운영체제 프로세스1 - 반효경 교수님

김소희·2024년 2월 6일

프로세스

프로세스가 시작되면 먼저 독자적인 주소 공간을 확보하게 되고,
프로세스가 CPU를 잡게 되면 프로그램 카운터라는 레지스터가 프로세스의 코드를 가르키고 있고, 이 기계어를 읽어서 CPU안의 레지스터로 불러온 다음(인스트럭션) 산술연산장치(ALU)가 연산을 하고, 결과를 레지스터나 메모리에 저장하게 된다.
이를 반복하다가 어느 시점에 '과연 이 프로세스는 지금 어디까지 와 있는가?'를 규명하기에 필요한 요소가 프로세스 문맥이다.

프로그램 카운터가 가르키는 것을 보고, 코드의 어느부분까지 실행을 했는가를 알아야 하고, 메모리에 어떤 내용이 담겨있는지도 봐야하고, 만약 코드에서 함수를 호출했다면 스택에 쌓여있을텐데 무슨내용을 얼만큼 쌓아놓고 있는지, data에 변수값이 현재는 얼마인지.. 등등 모든 요소를 다 알아야지만 프로세스의 현재 상태를 알 수 있을 것이다.
이렇게 현재 상태를 규명하기 위해 필요한 모든 요소를 문맥이라고 부른다.

프로세스의 문맥(context)

  1. CPU - 수행 상태를 나타내는 하드웨어 문맥
  • Program Counter
  • 각종 register
  1. 메모리 - 프로세스의 주소 공간
  • code, data, stack
  1. 운영체제가 프로세스를 관리 - 프로세스 관련 커널 자료 구조
  • PCB(Process Control Block)
  • Kernel stack

현대에서는 여러 프로세스들이 번갈아 가면서 실행되기 때문에 여러 프로세스들이 번갈아가면서 CPU를 사용한다. 하던 작업을 백업을 해두지 않는다면(=현재 문맥을 모른다면) 다음번 CPU 점유중일때 이어서 작업을 하기가 어려울 것이다.

프로세스의 상태

프로세스는 상태(state)가 변경되며 수행된다.

  • New : 프로세스가 생성중인 상태
  • Running : CPU를 잡고 instruction을 수행중인 상태
  • Ready : CPU를 기다리는 상태(메모리 등 모든 조건을 만족하고)
  • Blocked : CPU를 주어도 수행할 수 없는 상태. 예를들면 요청한 event(예를들면 I/O)가 만족되지 않아서 이를 기다리는 상태거나 디스크에서 file을 읽어와야하는 경우처럼 오래걸리는 작업을 하고있을때를 말하며 자신이 요청한 event가 만족되면 Ready 상태로 돌아갈 수 있다.
  • Terminated : 수행이 끝났지만 정리할 게 남은 상태

  • Suspended(stopped) : 외부적인 이유로 프로세스의 수행이 정지된 상태로 프로세스는 메모리에서 통째로 쫓겨나서 디스크에 swap out된다. 예를 들어 사용자가 프로그램을 일시정지 시키거나(break key) 메모리에 너무 많은 프로세스가 올라와 있을 때 발생 할 수 있다. 외부에서 다시 재개(resume)해주어야 Active할 수 있게 된다. (중기 스케줄러가 이를 결정한다.)

운영체제의 상태와 사용자 프로그램의 상태를 혼동하지 않도록 유의하자.

CPU에 비해 Disk는 100만배에서 1000만배 느릴 정도로 속도의 차이가 크기 때문에 모든 자원들을 쉬지않고 효율적이게 동작하게 하는 매커니즘이 필요하다.
놀이동산에서 줄을 기다렸다가 기구를 타는 것에 비유해서 CPU 작업중에 키보드 입력이 필요한 경우에 키보드 I/O에 줄을 서서 차례에 작업을 하고, 작업이 끝나면 다시 CPU에 인터럭트를 걸고 CPU ready줄에 서서 차례가 왔을때 작업을 이어서 수행한다는 설명이 인상 깊었다.
하지만 꼭 먼저 온 순서대로 처리하지는 않고 추후에 배울 스케쥴링에 의해 우선순위가 매겨지고 이에따라 순서가 달라지는 점을 기억하자.

