[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/운영체제

[운영체제] 상태천이 / PCB / 시스템 호출, 인터럽트, 문맥교환의 연계

inu 2020. 4. 2. 15:40
반응형

상태 천이 (State Transition)

  • 실제로 프로세스는 단순히 중단, 실행의 상태만 있는 것이 아니라 더 다양한 상태가 존재한다. (이는 운영체제의 종류에 따라 다양하지만 대표적인 5가지 상태인 생성,준비, 실행, 대기, 종료에 대해서만 알아보도록 하겠다.)
  • 이러한 프로세스의 상태가 바뀌는 것을 '프로세스 상태 천이'라고 한다. 각각의 상태는 모두 연관되어 있다. 이러한 상태 천이는 상태천이도로서 설명된다.
  • (참고 : https://sungjk.github.io/2016/05/20/Scheduling.html)
  • 생성(new) , 종료(terminated) : 프로세스가 생성 중일 땐 생성(new) 상태가 되고, 프로세스 실행이 종료하면 종료(terminated) 상태가 된다.
  • 준비(ready) : 스케쥴링에 의하여 언제든지 실행될 수 있는 상태이다. 준비 리스트 혹은 준비 큐에서 대기한다. 생성(new) 상태에서 선정되어 CPU 할당을 대기하고 있거나 / 실행(running) 상태에서 비자발적 문맥교환(CPU 독점방지를 위한 타임슬라이스 소진, 인터럽트 발생으로 인한 일시 중지)이 일어나거나 / 대기(blocked) 상태에서 입출력 또는 시그널 사건이 완료되었 을 때 준비(ready) 상태로 천이된다. CPU 스케쥴러에 의해 선정되면 실행(running) 상태로 천이된다.
  • 실행(running) : CPU가 프로세스를 실행시키고 있는 상태이다. 준비(ready) 상태에서 CPU 스케쥴러에 의해 선정되면 실행(running) 상태로 천이된다. 비자발적 문맥교환(CPU 독점방지를 위한 타임슬라이스 소진, 인터럽트 발생으로 인한 일시 중지)이 일어나면 다시 준비(ready) 상태가 된다. 자발적 문맥교환(입출력 요청, 시그널 대기)가 일어나면 대기(blocked) 상태가 된다. 실행은 사용자 모드 실행과 커널 모드 실행으로 나뉜다. 입출력이나 다른 프로세스로부터 들어온 시그널에 대한 대기를 요청하게 되면 프로세스가 트랩을 하여 커널 내부로 진입하고, 커널모드가 되어 커널의 코드부분이 실행된다. 프로그램이 끝이 나거나 exit가 실행되면 종료(terminated) 상태가 된다.
  • 대기(blocked) : 입출력 요청이나 시그널 대기가 요청되면 대기(blocked) 상태가 된다. 대기 상태에서는 입출력이 완료되거나 사건이 발생되어 시그널이 들어오기 전까지 CPU를 반납한다. 이 프로세스는 사건의 종류별로 구성된 대기 리스트(wait queue, sleep queue)로 이동되었다가 사건이 발생되어 시그널이 들어오면 준비(ready) 상태로 천이되어 준비 리스트로 이동된다. 대기 중에도 I/0을 진행되고, 다른 프로세스도 진행된다. 이러한 대기 상태의 개념으로 I/O와 CPU가 overlap되어 동시실행될 수 있게 되었다.

PCB : 프로세스 컨트롤 블록

  • PCB : 프로세스의 일생동안 프로세스의 모든 정적 및 동적 정보를 저장한다. 특수 레지스터의 상태, 범용 레지스터의 상태, 프로세스의 자원 사용정보나 커널의 프로레스 관리 정보 등이 저장되는 자료구조이다. 운영체제마다 이름이 다르다. (cf. linux : Task Struct)
  • 커널이 프로세스를 관리하기 위한 실체이다. 즉, 커널은 결국 PCB를 통해 프로세스를 관리한다.
  • 앞서 언급한 준비 리스트나 대기 리스트가 결국 PCB들의 리스트이다. 직접적으로 PCB 모두가 옮겨다닐 수는 없으므로, PCB의 포인터(주소)가 리스트를 옮겨다닌다. (cf. 실행 상태의 비밀 : 실행상태 시에는 PCB는 여전히 준비 리스트에 존재하고, 상태표시만 실행(running)으로 변경된다. 물론 실행이 된만큼 준비 리스트의 제일 앞에 존재한다.)
  • 프로세스 ID (식별자 고유번호) / 사용자 정보 (프로세스를 발생시킨 사용자 정보(보호시스템 통과 키로도 활용)) / 프로세스 상태 (프로세스의 상태 정보(생성, 준비(READY), 대기(BLOCKED), 실행(RUNNING), 종료 중 하나)) / 레지스터 문맥 (문맥교환을 위한 커널 수준 문맥 보관(PC, SP, PSR, 범용 Reg. 등)) / CPU 스케줄링 정보 (현재 우선 순위, 우선순위 결정 정보(최근 CPU 사용량, CPU 대기 시간, 잔여 타임 슬라이스 등)) / 메모리 정보 (메모리영역(텍스트, 데이터, 스택)의 주소 및 크기, 상하한 레지스터, 가상 메모리 정보) / 자원 할당 및 사용 정보 (할당된 각종 입출력 자원, 사용중인 파일 등의 정보(입출력 보호 및 오류에의한 종료시 자원 회수 용)) / 각종 링크 (연결 리스트 활용) 등이 PCB에 저장된다.
  • 문맥교환과 PCB : 프로세스 각자의 PCB에 각자의 문맥과 상태를 save하고 restore하면서 프로세스들이 번갈아가며 수행된다.

시스템 호출, 인터럽트, 문맥교환의 연계

  • 사용자 프로세스가 디스크 입력을 위한 read() 시스템 호출을 하여, 완료될 때까지의 과정을 종합적으로 살펴보자. 사용자 프로그램에서 read 함수를 실행하면 시스템 호출(트랩)과정으로 커널로 진입하여 커널모드로 변경된다.
  • 커널모드에서 sys_read 함수가 실행되면 먼저 파일의 현재 논리적 접근 위치를 디스크의 블록 번호로 변환한다. 커널의 버퍼캐시에 해당 디스크 블록이 있는지 확인하여 있으면 바로 사용자 영역의 버퍼로 복사한 뒤 사용자 모드로 복귀한다(리턴한다). 없으면 디스크 입출력을 위한 자료구조인 '디스크 I/O 요청 블록'을 생성하고 해당 블록을 'DISK I/O queue'에 입력한다.
  • 순서가 되면 디스크 제어기에 I/O 명령을 내려 작동을 지시한다. 이 시점부터 프로세스는 해당 입출력이 완료될 때까지 CPU를 반납하고 대기 상태로 진입해야 한다. 따라서 sleep_on 함수로 대기 상태로 진입하게 한다. 시간이 지나 sleep_on이 리턴되면, 그것은 곧 해당 프로세스가 준비 상태를 거쳐 다시 커널 모드 실행 상태가 된 것이다. 즉, 커널 내 버퍼 캐시에 원하던 데이터가 들어가 있을 것이므로 해당 자료를 사용자 영역의 버퍼로 복사하고 사용자 모드로 복귀한다(리턴한다).
  • 위의 sleep_on 함수를 좀 더 자세히 살펴보자. sleep_on 함수는 PCB 상태를 running에서 blocked로 변경하고, 현재 PCB를 준비 리스트에서 대기 큐로 옮긴다. 그 후 준비리스트에서 우선순위가 가장 높은 PCB를 선정하여 해당 상태 정보를 실행 상태로 변경한다. 그리고 해당 PCB의 정보를 running으로 바꾸어 그에 따른 프로세스를 수행한다. 그러다가 입출력 장치 제어기가 DMA를 마치면 인터럽트를 걸어오고, 다시 ISR과정에 의해 원래 수행하던 프로세스를 ready로 변경한다. 그 후, 결국 스케쥴링의 결과로 해당 프로세스가 wake-up된다. 그렇게 sleep_on 함수가 리턴되어 나머지 작업을 수행할 수 있게 되는 것이다.
  • 또 위의 ISR 함수도 좀 더 자세히 살펴보자. ISR은 PCB를 대기 큐에서 다시 준비 리스트로 옮겨준다. 그리고 다음 '디스크 I/O 요청 블록'이 존재하면 제어기에 명령을 내리고 다음 입출력을 시작시킨다. 그리고 인터럽트 처리 절차를 마치고 복귀한다. 이 때 스케쥴러, 문맥교환이 일어난다.

 

반응형