ABOUT ME

Today
Yesterday
Total
  • [운영체제] 3. 프로세스
    운영체제 2019. 8. 16. 17:37

     


     

    저번 Post에서 운영체제의 중요한 역할 중 하나가 프로세스 관리라고 했었다.

     

    이번 Post에서 프로세스가 정확히 무엇이고, 프로세스를 어떻게 관리하는지 알아보자.

     

     

     

     

    프로세스란 무엇인가에 대해서 알아보기 전에, 우리는 PCB(Process Control Block)를 알아야한다.

     

    PCB란, 이름에서 알 수 있듯이 프로세스의 제어를 위한 블럭이다. 우리의 운영체제가 프로세스 관리에 필요한 정보들을 저장하는 영역이다.

     

    PCB는 프로세스 생성 시, 커널 영역에 생성이 된다. PCB에 담기는 정보들은 OS마다 다를 수 있지만 크게는 다음과 같은 정보들이 있다.

    • PID (Process Identification Number) : 프로세스의 고유 아이디
    • 스케쥴링 정보 : 프로세스 우선순위 등과 같은 스케쥴링 관련 정보들
    • 프로세스 상태 : 자원의 할당, 요청 정보 등
    • 메모리 관리 정보 : Page Table, Segment Table
    • 입출력 상태 정보 : 할당받은 입출력 장치, 파일에 대한 정보 등
    • 문맥 저장 영역 (Context Saving Area) : 프로세스의 레지스터 상태를 저장하는 영역
    • 계정 정보 : 자원 사용시간 등을 저장하는 영역

    약간... 프로세스가 태어날 때 부터 붙는 개인 비서같은 느낌이다.... 이제 우리의 금수저 친구, 프로세스에 대해서 알아보자.

     

     

     

     

     

    프로세스

     

    프로세스란 현재 우리의 운영체제 위에서 실행되고 있는 프로그램이다.

     

    실행을 위해 커널에 등록되고 커널의 관리를 받는 프로그램이다. 각종 자원들을 요청하고 할당받을 권리가 있는 개체라고 볼 수도 있다.

     

    이런 프로세스에게도 삶이 있다. 탄생부터 죽음까지의 여러가지 상태(State)를 가진다. 그 상태들에 대해서 알아보자.

     

     

     

    프로세스의 상태

     

    프로세스의 상태들은 자원의 상호작용에 의해서 결정된다. 쉽게 말해 프로세스에게 할당받는 자원들에 따라서 상태가 결정된다는 소리다.

     

    실행중이지는 않지만 보조기억장치에 저장되어 있는 프로그램을 우리는 잡(Job)이라고 한다.

     

    우리가 이 Job에 대한 실행요청을 내리는 순간, 프로세스의 생은 시작된다.

     

     

    Created State

    • 커널은 실행을 위해 해당 Job을 등록한다.
    • PCB를 할당하고, 프로세스를 생성한다.
    • 커널이 가용메모리를 확인하고, 메모리가 충분하다면 메모리를 할당하여 실행을 하기위한 준비상태(Ready State)로 프로세스의 상태를 바꾼다. -> 이런 과정을 admit되었다고 표현한다.
    • 메모리가 충분치 않다면 메모리 할당을 기다리는 Suspended Ready 상태로 프로세스의 상태를 바꾼다.

     

    프로세스는 태어나자마자 메모리의 상태에 의해서 자신의 첫 운명이 결정된다.

     

    운이 좋아 메모리가 충분하여 Ready 상태에 들어갔다가 생각해보자. Ready 상태에선 무슨일이 벌어질까?

     

     

     

    Ready state

    • 프로세스는 자신을 실행시켜 줄 프로세서 외에 모든 자원들을 다 할당받은 상태이다.
    • 다르게 말해 즉시 실행 가능 상태가 되었다고 한다.
    • 그렇게 계속 기다리다가 프로세서가 할당이 된다면, 이 프로세는 Running State로 들어서게 된다. -> 이런 과정을 DIspatch 혹은 Scheduling 이라고 표현한다.
    • 기다리던 도중 메모리가 다시 부족해진다면 Suspended Ready 상태로 바뀌게 된다. -> 이런 과정을 Swap out 이라고 표현한다

    좋다. 기다리던 프로세는 프로세서를 할당받고 Running State로 들어섰다. 드디어 실행중인 상태인 것이다.

     

     

     

    Running State

    • 프로세서와 기타 자원들을 모두 할당받아 실행중인 상태이다.
    • 하지만 이 프로세스 외에도 수많은 프로세스들이 실행을 기다릴 것이고, 커널은 프로세스들을 스케쥴링할 의무가 있다.
    • 프로세스 스케쥴링에 의해서 프로세서를 뺏긴다면, 다시 Ready State로 상태가 변하여 자기 차례를 기다릴 것이다 -> 이러한 과정을 Preemtion 이라고 표현한다.
    • 프로세스 스케쥴링이 아니라 갑자기 인터럽트 요청(밑에서 설명)같이 프로세서 외에 다른 자원의 할당을 요청받으면 이 프로세스는 Asleep State로 변하게 된다. -> 이러한 과정을 Block된다고 표현한다.

     

    아쉽게도 실행중에 자기 순서가 끝나 Ready State로 변하면 다시 자기 차례를 기다려야 할 것이다. 하지만 인터럽트 요청같이 다른 자원의 요청이 들어온다면 Blocked/Asleep State로 변할 것이다.

     

     

    Blocked/Asleep State

    • 프로세서 외에 다른 자원을 기다리는 상태이다.
    • 다른 자원을 기다리다가 자원 할당의 준비가 되었다! 그렇다면 프로세스는 Running State로 들어가는 것이 아니고, 다시 Ready State로 가서 자기 차례를 기다려야 한다. -> 이러한 과정을 Wake up 이라고 표현한다.
    • 설상가상으로 이상태에서 메모리까지 부족하다면 Suspended Block StateSwap out된다..ㅠㅠ

     

    메모리까지 부족해져서 Suspended State에 빠지면 무슨 일이 일어날까?

     

     

    Suspended Ready State / Suspended Block State

    • 메모리가 부족하여 할당받지 못하거나 뺏긴 상태이다.
    • 커널이나 사용자에 의해 발생되는 상태이다.
    • 메모리를 할당받는다면 다시 Ready State나 Asleep State Swap in 된다.
    • 프로그램 실행 중 Suspended State로 변하게 된다면, 다시 메모리를 할당받았을 때 작업을 이어서 수행해야하기 때문에 Suspended State로 변하기 직전의 상황들을 기억해야한다. 그 상황을 이미지로 남겨둔 것을 Memory Image(실제 이미지는 아님...)라고 하며 Swap device라는 프로그램 정보 저장을 위한 특별한 파일시스템에 저장하게 된다.

     

    프로세스는 자원상황에 따라서 위의 상태들을 계속 반복하게 된다. 그러다가 프로세스가 모든 작업을 수행했다면 여한없이 죽을 수 있을 것이다.

     

     

    Terminated State

    • 프로세스의 수행이 끝난 상태이다.
    • 모든 자원을 반납하고 죽은 상태이다.
    • 커널 내에 일부 PCB 정보는 아직 남아있는 상태Zombie State라고 불리기도 한다.

     

     

    우리는 프로세스의 탄생부터 죽음까지의 모든 상태들을 봤다. 아래의 [그림1]은 위의 모든 상태들을 정리한 그림이다.

     

    [그림1] 프로세스 상태 변화 다이어그램

    하나의 프로세스는 위처럼 복잡한 상태들을 가진다. 하지만 커널이 관리할 프로세스는 한두개가 아닌 수십, 수백개의 프로세스이다. 자원을 항상 확인하고 프로세스들의 스케쥴링을 해줘야하는 막중한 임무를 가지고 있다. 커널이 프로세스를 쉬게 할 때는 그 때의 프로세스 실행상황을 기억해야하고, 다시 실행시킬 때는 기억했던 상황을 다시 꺼내서 실행시켜야한다. 그러한 정보들을 프로세스들의 개인비서인 PCB에 저장시킨다.

     

     

     

    Context Switching (문맥 교환)

    위에 언급했던 PCB의 저장영역들 중 문맥 저장 영역(Context Saving Area)이 있었다. 계속해서 언급되는 Context란 무엇일까?

    Context란 프로세스와 관련된 정보들의 집합이라고 할 수 있다. 커널이 프로세스를 쉬게 할 때, 프로세스의 Context를 PCB에 저장하는 작업을 Context Saving이라고 한다. 쉬고 있는 프로세스를 다시 실행시키기 위해 PCB에 저장시켰던 Context를 복구하는 작업을 Context Restoring이라고 한다. 커널은 Context Saving과 Context Restoring을 반복하며 프로세스의 상태를 계속해서 바꾼다. 이러한 작업을 Context Switching 혹은 Processing Switching이라고 한다. 이러한 작업은 매우매우 빈번하게 일어나기 때문에 Context Switching의 비용은 OS성능에 큰 영향을 미친다. 따라서 불필요한 Context Switching을 스레드(Thread)등을 이용하여 최대한 줄여야한다.

     

    스레드에 대해서는 다음 Post에서 설명할 예정이다.

     

     

     

     

    인터럽트(Interrupt)

    위에서 프로세스 상태들을 설명할 때, Running State에서 인터럽트 요청이오면 Asleep State로 변한다고 했다. '인터럽트'가 뭘까?

    인터럽트라는 것은 예상치 못한, 외부에서 발생되는 이벤트이다. 

     

    인터럽트의 처리 과정을 알아보자.

    1. 프로세스에 인터럽트가 발생한다면, 커널이 개입하여 프로세스를 중단시킨다.
    2. 이때, PCB에 Process의 Context를 저장하게 된다.
    3. 그 후에, 인터럽트의 발생장소나 원인을 파악한 후, 인터럽트 서비스를 할 것인지 결정한다.
    4. 서비스를 하기로 결정했다면 해당 인터럽트 처리 루틴을 호출하여 서비스를 수행한다.
    5. 인터럽트 서비스의 수행이 끝나면 프로세스를 다시 Ready State로 바꾼다.

    이해하기 쉽게 비유를 해보자.

    1. 나는 친구와 도서관에 와서 책을 읽고 있었다. 친구가 옆구리를 찔러 책 읽는 것을 중단했다.
    2. 책갈피를 책에 꽂고 책을 덮었다.
    3. 왜 찔렀나 물어봤더니 친구가 커피를 먹으러 가자고 한다. 나는 잠시 고민한다.
    4. 고민하던 나는 커피를 먹기로 결심했고, 커피를 마시는 행위를 한다.
    5. 커피를 마신 후, 다시 자리로 와 책 읽을 준비를 한다.

     

    이해가 쉽다. 그렇다면 컴퓨터 입장에서, 예상치 못한 이벤트인 '인터럽트'는 어떤것이 있을까?

     

     

     

    인터럽트의 종류

    • I/O Interrupt
    • Clock Interrupt
    • Console Interrupt
    • System call Interrupt
    • Program Check Interrupt
    • .....

     

    위와 같이 수많은 인터럽트가 있다. 키보드나 마우스 등의 입력이 들어가는 이벤트를 I/O Interrupt라고 하는데, 컴퓨터 입장에서는 사용자가 언제 키보드나 마우스를 누를지 모르기 때문에 예상치 못한 이벤트라고 할 수 있다. 나머지 인터럽트가 궁금하다면 구글에 쳐보도록 하자!

     

     

     

    '운영체제' 카테고리의 다른 글

    댓글

Designed by Tistory.