본문 바로가기
CS/운영체제

프로세스와 스레드

qbang 2021. 9. 24.

프로그램

어떤 작업을 위해 실행할 수 있는 파일이다.

 

프로세스

개념

컴퓨터에서 연속적으로 실행되고 있는 프로그램으로, 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있다. 

운영체제로부터 주소 공간, 파일, 메모리 등을 할당받으며 이것들을 모두 프로세스라고 부른다.

함수의 매개변수, 복귀 주소, 로컬 변수 등 임시 자료를 갖는 프로세스 스택과 전역 변수들을 저장하는 데이터 섹션을 포함한다. 또한, 프로세스 실행 중에 동적으로 할당되는 메모리인 힙을 포함한다.

 

구조

프로세스는 메인 스레드를 포함한 최소 1개의 스레드를 소유하고 있다. 프로세스는 자신만의 고유 공간과 자원을 할당받아서 사용하고 다른 프로세스의 변수나 자료구조에 접근할 수 없으나, 스레드는 다른 스레드와 공간 및 자원을 공유한다.

  • Code 영역은 코드 자체(프로그램 명령)를 구성하는 메모리 영역이다.
  • Data 영역은 전역 변수, 정적 변수, 배열 등을 저장한다. 추가로 초기화된 데이터는 data 영역에 저장하고, 초기화되지 않은 데이터는 bss 영역에 저장한다.
  • Heap 영역은 new()나 malloc 등 메모리를 동적으로 할당할 때 사용한다.
  • Stack 영역은 지역변수, 매개변수, 리턴 값 등을 저장하는 임시 메모리 영역이다. 

한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC; Inter-Process Communication)을 사용해야 한다.(ex. 파이프, 파일, 소켓 등 이용)

 

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

개념

프로세스 제어 블록은 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조이다.

운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB를 생성한다.

프로세스는 CPU를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB에 저장한다.

추후 다시 CPU를 할당받으면 PCB에 저장되어있던 내용을 불러와서 이전에 종료했던 시점부터 다시 작업을 수행한다.

 

PCB 저장 정보

  • 프로세스 식별자(Process ID, PID): 프로세스 식별번호
  • 프로세스 상태: new , ready, running, wating, terminated 등의 상태를 저장
  • 프로그램 카운터: 프로세스가 다음에 실행할 명령어의 주소
  • CPU 레지스터
  • CPU 스케줄링 정보: 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
  • 메모리 관리 정보: 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
  • 입출력 상태 정보: 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보: 사용된 CPU 시간, 시간제한, 계정 번호 등

 

스레드

스레드는 프로세스의 실행 단위이다.

한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있다.

스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성된다. 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다.

각 스레드는 별도의 레지스터와 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있으며. 한 스레드가 프로세스의 자원을 변경하면 다른 이웃 스레드()도 그 변경 결과를 즉시 볼 수 있다.

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상하는 것을 멀티스레딩이라고 한다. 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖는다.

 

각 스레드마다 스택 영역을 할당하는 이유

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소 값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것, 즉 독립적인 실행 흐름이 생기는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가시키기 위한 최소 조건으로 스택을 할당한다.

 

각 스레드마다 PC Register를 할당하는 이유

PC 값은 스레드가 어디까지 명령어를 수행하였는지를 나타낸다. 스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당하기 때문에 명령어가 어느 부분까지 수행되었는지 저장할 필요가 있어 PC 레지스터를 독립적으로 할당한다.

 

컨텍스트 스위칭(Context Switching)

프로세스의 스케줄링과 상태변화

스케줄링은 CPU는 하나인데 동시에 여러 프로세스가 실행되어야 할 때, 프로세스의 CPU 할당 순서 및 방법을 결정하는 것을 말한다.

프로세스는 Ready, Running, Blocked 상태를 지닌다. Running 상태인 프로세스는 더 우선순위가 높은 프로세스가 실행될 경우 Ready 상태가 되고, 우선순위가 높은 프로세스가 실행된다. Blocked 상태에 있는 프로세스는 스케줄러의 관심 밖에 있어 스케줄러에 의해 선택이 되지 않는 프로세스이다.

 

컨텍스트 스위칭

CPU 내에 존재하는 레지스터들은 현재 실행 중인 프로세스 관련 데이터들로 채워진다.

컨텍스트 스위칭은 실행 중인 프로세스가 변경될 때 프로세스가 가지고 있던 데이터들을 PCB에 저장하고, 새로운 프로세스가 아니라면 이전에 실행될 때 레지스터들이 가지고 있던 데이터들을 복구하는 것이다.

실행 중인 프로세스의 변경 과정에서 발생하는 컨텍스트 스위칭은 부하를 줄 수 있다. 프로세스는 각 독립된 메모리 영역을 할당받아 사용한다. 따라서 레지스터 개수가 많을수록, 프로세스 별로 관리되어야할 데이터의 종류가 많은 무거운 작업일수록 부하는 커진다.(ex. 캐시메모리 초기화)

컨텍스트 스위칭에 소요되는 시간을 줄이려면 저장하고 복원하는 컨텍스트 정보의 개수를 줄여야 한다.

 

메모리 구조 관점에서 본 프로세스와 스레드

자식 프로세스가 생성되고 난 다음 부모 프로세스의 핸들 테이블은 상속되지만 프로세스의 모든 것(Code/Data/Heap/Stack 영역)이 독립적으로 만들어진다.

따라서 프로세스 간 데이터를 주고 받기 위해서는 IPC가 필요한 것이다.

하지만 스레드를 생성하는 경우에는 스레드 만을 위한 Thread Stack 영역만 생성되고, 나머지 영역(Code/Data/Heap)은 부모 프로세스의 영역을 공유할 수 있다.

 

참고

'CS > 운영체제' 카테고리의 다른 글

가상메모리와 페이지 교체 알고리즘  (0) 2022.06.13
데드락(Dead-lock)  (0) 2021.10.04
[동기, 비동기] X [블로킹, 논블로킹]  (0) 2021.10.04

댓글