프로세스
프로세스와 스레드의 차이는 무엇인가요?
프로세스란 프로그램이 메모리에 올라가 인스턴스화 되어 실행된 것을 말하며, 프로그램이란 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태의 파일, 즉 코드 덩어리를 말합니다.
하나의 프로세스 안에서 여러가지 작업 흐름이 동시에 진행되는데, 이 때 스레드는 프로세스 내 작업의 흐름을 지칭합니다. 파일을 코드 덩어리라고 보았을 때, 스레드는 각각의 함수라고 볼 수 있습니다.
이러한 프로세스와 스레드의 차이는 다음과 같습니다.
프로세스는 메모리에 올라갈 때, 운영체제로부터 독립된 메모리 영역을 할당받습니다. 이 때, 메모리 영역은 스택, 힙, 데이터 영역(Data Segment), 코드 영역으로 나누어집니다.
이와 달리 스레드는 같은 프로세스 내의 메모리를 공유합니다(공유된 코드 영역, 데이터 영역, 힙과 별도의 스택을 할당 받음).
이러한 특성으로 인해,
프로세스는 다른 프로세스의 메모리에 직접적으로 접근할 수 없어 하나의 프로세스에 오류나 충돌이 발생하더라도 다른 프로세스에는 영향을 미치지 않으며 따라서 안정성과 보안 측면에서 유리합니다. 반대로 프로세스 간 통신을 위해 IPC(프로세스 간 통신: 파이프, 소켓, 메시지 큐 등을 이용)를 사용해야 하기 때문에 오버헤드가 발생합니다.
스레드는 같은 프로세스 내의 메모리를 공유하므로 데이터를 공유하고 통신하는데 용이하고, 멀티스레딩을 통해 메모리 및 자원을 효율적으로 사용할 수 있습니다. 반대로 메모리를 공유하기 때문에 공유 자원에 대한 접근 제어가 필요하고 동시성 문제가 발생할 수 있어 별도의 처리가 필요합니다.
교착상태란 무엇이며, 교착상태가 발생하기 위해서는 어떤 조건이 있어야 하나요?
교착상태(Deadlock)는 멀티스레드 또는 멀티프로세스 환경에서 발생할 수 있는 상황으로, task는 하나 이상의 자원을 필요로 할 수 있는데 일부 task가 자원을 점유한 채로 blocked되어 다른 task가 점유한 자원을 기다리는 상황이 발생하면 그 결과 모두가 진행하지 못하고 무한정 대기하는 상태를 말합니다. 이것은 시스템의 성능을 저하시키고, 프로그램의 실행을 멈추게 할 수 있습니다.
교착상태가 발생하기 위해서는 다음 네 가지 조건이 동시에 충족되어야 합니다.
상호배제(Mutual Exclusion):
자원은 동시에 하나의 프로세스 또는 스레드에 의해서만 사용될 수 있어야 합니다.
보유 및 대기(Hold and Wait):
프로세스나 스레드가 이미 어떤 자원을 가지고 있는 상태에서 다른 자원을 기다릴 때 교착상태가 발생합니다. 이는 어떤 자원을 보유한 상태에서 다른 자원을 기다리는 동안 해당 자원을 해제하지 않는 것을 의미합니다.
비선점(No Preemption):
다른 프로세스나 스레드가 이미 보유한 자원을 강제로 빼앗아 사용할 수 없어야 합니다. 자원은 해당 프로세스나 스레드가 직접 해제할 때까지 점유되어야 합니다.
환형 대기(Circular Wait):
여러 프로세스나 스레드가 자원을 대기하는데, 각각의 프로세스나 스레드는 다음에 얻을 자원을 다른 프로세스나 스레드가 가지고 있는 상태여야 합니다. 이로 인해 자원 대기 그래프에서 사이클이 형성됩니다.
이 네 가지 조건이 동시에 충족되면 교착상태가 발생하며, 이를 방지하기 위해서는 위 조건들 중 하나라도 깨뜨리는 방법이 필요합니다.
교착상태의 해결법은 무엇인가요?
교착상태를 해결하기 위한 주요 방법은 다음과 같습니다:
예방(Prevention):
- 교착상태의 발생을 막는 것이 가장 효과적인 방법입니다. 교착상태의 필요 조건 중 하나 이상을 깨뜨리는 방식으로 예방할 수 있습니다.
- 예를 들어, Hold and wait 조건을 깨기 위해 하나의 자원을 점유한 채로 다른 자원을 점유하려다 실패했을 때, 점유했던 자원을 release한 뒤 다시 처음부터 시도한다던가(resource utilization이 낮다는 단점과 starvation이 가능하다는 단점), circular wait 조건을 깨기 위해 total ordering을 적용하여 해결 가능합니다.
회피(Avoidance):
- 시스템이 자원 할당 요청에 대해 교착상태 발생 가능성을 사전에 평가하고, 교착상태가 발생할 수 있는 경우 해당 자원 할당을 회피합니다.
- 이를 위해 시스템은 safe state를 유지할 수 있는 자원 할당만을 수행하며, 교착상태, unsafe state가 발생하지 않는 자원 할당을 선택합니다.
- 이 때 safety checking에 사용할 수 있는 알고리즘으로는 자원 할당 그래프, Banker’s algorithm이 있습니다. 이 때, 은행원 알고리즘은 동적으로 자원 상황이 바뀌어도 처리할 수 있다는 장점이 있으나, 은행원 알고리즘을 사용하여 safety check를 하기 위해서는 프로세스의 needs와 가용한 자원을 비교해야 하는데 미리 한 프로세스의 maximum resourse needs를 알기 어려워 적용이 힘들다는 단점이 있습니다.
탐지 및 회복(Detection and Recovery):
- 교착상태가 발생한 후 시스템이 이를 감지하고, 회복하는 방법입니다.
무시(Ignoring):
- 많은 현대 OS 에서는 교착상태를 무시하는 방법을 택합니다.
- 교착상태는 매우 드물게 발생하지만 방지하기 위한 비용이 크기 때문에 효율적인 선택이라고 볼 수 있습니다.
- 편의성과 정확성의 trade-off라고 볼 수 있습니다.
뮤텍스와 세마포어에 대해서 설명해 보시오.
뮤텍스(Mutex)와 세마포어(Semaphore)는 동기화 도구로, 멀티스레드나 멀티프로세스 환경에서 공유 자원에 대한 접근을 제어하기 위해 사용됩니다. 그러나 두 도구 간에는 몇 가지 중요한 차이가 있습니다.
뮤텍스(Mutex):
- 뮤텍스는 Mutual Exclusion(상호배제)의 준말로, 공유 자원에 대한 접근을 한 번에 하나의 스레드나 프로세스만이 가질 수 있도록 제한합니다.
- 일반적으로 뮤텍스는 이진 상태(locked 또는 unlocked)를 가지며, 잠금된 상태에서는 다른 스레드가 해당 자원에 접근할 수 없습니다.
- Lock은 busy-wait(spin lock) 또blocked(sleep)로 구현될 수 있습니다.
- Busy-wait는 기다리는 스레드가 block되어 컨텍스트 스위칭되지 않는다는 장점이 있습니다.
- 뮤텍스는 주로 크리티컬 섹션(Critical Section)을 보호하기 위해 사용됩니다. 크리티컬 섹션은 여러 스레드가 동시에 접근해서는 안 되는 부분을 가리킵니다.
세마포어(Semaphore):
- 세마포어는 counting semaphore과 binary semaphore로 나뉩니다.
- S라는 state 값을 가지는데, 사용 가능한 자원의 개수를 나타냅니다.
- Wait와 signal 함수로 공유 자원에 대한 접근을 처리합니다.
- Wait는 자신의 차례가 올 때까지 기다리는 함수이고 signal은 다음 프로세스로 순서를 넘겨주는 함수입니다.
- Wait와 signal은 critical section에 접근하기 때문에 atomic하게 만들어주어야 합니다. 따라서 lock이 필요하고 lock을 걸기위해 lock이 필요한 상황이 발생합니다.
- counting semaphore는 여러 개의 자원에 대한 접근을 제어할 수 있습니다.
- binary semaphore는 뮤텍스와 유사하게 두 가지 상태(0 또는 1)만 가지며, 잠긴 상태에서는 다른 프로세스가 해당 자원에 접근할 수 없습니다.
- 세마포어는 뮤텍스보다 더 일반적인 동기화 도구로, 여러 프로세스 간의 동기화를 달성하는 데 사용됩니다. 예를 들어, 세마포어는 프로듀서-컨슈머 문제에서 버퍼를 보호하는 데 사용될 수 있습니다.
뮤텍스는 잠금을 기반으로 상호배제가 일어나는 잠금 기반이고, 세마포어는 신호를 기반으로 상호배제가 일어나는 신호메커니즘이라는 차이가 있습니다.
컨텍스트 스위칭이란 무엇인가요?
컨텍스트 스위칭(Context Switching)은 멀티태스킹 환경에서 한 프로세스나 스레드에서 다른 프로세스나 스레드로 실행 제어를 전환하는 과정을 말합니다.
컨텍스트 스위칭은 다음과 같은 과정으로 이루어집니다:
1. 현재 실행 중인 프로세스 또는 스레드의 상태 저장: 현재 CPU를 사용 중인 프로세스나 스레드의 state(레지스터 상태, 프로그램 카운터(PC) 등), 즉 context를 PCB에 저장합니다(interrupt or system call로 인해 커널 모드로 이동한 후 PCB에 state를 저장, PCB는 커널 메모리 영역에 위치함).
2. 다음에 실행할 프로세스 또는 스레드의 상태 로드: 스케줄러가 결정한 다음에 실행할 프로세스나 스레드의 상태를 PCB에서 로드합니다.
3. CPU 제어권 전환: 다음에 실행할 프로세스나 스레드로 CPU 제어권을 전환합니다.
이러한 과정은 매우 빠르게 이루어져야 합니다. 그렇지 않으면 switching 과정에서 시스템이 작업을 수행하지 못하는 시간이 길어져 시스템 성능에 부정적인 영향을 미칠 수 있습니다. OS와 PCB가 복잡할수록 시간이 오래걸리며, 효율적인 컨텍스트 스위칭은 운영 체제의 성능 및 응답 시간에 중요한 영향을 미칩니다.
경쟁 상태란 무엇인가요?
경쟁 상태(Race Condition)는 둘 이상의 프로세스나 스레드가 공유된 자원에 접근하고 변경을 시도할 때 발생할 수 있는 문제입니다. 이러한 상황에서는 각각의 프로세스나 스레드가 자원을 제어하기 위해 서로 경쟁하게 되는데, 이로 인해 예상치 못한 결과가 발생할 수 있습니다.
경쟁 상태가 발생하면 예상치 못한 결과가 발생할 수 있으며, 프로그램의 실행이 잘못될 수 있습니다. 이로 인해 데이터의 일관성이 손상되거나, 잘못된 결과가 발생할 수 있습니다. 경쟁 상태를 피하기 위해서는 적절한 동기화 메커니즘을 사용하여 자원에 대한 접근을 제어해야 합니다.(mutex, semaphore 등)
프로세스 혹은 스레드의 동기화란 무엇인가요?
프로세스나 스레드의 동기화(Synchronization)란 여러 프로세스나 스레드가 공유 자원에 동시에 접근할 때, 이를 조절하여 서로가 알고 있는 정보가 일치하게 하고 예기치 않은 결과나 데이터의 손상을 방지하기 위한 메커니즘을 말합니다. 동기화는 데이터의 일관성을 유지하고 상호 배제(Mutual Exclusion)를 통해 경쟁 상태(Race Condition)를 방지하여 프로그램의 정확성을 보장하는 데 중요합니다.
동기화는 주로 뮤텍스(Mutex), 세마포어(Semaphore) 등의 동기화 기법을 사용하여 구현됩니다. 이러한 동기화 메커니즘을 사용하여 프로세스나 스레드 간의 작업을 조정하고 공유 자원에 대한 접근을 조절합니다.
사용자 수준의 스레드와 커널 수준의 스레드의 차이는 무엇인가요?
사용자 수준의 스레드(User-Level Thread)와 커널 수준의 스레드(Kernel-Level Thread)는 스레드의 관리와 관련된 두 가지 주요 접근 방식입니다. 이 두 가지 방식은 각각의 장단점과 동작 방식이 다릅니다.
사용자 수준의 스레드(User-Level Thread):
1. 스레드 관리: 사용자 수준의 스레드는 커널 위의 사용자 레벨에서 관리됩니다. 운영 체제는 스레드의 존재를 인식하지 않으며, 스레드 관리는 라이브러리 또는 프로그래머에 의해 수행됩니다.
2. 동작 방식: 스레드의 생성, 스케줄링, 동기화 및 소멸은 모두 사용자 레벨에서 제어됩니다. 따라서 사용자 수준의 스레드는 빠르게 생성되고 관리될 수 있습니다.
3. 효율성: 사용자 수준의 스레드는 스레드 간의 전환을 위해 커널의 개입이 필요하지 않기 때문에 전환 비용이 낮을 수 있습니다. 그러나 스레드 간의 I/O 블록 또는 시스템 호출(blocking) 시에는 모든 스레드가 블록되는 단점이 있습니다.
커널 수준의 스레드(Kernel-Level Thread):
1. 스레드 관리: 커널 수준의 스레드는 운영 체제에 의해 직접 관리됩니다. 각 스레드는 커널 내부에서 개별적으로 식별되고 관리됩니다.
2. 동작 방식: 스레드의 생성, 스케줄링 및 동기화는 운영 체제에 의해 제어됩니다. 따라서 스레드 간의 동기화나 블로킹 작업은 운영 체제의 지원을 받습니다.
3. 효율성: 커널 수준의 스레드는 운영 체제가 직접 관리하기 때문에 스레드 전환 시 모드 간 전환이 일어나 비용이 소요될 수 있습니다. 그러나 I/O 블록이나 시스템 호출로 인한 스레드가 블로킹 될 경우, 다른 스레드가 계속해서 실행될 수 있습니다.
요약하면, 사용자 수준의 스레드는 프로세스 내부에서 스레드 관리를 수행하며 빠른 스레드 전환 속도를 가지지만, I/O 블록 시에 모든 스레드가 영향을 받을 수 있습니다. 반면에 커널 수준의 스레드는 운영 체제에 의해 직접 관리되며, 스레드 간의 블로킹이나 동기화 작업을 보다 효율적으로 수행할 수 있지만, 스레드 전환에 비용이 더 많이 들 수 있습니다.
CPU 스케줄링이란 무엇인가요?
CPU 스케줄링(CPU Scheduling)은 여러 프로세스 또는 스레드 중에서 어떤 것을 CPU에 할당하여 실행할지를 결정하는 작업을 말합니다. 컴퓨터 시스템은 일반적으로 여러 프로세스나 스레드가 동시에 실행될 수 있지만, 실제로 CPU는 한 번에 하나의 프로세스나 스레드만 실행할 수 있습니다. CPU 스케줄링은 이러한 상황에서 CPU의 효율성을 극대화하고, 프로세스나 스레드의 응답 시간을 최소화하는 것을 목표로 합니다.
CPU 스케줄링은 다음과 같은 상황에서 발생합니다:
새로운 프로세스나 스레드의 생성:
새로운 프로세스나 스레드가 생성되면 CPU에 할당되기를 기다리게 됩니다.
현재 실행 중인 프로세스나 스레드의 중단:
현재 실행 중인 프로세스나 스레드가 I/O 작업을 수행하거나 대기 상태에 들어갈 때 CPU를 양보해야 합니다.
인터럽트 발생:
하드웨어 인터럽트나 소프트웨어 인터럽트(system call)에 의해 CPU가 다른 프로세스나 스레드로 전환될 수 있습니다.
CPU 스케줄링 방법에는 대표적으로 어떤 것들이 있나요?
CPU 스케줄링은 다양한 스케줄링 알고리즘을 사용하여 수행됩니다. 가장 일반적인 CPU 스케줄링 알고리즘에는 다음과 같은 것들이 있습니다:
1. 선입선출(FIFO, First-Come, First-Served): 프로세스나 스레드가 대기열에 도착한 순서대로 CPU를 할당하는 방식입니다. 공정한 스케줄링 방식이지만, 대기 시간이 길어지는 문제가 있습니다.
2. 최단 작업 우선(SJF, Shortest Job First): 실행 시간이 가장 짧은 프로세스나 스레드를 우선적으로 CPU에 할당하는 방식입니다. 대기 시간을 최소화하고 평균 대기 시간을 줄이는 효율적인 방식입니다.
3. 우선순위(Priority Scheduling): 각 프로세스나 스레드에 우선순위를 할당하여 높은 우선순위를 가진 것을 먼저 실행하는 방식입니다. 하지만 우선순위가 너무 높은 프로세스나 스레드가 다른 프로세스나 스레드를 계속해서 무시하는 우선순위 불균형 문제가 발생할 수 있습니다.
4. 라운드 로빈(Round Robin): 각 프로세스나 스레드에 일정한 시간 할당량을 부여하여 순환하면서 CPU를 할당하는 방식입니다. 모든 프로세스나 스레드에게 공정한 실행 시간을 제공합니다.
이러한 스케줄링 알고리즘을 통해 CPU 스케줄링은 다양한 프로세스나 스레드의 실행을 효율적으로 관리하고 최적의 성능을 추구합니다.
동기와 비동기, 블로킹과 넌블로킹의 차이는 무엇인가요?
동기(Synchronous):
- 동기는 작업이 순차적으로 실행되며, 각 작업이 이전 작업의 완료를 기다립니다. 즉, 한 작업이 끝나야 다음 작업을 시작합니다.
- 호출된 함수가 결과를 반환할 때까지 호출한 함수는 대기하며(blocked) 작업을 수행합니다.
비동기(Asynchronous):
- 비동기는 작업이 순차적으로 실행되지 않고, 각 작업이 독립적으로 실행됩니다. 한 작업의 완료 여부와 상관없이 다음 작업이 진행됩니다.
- 호출된 함수가 결과를 반환하지 않고 바로 리턴되며, 호출한 함수는 결과를 기다리지 않고 다른 작업을 수행할 수 있습니다.
블로킹(Blocking):
- 호출된 함수가 자신의 작업이 종료될 때까지 제어권을 갖고 있는 것을 말한다. 즉, 호출된 함수의 작업이 종료될 때까지 호출하는 함수는 다른 작업을 진행할 수 없습니다.
- 블로킹 작업은 일반적으로 입출력(IO) 작업에서 발생합니다.
넌블로킹(Non-blocking):
- 넌블로킹은 호출된 함수의 작업의 완료 여부와 상관없이 제어권을 즉시 호출한 함수로 넘겨줍니다. 즉, 호출된 함수가 작업을 수행 중이어도 호출한 함수가 다른 작업을 계속할 수 있습니다.
- 넌블로킹 작업은 일반적으로 비동기적인 작업에서 발생합니다.
차이점:
- 동기/비동기는 작업의 실행 순서에 따라, 블로킹/넌블로킹은 작업의 대기 상태에 따라 결정됩니다.
- 동기/비동기는 작업의 완료 여부에 따라 제어 흐름을 결정하고, 블로킹/넌블로킹은 작업을 기다리는 동안 대기하는 방식을 결정합니다.
- 동기/블로킹은 작업이 완료될 때까지 대기하는 반면, 비동기/넌블로킹은 작업을 기다리지 않고 다른 작업을 수행할 수 있습니다.
메모리
프로세스에 할당되는 메모리의 각 영역에 대해서 설명해 주세요.
프로세스에 할당되는 메모리는 일반적으로 다음과 같은 영역으로 나누어집니다. 각 영역은 프로세스의 실행과 관련된 다른 종류의 데이터와 명령어를 저장하고 관리합니다.
텍스트(Text) 영역:
텍스트 영역은 실행 가능한 프로그램 코드(기계어 명령어)가 저장되는 영역입니다. 프로그램의 명령어들이 메모리에 로드되고 CPU에 의해 실행됩니다.
이 영역은 읽기 전용(Read-Only)이며, 프로그램이 실행 중에 수정되지 않습니다.
데이터(Data) 영역:
데이터 영역은 전역 변수(Global Variables)와 정적 변수(Static Variables)가 저장되는 영역입니다. 프로그램이 시작할 때 초기화되고 프로그램이 종료될 때까지 유지됩니다.
이 영역은 프로그램의 실행 도중에 데이터가 수정될 수 있습니다.
힙(Heap) 영역:
힙 영역은 동적으로 할당되는 메모리 블록들이 저장되는 영역입니다. 프로그램이 실행 중에 런타임에 동적으로 메모리를 할당하고 해제할 수 있습니다.
이 영역은 프로그래머에 의해 메모리 할당 및 해제가 수행되며, 힙의 크기는 프로그램 실행 중에 동적으로 변할 수 있습니다.
스택(Stack) 영역:
스택 영역은 함수 호출 및 지역 변수(Local Variables)가 저장되는 영역입니다. 각 함수 호출 시에 해당 함수의 지역 변수들과 함수 호출 정보가 스택에 추가되며, 함수가 반환되면 스택에서 제거됩니다.
이 영역은 후입선출(LIFO, Last-In-First-Out) 구조를 가지고 있으며, 스택 프레임(Stack Frame)의 형태로 데이터가 저장됩니다.
이러한 메모리 영역들은 프로그램의 실행과 데이터 관리를 위해 필요하며, 각각의 영역은 프로그램의 동작 및 메모리 사용에 중요한 역할을 합니다.
메모리 구조의 순서가 어떻게 되는가? CPU에서 가까운 순으로 말해보시오.
메모리 구조는 일반적으로 CPU에서 가까운 순서부터 멀어지는 순서로 배열됩니다. 이것은 CPU가 데이터에 접근할 때 속도가 빠른 순서부터 접근하기 때문에 효율적인 데이터 액세스를 가능하게 합니다. 주로 사용되는 메모리 구조의 순서는 다음과 같습니다.
레지스터(Register):
레지스터는 CPU 내부에 위치하며 가장 빠르게 접근할 수 있는 메모리입니다. 레지스터는 명령어의 주소, 연산에 필요한 데이터, 연산 결과를 저장하는 데 사용됩니다. 또한, CPU가 프로그램을 실행하는 동안 임시로 필요한 중간 결과나 제어 정보를 저장하는 데에도 사용됩니다.
캐시(Cache):
캐시는 CPU와 주 메모리(RAM) 사이에 위치하며, 주로 레지스터와 메인 메모리 간의 속도 차이를 극복하기 위해 사용됩니다. 캐시는 빈번하게 사용되는 데이터나 명령어를 저장하여 CPU가 더 빠르게 접근할 수 있도록 합니다.
메인 메모리(Main Memory 또는 RAM):
메인 메모리는 프로그램이 실행되고 데이터가 저장되는 곳입니다. CPU와 비교했을 때 상대적으로 속도가 느리지만, 대용량의 데이터를 저장할 수 있습니다.
보조 기억장치(Secondary Storage):
보조 기억장치는 메인 메모리와는 다르게 비휘발성(NVMe, HDD, SSD 등)입니다. 주로 하드 디스크 드라이브(HDD), 솔리드 스테이트 드라이브(SSD), 광 디스크 등이 이에 해당됩니다. 일반적으로 메인 메모리보다 용량은 크지만 접근 속도는 느립니다.
외부 저장장치(External Storage):
외부 기억장치는 컴퓨터 시스템과 연결되어 데이터를 주로 이동하거나 임시적으로 저장하는 데 사용됩니다.
주로 USB 플래시 드라이브, 외장 하드 디스크, 네트워크 저장 장치(NAS) 등이 이에 해당합니다.
주로 데이터의 이동성을 제공하거나, 컴퓨터의 저장 용량을 확장하거나, 백업을 수행하는 데 사용됩니다.
외부 기억장치에 저장된 데이터는 주로 컴퓨터와의 연결이 끊어진 후에도 그대로 유지됩니다.
이렇게 메모리 구조는 CPU에서 가까운 순서부터 멀어지는 순서로 배열되어 있으며, 이는 데이터 액세스 속도를 최적화하는 데 도움이 됩니다.
페이지와 세그멘테이션에 대해서 설명해 보시오.
페이지(Page)와 세그멘테이션(Segmentation)은 가상 메모리 관리 기법 중에서 주로 사용되는 두 가지 방식입니다. 이들은 프로세스의 가상 메모리 공간을 물리적 메모리에 매핑하는 방법에 대한 다른 접근 방식을 제공합니다.
페이지(Page):
- 페이지는 각 프로세스의 가상 메모리 공간을 동일한 크기로 나눈 작은 블록을 의미합니다. 물리적 메모리 역시 페이지 프레임이라 불리는 고정된 크기의 블록으로 나누어집니다.
- 페이지를 페이지 프레임으로 translation하는 정보를 포함한 PTE를 관리하는 페이지 테이블(Page Table)을 사용하여 가상 주소와 물리 주소를 매핑할 수 있습니다. 각 프로세스 별로 다른 페이지 테이블을 가지기 때문에 프로세스는 서로의 physical 주소에 접근할 수 없습니다.
- Page table base register는 현재 실행되는 프로세스의 페이지 테이블을 가리킵니다. 페이지 테이블은 선형 구조를 가질 수도 있지만 공간 낭비가 심하기 때문에 페이지 테이블을 페이지 크기로 나누어 계층적인 구조로 관리합니다.
- Paging은 segment보다 작은 단위로 메모리를 일정한 크기로 나눔으로써 internal fragment를 줄이고 external fragment 발생을 막을 수 있습니다.
- Page table은 OS가 만들고 업데이트, 관리하며, TLB를 이용해 최근 사용된 translation 정보를 저장함으로써 캐시처럼 사용할 수 있습니다.
세그멘테이션(Segmentation):
- 세그멘테이션은 프로세스의 주소 공간을 논리적으로 관련된 세그먼트(Segment)로 나누는 것입니다. 각 세그먼트는 서로 다른 크기를 가질 수 있으며, 세그먼트는 논리적 단위로 분할된 프로세스의 일부를 나타냅니다(예: 코드, 데이터, 스택 등).
- 각 프로세스는 각자의 세그먼트 테이블을 가집니다. 세그먼트 테이블은 각 세그먼트의 범위와 기준 주소(Base Address) 등을 저장하며, 이를 이용해 가상 주소와 물리 주소를 매핑할 수 있습니다.
- 세그멘테이션을 통해 각 용도별(예: 코드, 데이터, 스택 등)로 메모리를 나누어 사용합니다. 따라서 힙과 스택 영역의 크기를 동적으로 줄이거나 늘려서 사용할 수 있고, 이를 통해 hole을 더 효율적으로 사용 가능합니다. 그러나 여전히 외부 단편화(External Fragmentation) 문제가 발생은 할 수 있습니다
- 세그멘테이션과 페이지는 각각의 장단점을 가지고 있으며, 어떤 가상 메모리 관리 기법을 사용할지는 시스템의 요구 사항과 성능에 따라 결정됩니다. 일부 운영 체제에서는 페이지와 세그멘테이션을 결합하여 사용하기도 합니다.
외부 단편화란? 내부 단편화란?
외부 단편화(External Fragmentation)와 내부 단편화(Internal Fragmentation)는 메모리 할당과 관련된 두 가지 현상을 나타냅니다.
외부 단편화(External Fragmentation):
- 외부 단편화는 할당되지 않은 작은 조각들이 메모리에 흩어져 있어, 큰 메모리 공간을 할당할 수 없는 상황을 말합니다.
- 메모리 관리 시스템에서는 각 프로세스에게 필요한 메모리를 할당해야 합니다. 이때, 프로세스들이 메모리를 사용하고 해제하면서 메모리 공간이 조각조각으로 나뉘게 됩니다.
- 외부 단편화가 발생하면 프로세스에게 필요한 큰 메모리 블록을 할당하지 못하게 되어 메모리의 낭비를 초래할 수 있습니다.
- 외부 단편화는 세그멘테이션과 같은 메모리 할당 기법에서 주로 발생합니다.
내부 단편화(Internal Fragmentation):
- 내부 단편화는 할당된 메모리 블록이 프로세스에 실제로 사용되는 부분보다 큰 경우 발생합니다.
- 예를 들어, 메모리 블록이 8바이트를 할당받았지만, 프로세스가 실제로 사용하는 데이터는 5바이트인 경우, 나머지 3바이트가 낭비되는 상황을 내부 단편화라고 합니다.
- 내부 단편화는 페이징과 같은 고정 크기의 메모리 할당 기법에서 주로 발생합니다.
내부 단편화와 외부 단편화는 메모리 관리에서 중요한 문제이며, 이를 최소화하기 위한 다양한 메모리 할당 기법과 알고리즘이 개발되었습니다.
First Fit, Best Fit, Worst Fit에 대해서 설명해 보시오.
First Fit, Best Fit, Worst Fit은 메모리 할당 방법 중 일부로, 프로세스에게 메모리를 할당하는 알고리즘입니다. 각각의 알고리즘은 메모리 내의 빈 공간을 탐색하고 가장 적절한 곳에 프로세스를 할당하는 방식이 다릅니다.
First Fit:
- First Fit 알고리즘은 메모리에서 처음으로 발견된 충분한 크기의 빈 공간에 프로세스를 할당합니다.
- 메모리를 순차적으로 탐색하여 첫 번째로 발견된 적합한 곳에 프로세스를 할당하므로 탐색 시간은 짧지만, 메모리 내부에 많은 조각이 남을 수 있습니다.
- 간단하고 빠르다는 장점이 있습니다.
Best Fit:
- Best Fit 알고리즘은 프로세스가 가장 잘 맞는(가장 작은) 빈 공간에 프로세스를 할당합니다.
- 메모리를 순차적으로 탐색하여 모든 빈 공간을 비교하여 가장 적합한 곳을 찾습니다.
- 전체 메모리를 탐색해야 하므로 시간이 걸리고 비효율적일 수 있습니다. 낭비되는 메모리와 fragment의 크기를 최소화 할 수 있지만 external fragment 발생 가능성이 높아집니다.
Worst Fit:
- Worst Fit 알고리즘은 가장 큰 빈 공간에 프로세스를 할당합니다.
- 메모리를 순차적으로 탐색하여 모든 빈 공간을 비교하여 가장 큰 곳을 찾습니다.
- External fragment 발생 가능성을 줄일 수 있으나 전체 메모리를 탐색해야 하므로 시간이 걸리고 비효율적일 수 있습니다.
- 큰 공간을 찾아 할당하기 때문에, 프로세스가 사용하는 메모리보다 큰 공간을 할당할 가능성이 높습니다. 따라서 내부 조각화가 발생할 수 있고 메모리 낭비가 발생할 수 있습니다.
이러한 메모리 할당 알고리즘들은 외부 단편화와 내부 단편화를 최소화하고 메모리 사용 효율을 극대화하기 위해 고안되었습니다. 선택한 알고리즘은 시스템의 특성과 요구 사항에 따라 달라질 수 있습니다.
페이지 교체 알고리즘 종류에는 어떤 것들이 있나요?
페이지 교체 알고리즘은 가상 메모리 시스템에서 메모리에 적재된 페이지 중 어떤 페이지를 교체할지 결정하는 방법을 말합니다. 메모리에 여유 공간이 부족할 때 페이지 교체 알고리즘이 사용됩니다.
FIFO (First-In, First-Out):
- 가장 먼저 메모리에 적재된 페이지를 교체하는 알고리즘입니다. 즉, 가장 오래된 페이지를 교체합니다.
- 구현이 간단하고 오버헤드가 낮지만, 원래 페이지 프레임의 개수를 늘리면 page fault발생이 감소 해야 하나 오히려 늘어나는 Belady's Anomaly 문제가 발생할 수 있습니다.
LRU (Least Recently Used):
- 가장 오래 사용되지 않은 페이지를 교체하는 알고리즘입니다. 즉, 최근에 접근하지 않은 페이지를 교체합니다.
- 페이지 접근 패턴을 추적해야 하므로 구현이 복잡하지만, Belady's Anomaly 문제가 발생하지 않습니다.
LFU (Least Frequently Used):
- 가장 적게 사용된 페이지를 교체하는 알고리즘입니다. 페이지가 사용된 빈도를 추적하여 가장 적게 사용된 페이지를 교체합니다.
- 페이지 사용 빈도를 추적하기 위한 추가적인 메모리 및 연산이 필요합니다.
MRU (Most Recently Used):
- LRU와 반대로 가장 최근에 사용된 페이지를 교체합니다.
Optimal:
- 최적 페이지 교체 알고리즘으로, 가장 나중에 사용될 페이지를 교체합니다. 이론적으로 최적이지만, 실제로는 알고리즘이 미래의 페이지 접근 패턴을 알 수 없기 때문에 구현이 불가능합니다. 주로 효율적인 페이지 교체 알고리즘의 성능을 평가하는 데 사용됩니다.
이러한 페이지 교체 알고리즘들은 메모리 사용량, 성능, 구현의 복잡성 등 다양한 요소를 고려하여 선택됩니다. 실제로 사용되는 페이지 교체 알고리즘은 시스템의 특성과 요구 사항에 따라 다를 수 있습니다.
'CS' 카테고리의 다른 글
[ CS ] MTU (0) | 2024.03.18 |
---|