본문 바로가기
Operating System

[운영체제] 프로세스 개념, 프로세스 상태, 스케줄링, 스레드 의미

by Just Do Barro 2021. 3. 8.
 

출처: Icons made by  Nikita Golubev  from  www.flaticon.com

Icons made by Nikita Golubev from www.flaticon.com

[0] 들어가기 전

궁금한 내용은 ctrl F 후 키워드 검색하시면 빠르게 찾아보실 수 있습니다.

해당 포스트는 K-MOOC의 이화여자대학교 반효경 교수님의 운영체제 강의를 바탕으로 필기한 내용입니다. 

운영체제 - 이화여자대학교 | KOCW 공개 강의

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net

[1] 프로세스 개념

 
Process is a program in execution
프로세스: 실행중인 프로그램

▶프로세스 개념에서 중요한 내용
프로세스 문맥(context) 


-프로세스가 탄생해서 실행되다가 종료가 되는 과정중에서
문맥이란 것은 중간 어느 시점을 딱 집어 보았을 때 
이 프로그램이 '무엇을(what)' '어떻게(how)' 실행했는, 현재시점의 상태를 
정확하게 나타내기 위해 사용하는 개념이다. 
=>특정시점을 놓고 봤을 때, 프로세스가 어디까지 실행되었는지 확인
=>프로세스의 현재상태를 나타내는 데 필요한 모든 요소를 프로세스 문맥이다. 
▷예시(일상생활)
배우 '김소연'의 문맥(context)

-(2021.03.08기준) 펜트하우스 시즌2 '천서진'역 참여 중, 현재 배우 이상우의 아내
-현재의 상태를 screening해서 지금의 문맥(현재 상태)를 나타낼수있다.


▶현재 시점의 프로세스의 문맥을 나타내는 방법
-PC(Program Counter)가 어디를 가리키고 있는가 
= code의 어느 부분까지 실행했는가 
-프로세스 메모리에 어떤 내용을 담고 있는가 
▷프로세스 메모리에 담긴 내용 예시
- code에서 함수 호출 시 stack에는 해당 함수가 어디까지 stack frame에서 쌓은 내용
-data영역에서 변경된 변수의 값은 무엇인가
-레지스터에 어떤값을 넣고 어떤 instruction(명령)까지 실행했는가.
-> 해당 내용을 알아야지만 현재 프로세스의 상태를 나타낼 수 있다.


▶프로세스 특징
-프로세스는 실행이 시작이되면, 그 프로세스만의 독자적인 주소공간을 형성한다.
code, data, stack이라는 독자적인 주소공간으로 구성된다.  



▶프로세스 문맥(context)는 3가지로 설명된다.
1. CPU와 관련된 하드웨어 문맥
①각종 register가 가지고 있는 값을 나타낸다. 


-프로세스는 CPU를 잡고  매순간 instruction(명령)을 실행한다. 
-현재 시점에서 instruction을 어디까지 실행했는가를 확인하기 위해
지금 레지스터에 어떤값을 넣고 있었고
  PC(Program Counter)가 프로세스 메모리의 어디를 가리키고 있었고 등의
요소들이 필요하다
2. 메모리와 관련된 프로세스의 주소공간 
-현재 시점의 프로세스의 주소공간(code, data, stack에 어떤 내용이 들어있는가)

3. 프로세스 관련 커널 자료 구조(PCB) 
①PCB(Process Control Block)
②Kernel stack
*Kernel stack--------------------------------------------------------------------------
각각의 프로세스가 자신의 code영역을 실행하고 있을 때 함수 호출이 이루어지면 
자신의 stack영역에서 stack frame을 쌓아 일을 실행하지만, 
프로세스 자체로서 할 수 없는 일은 운영체제에게 넘긴다.(시스템 콜) 

시스템 콜이 발생되면 PC는 프로세스 A의 주소공간을 가리키는 것이 아니라
커널 주소 공간의 어느 공간을 가리킨다. 그리고 커널의 code영역을 실행한다. 
커널도 함수들로 구성되어있다. 커널에서 함수 호출이 이루어지면 stack 영역에 호출된 함수와
관련된 정보들을 쌓아 놓는다.
 
커널은 여러 프로세스들의 공유하는 코드이다. 
어떤 프로세스든 운영체제에게 서비스를 요청할 때
커널의 code영역을 실행한다. 커널의 누구의 부탁을 받고 code영역을 실행하는지가 매번 다르다.
커널에서 함수호출이 이뤄져서 stack영역에 정보를 쌓을 때,
 stack 영역에 프로세스 별로 각각의 공간이 구획된다. (정보의 꼬임 방지) 

