앞으로 하루에 한 번씩 면접을 준비한다는 생각으로 CS와 Java, DB에 관련된 내용을 작성할 것이다.
오늘은 OS부분에서의 MultiThread와 MultiProcess에 대해서 알아보겠다.
MultiProcess
MultiProcess란, 단어에서 유추할 수 있듯이 2개 이상의 프로세스가 동시에 실행되는 것을 의미한다.
동시라는 말은 동시성과 병렬성 두 가지를 의미한다.
동시성은 CPU core가 1개일 때, 여러 프로세스를 매우 짧은 시간동안에 번갈아가면서 연산을 하는 시분할 시스템으로 실행되는 것이다.
병렬성은 CPU core가 여러개일 때, 각각의 CPU core가 각각의 process를 연산함으로써 process가 동시에 실행되는 것이다.
프로세스들은 기본적으로 CPU와 메모리를 공유한다. 메모리의 경우 여러 프로세스들이 각자의 메모리 영역을 차지하여 동시에 적재된다.
CPU는 기본적으로 한 번에 하나의 프로세스만 처리할 수 있다.
하나의 프로세스를 CPU가 처리하는 데 걸리는 시간은 매우 짧은 ms내로 끝나게 되므로, 매우 빠르게 처리하고 다음 프로세스를 처리하기 때문에 사용자 입장에서 여러 프로그램들이 동시에 실행되는 것처럼 보인다. 이처럼 CPU의 작업시간을 여러 프로세스들이 조금씩 나누어 쓰는 시스템을 시분할 시스템이라고 한다.
하지만, 하나의 프로세스를 완전히 처리하고 나서 다음 프로세스를 처리하는 방식이 아니라, CPU는 모든 프로세스를 미리 정해진 매우 짧은 시간만큼만 처리하고 프로세스가 끝나지 않았더라도 그 다음 프로세스를 처리하게 된다.
다음으로 멀티 프로세스의 특징에 대해서 알아보겠다.
MultiProcess의 특징
메모리 관리 : 여러 프로세스서가 동시에 메모리에 적재된 경우, 서로 다른 프로세서의 영역을 침범하지 않도록 각 프로세서가 자신의 메모리 영역에만 접근하도록 운영체제가 관리해준다.
Context Switch / 문맥 교환 : 한 프로세스에서 다른 프로세스로 CPU 제어권을 넘겨주는 것을 의마한다.
하나의 프로세스는 내부적으로 PCB(Process Control Block)를 가지고 있다. PCB에는 해당 프로세스에 관련된 정보들을 가지고 있다.
따라서, CPU가 이전 프로세스를 처리하다가 다른 프로세스를 처리하려고 한다면, 우선 이전 프로세스의 PCB 정보를 저장하고 다음 프로세스의 PCB를 로드하여 다음 프로세스를 처리하게 된다. 이러한 과정에서 PCB가 저장되고 로드되는 과정을 Context Switch라고 한다.
Question
Q1. 프로세스의 Context는 무엇인가요?
A1. 프로세스의 context는 현재 프로세스가 어떤 상태로 수행되고 있는 지에 대한 정보가 들어있습니다. 해당 내용은 PCB에 기록되어 있습니다.
Q2. PCB에 저장되는 것은 어떤 것들이 있나요?
A2. PCB는 운영체제가 Process에 필요한 정보를 모아놓은 자료구조입니다. 일반적으로 PCB에는 다음과 같은 정보들이 들어갑니다.
1. process number
2. process state
3. PC, Register(CR3)
4. CPU Scheduling 정보, 우선순위
5. 메모리 정보
Q3. Process의 State에는 어떤 것들이 있나요?
A3. CPU 자원을 할당받기 전인 대기상태와, CPU 자원을 할당받고 실행중인 상태, I/O 혹은 인터셉터와같은 이유로 대기중인 상태가 있습니다.
MultiThread
하나의 프로세스에서 여러 스레드가 동시에 작업을 수행하는 것을 의미합니다.
여러개의 프로세스를 사용하면 병렬성을 높일 수 있다. 여러 작업을 동시에 수행하기 때문이다.
이는 프로세스의 스레드들이 각각 다른 프로세서에서 병렬적으로 수행될 수 있기 때문이다.
반면, 하나의 프로세스를 사용하는 경우, 동시성을 높일수 있다. 실제로는 각각의 시간에 한 작업만 수행되지만, 병렬적으로 수행되는 것처럼 보이기때문이다. 하나의 스레드가 중지되더라도 커널이 다른 스레드로 변경하게 실행할 수 있어서 하나의 프로세스임에도 불구하고 빠른 처리가 가능하고 계산 속도가 증가한다.
- 동시성 (Concurrency): 멀티스레딩은 여러 스레드가 동시에 실행되는 것처럼 보이게 합니다. 이는 프로그램이 여러 작업을 병렬로 처리할 수 있게 하여 효율성을 높입니다.
- 자원 공유 (Resource Sharing): 멀티스레드 환경에서는 여러 스레드가 동일한 메모리 공간을 공유합니다. 이를 통해 데이터와 자원의 공유가 용이해지며, 메모리 사용을 최적화할 수 있습니다.
- 속도 향상 (Performance Improvement): 멀티스레드를 사용하면 CPU 사용률을 극대화할 수 있어 작업 처리 속도가 빨라집니다. 특히 I/O 작업이나 대기 시간이 많은 작업에서 효과적입니다.
- 복잡성 증가 (Increased Complexity): 멀티스레드를 구현하면 동기화 문제, 교착 상태(Deadlock) 등 복잡한 문제들이 발생할 수 있어 관리와 디버깅이 어렵습니다.
비교
1. 멀티스레드는 멀티프로세스보다 더 적은 메모리 공간을 차지하고 비교적 Context Switching이 빠르다.
2. 멀티프로세스는 멀티스레드보다 CPU시간을 더 많이 차지한다.
3. 멀티스레드는 동기화 문제와 하나의 스레드에서 장애가 발생할 시, 전체 스레드가 종료될 수 있다.
4. 멀티프로세스는 하나의 프로세스가 중지해도 프로세스끼리는 별도의 공간을 지니기때문에, 영향을 주지않아 안정성이 높다.
Question
Q1. 어떤 상황에서 어떤 것을 사용하는 게 좋나요?
A1. 빈번한 자료 공유와 Context Switching이 발생하는 경우, MultiThread를 사용하는 것이 좋고 메모리 구분이 필요할 때는 Multi Processing이 더 좋습니다.
Q2. MultiThread가 MultiProcessing보다 좋은 점은 무엇인가요?
A2. 메모리 공간과 시스템 자원 소모가 줄어들게 됩니다. 그리고 process를 생성하고 자원을 할당하는 System Call을 사용하지 않아도 되기때문에, 자원을 효율적으로 관리할 수 있고 Context Switching시 캐시 메모리를 초기화할 필요가 없어서 속도가 더욱 빠릅니다.