여름의 서재
[운영체제] 프로세스 & 스레드 본문
💡 프로세스
1. 프로그램 vs 프로세스
- 프로그램 : 저장장치에 저장되어 있는 정적인 상태
- 프로세스 : 프로그램이 실행을 위해 메모리에 올라온 동적인 상태 (= 프로그램 + 프로세스 제어 블록)
2. 프로세스의 5가지 상태
- 생성 상태 (created status)
: 프로세스가 메모리에 올라와 실행 준비를 완료한 상태, 프로세스 제어 블록이 생성됨
- 준비 상태 (running status)
: 실행을 기다리는 모든 프로세스가 자기 차례를 기다리는 상태, 실행될 프로세스를 CPU 스케줄러가 결정함.
* 디스패치 : 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업
- 실행 상태 (running status)
: 프로세스가 CPU를 할당받아 실행되는 상태
* timeout : 프로세스가 타임 슬라이스동안 작업을 끝내지 못하고 다시 준비 상태로 돌아가는 것 (실행 -> 준비)
* exit : 실행 상태 동안 작업이 완료되는 것 (실행 -> 완료)
* block : 실행 상태에 있는 프로세스가 입출력을 요청하면 실행됨. (실행 -> 대기)
- 대기 상태 (blocking status)
: 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태. 완료되면 준비 상태로 감.
- 완료 상태 (terminate status)
: 프로세스가 종료된 상태. 사용하던 모든 데이터와 메모리, 프로세스 제어 블록을 삭제함.
3. 휴식 상태와 보류 상태
- 휴식 상태
: 프로세스가 작업을 일시적으로 쉬고 있는 상태. (프로세스가 메모리에 있으나 멈춘 상태)
- 보류 상태
: 프로세스가 메모리에서 쫓겨나서 스왑영역에 있는 상태 (swap-out)
4. 프로세스 제어 블록과 문맥 교환
- 프로세스 제어 블록 (PCB)
: 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료 구조로, 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기된다.
- 포인터 : 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용.
- 프로세스 상태
- 프로세스 구분자 : 프로세스를 구별하기 위한 구분자
- 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값
- 프로세스 우선순위
- 레지스터 정보 : 프로세스가 실행되는 중에 사용하던 레지스터 값
- 메모리 관리 정보 : 프로세스의 메모리 위치 정보
- 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원, 오픈 파일 등에 대한 정보
- 문맥 교환
: 두 프로세스의 프로세스 제어 블록 및 이와 관련된 값들을 교환하는 작업을 말한다. 일반적으로 문맥 교환은 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생하고, 인터럽트가 걸렸을 때도 발생한다.
5. 프로세스의 구조
- 코드 영역 : 프로그램의 본문이 기술된 곳
- 데이터 영역 : 코드가 실행되면서 사용하는 변수나 파일들의 각종 데이터를 모아놓은 곳
- 스택 영역 : 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳
6. 프로세스의 생성과 복사
- fork() 시스템 호출
: 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
- 새로 가져오지 않고 기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
- 부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속할 수 있다.
- 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리할 수 있다.
- exec() 시스템 호출
: 기존의 프로세스를 새로운 프로세스를 전환하는 함수
- 이미 만들어진 프로세스 제어 블록, 메모리영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.
- 새로운 코드 영역만 가져오면 되기 때문에 운영체제의 작업이 수월하다.
7. 프로세스의 계층 구조
: 부모 프로세스를 복사하여 자식 프로세스를 만드는 방법으로 프로세스끼리 계층구조를 갖는 것.
- 하드디스크로부터 프로그램을 새로 가져오지 않고 기본 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
- 모든 프로세스를 부모-자식 관계로 만들면 자식 프로세스가 작업을 마쳤을 때 사용하던 자원을 부모 프로세스가 회수하면 된다.
- 고아 프로세스
: 프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스. 부모 프로세스가 자식보다 먼저 죽는 경우 발생.
- 좀비 프로세스
: 자식 프로세스가 종료 했음에도 부모가 뒤처리를 하지 않을 때 발생.
💡 스레드
1. 스레드
: CPU 스케줄러가 CPU에 전달하는 일 하나를 스레드라고 하며, 하나의 프로세스에는 여러개의 스레드가 존재하기도 한다.
2. 스레드 관련 용어
- 멀티스레딩
: 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 기법
- 멀티 프로세스
: 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
- 멀티태스킹
: 운영체제가 CPU에 작업을 줄때 시간을 잘게 나누어 배분하는 기법
- 멀티프로세싱
: CPU를 여러개 사용하여 여러개의 스레드를 동시에 처리하는 작업환경
- CPU 멀티스레드
: 한번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법
3. 멀티스레드의 장단점
- 장점
- 응답성 향상 : 한 스레드가 입출력으로 인해 작업이 진행되지 않더라고 다른 스레드가 작업을 계속하여 작업 요구에 빨리 응답
- 자원 공유 : 프로세스 내에서 독립적인 스레드들이 프로세스가 가진 자원을 모두 공유하게 되어 작업을 원할하게 진행, 불필요한 자원의 중복을 막음으로써 시스템 효율이 향상
- 다중 CPU 지원 : 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증라하고 프로세스의 처리 시간 단축
- 단점
- 하나의 스레드가 문제가 생기면 전체 프로세스에 영향을 미친다.
- 자원 하나를 여러 스레드가 공유하기 때문에 동기화 문제가 발생한다.
4. 멀티스레드 모델
- 사용자 스레드 (1 to N)
: 라이브러리에 의해 구현된 일반적인 스레드
- 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥교환이 필요 없음.
- 여러 개의 스레드가 하나의 커널 스레드와 연결되기 때문에 커널 스레드가 대기상태가 되면 모든 사용자 스레드가 같이 대기하게 됨.
- 여러개의 CPU 동시에 사용 불가
- 커널 스레드 (1 to 1)
: 커널이 직접 생성하고 관리하는 스레드
- 멀티 CPU 사용 가능
- 하나의 스레드가 대기상태에 있어도 다른 스레드는 작업을 계속할 수 있음.
- 보안에 강하고 안정적으로 작동
- 문맥교환을 할때 오버헤드 때문에 느리게 작동
- 멀티레벨 스레드 (M to N)
: 사용자 스레드와 커널 스레드를 홉합한 방식
- 멀티 스레드 vs 멀티 프로세스
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 안고 있다. 반면 멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재한다. 이 두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야 하는 시스템에 따라 적합/부적합이 구분된다. 따라서 대상 시스템의 특징에 따라 적합한 동작 방식을 선택하고 적용해야 한다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 가상 메모리 관리 (0) | 2021.12.09 |
---|---|
[운영체제] 가상 메모리의 기초 (0) | 2021.12.09 |
[운영체제] 물리 메모리 관리 (0) | 2021.12.09 |
[운영체제] 프로세스 동기화 (0) | 2021.12.02 |
[운영체제] CPU 스케줄링 (0) | 2021.12.01 |