=> 프로세스의 현재상태를 규명하기 위해서는 user stack 말고  kernel stack 도 어떤 정보를 
쌓고 있는지 확인해야한다. 
-----------------------------------------------------------------------------------------

운영체제의 기능 중 컴퓨터 안에 돌아가는 프로세스 관리
운영체제는 하나의 프로세스가 생성될 때 마다 운영체제 자신의 data영역(커널 주소공간)에
자료구조(PCB, Process Control Block) 하나를 두고있다. 

운영체제의 PCE 자료구조는
프로세스가 1개 실행될 때마다 운영체제는 PCB자료구조를 1개씩 두면서 
해당 프로세스에게 CPU, 메모리를 얼만큼 줘야할 지, 나쁜 짓은 안하는지 관리하는 역할 

프로세스의 현재 상태를 알려면 CPU, 메모리 상태를 알아야하지만, 
운영체제가 프로세스에 대한 어떤 PCB 값을 가지고 있느냐, 
운영체제가 프로세스를 어떻게 평가하느냐도 알아야한다.


Q: 왜 Kernel 주소 공간의 stack 영역에 쌓인 정보까지 확인하나?
현대의 컴퓨터 시스템은 time sharing, mutil tasking
여러 프로세스 마다 cpu를 번갈아 가면서 실행하기 때문에.

프로세스가 레지스터에 저장한 값을 백업해두지 않으면 다음 cpu를 잡아 실행할 때 
앞부분부터 다시 실행해야하는 비효율적인 결과를 불러옴.

프로세스 문맥을 항상 파악하고 있다가 어느시점까지 실행했는지를 파악해서 
바로 그 다음 시점부터 instruction을 실행할 수 있게 해준다.


■'사용자'프로세스의 상태 Process State_3가지+2
※'사용자'프로세스의 상태도(운영체제 kernel의 상태도 아님) 
  운영체제의 프로세스를 Running, Ready, Blocked, Suspended 라고 하지 않음 
Running(user mode) : 사용자 프로그램이 Running상태다.
Running(monitor mode) : 사용자 프로세스가 커널모드에서 운영체제 code가 실행중
운영체제가 Running하고 있다(x)틀린 표현 

System call이나 interrupt가 끝나면, 다시 user mode(사용자 모드)에서 
사용자 프로그램의 코드를 실행한다. 
cpu를 잡고있거나, 기다리거나, 오래걸리는 작업을 하고 있거나 

(컴퓨터에 cpu는 1개라고 가정) 

Running, Ready, Blocked는 CPU관점에서의 상태
프로세스 입장에서는 CPU에서 일하는가, 메모리에서 일하는가, 
본인은 치열하게 일하는 상태에서 CPU를 기다리는 상태인가 이다. 

cpu를 잡고 있는 프로세스는 매순간 1개이다. 
●Running: 현재 cpu를 잡고 instruction을 수행중인 상태 

●Ready: cpu가 1개 밖에 없기 때문에 기다려야하는 프로세스들의 상태
다른 모든 준비는 다 끝나있고, cpu를 얻으면 바로 instruction을 실행할 수 있는 상태 
물리적인 메모리에는 올라와있는 프로세스 
주로 Ready 상태에있는 프로세스들간 cpu를 번갈아가면서 실행한다. 

프로세스는 최소한의 메모리는 가지고 있어야한다. 
cpu에서 instruction을 실행하는데 필요한 부분은 메모리에 올라와 있는 상태. 
Ready 상태에서 프로세스가 본인 상태가 되면, Running 상태가 된다. 

<상태 변경>
-자진해서 cpu 내놓기
입출력같은 오래걸리는 작업을 해야하기 때문. 
-cpu를 쓰고 싶지만, Timer interrupt로 인해 나에게 할당된 시간이 끝나 cpu를 뻈긴 경우 
이때는 다시 cpu를 기다리면서 뺐긴 경우


●Blocked(wait, sleep) 

지금 cpu를 줘봤자 바로 instruction을 실행할 수 없는 상태 
(예시) 오래걸리는 I/O 작업, Disk로 부터 무엇을 읽어와야하는 데, 그 내용을 읽어봐야 다음을 
실행할 수 있는 프로세스.
디스크에서 읽어오는 작업은 오래걸리는 작업이다. 
프로세스가 자신이 요청한 EVENT(I/O)가 즉시 만족되지 않아 이를 기다리는 상태
-디스크에서 file을 읽어와야하는 경우

