
이번 포스트에서는 프로세스의 상태에 대해 알아보도록 하자
Trace of Process프로세스에 대해 실행되는 명령 순서
Dispatcher프로세서(CPU)를 한 프로세스에서 다른 프로세스로 전환하는 역할
Scheduler (Kernel 내의 함수 이름)실행 가능한 Process들(Ready state)들 중 우선순위가 가장 높은 프로세스 선택
해당 프로세스에게 프로세서(CPU)를 넘겨주는(dispatch) 역할
프로세스 스위치 사이에 반드시 스케줄러 함수 호출함
A Five-State Model각 프로세스는 실행 도중 항상 다음 상태들 중 하나의 상태로 존재
New프로그램의 실행을 준비하는 단계
- PCB 생성
- Load 과정으로 Ready 상태가 됨
Ready프로세서만 주어지면 언제든 실행될 수 있는 상태
즉, 실행 가능한 준비 상태
Running프로세서에 의해 현재 실행 중인 상태
BlockedI/O 장치에서 대기(waiting)상태
키보드,파일,네트워크등에서 데이터 대기- 프로세서가 주어져도 실행할 수 없는 상태
- 데이터가 도착하면 Ready 상태가 됨
Exit프로그램 실행이 완료되어 폐기단계
- 메모리에서 제거
- PCB 소멸
Wait EventDevice driver에서 대기 -> Block State로 상태 변화
Event OccursDevice driver 실행 -> Ready State로 상태 변화
Keyboard, Mouse - Keyboard, Mouse interrupt
Wait Event
scanf(),GetMessage()호출
Event Occurs키보드 -
Enter
마우스 - 움직임,Click
Disk(File Read) - Disk(or USB) interrupt
Wait Event
read(),fread(),fscanf()호출
Event Occurs디스크가 파일을 읽어 메모리에 전달한 후
Network - Network interrupt
Wait Event
receive()호출
Event Occurs네트워크 보드에 데이터가 도착했을 때
Timer - Timer interrupt
Wait Event
Sleep(2000),sleep(2)호출
Event Occurs지정한 시간(2초) 지난 후
time quantum(0.1초) 초과 -> 시분할 시스템
Semaphore - 다른 프로세스가 unlock(s) 호출 시에만Interrupt와는 무관.
Wait Event
lock을 호출했지만 다른 프로세스가 이미lock()한 경우
Event Occurs다른 프로세스가
unlock(s)함수를 호출하여 lock을 풀어줄 때

Running -> Blocked 상태로의 전환실행중인 프로세스가 대기 상태로 전환되는 과정
I/O 함수 호출 - scanf(), read(), receive() 등
- 궁극적으로 API 함수 호출하고 kernel속으로 진입
- 키보드, 디스크, 네트워크 device에 도착한 데이터가 없으면 데이터가 도착할 때까지 대기
Running상태에서Blocked상태로 전환Scheduler()함수 호출 -processor를 다른process에게 넘겨 줌- 데이터가 도착하면 깨어나 해당 데이터를 가지고 리턴
Scheduler() 함수
Ready상태의process들 중 우선순위가 가장 높은 프로세스를 선택processor를 해당process에게 넘겨 줌- 실행할 다른 프로세스가 없을 경우
processor는idle상태
for(;;);무한 loop 돌면서 대기- Blocked 상태의
process들은 스케줄링 대상에서 제외
Blocked -> Ready 상태로의 전환대기상태의 프로세스가 깨어나 Ready 상태로 전환되는 과정
각 디바이스는 데이터가 도착했다는 것을processor에게interrupt(전기적 신호)를 통해 통보
Interrupt 발생 - Timer, Network, Disk 등에서 발생
processor는 현재 실행 중인process의 실행 보류- 현재 실행 중인
process:Running->Ready상태로 전환- Interrupt 고유 업무 수행
- 해당 디바이스의 대기큐에서 데이터를 기다리는
process를 찾아 데이터 전달- 해당
process를Blocked상태에서Ready상태로 변환(깨우기)Scheduler()호출 :Interrupt의 마지막에 항상scheduler호출
- 깨어난 프로세스가 최우선순위면 바로 실행
- 그렇지 않으면
interrupt가 들어오기 전에 실행되었던 프로세스 계속 실행