-
# 02. 프로세스와 스레드전공 지식/OS 2022. 8. 7. 02:32
1. 프로세스란 무엇일까?
프로세스는 무엇일까? 많은 사람들이 프로세스를 정의할 때 가장 많이 언급하는 것은 수행중인 프로그램(A program in execution) 이다. 이 말은 디스크와 같은 보조기억 장치에 단순히 저장되어 있는 프로그램은 프로세스가 아니라는 말과 같다. in execution 하지 않기 때문이다.
프로세스란
- 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태.
- 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 능동적인 존재.
- 실행중에 있는 프로그램(Program)이다.
잘 읽어봐라 다 똑같은 뜻이다.
1.1 프로세스 제어블록(Process Control Block, PCB)
- 프로세스가 만들어져 없어질 때까지 PCB라는 테이블 모양의 자료구조를 가지고 있다.
- 프로세스가 하나 만들어진다 라는 것은 PCB가 하나 만들어진다랑 같은 뜻이다.
- 운영체제가 프로세스를 관리한다는 것은 이런 PCB를 생성, 수정, 삭제 등등 한다고 보면 된다.
- PCB는 다음과 같은 것들이 저장되어 있다.
프로세스 번호(Process Identification Number, PID) 프로세스의 고유한 정수 번호이며 다른 프로세스와의 구별을 위해 사용된다. 프로세스의 상태(Status) 준비, 실행, 대기, 보류 등의 상태를 나타내며 다음 절에서 설명한다. 프로세스의 우선순위(Priority) 스케줄링을 할 때 사용되는 우선순위이다. 프로그램 카운터 값 다음에 실행될 명령어의 주소 값을 가지고 있다. 메모리 포인터 프로그램과 데이터가 저장되어 있는 메모리 블록위치와, 공유되는 메모리 블록들에 대한 포인터를 포함하고 있다. 문맥 데이터 문맥교환 시에 CPU 레지스터 값들을 저장하는 영역이다. 할당받은 자원들에 대한 목록 개방(Open)한 파일 등 할당받은 자원들의 정보이다. 계정정보(Accounting Information) CPU를 사용한 시간 들의 정보이다. 입출력 정보 진행 중인 입출력 요구 등의 정보이다. 1.2 프로세스의 상태(Process State)와 변화
- 생성 상태
- 사용자 가 요청한 작업이 커널에 등록되고 PCB가 만들어져 프로세스가 만들어진 다음 준비나 보류 준비 상태로 되기 위해 잠시 거치는 상태이다.
- 운영체제는 프로세스를 생성한 후 메모리 공간을 검사하여 충분한 공간이 있으면 메모리를 할당 하면서 준비상태로 바꾸어주고, 그렇지못한 경우 보류 준비상태로 만든다.
- 준비 상태
- CPU를 할당받기 위해 기다리고 있는 상태 즉, CPU만 주어지면 바로 실행할 준비가 되어있는 상태이다.
- 다중 프로그래밍 시스템의 경우 준비 상태의 여러 프로세스들은 메모리에 적재되어 있으며 CPU를 할당받기를 기다리고 있다.
- 큐(또는 리스트)가 사용된다.
- 순서를 정하는 것을 CPU 스케줄링이라고 부른다
- 실행 상태
- CPU를 할당받아 실행 중인 상태, 이때 CPU를 할당하는 것을 디스패치(Dispatch) 라고 부른다.
- 실행 상태의 프로세스는 CPU 스케줄링 정책에 의해 CPU를 뺏길 수 있으며 이 경우 준비 상태로 바뀌게 된다.
- 시간 할당량이 소진되어 뺏길 때는 시간종료라고 하는데 이 경우도 인터럽트가 동원되어 처리된다.
- 프로세스가 입출력이 필요하게 되어 시스템 호출을 하면 입출력 처리의 종료를 기다리면서 대기 상태로 바뀌게 되고 CPU는 바로 준비 상태의 프로세스들 중에서 하나를 실행한다.
- 대기 상태
- 프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보 될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료 되기를 기다리면서 대기하는 상태이다.
- 이들의 관리를 위해 큐(또는 리스트)가 사용된다.
- 요청한 일이 완료되면 다시 실행 차례를 기다리기 위해 준비 상태로 바뀌면서 준비 큐에 들어간다.
- 종료 상태
- 프로세스가 종료될 때 아주 잠시 거치는 상태.
- 모든 자원들이 회수, PCB만 커널에 남아있는 상태
- 운영체제가 시스템에 남겨져 있는 이 프로세스의 흔적들을 최종 정리 후 PCB를 삭제하면 프로세스가 완전히 사라짐.
- 보류 상태
- 한정된 메모리 공간의 여유가 없어지게 되면 시스템은 당분간 메모리를 회수해도 문제가 되지 않을 프로세스들을 골라 보류시켜 메모리 공간을 확보하게 된다.
- 메모리 공간을 뺏기고 디스크로 나가는 것 - 스왑되어 나간다(Swapped Out)
- 나중에 다시 메모리로 들어오는 것 - 스왑되어 들어온다.(Swapped In)
- 두 개를 통틀어 스와핑(Swapping)이라 부른다.
- 보류 준비 상태
- 생성된 프로세스가 바로 메모리를 받지 못할 때나, 준비 또는 실행 상태에서 메모리를 잃게 될 때를 위해 필요하다.
- 실행 상태의 프로세스가 CPU를 반남하면서 준비 상태로 바뀔 때 메모리 공간까지 잃어야 하는 경우라면 보류 준비 상태로 바뀌게 된다.
- 메모리의 여유가 생기거나 또는, 준비 상태의 프로세스가 전혀 없을 때 대기 상태의 프로세스를 보류 대기로 만들고 메모리 공간이 확보되면 준비 상태로 바뀌게 된다.
- 보류 대기 상태
- 대기 상태일 때 메모리 공간을 잃은 상태이다.
- 보류 상태의 필요는 일차적으로 메모리 공간의 확보이지만 다른 이유 때문에 필요하기도 하다.
- 현재 결과가 바라던 것이 아닌 오류가 보일 때.
- 시스템에 위해를 가 할 수 있는 수상한 행동을 보일 때.
- 주기적인 일이라서 다음 주기의 실행 때까지 메모리를 회수해도 문제되지 않을 때 등
2. 스레드란 무엇일까?
스레드(Thread)는 프로세스 내부의 작업의 흐름, 단위이다. 따라서 스레드는 한 프로세스 내부에 적어도 하나 존재한다.
예를 들어보자. 쇼핑몰 웹사이트 메인 화면을 보았을 때, 작은 동영상이 한쪽에서 돌아가고 있고, 물건의 가격이 나와 있는 부분이 있고 옆에는 다른 광고 배너 창이 하나 있다. 이런 것들이 전체적으로 모여 하나의 프로세스를 이루는 것이다. 이런 작은 일들을 각각 하나의 실행단위로 세분화하여 관리하면 훨씬 더 쉽게 관리할 수 있다. 따라서 큰 틀은 프로세스로, 세분된 작은 일 하나하나는 스레드라 부른다. 프로세스는 부여된 자원의 소유자로서, 스레드는 스케줄링의 단위로서 존재하게 된다.
2.1 다중 스레드
- 스레드(thread)가 여러개 존재하는것을 다중스레드(Mulitread)라고 한다. 다중스레드에서 각 스레드끼리는 프로세스의 일정 메모리 영역을 공유한다. 작업의 수행에 필요한 자원들을 공유하기 때문에 자원의 생성과 관리가 중복되는 것을 줄일 수 있다.
2.2 스레드를 사용하는 이유
- 스레드를 만들고 없애고 스위칭에 소요되는 시간이 프로세스 단위로 이루어질 때보다 빠르고 저렴하다. 단일 프로세서 상황에서 시간적 이점은 없을 수 있지만(스레드를 여러개로 나누나 프로세스 하나로 처리하나 똑같음), 활용에 따라 시간을 단축할 수도 있다.
- 일정 메모리 영역을 공유 하기 때문에 동일한 프로세스 내부의 스레드 간 문맥전환(context switching) 할 때가, 프로세스 끼리 문맥전환(context switching)을 할때보다 빠르다. 상대적으로 스위치 해야 할 메모리 영역이 적기 때문이다. 즉 스위칭에 소요되는 시간과 비용이 프로세스 단위로 이루어질 때 보다 빠르고 저렴하다. (위에랑 같은 말)
- 데이터 통신 : 프로세스 간의 통신은 커널 개입을 필요로 하지만, 한 프로세스 내의 스레드 간 통신은 자원을 공유하므로 커널의 개입이 필요하지 않다.
- 프로그램을 여러 개의 스레드로 구현하여 시간과 비용을 줄일 수 있다.
2.3 스레드의 구성
단일 스레드와 다중 스레드 - 스레드는 자신의 제어 블록과 스택을 가진다.
- 동시에 프로세스의 정보인 PCB와 사용자 주소 공간을 공유한다. 자신이 속한 프로세스의 상태와 자원들은 자연스럽게 공유된다.
2.4 스레드의 상태와 동기화(Synchronization)
프로세스와 마찬가지로 스레드 역시 실행, 준비, 대기와 같은 상태를 가지며, 다만
보류는 프로세스 레벨의 개념이므로 스레드에서는 필요 없는 상태이다. 한 프로세스 내의 스레드들은 그 프로세스의 주소 공간과 자원을 공유한다. 이는 특정 스레드가 변경시킨 내용이 다른 스레드에 바로 영향을 미친다. 따라서 오류를 야기할 수 있는 상호 간섭을 방지하기 위해 스레드 실행의 동기화가 요구된다. 이 문제는 프로세스 간의 동기화에서 발생하는 문제 및 해결책과 동일하다.2.5 스레드의 종류 (사용자 레벨, 커널 레벨, 혼합)
(1) 사용자 레벨 스레드 (User Level Thread)
- 커널은 스레드의 존재를 모른다.
- 커널은 프로세스만 보인다. → 스레드 각자가 일으키는 행위를 프로세스의 행위로 인식한다.
- 스레드에 대한 모든 관리는 스레드 라이브러리가 한다.
- 특정 스레드의 대기 : 자신이 소속된 프로세스의 대기를 초래한다.
- 스레드의 실행 : 커널이 프로세스 스위칭을 수행해도 당시 실행 중이던 스레드는 라이브러리에 의해 실행 상태라고 표시되었다가 다시 CPU를 받으면 다시 실행된다.
- 장점
- 사용자 레벨 스레드는 스레드 스레드 스위칭에 커널의 개입이 필요하지 않다. 즉 유저 → 커널, 커널 → 유저 두 번의 모드 스위칭이 필요하지 않다.
- 어떤 운영체제에서도 운영이 가능하다. 스레드간의 스위칭은 운영체제의 스케줄링을 따르지 않고 라이브러리를 따르기 때문이다.
- 단점
- 특정 스레드의 대기가 자신이 소속된 프로세스 내의 모든 스레드 대기를 초래한다.
- CPU가 프로세스 단위로 할당되므로 스레드 단위의 다중처리가 불가능하다.
- 여러 스레드가 다른 CPU를 할당받아 동시에 실행될 수 없다.
(2) 커널 레벨 스레드(Kervel Level Thread)
- 모든 스레드의 관리를 커널이 한다.
- 장점
- 한 스레드가 대기할 경우, 다른 스레드로 스위칭이 가능하다.
- 스레드 단위의 다중처리가 가능하다.
- 다중처리 환경일 경우에도 병렬 실행이 가능하다.
- 단점
- 스레드 스위칭에 커널이 개입하므로, 모드 스위칭이 요구된다. (인터럽트 처리)
(3) 혼합 스레드
- 커널이 모든 스레드를 보고 있다.
- 커널이 매번 스레드 스위칭에 개입하면 부담이 되니
- 자잘한 일들은 스레드 라이브러리가 보조하도록 한다.
- 스레드 라이브러리가 커널 레벨의 스레드를 또 쪼갤 수 있는데, 이 경우 커널은 하나의 스레드로 본다.
'전공 지식 > OS' 카테고리의 다른 글
# 07. Memory (3) 2022.09.19 # 05. 병행프로세스 동기화 (3) 2022.08.30 # 04. CPU 스케줄링 (0) 2022.08.30 # 03. Interrupt & System call (6) 2022.08.15 # 01. 운영체제란? (0) 2022.08.07