프로세스(Process)
프로세스의 개념
프로세스란 실행 중인 프로그램을 뜻한다. 디스크에 있는 실행파일이 메모리에 올라가서 실행되기 시작하면 프로세스가 되며, CPU를 획득해 코드를 수행하거나 CPU를 반환하고 입출력 작업을 수행한다. 프로세스를 이해하기 위해서는 Context에 대해 알 필요가 있다.
Context란
Context란 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확한 상태 관리를 위해 필요한 정보를 의미한다. 일반적으로 멀티 프로세싱 환경에서는 타이머 인터럽트에 의해 짧은 시간 동안 프로세스가 완료될 때까지 CPU 자원의 획득 / 반환 과정을 반복적으로 발생시키는 방식으로 CPU 자원 관리가 이루어진다. 따라서 CPU 자원을 다시 획득해 중단됐던 명령을 재개하기 위해서는 직전 수행 시점의 정확한 상태를 재현할 필요가 있다.
즉 Context는 그 프로세스의 주소 공간을 비롯해 프로세스가 명령을 시작/재개하기 위한 각종 정보를 포함하게 된다.
Context의 구성
- 하드웨어 컨텍스트
- cpu의 수행 상태를 나타내는 값으로 프로그램 카운터 값과 각종 레지스터에 저장하고 있는 값들을 의미한다.
- 프로세스 주소 공간
- 코드 , 데이터 , 스택 으로 구성되는 자기 자신만의 독자적인 메모리 주소 공간을 가지고 있다. 이 주소 공간은 그 프로세스의 Context를 결정짓는 중요한 요소 중 하나이다.
- 커널 문맥
- 프로그램이 수행되어 프로세스가 되면 운영체제는 프로세스를 관리하기 위한 자료구조를 유지한다. PCB와 커널스택이 이에 해당한다.
💡 시스템 콜이 호출될 경우 커널은 프로세스마다 스택을 분리하여 저장한다.
프로세스의 상태
- 실행(running)
프로세스가 CPU 자원을 보유하고 기계어 명령을 실행하고 있는 상태를 말한다. 일반적인 컴퓨터 시스템에서는 CPU가 하나뿐이므로 멀티 프로세싱 환경이라 하더라도 실제로 실행상태에 있는 프로세스는 항상 하나뿐이다. - 준비(ready)
프로세스가 CPU만 보유하면 당장 명령을 수행할 수 있지만 CPU 자원을 획득하지 못한 상태 - 봉쇄(blocked)
CPU 자원을 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태를 말한다. I.O작업이 진행 중인 경우가 해당된다.
모든 프로세스는 위 상태 중 하나에 머물러 있으며 시간이 흐름에 따라 변하게 된다. 예를 들어 실행 상태에서 CPU의 제어권을 가지고 프로세스가 실행되는 중에 타이머 인터럽트가 발생하면 CPU 제어권이 OS로 이양된다. 그러면 OS는 타이머 인터럽트 처리 루틴으로 가서 수행 중이던 프로세스의 Context를 저장하고 준비 상태에 있는 프로세스 중 하나를 선택한다. 그러면 원래 수행중이던 프로세스는 준비 상태로 변하고 선택된 CPU가 실행 상태가 된다. 이렇게 문맥을 저장하고 새로운 프로세스가 문맥을 세팅하는 과정을 문맥 교환이라고 한다.
이외에도 실행 중인 프로세스가 I.O 요청을 할 경우 봉쇄 상태로 바뀌게 되며 다른 프로세스가 CPU를 할당받게 된다. 이렇게 프로세스가 준비/봉쇄 상태가 되고 새롭게 CPU를 할당받을 프로세스를 선택하여 제어권을 넘기는 과정을 CPU Dispatch라고 한다.
운영체제와 정보기술의 원리. 반효경 지음.
스레드(Thread)
스레드의 개념
프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위를 뜻한다. 모든 프로세스는 최소 하나 이상의 스레드를 갖고 있으며 프로세스와 함께 생성되는 첫 번째 스레드를 메인 스레드라고 한다.
스레드의 구성
각 스레드는 고유한 레지스터와 메모리 스택 영역을 프로세스로부터 할당받는다.
이외에 프로세스 내의 Data 힙 영역과 Code 섹션은 공유자원으로써 모든 스레드가 접근할 수 있다. 멀티 스레딩 환경에서도 마찬가지로 실제로 실행되는 스레드가 바뀔 때마다 Context Swtich로 인한 오버헤드가 발생하지만 프로세스에 비해 그 영역이 작기 때문에 비용이 적어 프로그램의 동시성이 필요할 경우에 많이 사용된다.
동시성 환경에서 멀티 프로세스 vs 멀티 스레드 고려사항
멀티 프로세스의 장점
- 구현이 비교적 쉽다.
- 하나의 프로세스 실패가 다른 프로세스에 영향을 미치지 않는다.
멀티 프로세스의 단점
- 프로세스 간 Context Switch 오버헤드가 크다.
- 공유자원이 없어 IPC를 통한 통신으로 데이터를 공유해야 하므로 효율성이 다소 떨어진다.
멀티 스레드 장점
- Context Switch의 오버헤드가 비교적 적다.
- 힙 영역을 공유하여 스레드 간 자원 공유가 간단하고 멀티 프로세스에 비해 효율적이다.
멀티 스레드의 단점
- 안정적인 멀티스레드 환경을 구축하는 것이 기술적으로 난도가 높은 편
- 디버깅이 까다롭다
구현 | 난도 | 효율성 | 장애 전파 |
멀티 프로세싱 | 상대적으로 쉬움 | 낮음 | 적음 |
멀티 스레딩 | 어려움 | 높음 | 높음 |