Process / Thread
Updated:
프로세스 vs 스레드
프로그램
어떤 작업을 위해 실행할 수 있는 파일.
프로세스
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이다.
프로세스는 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체) 이며, CPU 의 할당을 받을 수 있는 것을 말한다. 운영체제로부터 주소 공간, 파일, 메모리 등을 할당받으며 이것들을 총칭하여 프로세스라고 한다.
구체적으로 살펴보면 프로세스는 함수의 매개변수, 복귀 주소와 로컬 변수와 같은 임시 자료를 갖는 프로세스 스택과 전역 변수들을 수록하는 데이터 섹션을 포함한다. 또한 프로세스는 프로세스 실행 중에 동적으로 할당되는 메모리인 힙을 포함한다.
한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, Inter-Process Communication)을 사용해야 한다.
변수들이 메모리에 저장되는 영역
- Code 영역 : 함수, 제어문, 상수 등등 함수에 대한 기계어 코드가 들어간다.
- Data 영역 : 초기값 있는 전역변수, 배열, static으로 선언된 변수가 들어간다.
- Bss 영역 : 초기값 없는 전역변수, 배열, static으로 선언된 변수가 들어간다.
- Heap 영역 : 동적할당(malloc)으로 할당된 변수가 들어간다.
- Stack 영역 : 지역 변수, 블록 내에서 할당된 변수다 들어간다.
프로세스 제어 블록(Process Control Block, PCB)
PCB 는 특정 프로세스에 대한 중요한 정보를 저장 하고 있는 운영체제의 자료구조이다. 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB 를 생성 하고 프로세스가 완료되면 PCB는 제거가 된다.
프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 된다. 그리고 다시 CPU 를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.
PCB에 저장되는 정보
- 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
- 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
- CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등
프로세스 간 통신(Inter-Process Communication, IPC)
프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.
공유 메모리 기법(Shared Memory)
- 특징
- IPC를 위해 공유 메모리 영역을 구축하고, 공유 영역을 통해 자원이나 데이터를 주고받는다.
- 장점
- 커널 의존성이 낮기 때문에 속도가 빠르다. 유저 레벨에서 IPC가 가능하기 때문에, 통신이 자유롭다.
- 단점
- 자원과 데이터를 공유하기 때문에 동기화 이슈가 발생한다.
메세지 전달 기법(Message Passing)
- 특징
- IPC를 위해 커널을 통해 메시지를 전달하는 방식으로 자원이나 데이터를 주고받는다.
- 장점
- 별도로 다른 것을 구축할 필요 없이 커널을 이용하기 때문에 구현이 비교적 쉽다.
- 단점
- 커널을 이용하기 때문에, 시스템 콜(System call)이 필요하며 이로 인해 오버헤드가 발생한다.
- 종류 파이프, 시그널, 메시지 큐, 소켓 등
파이프 (Pipe)
- 특징
- 하나의 프로세스가 파이프를 통해 다른 프로세스로 메시지를 직접 전달하는 방식
- Half-duplex 방식이기 때문에, 데이터는 한쪽 방향으로만 이동한다. 양방향 통신을 하기 위해서는 두 개의 파이프가 필요하다.
- 파이프에 용량 제한이 있기 때문에 이용에 제약이 있다.
시그널 (Signal)
- 특징
- 프로세스 ID를 통해,특정 프로세스에게 메시지를 전달하는 방식
- 시그널 ID에 따라 어떤 이벤트인지 알 수 있다.
메시지 큐 (Message Queue)
- 특징
- 고정 크기의 메시지를 연결 리스트를 통해 통신하는 방식
- 메시지 단위의 통신이며, 메시지 큐 ID를 통해 통신을 한다.
소켓 (Socket)
- 특징
- 네트워크 상에서 프로세스 간에 통신하는 방식
- Local 뿐만 아니라, Remote 통신이 가능하다.
스레드
스레드는 프로세스의 실행 단위라고 할 수 있다. 스레드는 한 프로세스 내에서 각각 Stack만 따로 할당을 받고 Code, Data, Heap 영역을 공유합니다.
스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다. 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다.
멀티프로세스 vs 멀티 스레딩
멀티 프로세스
하나의 프로세서가 아니라 여러 개의 프로세스가 서로 협력적으로 일을 처리하는것이다. 즉, 여러 개의 프로세스가 작업을 병렬처리 하는것이다.
또한 멀티프로세싱을 이용할 경우 한 프로세스가 고장나더라도 시스템이 정지하는것이 아니라 단지 속도만 느려지게 됩니다. 이처럼 신뢰성도 보장할 수 있습니다.
하지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재합니다.
멀티 스레딩
하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 한다.
이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 프로세스의 스택 영역을 스레드 개수만큼 공유하여 사용합니다. 그래서, 각자의 스택과 PC 레지스터 값을 갖고 있다.
하나의 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없지만 힙영역과 스태틱 영역을 공유하여 사용할 수 있습니다.
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 안고 있다.
문맥교환(Context Switching)
하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다.
그리고 인터럽트가 발생되었을 때 실행중이던 프로세스가 작업을 멈추었다가 다시 실행될 때 이전 작업을 다시 수행하기 위해 이전 작업 내용과 프로세스의 정보들을 PCB에 저장해둔다.
한 프로세스의 문맥은 그 프로세스의 프로세스 제어 블록에 기록되어 있다.
교착상태 (DeadLock)
교착상태(Dead Lock)은 상호 배제에 의해 나타나는 문제점으로, 둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상을 의미합니다.
교착상태의 조건
- 상호배제: 한 자원에 대한 여러 프로세스의 동시접근 불가
- 점유대기: 자원을 들고 다른 프로세스의 자원 반납 대기
- 비선점: 상대 자원 강제 취소 불가
- 순환대기: 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있는 것
예방기법
- 예방: 사전에 시스템을 제어하는 방법으로 교착상태 발생의 네가지 조건 중에서 어느 하나를 제거함으로써 수행됩니다.
- 회피: 교착상태가 발생할 가능성을 배제하지 않고 교착상태가 발생하면 적절히 피해나가는 방법으로, 주로 은행원 알고리즘(Banker’s Algorithm)이 사용됩니다.
- 회복: 교착상태를 일으킨 프로세스를 종료하거나 교착상태의 프로세스에 할당된 자원을 선점하여 프로세스나 자원을 회복하는 것을 의미합니다.
은행원 알고리즘(Banker’s Algorithm)
은행원 알고리즘에서 운영체제는 안전상태를 유지할 수 있는 요구만을 수락하고 불안전 상태를 초래할 사용자의 요구는 나중에 만족될 수 있을 때까지 계속 거절합니다.
Leave a comment