김주균 저자의 OS? Oh Yes - 누워서 보는 운영체제 이야기를 토대로 개인적으로 정리를 한 것 입니다. 어느 상업적인 목적으로 작성하지 않았음을 알립니다.

동시에 CPU라는 자원을 분배해 주어야 하는 대상이 되는 작업들은 시스템에 의해 일거리의 단위 서로 명확하게 구분이 되어야 하는데 이것을 프로세스 라 부른다.
스레드 라는 개념이 사용되면서 CPU를 할당받게 되는 단위에 변동이 생긴다.


1. Process(프로세스)

수행 중인 프로그램 - program in exceution
다시 말해 프로세스란 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 능동적인 존재이다.


1.1 프로세스 제어블록(Process Control Block, PCB)

  • 테이블 모양의 자료구조를 가지고 있다.
  • 프로세스하나가 만들어진다. -> PCB 하나가 만들어진다.

1.1.1 정보

이름 설명
프로세스 번호(Process Identification Number, PID) 프로세스의 고유한 정수 번호이며 다른 프로세스와의 구별을 위해 사용된다.
프로세스의 상태(Status) 준비, 실행, 대기, 보류 등의 상태를 나타내며 다음 절에서 설명한다.
프로세스의 우선순위(Priority) 스케줄링을 할 때 사용되는 우선순위이다.
프로그램 카운터 값 다음에 실행될 명령어의 주소 값을 가지고 있다.
메모리 포인터 프로그램과 데이터가 저장되어 있는 메모리 블록위치와, 공유되는 메모리 블록들에 대한 포인터를 포함하고 있다.
문맥 데이터 문맥교환 시에 CPU 레지스터 값들을 저장하는 영역이다.
할당받은 자원들에 대한 목록 개방(Open)한 파일 등 할당받은 자원들의 정보이다.
계정정보(Accounting Information) CPU를 사용한 시간 들의 정보이다.
입출력 정보 진행 중인 입출력 요구 등의 정보이다.

1.2 프로세스의 상태(Process State)와 변화

  • 생성 상태, 준비 상태, 실행 상태, 대기 상태, 보류 준비 상태, 보류 대기 상태, 종료 상태 등이 있다.

프로세스 과정


1.2.1 생성 상태

사용자 가 요청한 작업이 커널에 등록되고 PCB가 만들어져 프로세스가 만들어진 다음 준비나 보류 준비 상태로 되기 위해 잠시 거치는 상태

  • 운영체제는 프로세스를 생성한 후 메모리 공간을 검사하여 충분한 공간이 있으면 메모리를 할당 하면서 준비상태로 바꾸어주고 , 그렇지못한 경우 보류 준비상태로 만든다. (시스템에 따라 점선 부분을 빼는 경우가 있다.)

1.2.2 준비 상태

CPU를 할당받기 위해 기다리고 있는 상태 즉, CPU만 주어지면 바로 실행할 준비가 되어있는 상태

  • 다중 프로그래밍 시스템의 경우 준비 상태의 여러 프로세스들은 메모리에 적재되어 있으며 CPU를 할당받기를 기다리고 있다.
  • 큐(또는 리스트)가 사용된다.
  • 순서를 정하는 것을 CPU 스케줄링이라고 부른다

1.2.3 실행 상태

CPU를 할당받아 실행 중인 상태, 이때 CPU를 할당하는 것을 디스패치(Dispatch) 라고 부른다.

  • 실행 상태의 프로세스는 CPU 스케줄링 정책에 의해 CPU를 뺏길 수 있으며 이 경우 준비 상태로 바뀌게 된다.
  • 시간 할당량이 소진되어 뺏길 때는 시간종료라고 하는데 이 경우도 인터럽트 가 동원되어 처리된다.
  • 프로세스가 입출력이 필요하게 되어 시스템 호출을 하면 입출력 처리의 종료를 기다리면서 대기 상태로 바뀌게 되고 CPU는 바로 준비 상태의 프로세스들 중에서 하나를 실행한다.

1.2.4 대기 상태

프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보 될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료 되기를 기다리면서 대기하는 상태.

  • 이들의 관리를 위해 큐(또는 리스트)가 사용된다.
  • 요청한 일이 완료되면 다시 실행 차례를 기다리기 위해 준비 상태로 바뀌면서 준비 큐에 들어간다.

1.2.5 종료 상태

프로세스가 종료될 때 아주 잠시 거치는 상태.

  • 모든 자원들이 회수, PCB만 커널에 남아있는 상태
  • 운영체제가 시스템에 남겨져 있는 이 프로세스의 흔적들을 최종 정리 후 PCB를 삭제하면 프로세스가 완전히 사라짐.

