[운영체제 정리] 3.프로세스

프로세스란?

프로세스: 실행중인 프로그램.

프로세스의 문맥: 프로세스의 현재 상태를 나타내는것.과거의 프로그램이 실행되면서 현재까지 왔을때, 프로그램의 현재상태를 보여준다.

PCB(프로세스 컨트롤 블락): 프로세스가 실행될때마다 운영체제는 PCB를 만들어서, cpu, 메모리를 얼마나 할당할지 판단한다.

왜 pcb문맥이 필요한가?

현대의 cpu는 타임쉐어링 방식으로 작동되기 때문에 cpu가 어떤 프로그램이 사용을 했는지 기억을해야 cpu를 뺏기고 , 얻었을때 이어서 프로그램을 실행할수 있다.

 

프로세스의 상태

프로세스의 상태는 대표적으로 러닝, 레디, 블락이 있다. 컴퓨터는 일반적으로 레디와 런닝 상태를 주로 반복한다.

 

프로세스의 상태변화 1

- 뉴상태 : 프로세스가 시작되어 그 프로세스를 위한 자료 구조는 생성되었지만, 아직 메모리 획득을 승인 받지 못한 상태.

-레디상태: cpu만 받으면 되는 상태

-러닝상태 : cpu를 받아서 인스트럭션 라인을 읽고 있는 상태

- 봉쇄 : 프로세스에게 cpu를 주어도 당장 명령을 실행할 수 없는 상태.

- 완료 : 프로세스가 종료되었으나, 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태.

- 디스패치 : 준비상태에 있는 프로세스들 중에서 cpu를 할당 받을 프로세스를 선택한 후 실제로 cpu의 제어권을 넘겨받는 과정을 cpu 디스패치라고 한다.

-웨이팅블락상태 : 프로그램이 cpu를 얻은 상태에서 cpu를 내려놓을때

1.io작업이 있을때. 

2.타이머 인터럽트가 발생했을때.

 

상태변환 시나리오

프로세스가 cpu 할당 받음 (실행상태) -> 입출력 명령어 읽음(시간이 오래걸림) -> cpu가 낭비되므로 cpu 반환 -> 입출력 서비스를 기다리는 장치큐에 줄 선다 -> 이때 상태는 봉쇄상태가 된다 -> cpu를 기다리는 줄에서 맨앞에 있는 프로세서에게 cpu 할당 (cpu만 받으면 바로 명령을 수행할 수 있는 프로세스들만 줄서있게됨 : 준비상태) -> cpu를 할당 받은 프로세스는 실행상태로 변경 -> 입출력 장치큐에 있던 프로세스는 디스크 컨트롤러 부터 마그네틱 원판에서 원하는 데이터를 로컬 버퍼로 읽어오면 -> 디스크 컨트롤러가 cpu에게 인터럽트 발생 -> 인터럽트 루틴 실행( 입출력이 완료된 프로세스를 장치 큐에서 빼서 cpu를 기다리는 준비큐에 넣어주고, 프로세스의 상태를 준비 상태로 바꾸고, 로컬 버퍼에 있는 내용을 메모리로 이동 시키는 업무)->  다시 cpu를 할당해서 실행상태로 변경시켜줌.

프로세스의 상태변화 2

연두색 동그라미: 프로세스.

프로세스가 cpu를 얻어 러닝되다가 디스크를 사용하려면 cpu를 반납하고 웨이팅상태로 변한다음, 디스크 큐로가서 줄선다(블락상태). 디스크 컨트롤러가 작업을 끝내면 운영체제에 인터럽트를 보낸다. 그럼 운영체제는 로컬버퍼에 있는 데이터를 메모리로 옮기고 디스크 큐에 있던 프로세스를 빼서 래디큐에 넣고 상태는 레디로 변경한다.

[놀이동산에서 놀이기구 타는거랑 비슷?]

 

큐 란?

큐라는것은 운영체제 커널이 데이터 영역에 자료구조 '큐'를 만들어놓고 레디상태에 있는 프로세스에게 cpu를 주거나 러닝상태에 있는 프로세스에게 cpu를 뺏거나 관리하기 위한 것이다.

 

용어정리- 프로세스를 스케쥴링하기 위한 큐

- 잡 큐 : 현재 시스템 내에 있는 모든 프로세스의 집합

