안녕하세요!

FE 개발자 유진주입니다.

CS/운영체제

Chapter3. 프로세스와 스레드

ypearl 2023. 4. 7. 15:29

프로세스(Process)란?

시스템에 의해 일거리의 단위로 명확하게 구분되는 작업의 대상

(*스레드와 차이 존재)

- 수행 중인 프로그램(A program in execution)

: 수행 중 (in execution): 어떤 일을 함을 나타내는 프로그램과 이때 필요한 값들을 저장하고 있는 처리기 레지스터, 스택 등의 데이터와 함께, 어느 정도 진행되었는지를 나타내는 PC 값 등으로 표현되어, 커널에 등록되어 있다는 것을 의미함.

- 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을

시스템으로부터 부여받은 능동적인 존재.

Program
Data

 

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

- 프로세스에 대한 모든 정보를 가진 자료구조

- 프로세스 생성 시에 만들어짐

- 프로세스 관리 = 해당 PCB에 대한 다양한 행동 (만들고, 수정하고, 관련 리스트로 연결하고, 지우고)

- PCB들은 메모리에 상주

 

- PCB에 저장되는 정보들

 

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

* 운영체제마다 조금씩 다를 수 있지만, 이 정도의 내용은 공통적이다.

 

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

: 프로세스가 만들어져 시스템에 존재하는 동안 여러 가지 사건들에 의해 일련의 상태 변화를 거치게 된다.

 

- 생성(Created) 상태

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

 

- 준비(Ready) 상태

: 운영체제는 프로세스를 생성한 후 메모리 공간을 검사하여 충분한 공간이 있으면 메모리를 할당하면서 준비 상태로 바꾸어준다. (그렇지 못할 경우 보류 준비 상태)

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

- 다중 프로그래밍 시스템의 경우 준비 상태의 여러 프로세스들은 메모리에 적재되어 있다. (CPU 할당을 기다림)

- 큐(또는 리스트) 사용.

- 준비 상태의 프로세스들은 순서에 따라 CPU를 할당받으면 실행 상태가 되는데

  이때 순서를 정하는 것CPU 스케줄링이라 부른다.

 

- 실행(Running) 상태

: CPU를 할당받아 실행 중인 상태

- 디스패치(Dispatch): 실행 단계에서 CPU를 할당하는 것

- 실행 상태의 프로세스는 CPU 스케줄링 정책에 의해 CPU를 뺏길 수 있고, 이 경우 준비 상태로 바뀐다.

(특히, 시간 할당량(Time Quantum)이 소진되어 뺏길 때시간 종료(Timeout)라고  함.

이 경우도 인터럽트가 동원되어 처리된다.)

- 과정 예) 실행 상태의 프로세스가 입출력이 필요하게 되어 시스템 호출을 하면 입출력 처리의 종료를 기다리면서

대기 상태로 바뀌게 되고 CPU는 바로 준비 상태의 프로세스들 중에서 하나를 선택해 실행해 줄 것.

 

- 대기(Blocked) 상태

: 프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고

 요청한 일이 완료되기를 기다리면서 대기하는 상태

(실행도중 당장 만족될 수 없는 어떤 일을 요구할 때 (대표 예. 입출력 I/O), 대기상태로 변한다.)

- 대기 상태 역시, 이들의 관리를 위해 큐(또는 리스트)가 사용됨

(요청한 일이 완료되면 다시 실행 차례를 기다리기 위해 준비 상태로 바뀌면서 준비 큐에 들어간다.)

 

- 보류 준비(Suspended Ready) 상태

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

예) 충분한 메모리 공간의 확보를 위해 준비 상태의 프로세스를 보류시킬 수밖에 없는 경우,

높은 우선순위의 보류 대기 상태 프로세스가 준비 상태가 되면서 실행 상태의 프로세스로부터 CPU를 뺏게 되는 경우

: 메모리의 여유가 생기거나, 준비 상태의 프로세스가 전혀 없을 때 (CPU를 할 일이 없게 놔두지 않기 위해)

  대기 상태의 프로세스를 보류 대기로 만들고 메모리 공간이 확보되면 준비 상태로 바뀌게 (Resume) 됨.

 

- 보류 대기(Suspended Blocked) 상태

: 대기 상태일 때 메모리 공간을 잃은 상태

- 준비 상태의 프로세스가 있었다고 하더라도 메모리의 여유 공간을 더 확보하기 위해서

  보류 대기 상태가 되기도 함.

- 특별한 경우가 아니면 입출력이나 기더리던 사건의 종료 시 보류 준비 상태가 된다.

 

- 종료(Terminated) 상태

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

- 할당되었던 모든 자원들이 회수되고 PCB만 커널에 남아있는 상태

