이번 포스트에서는 프로세스의 상태에 대해 알아보도록 하자
Trace of Process
프로세스에 대해 실행되는 명령 순서
Dispatcher
프로세서(CPU)를 한 프로세스에서 다른 프로세스로 전환하는 역할
Scheduler
(Kernel
내의 함수 이름)실행 가능한 Process들(Ready state)들 중 우선순위가 가장 높은 프로세스 선택
해당 프로세스에게 프로세서(CPU)를 넘겨주는(dispatch) 역할
프로세스 스위치 사이에 반드시 스케줄러 함수 호출함
A Five-State Model
각 프로세스는 실행 도중 항상 다음 상태들 중 하나의 상태로 존재
New
프로그램의 실행을 준비하는 단계
- PCB 생성
- Load 과정으로 Ready 상태가 됨
Ready
프로세서만 주어지면 언제든 실행될 수 있는 상태
즉, 실행 가능한 준비 상태
Running
프로세서에 의해 현재 실행 중인 상태
Blocked
I/O 장치에서 대기(waiting)상태
키보드
,파일
,네트워크
등에서 데이터 대기- 프로세서가 주어져도 실행할 수 없는 상태
- 데이터가 도착하면 Ready 상태가 됨
Exit
프로그램 실행이 완료되어 폐기단계
- 메모리에서 제거
- PCB 소멸
Wait Event
Device driver에서 대기 -> Block State로 상태 변화
Event Occurs
Device 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
가 들어오기 전에 실행되었던 프로세스 계속 실행