*어떤 프로그램의 주소공간(메모리) 전체를 물리 메모리에 올려 실행하지 않는다. 
메모리 공간은 여러 프로세스들이 동시에 사용해야하기 때문에.
만약 프로그램의 code영역에서 code를 실행하려고 하는데, code영역에 물리 메모리에 올라와있지 않고
디스크에 내려가 있을 떄, 해당 프로세스에 cpu를 줘봤자 바로 해당 프로세스를 실행할 수 없다. 

●Suspended(stopped) == Swap out 외부의 요인으로 메모리 완전 잃음 

CPU뿐만 아니라 외부에서 이 프로세스를 강제로 정지시켜 놓은 상태 
메모리를 빼앗겼기 때문에 아무것도 못하는 상태 

중기 스케줄러에 의해 새로 추가된 프로세스 상태
중기 스케줄러에 의해 메모리를 통째로 빼앗긴 프로세스의 상태를 표현
메모리를 통째로 뺴앗기면 CPU를 얻어도 아무일도 못함.
Running, Ready, Blocked상태도 아니다. 

-외부적인 이유로 프로세스의 수행이 정지된 상태
-프로세스는 통째로 디스크에 swap out된다.
(예) 사용자가 프로그램을 일시 정지시킨경우 
(break way, 리눅스의 Ctrl Z: 프로세스가 종료된건 아니지만 사람이(외부에서) 정지시킴)
(사람이 다시 그 프로세스를 재개시켜줘야만 다시 Running, Ready, Blocked 상태가 될수 있다.)
시스템이 여러 이유로 프로세스를 잠시 중단시킴
(메모리에 너무 많은 프로세스가 올라와 있을 때) 

-메모리를 통째로 빼앗겼기 때문에 cpu관점에서 아무 일도 할 수 없지만,
I/O작업이 진행중이었다면 계속 진행이 돼서 Suspended Ready 상태가 될 수 있다. 

☆Blocked vs Suspended
Blocked: 자신이 요청한 event 가 만족되면 Ready
Suspended: 외부에서 resume해 주어야 Active(외부에서 정지시켜놓음) 
 (프로세스 자신이 해결 불가)

+New: 프로세스가 생성중인 상태
프로세스가 이미 생성완료된 상태면 Running, Ready, Blocked 이 3개 상태중 하나.

+Terminated: 수행(execution)이 끝난 상태(이지만, 정리할 게 남은 상태)
프로세스가 종료'중'(~ing)인 상태. 프로세스가 종료완료된 상태는 프로세스가 아니다. 프로그램이다. 
프로세스 본인이 할 일 (instruction)이 다 마친 상태
instruction은 다 끝내서 프로세스 자체는 끝이 났지만, 보통은 끝나고 나면 정리하는 작업이 남음.
__________________________________________________________________
▶CPU 특징
●1. 빠르고 여럿이 공유하는 자원 

Queue들이 놀이동산의 여러 기구들에 대기 줄을 스는 것과 비슷.
-cpu는 롤러코스터와 비슷. 롤러코스터 즐기는건 1분인데 대기시간은 오래걸리는 것처럼.

즉 모든 자원들이 놀지 않고 다 잘 일을 할 수있는 메커니즘 필요 

▶Queue
Kernel Address space의 Data영역에 자료구조로 Queue 들을 만들어 놓고 
프로세스의 상태를 바꿔가면서 운영.

▶PCB
각 프로세스마다 프로세스를 관리하기 위해 
운영체제가 자신의 Kernel Address space의 Data영역에 두고 있는 PCB구조가 있다.

프로세스 하나당 PCB를 1개씩 가진다. 

▷PCB구성요소-4
운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
(운영체제가 유지 및 관리하는 자료구조)

●1.OS가 관리상 사용하는 (필요한)정보
-Process state(Running, Ready, Blocked)
-Process ID (주민등록번호)
-scheduling information, priority(프로세스 우선순위 순서로 cpu 실행)

●2.CPU 수행 관련 하드웨어 값(프로세스의 문맥을 표시하기 위한 정보들) 
-Program Counter, Registers(레지스터에 저장된 값) 

●3.메모리 관련
-code, data, stack이 메모리의 어느 위치에 있는가. 위치정보 

●4.파일 관련 
-프로세스가 사용하고 있는 open하는 file descriptors

▶문맥교환 
-CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정. 

프로세스가 CPU를 뺏겼을 때의 문맥을 기억해 두었다가 다시 CPU를 할당받을 때
처음부터 실행하는 것이 아닌 뺏긴 시점(아직 실행안한)부터 계속 실행 


