프로그램이 메모리에 올라가서 cpu를 잡고서 실행되는 상태를 프로세스라고 한다.
프로세스의 문맥(context)
특정 시점에서의 프로세스의 현재 상태를 나타태는 것을 프로세스 문맥(context)이라고 한다.
프로세스의 cpu제어권은 다른 프로세스와 번갈아가면서 잡게 된다.
그렇다면, cpu제어권을 놓았을 때, 이전 시점까지 실행된 기록이 있어야 한다.
다시말해, 현재시점에 프로세스가 인스트럭션을 어디까지 실행되었나?
레지스터가 어떤값을 가지고 있는가? 등의 정보를 포함한, cpu수행 상태(기록)를 나타태는 하드웨어 문맥이다.
또한 프로그램이 실행이 되서 프로세스가 되면 프로세스의 주소공간을 가지게 된다. 프로세스의 주소공간에는 code, data, stack이 있고, 각 내용에 어떤 내용이 들어 있는가? 역시 프로세스의 문맥이다.
프로세스 관련 커널 자료 구조
운영체제는 프로세스가 하나 실행될 때마다 프로세스 관리를 위해 커널의 data영역에 pcb를 하나씩 두면서 어느정도의 cpu, 메모리 를 주어야 할지 등을 관리한다.
kernel stack에는 프로세스가 시스템 콜을 하게 되면 커널을 코드를 실행하게 되고, 함수를 호출하게 되면 관련된 것을 stack에 저장한다. 커널을 모두 공유하는 곳이므로 누구의 부탁을 받고 실행하는지 프로세스별로 stack에 별도로 저장해 두어야 한다.
프로세스는 실행되면 프로세스만의 독자적인 주소공간을 만들고, cpu를 잡게 되면, 프로그램카운터라는 레지스터가 프로세스의 code 어느부분을 가르키고, 매 순간, 기계어를 읽어와서 실행한다.
running
cpu를 잡고 인스트럭션을 실행중인 상태
ready
cpu가 하나 밖에 없기 때문에 기다리는 상태 cpu만 있으면 바로 실행가능 상태
blocked(wait, sleep)
cpu를 주어도 인스트럭션을 수행할 수 없는 상태
I/O작업, 디스크에서 읽어오고 나서 수행해야 하는 경우
new
프로세스가 생성중인 상태
terminated
수행이 끝난 상태
위에서 설명한 프로세스의 상태에 따라서 위와 같은 그림의 프로세스 상태가 진행이 된다.
프로세스가 running에서 실행되다가 I/O작업등으로 시스템콜을 하게되면, 자신해서 cpu제어권을 놓고, waiting상태가 되었다가 이벤트가 끝나게 되면 다시 ready상태가 된다. 또는 실행하다가 timer에 세팅한 시간이 되면, 강제로 빼았기고, 다시 ready상태로 돌아간다. ready 상태의 프로세스는 위의 상황이 발생하면 하나씩 cpu제어권을 잡고서 running상태가 되고, 모든 작업이 끝나면 terminated상태로 돌아간다.
프로세스는 cpu제어권을 잡고 놓고를 반복하면서 작업을 수행한다.
cpu를 잡고 작업을 하다가 I/O작업을 하게되면 시스템콜로 cpu제어권이 운영체제로 넘어가며, 운영체제는 I/O작업을 각 디바이스에 요청을 한다. 디바이스에도 queue가 있어서 들어온 순서대로 처리를 하게 되고, 해당프로세스는 wait상태가 된다. I/O작업이 끝나게 되면, 디바이스 컨트롤러가 인터럽트를 걸어서 cpu제어권은 I/O작업이 끝났다는 것을 안다. 그러면 해당 프로세스는 다시 queue에 ready상태로 기다리게 된다. 이후 자신의 차례가 오면 cpu제어권을 잡고서 I/O작업을 부탁한 시점 이후부터 다시 실행하게 된다.
커널의 주소공간의 데이터 영역에는 모든 프로세스가 공유할 수 있는 데이터가 있다. 공유데이터에 접근하게 되면, 다른프로세스가 접근하는 것을 막는다.
운영체제각 각 프로세스를 관리하기 위해서 커널의 데이터 영역에 있는 것이 프로세스별 Process Control Block(PCB)이다.
어떤 프로세스가 cpu를 장악해서 짧은 시간 간격으로 썻다가 빼겼다가를 반복한다. 뺏긴 시점의 문맥을 기억했다가 그 시점부터 다시 시작해야 한다.
cpu가 사용자 프로세스 하나로 부터 또다른 프로세스로 넘어가는 과정을 말한다. cpu가 빼앗길 때 이 시점부터 시작하기 위해 레지스터에 저장되있던 값에 그 커널의 프로세스의 pcb에 저장해둔다.
cpu를 얻는 프로세스도 과거 실행된 게 있을 것이고, 운영체제가 cpu를 넘겨줄 때 그 프로세스의 문맥을 넘겨준다.
시스템콜이나 인터럽트가 발생후 사용자프로세스로 부터 운영체제로 넘어가는 것을 context switch라고 말하지 않는다. cpu가 다른 프로세스로 넘어갈 때 context switch라고 하며, 이때의 부담비용이 더 크다. 그렇기 때문에 cpu제어권을 놓는다고, 반드시 context switch가 발생하는 것은 아니다.
job queue
현재 시스템 내에 있는 모든 프로세스의 집합
ready queue
cpu를 기다리는 큐
device queue
디바이스 작업을 기다리는 큐
Long-term scheduler
메모리를 다음에 누구에게 줄지 결정하는 스케줄러
다음에 누구를 ready queue에 넣을지를 결정하는 스케줄러이다.
새롭게 생기는 프로세스를 new에서 ready로 바꾸어 주어야 하는데, 이때 메모리에 올라가는 것을 결정해서 올라가는 것을 admitted이라고 하고, 이를 결정하는 것을 장기스케줄러가 한다.
Short-term scheduler
어떤 프로세스에게 cpu제어권을 넘길지를 결정하는 스케줄러이다.
Medium-term scheduler
너무 많은 프로세스에게 메모리를 할당해서 시스템의 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러이다.
메모리에 너무많은 프로세스가 올라가있으면, 메모리에서 쫒아낸다. 메모리에 많은 프로세스가 올라가게 되면, 한정된 메모리를 프로세스가 나누게 될경우 한개의 프로세스가 차지하는 메모리양이 극도로 작아질것이고, 프로세스의 주소공간을 올리기 어려울 정도의 문제와 시스템의 성능이 저하되는 문제가 발생한다.
그렇기 때문에 메모리에 올라와 있는 프로세스의 메모리를 통째로 빼았아서 그 내용을 디스크의 스왑영역에 저장하는 방식이 생겼다.
중기 스케줄러의 등장으로 프로세스의 상태에 suspended(stop)가 생기게 되엇다.
중기스케쥴러로 추가된 process상태가 suspended(stop) 이다.
외부적인 이유로 프로세스의 수행이 정지된 상태로 메모리에서 쫒겨나서 디스크로 swap out된 상태이다.
아래의 프로세스 상태도는 suspended가 추가된 프로세스 상태도 이다.
프로세스가 running되다가 system call이나 인터럽트등으로 운영체제로 cpu 제어권이넘어가면 사용자프로세스가 커널모드에서 running중이다. 라고 하지 운영체제가 running이다 라고 말하지 않는다.