- 운영체제가 시스템에 남겨져 있는 프로세스의 흔적들을 최종 정리 후,

PCB를 삭제하면 프로세스가 완전히 사라지게 된다.

 

<📌참고>

- 활성 상태(Active State): 준비, 실행, 대기 상태

ㄴ 실행될 프로그램과 데이터 등을 위해 메모리 공간의 일정량을 부여받았음(=메인 메모리에 올라와있음)을 의미

- 보류(Suspension): 메모리가 부족하거나 다른 이유에 의해 시스템이

                                활성 상태의 프로세스로부터 메모리를 회수하는 경우

   (이것의 반대를 재개(resume)이라 함.)

- 스와핑 (Swapping): Swapped Out (디스크로 나감) / Swapped In (메모리에 들어옴)

- 보류 상태의 필요일차적으로 메모리 공간의 확보이지만,

실행되는 프로세스의 현재 결과가 바라던 것이 아닌 오류가 보일 때, 시스템에 위해를 가할 수 있는 수상한 행동을 보일 때,

주기적인 일이라서 다음 주기의 실행 떄까지 메모리를 회수해도 문제되지 않을 때 등의 다른 이유로 필요하기도 하다.

 

<프로세스의 상태변화>

 

 

프로세스의 상태변화는 인터럽트에 의해 처리된다.

그러나 인터럽트 이전에 실행되던 프로세스가 인터럽트를 처리한 후에 계속 실행이 될 경우도 있지만,

다른 프로세스로 CPU가 할당되어 버릴 수도 있다.

예) 시간종료, 우선순위, 입출력 발생시킨 경우 등

 

문맥교환(Context Switching)

문맥교환을 위해 필요한 일의 양은 인터럽트 처리 전후의 프로세스가 같으냐, 다르냐에 따라 차이가 나게 되는데,

당연히 같을 때 해줄 일이 적다.

 

1) 모드 스위칭(Mode Switching) *모드 스위칭이라 하고,

- 인터럽트 처리 전후의 프로세스가 같은 경우.

- 사용자 모드에서 인터럽트 처리를 위해 커널모드로 바뀌고 처리가 끝나면 다시 사용자 모드로 바뀜

- 문맥 교환을 위해 필요한 일의 양이 2) 프로세스 스위칭 보다 작음

예) 입출력 완료 인터럽트 등

 

2) 프로세스 스위칭(Process Switching) *문맥교환이라 하기도 함

- 인터럽트 처리 전후의 프로세스가 달라지는 경우

- 문맥 교환을 위해 필요한 일의 양이 1) 모드 스위칭보다 많음

예) 시간 종료 인터럽트, 입출력 요청 등

 

 

스레드(Thread)란?

하는 일은 서로 다르지만 관련 있는 작은 일들이 모여 하나의 프로세스를 이룬다.

예) 인터넷 사이트 - 작은 동영상 재생, 입력 요구, 배경음악 등 

이것들이 전체적으로는 하나의 일 즉, 프로세스가 된다.

 

- 프로세스(process): 전체적인 하나의 일. 주소 공간 및 자원의 소유자

- 스레드(thread): 세분된 작은 일. 스케줄링의 단위

-> 한 프로세스에 속한 각각의 스레드들은 프로세스가 가지는 자원(주소공간 역시 자원)을 공유하면서,

각자는 자신의 실행 환경(프로그램 카운트, 스택, 레지스터 값들 등)을 따로 가지게 됨.

 

다중 스레딩(Multi-threading)

: 하나의 프로세스를 다수의 스레드로 만들어 실행하는 것

* 하나의 프로세스 내에 다수의 실행 단위들이 존재하여 작업의 수행에 필요한 자원들을 공유하기 때문에

  자원의 생성과 관리가 중복되는 것을 줄일 수 있다.

<In 멀티 스레딩에서>

■ 프로세스

- 보호와 자원의 할당 단위.

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

■ 스레드

- 스레드의 수행 상태(실행, 준비), 스레드 문맥, 실행 스택, 자신이 속한 프로세스가 가지는 메모리와 자원에 대한 접근 권한을 가짐

 

제어블록 (실행 중의 레지스터 값, 우선순위, 또는 스레드와 관련한 상태 정보 등을 위해 필요한 자료구조)

+스택

 

스레딩의 장점 (성능)

- 스레드를 생성, 제거, 스위칭에 소요되는 시간과 비용이 프로세스 단위보다 빠르고 저렴하다.

(관련된 작은 일 각각을 프로세스로 만드는 것보다 스레드로 만드는 것이 저렴)