- 레디 큐 : 현재 메모리 내에 있으면서 cpu를 잡아서 실행되기를 기다리는 프로세스의 집합

- 디바이스 큐 : i/o 디바이스의 처리를 기다리는 프로세스의 집합

(프로세스들은 각 큐를 오가며 수행된다)

 

프로세스 컨트롤 블락이란 ?

프로세스 컨트롤 블락은 운영체제가 프로세스를 관리하기 위한 정보이다. 프로세스가 생성될 때마다 하나씩 생성한다. 2번은 cpu 수행관련 하드웨어 값으로 프로세스 안에서 여러 스레드가 독립적인 값을 가질때 사용된다. 

 

구성

- 프로세스의 상태: cpu를 할당해도 되는지 여부를 결정하기 위해 필요함. 

- 프로그램 카운터값: 다음에 수행할 명령어의 위치를 가리킴 

- cpu 레지스터: cpu 연산을 위해 현 시점에 레지스터에 어떤 값을 저장하고 있는지를 나타냄.

- cpu 스케쥴링 정보: 각각 그 프로세스의 cpu 스케쥴링과 메모리 할당을 위해 필요한 정보

- 메모리 관리 정보 : 각각 그 프로세스의 cpu 스케쥴링과 메모리 할당을 위해 필요한 정보

- 자원사용정보: 사용자에게 자원 사용 요금을 계산해 청구하는 용도.

- 입출력 상태 정보: 

 

프로세스의 문맥이란?

프로세스가 현재 어떤 상태에서 수행되고 있는지를 정확히 규명하기 위해 필요한 정보.

한 프로그램이 인터럽트 발생후 , cpu를 다시 획득해 명령의 수행을 재개하는 시점이 되면 지난 번 cpu 보유 시기에 어느 부분까지 명령을 수행했는지 직전 수행 시점의 정확한 상태를 재현할 필요가 있다. 이때, 정확한 재현을 위해 필요한 정보가 바로 프로세스 문맥이다. 

즉, 프로세스의 문맥은 프로세스의 주소 공간(코드, 데이터, 스택)을 비롯해 레지스터에 어떤 값을 가지고 있었는지와 시스템 콜 등을 통해 커널에서 수행한 일의 상태 , 그 프로세스에 관해 커널이 관리하고 있는 각종 정보 (pcb)등을 포함하게 된다.

 

-하드웨어문맥 : cpu의 수행상태를 나타내는 것으로 프로그램 카운터 값과 각종 레지스터에 저장하고 있는 값들을 의미한다.

- 커널상의 문맥 

-프로세스의 주소공간 :코드, 데이터, 스택으로구성. 프로그램이 수행되어 프로세스가 되면 운영체제는 프로세스를 관리하기 위한 자료구조를 유지한다. (pcb와 커널스택이 이에 해당한다)

문맥교환이란 ?

 

문맥교환이란 한 프로세스가 cpu를 쓰다가 다른 프로세스로 cpu제어권이 넘어가는 상황을 뜻한다. 어떤 프로세스가 짧은 시간 cpu를 쓰고 뺏긴후, 나중에 뺏긴 후 부터 , 그 문맥부터 cpu를 사용하기 위해서 일종의 기록과 같은것이다. cpu가 a 프로세스에서 b로 넘어가면 운영체제는 a의 상태를 a의 pcb에 저장하고, b에게 cpu를 넘기고 b의 pcb에서 프로세스 상태를 읽어와서 b를 실행한다.

(실행시킬 프로세스를 변경하기 위해 원래 수행중이던 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 셋팅하는 과정을 문맥교환이라고 한다.)

 

발생시점

타이머 인터럽트가 발생할때. 실행상태에 있던 프로세스가 입출력 요청으로 봉쇄상태로 바뀌는 경우.

문맥교환이 일어나지 않을때

참고로 문맥교환은 한 프로세스에서 다른 프로세스로 cpu제어권이 옮겨질때 발생된다. 한 프로세스에서 커널로 cpu제어권이 갔다가 다시 그 프로세스로 cpu제어권이 갔다면 그건 컨텍스트 스위치(문맥교환)이 아니다. 타이머 인터럽트 경우는 cpu를 다른 프로세스에게 주기위한 인터럽트여서 발생을 한다면 컨텍스트 스위치가 발생한다. 즉, 한 프로세스에서 다른 프로세스로 cpu 제어권이 이동해야지만 문맥교환이 발행하지, a 프로세스에서 커널로 cpu제어권이 넘어갔다가 다시 a로 cpu제어권이 넘어간다면 그때는 문맥교환이 발생하지 않는다.

 

