3.1 프로세스란?
- 프로세스 : 수행 중인 프로그램, 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 능동적인 존재
- 프로세스 제어 블록(PCB) : 프로세스가 시스템에서 존재하는 형태, 프로세스 하나가 만들어진다는 것은 프로세스에 대한 모든 것을 표현하는 PCB하나가 만들어진다는 것, 기본적으로 메모리에 저장
- PCB에 저장되는 정보
- 프로세스 번호(PID) : 프로세스의 고유한 정수 번호이며 다른 프로세스와의 구별을 위해 사용
- 프로세스의 상태(Status) : 준비, 실행, 대기, 보류 등의 상태를 나타낸다.
- 프로세스 우선순위(Priority) : 스케줄링을 할 때 사용되는 우선순위
- 프로그램 카운터 값 : 다음에 실행될 명령어의 주소 값을 가지고 있다.
- 메모리 포인터 : 프로그램과 데이터가 저장되어 있는 메모리 블록 위치와 공유되는 메모리 블록들에 대한 포인터를 포함하고 있다.
- 문맥 데이터 : 문맥교환 시에 CPU 레지스터 값들을 저장하는 영역
- 할당받은 자원들에 대한 목록 : 개방한 파일 등 할당받은 자원들의 정보
- 계정 정보 : CPU를 사용한 시간 등의 정보
- 입출력 정보 : 진행 중인 입출력 요구 등의 정보
- 프로세스의 상태와 변화
- 생성 상태 : 사용자가 요청한 작업이 커널에 등록되고 PCB가 만들어져 프로세스가 만들어진 다음 준비나 보류 준비 상태로 되기 위해 잠시 거치는 상태, 프로세스를 생성한 후 메모리 공간을 검사하여 공간이 있으면 준비 상태 아니면 보류 준비 상태
- 보류 준비 상태 : 생성 상태로부터 일단 보류 준비 상태로 바뀌는 한 가지 변화만 있다는 의미. 메모리 공간 없을 때.
- 준비 상태 : CPU를 할당받기 위해 기다리고 있는 상태. 다중 프로그래밍 시스템의 경우 준비 상태의 여러 프로세스들은 메모리에 적재되어 있으며 CPU를 할당받기를 기다리고 있는데 이를 위해 큐나 리스트가 사용. 준비 상태의 프로세스들이 순서에 따라 CPU를 할당(CPU 스케줄링) 받으면 실행 상태가 된다.
- 실행 상태 : CPU를 할당받아(dispatch) 실행 중인 상태, 실행 상태의 프로세스는 CPU스케줄링 정책에 의해 CPU를 뺏길 수 있고 이 경우 준비 상태로 바뀐다. 특히 시간 할당량이 소진되어 뺏길 때를 시간 종료라고 하는데 이 경우도 인터럽트가 동원되어 처리된다. 혹은 실행 상태의 프로세스가 입출력이 필요하게 되어 시스템 호출을 하면 입출력 처리의 종료를 기다리면서 대기 상태로 바뀌고 CPU는 바로 준비 상태의 프로세스들 중에서 하나를 선택해 실행해줄 것이다.
- 대기 상태 : 프로세스가 실행되다가 입출력 처리를 요청하거나 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료되기를 기다리면서 대기하는 상태. 대기 상태의 프로세스들도 큐나 리스트가 사용된다. 요청한 일이 완료되면 다시 실행 차례를 기다리기 위해 준비 상태로 바뀌면서 준비 큐에 들어간다.
- 종류 상태 : 프로세스가 종료될 때 잠시 거치는 상태, 이 상태의 프로세스는 할당되었던 모든 자원들이 회수되고 PCB만 커널에 남아있는 상태, 운영체제가 시스템에 남겨져 있는 이 프로세스의 흔적들을 최종 정리 후 PCB를 삭제하면 프로세스가 완전히 사라진다.
- 보류 상태 : 메모리가 부족하거나 다른 이유에 의해 시스템은 활성 상태의 프로세스로부터 메모리를 회수한 상태, 프로세스가 메모리 공간을 뺏기고 디스트로 나간 후 다시 들어오는 것을 스와핑이라 부른다.
- 보류 준비 상태 : 생성된 프로세스가 바로 메모리를 받지 못할 때, 준비/실행 상태에서 메모리를 잃게 될 때를 위해 필요. 보류 준비 상태의 프로세스는 메모리의 여유가 생기거나 준비 상태의 프로세스가 전혀 없을 때 대기 상태의 프로세스를 볼 대기로 만들고 메모리 공간이 확보되면 준비 상태로 바뀌어 스와핑이 일어난다.
- 보류 대기 상태 : 대기 상태일 때 메모리 공간을 잃은 상태, 준비 상태의 프로세스가 있었다고 하더라도 메모리의 여유 공간을 더 확보하기 위해서 보류. 대기 상태가 되기도 한다.
3.2 스레드란?
- 큰 틀 = 프로세스, 세분된 작은 일 = 스레드
- 프로세스는 부여된 자원의 소유자로 존재, 스레드는 스케줄링의 단위로서 존재하는 동시에 프로세스가 가지는 자원을 공유하면서 각자는 자신의 실행 환셩을 따로 가진다.
- 다중 스레딩 : 하는의 프로세스를 다수의 스레드로 만들어 실행하는 것. 자원의 생성과 관리가 중복되는 것을 줄일 수 있다.
- 프로세스 : 보호와 자원의 할당 단위
- 다수개의 스레드 : 스레드의 수행상태와 실행상태가 아닐 경우를 위한 스레드 문맥, 각자의 실행 스택, 자신이 속한 프로세스가 가지는 메모리와 자원에 대한 접근 권한을 가진다.
- 스레드는 자신의 제어 블록과 스택을 가진다. 프로세스의 정보인 PCB와 사용자 주소 공간을 공유함으로써 자신이 속한 프로세스의 상태와 자원들은 자연스럽게 공유
- 한 스레드에 의해 메모리의 데이터가 변경될 경우 다른 스레드들은 변경된 데이터를 사용하게 되며 열린 파일은 다른 스레드들에게도 열린 상태로 사용된다.
- 스레드의 장점 : 성능 측면에서 스위칭에 소요되는 시간과 비용이 프로세스 단위로 이루어질 때보다 빠르고 저렴하다. 스레드 간 통신은 메모리와 파일을 공유하기 때문에 커널의 개입이 필요없다.
- CPU 스위칭을 위한 스레드 단위의 자료는 유지되어야 하며, 프로세스 단위로 행해지는 보류, 종료 등은 해당 프로세스에 속하는 전체 스레드에 동일한 영향을 미친다.
- 스레드는 프로세스와 마찬가지로 실행, 준비, 대기와 같은 상태를 가지지만 보류는 프로세스 레벨의 개념이므로 스레드에서는 필요 없는 상태. 대기는 레지스터 값, 프로그램 카운터, 스택 포인터 등의 보관이 요구, 종료는 해당 스레드의 레지스터 값들과 스택을 없앤다.
- 스레드는 상호 영향을 미치므로 오류를 야기할 수 있는 간섭이나 데이터 파괴 등을 방지하기 위한 스레드 실행의 동기화가 요구된다.
- 스레드의 종류
- 사용자 레벨 스레드 : 스레드 라이브러리에 의해 관리. 커널은 스레드의 존재를 알지 못한다.
- 커널은 특정 프로세스에 속한 스레드들 각자가 일으키는 행위를 그 스레드가 속한 프로세스의 행위로 인식한다. 스레드 라이브러리는 스레드의 생성, 소멸을 위한 코드와, 스레드 간의 메시진나 데이터의 전달, 스레드의 스케줄링, 스레드 문맥의 보관, 재 저장 등을 담당한다.
- 특정 스레드의 실행에서 대기는 자신이 소속된 프로세스의 대기를 초래한다.
- 스레드 스위칭에 커널의 개입이 필요없고 스레드 간의 스위칭 시 운영체제가 정한 스케줄링에 따를 필요가 없다.
- 다중처리의 환경이 주어진다 해도 스레드 단위의 다중처리가 되지는 못한다.
- 커널 레벨 스레드 : 커널이 모든 스레드를 관리.
- 스케줄링은 커널에 의해 스레드 단위로 이루어져 특정 스레드의 실행에서 대기가 발생해도 전체 프로세스가 대기하지 않는다.
- 다중처리 환경일 경우 한 프로세스 내의 다수 스레드는 각 처리기를 할당 받아 병렬 실행이 가능하며 한 스레드의 대기 시 같은 프로세스에 속한 다른 스레드로 스위칭이 가능하다.
- 같은 프로세스에 속한 스레드 간의 스위칭에도 커널의 개입이 필요하므로 모드 스위칭이 요구된다.
- 사용자 레벨 스레드 : 스레드 라이브러리에 의해 관리. 커널은 스레드의 존재를 알지 못한다.