- 한 프로세스 내의 스레드 간 통신은 메모리와 파일을 공유하기 때문에 커널의 개입 필요 X

(프로세스 간의 통신은 역시 커널의 개입을 필요로 함)

 

프로세스와 마찬가지로 스레드 역시 실행, 준비, 대기 등과 같은 상태를 가진다.

하지만, 보류(프로세스 레벨의 개념)는 X

- 대기: 레지스터 값, 프로그램 카운터, 스택 포인터 등의 보관 요구

- 종료: 해당 스레드의 레지스터 값들과 스택을 없애게 함

 

스레드 실행의 동기화

- 한 프로세스 내의 스레드들은 그 프로세스의 주소 공간과 자원들을 공유한다는 사실은

  특정 스레드가 변경시킨 내용이 다른 스레드에 바로 영향을 미침

- 프로세스의 주소 공간과 자원을 공유하는 스레드의 변경으로 인한 오류를 야기할 수 있는

  상호 간의 간섭이나 데이터의 파괴 등을 방지하기 위해 존재.(5장)

 

 

스레드의 종류

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

- 스레드 라이브러리(Library)(일종의 어플리케이션 프로그램)에 의해 관리.

  (=이 어플리케이션 프로그램이 생성부터 제거까지 스레드에 대한 모든 일을 담당)

ㄴ 스레드 라이브러리는 스레드의 생성, 소멸을 위한 코드와 스레드 간의 메시지나 데이터의 전달, 스레드의 스케줄링, 스레드 문맥의 보관, 재저장 등을 담당

- 스레드와 관련된 모든 행위(Activity)는 사용자 공간에서 이루어지므로 커널은 스레드의 존재를 알지 못함

- 특정 스레드의 실행에서 대기는 자신이 소속된 프로세스의 대기를 초래하며, 당시 실행 중이었던

  스레드는 지금은 실제로 실행 중이 아니지만 나중에 CPU가 다시 이 프로세스에게 할당되었을 때

  계속 실행해나갈 수 있도록 해준다.

- 스레드의 실행 중 해당 프로세스의 시간 초과가 될 경우 커널은 프로세스의 스위칭을 수행하며,

  당시 실행 중이던 스레드는 해당 프로세스가 CPU를 다시 받게 되면 다시 실행된다.

- 스레드 간의 스위칭 시 운영체제가 정한 스케줄링에 따를 필요가 없음

- 응용 별로 독자적인 스케줄링을 사용할 수 있으며 어떤 운영체제에서도 운영이 가능

- 커널은 특정 프로세스에 속한 스레드들 각자가 일으키는 행위를 그 스레드가 속한 프로세스의 행위로 인식

(= 스레드 내부적으로  블락 되었다 하더라도, 시스템(OS)은 프로세스 단위로 보기 때문에 프로세스가 블락된다.

스레드 내부에서 블락되었다는 세부적 내용은 스레드 라이브러리가 알고 있는 것.)

★ 가장 중요한 점: OS는 스레드를 모른다!

<단점>

- 특정 스레드의 대기가 자신이 소속된 프로세스 내의 모든 스레드들의 대기를 초래

- CPU가 프로세스 단위로 할당되기 때문에 다중처리의 환경이 주어진다 해도 스레드 단위의 다중처리가 되지 못한다는 점

 

■ 커널 레벨 스레드(Kernel Level Thread)

- 모든 스레드의 관리를 커널이 하는 경우

- 스케줄링은 커널에 의해 스레드 단위로 이루어지므로 사용자 레벨 스레드 때의 단점을 극복할 수 있음

ㄴ 다중처리의 환경일 경우 한 프로세스 내의 다수 스레드는 각각 처리기를 할당 받아 병렬(Parallel) 실행이 가능

ㄴ 한 스레드의 대기 시 같은 프로세스에 속한 다른 스레드로 스위칭이 가능

ㄴ 같은 프로세스에 속한 스레드 간의 스위칭에도 커널의 개입이 필요하다. (약간의 단점)

★ 가장 중요한 점: OS가 자체적으로 스레드까지 만들고 관리한다!

<참고>

단일처리 시스템의 경우에도 스레드를 만드는 것이 프로세스를 만드는 것보다

지간과 비용 측면 외에도 응용에 따라 전체 실행 시간도 단축할 수 있다는 장점 존재!

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

Chapter 6. 교착 상태(Deadlock)  (0) 2023.05.22
Chapter 5. 병행 프로세스와 동기화(1)  (0) 2023.04.14
Chapter 4. CPU 스케줄링  (1) 2023.04.12
Chapter2. 들어가기 전에 (인터럽트, I/O 방식)  (0) 2023.03.22
Chapter1. OS란?  (0) 2023.03.16