위의 프로세스가 줄서는 큐는 사실 운영체제의 데이터저장 메모리 공간에 프로세스의 상태를 바꾸어 가면서 프로세스의 정보를 저장하고 있다.

다시 말해 프로그램의 문맥 정보는 커널 운영체제의 DATA 메모리영역에 PCB형태로 저장되어 있는데 PCB는 4단계로 구성되어 있다.

문맥 교환(Context switch)

A프로세스가 CPU에서 실행중이라면 프로그램 카운터가 어딘가를 가리키고 있고, 레지스터에 값이 들어가 있고, 메모리의 위치 정보 map이 있는 상태였을 것이다. 그런데 타이머 인터렉트가 들어와서 CPU를 빼앗겨야 한다면 다음에 이어서 작업하기 위해 프로그램 카운터값과 레지스터의 값, 메모리 map을 A프로세스 PCB에 저장한다.

이후 B프로세스가 작업을 실행하기 위해서 운영체제가 CPU를 넘겨줄때는 B프로세스의 문맥을 PCB에서 찾아서 하드웨어에 복원을 시킨 후에 CPU를 넘긴다.

프로세스가 본인이 필요해서 CPU에 요청하는 System call과 controller와 같은 장치가 정보를 전달하기 위해 거는 Interrupt의 상황은 다르지만 둘 다 운영체제에게 CPU 권한이 넘어가게 된다.
하지만 이를 모두 context switch 라고 부르는 건 아니다. context switch는 프로세스에서 다른 프로세스로 넘길때 발생하는 것을 의미하므로 운영체제에게 권한을 준 이후에 다시 기존의 프로세스가 권한을 얻게 되는 경우도 있을 수 있다. 이럴때는 문맥교환이 발생하지 않았으므로 부담이 적을 것 이다.(ex) 캐시 메모리 삭제를 안해도 됨)

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

위 사진은 이는 오래걸리는 I/O작업을 위해 CPU를 내려놓은 동기식인 상황이다.

CPU에서 프로세스가 작업을 하다가 I/O요청이 들어오면 I/O큐에서 줄을 서서 대기를 하고, 그후 I/O를 마치면, 다시 CPU를 기다리는 ready큐에서 줄을 서서 기다리는 흐름을 볼 수 있다.

  • job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
  • dvice queue : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • ready queue : I/O device의 처리를 기다리를 프로세스의 집합
  • 프로세스들은 각 큐들을 오가며 수행된다.

스케줄러(Scheduler)

스케줄러는 자원별로 이번에 무슨일을 얼마만큼의 시간만큼 하고 다음번엔 어떤 일을 해야할지 결정하는 역할을 한다.

  • Long-term : 멀티프로그래밍이란 메모리에 몇개의 프로그램을 올릴 것 인지를 결정한다는 의미인데 너무 많은 프로그램을 올리면 성능이 떨어질 수 있다. 하지만 현재에는 장기 스케줄러가 쓰이지 않고 무조건 메모리에 올리기 때문에 중기 스케줄러를 사용한다.
  • short-term : 다음번 실행할 프로세스를 결정한다.
  • Medium-Term : 프로세스의 메모리를 빼앗아 디스크로 보내어 프로세스의 상태를 Suspended(stopped)로 만드는 역할을 수행한다.

<참고자료>
교보문고 책 구입처
이화여대 반효경 교수님 강의

profile
개발자 소희의 노트

2개의 댓글

comment-user-thumbnail
2024년 2월 25일

안녕하세요. 블로그 잘 봤습니다.
23년 여름쯤에 '취준 글'과 '앤드류 후버만 루틴 글'을 봤는데요.

지금은 취업에 성공하셨는지, 앤드류 후버만 루틴은 어땠는지 궁금합니다!

1개의 답글