프로세스란 ? 실행중인 프로그램
문맥이란 ? 전체적인 문장구조 속에서 파악하는것!
프로세스의 문맥(context) : 프로세스가 진행되는동안 여러 동작이 진행된다. 그 과정 속에서 어느 시점에 프로세스가 어느정도 진행되었는가.. 등을 규명하는데 필요한 요소 (프로세스의 현재 수행 상태를 나타내는데 필요한 모든 요소)
1. CPU 수행 상태를 나타내는 하드웨어 문맥 ex) Program Counter , 각종 register 어디를 가르키고있고, 어떤 값을 가지고 있었는가?
2. 프로세스의 주소공간 ex) code, data, stack에 어떤 내용이 들어 있는가?
3. 프로세스 관련 커널 자료 구조 ex) PCB(Process Contrl Block), Kernel stack
프로세스 마다 커널 스택을 별도로 두고있음..
현대 컴퓨터는 타임쉐어링, 멀티태스킹 등 프로세스들이 번갈아가며 실행이 되고있음.
만약 문맥을 모르게 된다면, cpu가 타임쉐어링에 의해 다른 프로세스로 넘어간 뒤 다시 본래의 프로세스로 넘어올 때, 어디부터 실행해야 하는지를 모름.
그래서 항상 문맥을 파악하고, 진행했던 시점 그 다음시점부터 인스트럭션을 실행할 수 있게 하는 것이다.
프로세스의 상태(Process State)
프로세스 상태(state)가 변경되며 수행이 된다.
-Running
CPU를 잡고 instruction을 수행중인 상태
-Ready
CPU를 기다리는 상태(물리적인 메모리 공간에 올라와 있는 상태)
-Blocked(wait, sleep)
CPU를 줘 봤자 instruction을 수행할 수 없는 상태
프로그램의 메모리 전체를 물리적인 메모리에 올려놓고 실행하는 것은 아니다.
그래서 어떤 프로그램 code를 실행하려고 했는데 그 부분이 메모리에 올라와있지 않고 디스크에 있을때
그럴때는 cpu를 줘봤자 당장 실행이 안되고, 그런 상태의 프로세스를 blocked 상태에 있다고 한다.
process 자신이 요청한 event(I/O)작업 같이 오래 걸리는 작업이 만족되기 전까지는
CPU를 줘봤자 일을 할 수가 없다. ex) 디스크에서 file을 읽어와야 하는 경우 등
New : 프로세스가 생성중인 상태
Terminated: 수행(execution)이 끝난 상태
프로세스의 상태도이다.
프로세스가 생성(new)이 됬으면, ready 상태가 된다. ready 상태는 CPU만 할당 받으면 실행되는 상태 (최소한의 메모리는 가지고 있는 상태)이다...->다른말로 당장 인스트럭션을 실행하는데 필요한 부분은 메모리에 올라와 있는 상태이다. 그 상황에서 CPU를 얻게 되면 running 상태가 된다.
running 상태일 때, CPU를 다시 반환하는 3가지가 있다.
1. 자진해서 CPU를 내놓는것 (I/O)작업 같은 오래 걸리는 작업은 blocked 상태로 가게 된다.
2. Timer interrupt가 걸려서 CPU를 뺏길 수 있다. 이럴경우 다시 ready상태에서 줄 서 있는다. (큐)
3. 중간중간 I/O 작업을 많이하는 프로그램
프로세스의 상태이다.
CPU는 굉장히 빠르고 여럿이 공유하는 자원이다.
하나의 프로세스가 CPU에서 running 하고있다가, timer interrupt가 들어오면 CPU를 뺏기고, 다시 맨뒤에서 대기하는 식으로 'queue'식으로 CPU를 사용하게 되있다.
그러는 중, CPU에서 running이 되다가, disk에서 뭔가를 읽어와야 하면, running에서 blocked 상태로 바뀌면서 disk의 서비스를 받는 곳에 프로세스가 줄을 서게 된다.
disk 작업이 끝나면, disk controller가 cpu한테 인터럽트를 걸것이고, IO 작업이 끝났음을 알려주고, 인터럽트 걸렷으니 제어권이 운영체제 커널에게 넘어가고, 커널은 IO작업이 끝났으니, 그 프로세스의 메모리 영역에 해당하는 데이터를 넘겨주는 일과, 프로세스의 상태를 blocked에서 ready로 바꿔서 CPU를 얻을 수 있는 자격을 준다.
키보드 입력받는 경우
Running 상태에 있던 프로세스가 키보드를 입력받은 후 그 결과를 보고 실행을 하겠다
-> 키보드 입력이라는 IO작업을 위해서 이 프로세스는 blocked 상태가 되고, IO작업 메모리에 줄을 서게 된다. (I/O queue)
요청한 키보드 입력을 넣으면 키보드 컨트롤러가 그 요청을 인터럽트 걸어서 CPU가 하던일을 잠시 멈추고, 운영체제에 넘어간다.
blocked된 프로세스를 다시 ready 상태로 바꿔서 CPU를 잡을 수 있는 자격이 생기게 된다.
공유 데이터를 접근하는 경우
공유 데이터를 동시에 접근하면 일관성이 깨질 수 있음. 그래서 먼저 공유데이터를 점유하는 프로세스가 끝날때까지 메모리영역에 줄을 서서 기다림
이것 또한 block 상태이고, (Resource queue), 그 작업이 끝나면 다시 ready queue 상태로 넘어옴
운영체제 커널이 데이터 영역에 자료구조로 큐를 만들어놓고, 프로세스의 상태를 바꿔가면서 레디 상태에 있는 프로세스 중에서 CPU를 주고, blocked 상태에 있는 친구들 한테는 CPU를 안 주고 이런식으로 운영하는 것.
운영체제 커널이 각 프로세스마다 그 프로세스와 관련된 정보 즉 프로세스를 관리하기 위해서 프로세스 당 유지하는 정보로 'PCB'라는 것을 둔다.
PCB구조
(1) : OS가 관리상 사용하는 정보 - Process state, Process ID, Scheduling information, priority
(2) : CPU 수행 관련 하드웨어 값 - Program counter, registers
(3) : 메모리 관련 - Code, data, stack의 위치 정보
(4) : 파일 관련 - Open file descrioptors...(프로세스가 사용하고 있는 파일들)
문맥교환이란 ? CPU를 어떤 프로세스에서 사용 중에 다른 프로세스로 넘겨주는 과정
문맥 교환이 일어나서, CPU를 뺏기게 되면, ready 상태에 있다가 다시 Running 시기때 어느 시점부터(문맥) 실행을 재개하기 위해서는
PCB에다가 값등을 save 해놓는다. memory map도 세이브를 해놓음.
시스템 콜이나 인터럽트 발생 시 항상 문맥교환이 일어나는 것은 아니다.
문맥교환은 사용자 프로세스에서 또다른 사용자 프로세스로 넘어가는 과정에서 일어나는 것을 말한다.
즉, 시스템 콜이나, 인터럽트 등은 운체에 넘어간 뒤에 다시 본래의 process로 CPU제어권이 넘어가는 것이므로, 문맥교환이 일어나지 않음
반면에 time interrupt, I/O요청 System call에 의해서 는 문맥교환이 일어난다.
time interrupt 경우 다른 프로세스로 넘어가게 되고, io요청은 당장 인스트럭션 실행 불가(blocked되어서) 레디인 다른 프로세스한테 cpu를 넘겨주게 된다.(문맥교환 일어남)
ready queue, device queue 모두 job queue에 포함되어 있다.
그치만 ready에 있으면 device에, device에 있으면 ready에 없다.
ready queue에 줄서있는것은 pcb 연결 -> 포인터를 통해서 가능하다.
프로그램 시작 - ready queue에 줄을 서다, 자기 차례때 cpu를 얻고, 할당시간 (timer)끝나면 ready queue에 줄을 선다.
오래걸리는 작업일 경우 i/o queue에 줄을 서다가, 그작업이 끝나면 다시 ready queue에 줄을 서있고.. 본인 역할이 끝나면 프로세스 종료되어 빠져나가는 것
스케줄러 : 자원별로 시간을 얼만큼 잡고 무슨일을 하는지 정해주는 것..?
보통 현대 컴퓨터는 timesharing 방식이다. timesharing 방식은 컴퓨터가 시작하면 프로세스들을 곧바로 메모리에 올려놓는다. 그러므로 현대 컴퓨터는 Long-term scheduler를 안쓴다. -- 그래서 나온게 Medium-Term Scheduler이다.
중기 스케줄러는 일단 메모리에 다 올려놓고, 너무 메모리에 많은 프로그램이 올라가있으면 몇개를 쫓아낸다.
중기스케줄러 때문에 프로세스 3가지상태(running, ready, blocked)에 suspended(stopped)상태가 추가되었다.
suspended 상태는 메모리를 통째로 빼앗긴 프로세스의 상태이다. ( 강제로 정지시켜 놓은 상태)
suspended 상태는 메모리에서 다 쫓겨나서 프로세스가 통째로 디스크에 swap out이 된 상태를 의미한다.
blocked, suspended 차이
blocked : 자신이 요청한 (io등의) event가 만족되면 다시 ready 상태로 돌아옴
suspended : 외부(중기스케쥴러)에서 resume 해 주어야 active 상태가 된다.
Running은 두가지로 되있는데 하나는 user mode, 하나는 monitor mode이다. 프로세스가 자기 코드를 실행하다, system call이 실행해서 운영체제 코드가 실행중일 때에도, 사용자 프로세스가 커널모드에서 러이하고 있다라고 부른다. (운영체제가 러닝을 하고있다 라고 부르지 않음)
이 그림은 모두 사용자 프로그램의 상태도를 나타내는것..
시스템 콜이나 인터럽트가 끝났으면 다시 유저모드에서 사용자 프로그램의 코드를 실행한다.
active상태, inactive상태 추가된 모습
inactive상태는 외부적인 이유로 프로세스가 얼어 붙은것.
외부에서 정지했으면, 다시 외부에서 정지를 풀어줘야지만 active 상태로 올라갈 수 있다.
active 상태는 cpu를 얻었거나 cpu를 기다리거나 i/o작업을 하거나 무언가 작업을 하는 상태들이다.
suspended blocked 상태에서 io 같은 작업이 일어나서 끝났을때 suspended ready 상태로 가는 경우도 있을수 있다.
'운영체제' 카테고리의 다른 글
[운영체제]5. Process(2) (1) | 2018.01.11 |
---|---|
[운영체제]3. System Structure & Program Execution(2) (1) | 2017.12.29 |
[운영체제]2. System Structure & Program Execution (3) | 2017.12.27 |