장미정원
[OS] 프로세스와 스레드 본문
프로세스
프로세스는 실행 중인 프로그램을 의미합니다. 컴퓨터에 있는 여러 프로그램들은 보조기억장치에 저장되어 있다가 프로그램을 실행하는 순간 메모리에 적재되고 프로그램은 프로세스가 됩니다.
프로세스는 실행될때 CPU의 자원을 필요로 합니다. 컴퓨터에는 여러 개의 프로세스들이 실행될 수 있습니다. 하지만 모든 프로세스가 CPU의 자원을 동시에 사용할 수는 없으므로 각자 차례를 기다리며 한정된 시간만큼만 CPU 자원을 사용하고 돌려주는 것을 반복하여 동작합니다.
이러한 프로세스의 실행 순서를 관리하고 프로세스에 지원을 배분하는 일은 운영체제가 담당하는데 이를 위한 운영체제는 PCB를 이용합니다.
PCB - Process Control Block
프로세스 제어 블록은 프로세스의 정보를 저장하는 자료구조입니다. 메모리에는 사용자 영역과 커널 영역으로 나누어져 있습니다. 프로세스는 사용자 영역에, PCB는 커널 영역에 적재됩니다. 운영체제는 이 PCB를 사용해서 프로세스를 식별하고 프로세스에 대한 정보를 얻습니다. 이 PCB에는 PID, 레지스터값, 프로세스 상태와 같은 정보들이 저장됩니다.
프로세스의 구조
프로세스는 아래와 같은 구조를 가지고 있습니다.
스택 영역에는 메서드의 매개변수, 지연 변수와 같이 임시 데이터가 저장됩니다. 힙 영역에는 객체의 인스턴스와 같이 동적으로 할당한 데이터가 저장됩니다. 힙에 할당한 데이터는 사용 후 반환해야합니다. 데이터 영역에는 전역변수나 static 변수 같이 프로그램이 실행되고 종료될 때 까지 유지되는 변하지 않는 데이터가 저장됩니다. 코드 영역에는 프로그램의 소스코드, 기계어로 이루어진 명령어가 저장됩니다.
멀티 태스킹
CPU는 여러 프로세스를 동시에 실행시킬 수 없기 때문에 각각의 프로세스를 아주 짧은 단위로 나눠서 번갈아 가면서 실행합니다. 그리고 이렇게 CPU 자원을 번갈아서 실행하는 것을 Context Switching이라고 합니다.
스레드
스레드는 프로세스를 구성하는 실행단위 입니다. 그리고 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다.
스레드의 구조
스레드는 아래와 같은 구조를 가지고 있습니다.
스레드는 프로세스를 구성하는 실행 단위라고 했습니다. 그렇게 때문에 프로세스의 코드 영역, 데이터 영역, 힙 영역을 공유합니다. 각각의 스레드는 스택 영역, 레시드터 값, PC, 스레드 ID와 같은 정보만 가지고 있고 프로세스 전반적으로 사용되는 데이터는 서로 공유합니다.
멀티 프로세스 vs 멀티 스레딩
하나의 프로그램에서 여러 갈래로 나뉘는 작업을 여러 프로세스를 동시에 실행하는 것을 멀티 프로세스, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티 스레딩이라고 합니다.
한 프로그램에서 작업의 흐름이 여러 갈래로 나뉘는 경우가 있습니다. 예를 들어 인텔리제이 프로그램으로 코드를 작성하면서 컴파일을 진행하는 것과 같이 한 프로그램에서 여러 갈래로 나뉘는 작업을 처리해야 하는 경우가 있습니다.
멀티 프로세스
멀티 프로세스로 이러한 작업을 처리할 수 있습니다. 프로세스를 fork 하여 동일한 프로세스를 복제할 수 있습니다. 이렇게 복제한 프로세스로 여러 갈래로 나뉘는 작업을 수행할 수 있습니다.
이때 복제된 프로세스를 독립된 메모리 공간을 확보하게 됩니다. 이렇게 독립된 메모리 공간을 가지기 때문에 만약 어느 한 프로세스 문제가 발생했을 때, 다른 프로세스는 영향을 받지 않는다는 장점이 있습니다. 예를들어 크롬에서는 탭을 생성할 때 멀티 프로세싱 방식으로 생성됩니다. 그렇기 때문에 하나의 탭에서 문제가 발생했을 때 다른 탭은 영향을 받지 않습니다.
하지만 멀티 프로세스 방식을 이용하면 단점이 존재합니다. 먼저 Context Switching 비용이 크다는 것입니다.
멀티 프로세스 방식은 컨텍스트 스위칭이 발생할 때 CPU 캐시에 스택, 힙, 데이터, 코드 영역에 대한 정보를 모두 올린 후 작업을 진행 후 다른 프로세스가 CPU를 할당받을 때 다시 스택, 힙, 데이터, 코드 영역에 대한 정보를 올리는 작업을 진행합니다.
어떻게 보면 PID, 메모리 주소만 다르고 모든것이 동일한 프로세스들이 복제되는 것이기 때문에 메모리 낭비가 발생할 수도 있고 같은 작업을 하기 위해 만든 프로세스인데 스택, 힙과 같은 각각의 메모리 영역을 따로 가지기 때문에 IPC라는 프로세스간의 통신이 발생합니다. (프로세스 간의 통신은 비용이 큽니다.)
멀티 스레딩
멀티 스레딩은 프로그램에서 여러 갈래가 나뉘는 작업을 하나의 프로세스 내부의 여러 개의 스레드로 처리하는 것입니다. 스레드는 위에 구조를 설명할 때와 같이 코드, 데이터, 힙 영역을 서로 공유하고 각각의 스레드는 스택, 레지스터 값, PC와 같은 데이터를 가지게 됩니다.
그렇기 때문에 멀티 프로세스에서 프로세스간의 컨텍스트 스위칭에서는 코드, 데이터, 힙 영역도 로딩하고 갈아끼우는 행위가 필요하였는데, 멀티 스레딩 방식에선 코드, 데이터, 힙 영역을 로딩시켜두고 각각의 작업에 대한 스레드 정보만 컨텍스트 스위칭되면 되기 때문에(CPU 캐시를 비우지 않습니다.) 컨텍스트 스위칭이 가볍고 한 프로세스의 스레드 끼리는 자원을 공유하기 때문에 서로 독립적으로 실행되는 것이 아니기 때문에 협력과 통신에 유리합니다.
멀티 프로세스와 멀티 스레딩은 소프트웨어 개발에서의 처리방식입니다. 각각의 장단점을 이해하고 적절한 방식을 선택하고 활용하는 것이 중요합니다.
'CS' 카테고리의 다른 글
[CS] sync, async, blocking, non-blocking (2) | 2024.10.15 |
---|---|
[OS] 동기화을 위한 뮤텍스와 세마포어 (0) | 2024.07.10 |