▷문맥교환시 필요한 작업
●1.운영체제가 프로세스의 PCB에 PC, 레지스터값, Memory map을
Kernel Address space에 save해둔다.

레지스터 값과 PC값은 CPU안에 있는 하드웨어 자체를 나타냄.

●2.CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴.


★ 뺏다 VS 뺐다. 
남의 물건을 빼앗거나 자격을 상실하게 하는
경우에는 '뺏다' 라는 동사를,
박힌 가시나 돈을 뽑는 일 등에는 '뺐다(빼다)'를
[출처] 뺐다 vs 뺏다|작성자 속기법인 지원


▷문맥교환(Context Switch) 혼동 사례. 주의사항
*System call이나 *interrupt 발생 시 cpu 제어권이 사용자 프로세스로부터 운영체제 커널한테 넘어감. 
운영체제한테 cpu제어권이 넘어갔다고 이것을 context switch 라는 것이 아님  

System call이나 *interrupt 발생 시' 반드시' 100%  context switch가 일어나는 것은 아님.

※Context Switch인 경우: 사용자 => 사용자 
사용자 프로세스 A로부터 다른 사용자 프로세스 B한테 CPU 제어권이 넘어가는 과정

※Context Switch아닌 경우: 사용자 => 운영체제
사용자 프로세스 A로부터 운영체제 커널에게 CPU 제어권이 넘어가는 과정  

*System call
프로세스 본인이 필요해서 OS에 서비스 요청하는 경우

*interrupt(여기서는 하드웨어 인터럽트)
컨트롤러 장치나 cpu 한테 정보를 전달한 목적

*Timer interrupt
cpu를 다른 프로세스에 넘기기위한 의도를 가진 인터럽트 




▶프로세스를 스케줄링하기 위한 큐-3

●1.Job queue
-Ready queue와 Device queues들이 Job 에 포함된다. 안에 들어가 있다. 


●2. Ready queue
-cpu를 기다리는 줄. 
-현재 메모리 내(위에 올라와 있는 상태)에 있으면서 cpu를 잡아서 실행되기를 
기다리는 프로세스의 집합

●3. Device queues
-각 I/O devices들을 기다리면서 줄을 서있는 큐

프로세스들은 각 큐들을 오가며 수행된다. 


큐에 줄세우는 것은 프로세스들을 줄세우는 것이다. 

운영체제가 프로세스들을 관리하는 자료구조인 PCB를 큐에 줄세우는 것이다. 
-PCB에 pointer요소가 큐에서 여러 PCB를 줄줄이 세울수 있게 해준다. PCB연결


▶스케줄러 (Scheduler)-3 : 순서를 정해줌
시스템안에서 스케줄러는 각각의 자원별로 이번에 무슨일을 하고, 다음에 무슨일을 하고 
얼만큼 할 건지 정하는 행위.

●1.Long-term scheduler(장기 스케줄러 or job scheduler)<->short scheduler
-시작 프로세스들 중 메모리를 어떤 프로세스에게 줄지 결정.
-시작 프로세스 중 어떤 것을 ready queue로 보낼지 결정. 
-현대 시스템은 장기 스케줄러를 사용하지 않음.

-프로세스 상태가 new에 ready로 넘어갈 때 admitted를 하는데
허용하는 대상은 메모리에 올라가는 것을 말한다. 
-처음 프로세스가 시작되고 나서 해당 프로세스가 메모리를 전혀 갖지 못하면
아무일도 못함. 메모리에 프로세스가 올라가는 것을 허락하면 비로소 
ready상태가 돼서 cpu를 얻을 수 있게 된다. 

-☆degree of *Multiprogramming을 제어
메모리에 올라가있는 프로그램 수 제어 
메모리에 몇개의 프로그램이 올라가 있는가를 나타냄.

(예시)10개의 실행시작되는 프로그램 중에서 10개 다 메모리를 주면
degree of *Multiprogramming이 10이된다. 

*Multiprogramming
메모리에 여러 프로세스들이 동시에 올라가는 개념 
메모리에 너무 많은 프로그램이 동시에 올라가 있으면 프로그램 성능에 좋지 않다.
메모리에 프로그램이 너무 적게 올라가도 성능이 안좋아진다.

-time sharing system에서는 보통 장기 스케줄러가 없음 (무조건 ready) 
실제 시스템에서는 어떤 프로그램이 시작이 되면
곧바로 메모리에 올려놓는다.
장기 스케줄러가 발동해서 어떤 프로그램을 메모리에 올려 놓을지 정하지 않음,
중기 스케줄러가 degree of Multiprogramming을 제어한다.

