본문 바로가기
OS

프로세스 관리

by creatingeveryday 2023. 3. 11.
  • 프로세스란?
    • 프로세스는 실행 중인 프로그램을 의미한다. job 이라는 용어와 혼용해서 사용
    • 프로세스를 이해하기 위해서는 프로세스 문맥(context)에 대한 이해가 필요하다.
      • 여러 프로세스가 함께 수행되는 시분할 시스템 환경에서는 CPU의 제어권을 잠깐씩 점유하여 사용하기 때문에 다시 획득해서 명령의 수행을 재개하는 시점이 되면 이전의 CPU 보유 시점에 어느 부분까지 명령을 수행했는지 직전 수행 시점의 정확한 상태를 재현할 필요가 있다.
      • 프로세스의 문맥은 그 프로세스의 주소 공간을 비롯해 레지스터에 어떤 값을 가지고 있었는지와, 시스템 콜 등을 통해 커널에서 수행한 일의 상태, 그 프로세스에 관해 커널이 관리하고 있는 각종 정보 등을 포함하게 된다.
      • 프로세스 문맥을 크게 3가지로 분류
        • 하드웨어 문맥
          • CPU의 수행상태를 나타내는 것으로 프로그램 카운터값과 각종 레지스터에 저장하고 있는 값들을 의미한다.
        • 프로세스의 주소 공간
          • 프로세스는 코드, 데이터, 스택으로 구성되는 자기 자신만의 독자적인 주소 공간을 가지고 있다.
        • 커널상의 문맥
          • 운영체제는 프로세스를 관리하기 위한 자료 구조인 PCB와 커널 스택을 유지한다.
    • 프로세스의 상태
      • 시작
        • 프로세스가 시작되어 그 프로세스를 위한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태
      • 실행(running)
        • 실행 상태는 프로세스가 CPU를 보유하고. 기계어 명령을 실행하고 있는 상태
          실행 시킬 프로세스를 변경하기 위해 원래 수행 중이던 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정을 context switch 라고 한다.
      • 준비(ready)
        • 프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만 CPU를 할당받지 못한 상태
          인터럽트가 발생하거나 실행 중이던 프로세스가 봉쇄상태로 바뀌는 경우 준비 상태에 있는 프로세스들 중에서 CPU를 할당받을 프로세스를 선택한 후 실제로 CPU의 제어권을 넘겨받는 과정을 CPU dispatch라고 한다.
      • 봉쇄(blocked, wait, sleep)
        • CPU를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태
      • 완료
        • 프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태
      • 중지
        • 외부적인 이유로 프로세스의 수행이 정지된 상태 (inactive)
          중지 상태에 있는 프로세스는 외부에서 재개시키지 않는 이상 다시 활성화될 수 없으므로 메모리 자원이 필요하지 않기 때문에 중지 상태 프로세스의 메모리는 통째로 디스크로 스왑 아웃된다.
        • 중지준비(suspended ready)
        • 중지봉쇄(suspended blocked) 
  • 프로세스의 제어블록(Process Control Block)
    • PCB는 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조
    • 구성
      • 운영체제가 관리상 사용하는 정보
        • 프로세스의 상태, 프로세스 번호, 스케줄링 정보, 우선순위
      • CPU 수행 관련 하드웨어 값
        • 프로그램 카운터, 레지스터
      • 메모리 관련
        • 코드, 데이터, 스택의 위치 정보
      • 파일 관련
        • 프로세스가 오픈한 파일 정보
  • 문맥 교환(context switch)
    • 문맥 교환이란 하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU의 제어권이 이양되는 과정을 뜻한다.
      문맥 교환 중에 이전 프로세스는 프로세스 문맥을 자신의 PCB에 저장하고, 새롭게 CPU를 할당받을 프로세스는 예전에 저장했던 자신의 문맥을 PCB로부터 실제 하드웨어로 복원시키는 과정을 거친다.
    • 하나의 사용자 프로그램이 인터럽트나 시스템 콜이 발생할 경우 CPU의 제어권이 잠시 운영체제로 넘어갔다가 돌아오는 것은 문맥 교환이라고 하지 않는다.
    • 문맥 교환에 소요되는 시간은 시스템 입장에서 일종의 오버헤드라고 할 수 있다. 문맥교환 중에 일어나는 작업은 실제 시스템에게 유용한 작업이 아니기 때문이다. 타이머에 CPU 할당 시간을 아주 작게 세팅하면 문맥교환이 빈번하게 발생하면 이에 드는 오버헤드가 상당히 커진다. 또 그 반대로 CPU 할당 시간을 너무 길게 설정하면 시분할 시스템의 의미가 퇴색하므로 적절한 CPU 할당시간을 정하는 것이 중요하다.
  • process ready queue
    • 운영체제는 준비 상태에 있는 프로세스들을 줄 세우기 위해 큐를 두고 큐의 제일 앞에 줄 서 있는 프로세스에 제일 먼저 CPU를 할당한다.
    • 운영체제는 커널의 주소 영역 중 데이터 영역에 다양한 queue를 두어 프로세스의 상태를 관리한다.
    • 큐에 프로세스를 줄 세우는 방법은 CPU 스케줄링 방법에 따라 달라진다.
    • 큐는 각 프로세스의 PCB를 연결 리스트 형태로 관리하며 포인터를 사용해 순서를 정한다.
    • device queue
      • 운영체제는 특정 자원을 기다리는 프로세스들을 줄 세우기 위해 자원별로 장치 큐를 둔다.
      • Disk I/O queue, keyboard I/O queue…
    • job queue
      • 시스템 내의 모든 프로세스를 관리하기 위한 큐
      • 프로세스의 상태와 무관하게 현재 시스템 내에 있는 모든 프로세스가 작업 큐에 속하게 된다.

 

  • 스케줄러(scheduler)
    • 스케줄러란 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드를 지칭한다.
    • 장기 스케줄러(long term, job)
      • 어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할
      • 준비 큐는 CPU만 얻으면 당장 실행될 수 있는 프로세스의 집합이고, CPU에서 실행되기 위해서는 프로세스가 메모리를 보유해야 하므로 장기 스케줄러는 프로세스에게 메모리를 할당하는 문제에도 관여한다.
      • 수십 초 내지 수 분 단위로 가끔 호출되므로 단기 스케줄러에 비해 상대적으로 수행 속도가 느리다.
      • 과거에 자원이 매우 빈약하던 시절에 사용되었으며 현재 장기 스케줄러를 두지 않는게 대부분이다. 과거에는 적은 양의 메모리를 많은 프로세스들에게 할당하면 시스템 효율이 매우 떨어졌기 때문에 메모리에 동시에 올라가 있는 프로세스의 수를 조절하는 역할을 담당했다. 현재는 프로세스가 시작 상태가 되면 장기 스케줄러 없이 곧 바로 그 프로세스에 메모리를 할당해 준비 큐에 넣는다.
    • 중기 스케줄러(medium term)
      • 현재는 장기 스케줄러 대신 중기 스케줄러를 두는 경우가 많다.
      • 너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하는 역할을 한다.
      • 프로세스당 보유 메모리양이 지나치게 적어진 경우 이를 완화시키기 위해 일부 프로세스를 메모리에서 디스크로 스왑 아웃시키는 역할을 수행한다.
      • 스왑아웃 시키는 대상의 0 순위는 봉쇄 상태에 있는 프로세스들이다. 그래도 메모리 공간이 부족한 경우 보통 타이머 인터럽트가 발생해 준비 큐로 이동하는 프로세스를 추가적으로 스왑 아웃 시켜서 당장 실행되는 프로세스가 사용할 메모리 공간을 확보한다.
    • 단기 스케줄러(short term, CPU scheduler)
      • 준비 상태의 프로세스 중에서 어떤 프로세스를 다음 번에 실행 상태로 만들 것인지 결정한다.
      • 타이머 인터럽트가 발생하면 단기 스케줄러가 호출된다.
      • 밀리초 정도의 시간 단위로 매우 빈번하게 호출되므로 빠른 수행 속도가 요구된다.