1.2.6 보류 상태

한정된 메모리 공간의 여유가 없어지게 되면 시스템은 당분간 메모리를 회수해도 문제가 되지 않을 프로세스들을 골라 보류시켜 메모리 공간을 확보하게 된다.

  • 메모리 공간을 뺏기고 디스크로 나가는 것 - 스왑되어 나간다(Swapped Out)
  • 나중에 다시 메모리로 들어오는 것 - 스왑되어 들어온다.(Swapped In)
  • 두 개를 통틀어 스와핑(Swapping)이라 부른다.

1.2.6.1 보류 준비 상태

생성된 프로세스가 바로 메모리를 받지 못할 때나, 준비 또는 실행 상태에서 메모리를 잃게 될 때를 위해 필요하다.

  • 실행 상태의 프로세스가 CPU를 반남하면서 준비 상태로 바뀔 때 메모리 공간까지 잃어야 하는 경우라면 보류 준비 상태로 바뀌게 된다.
  • 메모리의 여유가 생기거나 또는, 준비 상태의 프로세스가 전혀 없을 때 대기 상태의 프로세스를 보류 대기로 만들고 메모리 공간이 확보되면 준비 상태로 바뀌게 된다.

1.2.6.2 보류 대기 상태

대기 상태일 때 메모리 공간을 잃은 상태이다.

보류 상태의 필요는 일차적으로 메모리 공간의 확보이지만 다른 이유 때문에 필요하기도 하다.

  • 현재 결과가 바라던 것이 아닌 오류가 보일 때
  • 시스템에 위해를 가 할 수 있는 수상한 행동을 보일 때
  • 주기적인 일이라서 다음 주기의 실행 때까지 메모리를 회수해도 문제되지 않을 때 등

2 스레드(Thread)

큰 틀은 프로세스로, 세분된 작은 일 하나하나는 스레드라 부른다. 프로세스는 부여된 자원의 소유자로서, 스레드는 스케줄링의 단위로서 존재하게 된다.

  • 다중 스레딩(Multi-threading)이란 하나의 프로세스를 다수의 스레드로 만들어 실행하는 것을 말한다. 작업의 수행에 필요한 자원들을 공유하기 때문에 자원의 생성과 관리가 중복되는 것을 줄일 수 있다.

2.1 다중 스레딩에서 프로세스란

프로세스의 코드와 데이터를 수용하기 위한 가상주소 공간과 CPU, 다른 프로세스들의 파일들, 입출력에 사용되는 자원에 대한 보호된 액세스를 보장하기 위한 단위

  • 동시에 프로세스의 정보인 PCB와 사용자 주소 공간은 공유함으로써 결과적으로 자신이 속한 프로세스의 상태와 자원들은 자연스럽게 공유

스레드의 가장 큰 장점은 성능 측면에서 있다. - 스위칭에 소요되는 시간과 비용이 프로세스 단위로 이루어질 때 보다 빠르고 저렴하다.

2.2 스레드의 상태와 동기화(Synchronization)

프로세스와 마찬가지로 스레드 역시 실행, 준비, 대기와 같은 상태를 사지며, 다만 보류는 프로세스 레벨의 개념이므로 스레드에서는 필요 없는 상태이다.

2.2.1 사용자 레벨 스레드(User Level Thread)

스레드 라이브러리에 의해 관리 되며, 스레드와 관련된 모든 행위는 사용자 공간에서 이루어지므로 커널은 스레드의 존재를 알지 못한다. 즉 커널은 특정 프로세스에 속한 스레드들 각자가 일으키는 행위를 그 스레드가 속한 프로세스의 행위로 인식

  • 스레드 스위칭에 커널의 개입이 필요 없음.
  • 스레드 간의 스위칭은 라이브러리에 있는 스위칭 프로그램에 의해 결정
  • 단점 : 특정 스레드의 대기가 자신이 소속된 프로세스 내의 모든 스레드들의 대기를 초래 하며, CPU가 프로세스 단위로 할당되기 때문에 다중처리의 환경이 주어진다 해도 스레드 단위의 다중처리가 되지 못한다.

2.2.2 커널 레벨 스레드(Kervel Level Thread)

모든 스레드의 관리를 커널이 하는 경우. 사용자 레벨 스레드 때의 단점을 극복할 수 있다.

  • 다중 처리의 환경일 경우 한 프로세스 내의 다수 스레드는 각각 처리기를 할당 받아 병렬 실행이 가능하며, 한 스레드의 대기 시 같은 프로세스에 속한 다른 스레드로 스위칭이 가능하다. 반면에, 같은 프로세스에 속한 스레드 간의 스위칭에도 커널의 개입이 필요하므로 모드 스위칭이 요구된다.