프로세스들이 큐에 줄서 있는 모습

pcb에는 포인터가 존재한다. 그 포인터를 이용해서 순서를 정해놓는다.

 

프로세스 스케쥴링 큐 모습

 

스케쥴러

- 장기 스케쥴러 (잡스케쥴러) : 시작 프로세스 중 어떤 것들을 레디 큐로 보낼지 결정한다. 프로세스에 메모리 및 각종 자원을 주는 문제를 판단한다. 디그리 오브 멀티프로그래밍을 제어한다.(메모리에 최대로 올릴 수 있는 프로그램 수). 타임 쉐어링 시스템에는 보통 장기 스케쥴러가 없다. 어떤 프로세스를 준비큐에 삽입할지 결정.프로세스에게 메모리를 할당하는 문제에 관여한다. 느리다.

 

- 단기 스케쥴러 (cpu 스케쥴러) : 어떤 프로세스를 다음번에 러닝 시킬지 결정한다. 프로세스에게 cpu를 주는 문제를 결정한다. 충분히 빨라야 한다. (밀리세컨 단위) cpu 스케쥴러라고도 함. 준비 상태의 프로세스 중에서 어떤 프로세스를 다음 번에 실행 상태로 만들 것인지를 결정한다. 다시말하면, 준비큐에 있는 여러 프로세스들 중에 어떠한 프로세스에게 cpu를 할당할 것인가를 단기 스케쥴러가 결정하게 된다.

ex) 타이머 인터럽트가 발생하면 단기 스케쥴러 호출됨. 빠르다.

 

- 중기 스케쥴러 (스와이퍼) : 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아낸다. 프로세스에게서 메모리를 뺐는 문제를 판단한다. (메모리에 너무 많은 프로그램들이 있을때스와퍼가 일부 프로그램을 메모리에서 쫓아냄). 디그리 오브 멀티프로그래밍을 제어한다.

상세

너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러이다.

중기스케줄러는 메모리에 올라와 있는 프로세스 중 일부를 선정해 이들로부터 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장해 둔다.

중기 스케쥴러가 일부 프로세스를 메모리에서 디스크로 스왑아웃 시켜야 하는 경우 그 0 순위인 프로세스는 봉쇄 상태에 있는 프로세스 들이다.

이유: 봉쇄상태에 있는 프로세스들은 당장 cpu를 획득할 가능성이 없기 때문에.. 메모리를 보유하고 있는것이 의미가 없다…

중기 스케쥴러는 필요한 프로세스들을 스왑아웃 시킨 후에도 메모리가 부족하면 타이머 인터럽트가 발생해서 준비 큐로 이동하는 프로세스를 추가적으로 스왑아웃 시킨다.

 

참고 - 프로세스의 상태 : 중지

 

외부적인 이유로 프로세스의 수행이 정지된 상태를 나타내는 중지 상태.

중지 상태에 있는 프로세스는 외부에서 재개시키지 않는 이상 다시 활성화 될 수 없으므로 메모리 자원이 당장 필요하지 않다.

따라서 중지 상태의 프로세스는 메모리를 통째로 빼앗기고 디스크로 스왑아웃된다.

 

세분화 -

 

중지 준비 : 준비 상태에 있던 프로세스가 중기 스케줄러에 의해 디스크로 스왑아웃됨.

중지봉쇄: 봉쇄 상태에 있던 프로세스가 중기 스케줄러에 의해 스왑아웃됨.

 

*디그리 오브 멀티플렉싱: 메모리에 몇개의 프로그램을 올려놓을지 결정한다(현대 컴퓨터에는 없음, 프로그램 100개 실행하면 100개가 메모리에 올라감. 현재 사용은 안되고 이기능을 중기 스케쥴러가 담당함)

 

서스팬디드 상태

 

프로세스 상태도

 

 

 

참고: 이화여대 반효경 교수님 운영체제 강의정리