프로세스의 생성

  • 시스템이 부팅된 후 최초의 프로세스는 운영체제가 직접 생성하지만 그 다음부터는 이미 존재하는 프로세스가 다른 프로세스를 복제 생성하게 된다.
    • 자식 프로세스가 종료될 경우 부모 프로세스가 그에 대한 처리를 수행한다.
    • 부모 프로세스가 종료된다면 연관된 자식 프로세스를 모두 종료시킨 후에야 종료될 수 있다.
  • 프로세스 수행 모델
    • 부모 프로세스와 자식 프로세스가 공존하며 수행되는 모델
    • 자식이 종료될 때까지 부모가 기다리는 모델
      • 자식 프로세스가 종료될 때 까지 부모 프로세스는 봉쇄 상태에 머무른다.
  • 부모 프로세스가 자식 프로세스를 생성하면 자식 프로세스는 부모 프로세스와는 별도의 주소 공간을 가지게 되는데, 처음 주소 공간을 생성할 때에는 부모 프로세스의 주소 공간의 내용(문맥 포함)을 그대로 복사해서 생성한다. (fork) 따라서 자식 프로세스는 부모 프로세스의 처음부터 수행을 시작하는 게 아니라 부모 프로세스가 현재 수행한 시점(프로그램 카운터 지점)부터 수행하게 된다.
  • 이렇게 복사한 자식 프로세스를 생성한 후 부모와는 다른 독자적인 프로그램을 수행시킬 수 있게 하기 위해 유닉스에서는 프로세스의 주소 공간에 새로운 프로그램을 덮어 씌우는 exec() 시스템 콜을 지원한다. 프로세스의 주소 공간을 완전히 새로운 프로그램으로 덮어 씌운 후 새로운 프로그램의 첫 부분부터 다시 실행을 시작하도록 한다.
  • wait() 시스템 콜은 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록 할 때 사용되며 자식 프로세스가 종료되야만 부모 프로세스를 준비 상태로 변경시키기 때문에 부모 프로세스와 자식 프로세스 간의 동기화를 가능하게 한다.

 

  • 프로세스 간의 협력
    • 원칙적으로 프로세스가 다른 프로세스의 독립적인 주소 공간을 참조하는 것은 허용되지 않기 때문에 다른 프로세스의 수행에 영향을 미칠 수 없다.
    • 그렇다면 독립적인 프로세스들의 협력은 어떻게 이루어 질까?
    • 운영체제는 IPC(Inter-Process Communication) 프로세스간 협력 매커니즘을 제공한다.
      • IPC는 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신을 말한다.
      • 의사소통 기능과 동기화가 보장되어야한다.
      • 메시지 전달 방식
        • 프로세스 간 공유 데이터를 일체 사용하지 않고 메시지를 주고 받으면서 통신하는 방식
        • 메시지 전달은 커널이 대신한다. 커널은 send 와 receive 연산을 제공하고 프로세스는 전달할 메시지를 운영체제에게 시스템 콜 방식으로 요청해 전달할 수 있다.
        • 직접 통신
          • 메시지의 전송 대상이 다른 프로세스 이므로 통신하려는 프로세스의 이름을 명시적으로 표시한다.
        • 간접 통신
          • 메시지를 메일 박스 또는 포트로부터 전달 받는다.
      • 공유 메모리 방식
        • 프로세스들이 주소 공간의 일부를 공유한다.
        • 각 프로세스는 독자적인 주소 공간을 가지고 있지만, 주소 공간이 물리적 메모리에 매핑될 때 공유 메모리 주소 영역에 대해서는 동일한 물리적 메모리 주소로 매핑한다.
        • 데이터 일관성 문제가 발생할 수 있으며 커널이 책임지지 않기 때문에 각 프로세스끼리 동기화 문제를 책임져야한다.

'OS' 카테고리의 다른 글

메모리 관리  (1) 2023.03.26
CPU 스케줄링  (0) 2023.03.18
프로그램의 구조와 실행  (0) 2023.03.03
컴퓨터 시스템의 동작 원리  (1) 2023.02.25
운영체제란?  (0) 2023.02.17

댓글