●2. Short-term scheduler(단기 스케줄러 or CPU scheduler)
-스케줄이 이뤄지는 단위 millisecond 단위. 매우 빠름
-다음번에 어떤 프로세스에게 cpu를 running시킬지 (줄지 )결정


●3. Medium-Term Scheduler(중기 스케줄러 or Swapper): 악역 
-프로세스에게서 memory를 뺏는 문제
-degree of Multiprogramming을 제어
-시스템 입장에서 중기 스케줄러를 두는 것이 장기 스케줄러보다는 효과적.

-여유공간을 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄.

목적: 메모리에 동시에 많은 프로그램들이 올라오는 것을 방지하기 위해
기능: 메모리에 동시에 너무 많은 프로그램들이 올라오면 
몇몇 프로세스들을 메모리에서 통째로 쫓아낸다. 

일단 메모리에 모든 프로그램들을 다 올려놓고 너무 많이 올라있다 싶으면
memory를 뺏는다. 

-중기 스케줄러 때문에 프로세스 상태에 추가된 상태가 있다.
①Suspended(stopped)

▶Implementation(실행) of Threads


---------
Process2



▶Thread 스레드
A thread(or *ligthweight process) is a basic unit of CPU utilization
스레드는 프로세스 내부에 CPU 수행 단위가 여러개 있는 경우를 말한다


*lightweight process
스레드를 lightweight process라고도 부른다.
아무래도 프로세스를 별도로 두는 것보다 프로세스 안에 스레드를 여러개 두는 게 
훨씬더 가볍기 떄문에 

보통 프로세스가 하나 주어지면 프로세스 1개마다
주소공간이 code, data, stack 영역으로 구성된다. 

운영체제가 각각의 프로세스를 관리 및 유지하기 위해 
운영체제 내부의 주소공간 (Kernel Address space)의 Data영역에 PCB를 두고 있다.

PCB는 PID(Process ID), Process state, PC(주소공간에서 메모리의 어느 부분을 가리키고 있는가)

동일한 일을 하는 프로세스가 여러 개라고  별도의 프로세스라고 가정하면, 
동일한 주소공간이 여러 개 만들어진다. 즉 메모리가 낭비된다. 
=> 같은 일을 하는(공통적인 일) 프로세스를 여러 개 메모리에 띄우고 싶을 때는 1개만 띄워놓자
프로세스마다 다른 일을 하는 부분만 메모리에 띄우자  가 스레드의 개념 

[정리] 
물리 메모리에 프로세스는 1개만 띄워놓고,
(주소공간에 code, data, stack 영역 1개)
CPU가 현재 이 code의 어느 부분을 실행하고 있는가 즉, Program Counter만 여러개 두는것.

프로세스 하나에 CPU 수행단위만 여러 개 두는 것 을 스레드라 한다. 

CPU실행, 즉 instruction을 실행하기 위해서는 *Program Counter, registers가 필요하다. 

*Program Counter 
현재 프로그램의 code 영역의 어느 부분을 실행하고 있는 지 알려줌

=>스레드는 프로세스 1개에서 최대한 공유할 수 있는 부분은 최대한 공유하고 (메모리 주소공간 공유)
프로세스는 1개이기 때문에 Process state는 스레드간 공유하는 부분이다. 

프로세스가 사용하는 각종 자원들은 스레들끼리 공유하고 있다.
다만 별도로 가지고 있는 것은 cpu 수행과 관련된 정보이다.  -PC, stack, registers



▷Thread의 구성(스레드들이 독립적으로 only 자신의 것을 소유하는 요소들)
1. program counter
2. register set
3. stack space


▷Thread 가 동료 thread와 공유하는 부분(=task)
1.code section
2.data section
3. OS resources

하나의 프로세스안에는 스레드가 여러개 있으면 task는 1개 있다. 

▷전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task 로 볼수 있다.



▷Thread 장점

●다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인
동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다
-응답시간이 빨라진다. 빠른 응답성 

-웹브라우저에서 네이버를 불러오는 과정에서는 해당 탭에서는 아무것도 못하는 blocked상태
웹브라우저를 다중 스레드(여러 스레드)로 프로그램을 구성했다면 
네이버를 불러오는 과정을 해당 프로세스를 blocked시키지 않고 다른 스레드가 읽어온 내용이라도
화면에 display해주면 사용자 입장에서 더 빨리 네이버 화면을 볼 수 있다.


●동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능을 
얻을 수 있다

●스레드를 사용하면 병렬성을 높일 수 있다

댓글