[CS 기초] 운영체제

Sohyeon Bak·2022년 7월 2일
0

개발 책

목록 보기
11/18
post-thumbnail

'운영체제와 정보기술의 원리' 책을 바탕으로 정리한 내용입니다.

05. 프로세스 관리

프로세스의 개념

프로세스(≒job)란 실행 중인 프로그램(program in execution)을 뜻하고 디스크에 실행파일 형태로 존재하던 프로그램이 메모리에 올라가서 실행되는 것이다.

프로세스 문맥은 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보를 의미한다.
여러 프로세스가 함께 수행되는 시분할 시스템 환경에서는 타이머 인터럽트에 의해 짧은 시간 동안 CPU를 사용한 후 빼앗겼다가 추후에 다시 CPU를 획득하는 식으로 관리된다.
→ 정확한 재현을 위해 필요한 정보이다.

  • 하드웨어 문맥
    : CPU의 수행 상태를 나타내는 것
    • 프로그램 카운터 값
    • 각종 레지스터에 저장하고 있는 값
    • 주소 공간(코드, 데이터, 스택 상태)
    • PCB와 커널스택
      : 프로세스 상태가 되면 운영체제는 프로세스를 관리하기 위한 자료구조를 유지

프로세스의 상태

프로세스의 상태는 실행(running), 준비(ready), 봉쇄(block, wait, sleep)으로 구분할 수 있다.

  • 실행 상태
    : 프로세스가 CPU를 보유하고, 기계어 명령을 실행하고 있는 상태를 가리킨다.
  • 준비 상태
    : 프로세스가 CPU만 보유하면 당장 명령을 실행 할 수 있지만 CPU를 할당받지 못한 상태
  • 봉쇄 상태
    : CPU를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태
  • 시작 상태
    : 프로세스가 생성
  • 완료 상태
    : 프로세스가 종료중인 일시적 상태
    → 컴퓨터 자원을 효율적으로 관리하기 위해서

문맥교환

: 실행시킬 프로세스를 변경하기 위해 원래 수행중이던 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정

  • 타이머 인터럽트가 발생하는 경우
  • 실행 상태에 있던 프로세스가 입출력 요청등으로 봉쇄 상태로 바뀌는 경우
    → CPU를 할당받을 프로세스를 선택한 후 실제로 CPU의 제어권을 넘겨받는 과정을 CPU 디스패치

프로세스 제어블록

프로세스 제어블록(Process Control Block: PCB)는 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조

  • 프로세스의 상태
    : CPU를 할당해도 되는지 여부 결정
  • 프로그램 카운터의 값
    : 다음에 수행할 명령의 위치를 가리킴
  • CPU 레지스터의 값
    : CPU 연산을 위해 현 시점에 레지스터의 어떤 값을 저장하고 있는지 나타냄
  • CPU 스케쥴링 정보
    : 프로세스의 CPU 스케줄링을 위해 필요한 정보
  • 메모리 관리 정보
    : 프로세스의 메모리 할당을 위해 필요한 정보
  • 자원 사용 정보
    : 사용자에게 자원 사용 요금을 계산해 청구하는 등
  • 입출력 상태 정보
    : 프로세스가 오픈한 파일 정보 등 프로세스의 입출력 관련 정보

문맥교환

문맥교환은 하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU의 제어권이 이양되는 과정이다.

이양 되는 과정에서 원래 수행중이던 프로세스는 준비 상태로 바뀌고 새롭게 CPU를 할당받은 프로세스는 실행 상태가 된다.

프로세스가 실행 상태일 때 시스템 콜이나 인터럽트가 발생하면 CPU의 제어권이 운영체제로 넘어와 원래 실행 중이던 프로세스의 업무를 잠시 멈추고 커널의 코드가 실행된다.

사용자모드에서 커널모드로 바뀌어 시스템 콜이나 인터럽트 처리를 하고, 다시 동일한 프로셋의 사용자모드로 돌아와 이전에 수행하던 작업을 계속 수행한다.

프로세스를 스케줄링하기 위한 큐

운영체제는 준비상태에 있는 프로세스들을 줄 세우기 위해 준비 큐(ready queue)를 두고 준비 큐의 제일 앞에 줄 서 있는 프로세스에 제일 먼저 CPU를 할당한다.
운영체제는 CPU 뿐만아니라 특정 자원을 기다리는 프로세스들을 줄 세우기 위해 자원별로 장치 큐(device queue)를 둔다.

  • 디스크 입출력 큐
    → 디스크 컨트롤러는 디스크 입출력 큐에 줄 서 있는 순서대로 프로세스들의 입출력 작업을 수행
    → 작업이 끝나면 디스크 컨트롤러가 CPU에 인터럽트를 발생
    → 인터럽트 처리루틴에 의해 디스크 입출력이 완료된 프로세스는 입출력 큐에서 빠져나와 CPU를 기다리는 준비 큐에 줄을 서게 된다.

📌
각 프로세스가 CPU를 기다리는지, 입출력을 기다리는지 등의 정보를 커널이 총체적으로 관리

  • 작업 큐
    : 시스템 내에 모든 프로세스를 관리하기 위한 큐
    → 프로세스의 상태와 무관하게 현재 시스템 내에 있는 모든 프로세스가 작업 큐에 속함
    → 준비 큐와 장치 큐를 오가며 실행되며, 작업 큐가 가장 넓은 개념이다.

  • 장치 큐
    : 운영체제가 어떻게 자료구조로 구현하는지 보여줌

    • 큐 헤더
      : 큐의 가장 앞 부분, 장치 큐에 속한 프로세스들은 봉쇄 상태에 있다가 해당 장치느이 서비스를 받고 나서 장치 컨트롤러가 인터럽트를 발생시키면 준비 상태로 바뀌어 준비 큐로 이동

스케줄러

스케줄러는 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드

  • 장기 스케줄러(≒ 작업 스케줄러)
    : 어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할
    → 수십 초 내지 수분 단위로 가끔 호출되기 때문에 상대적으로 속도가 느린 것 허용
    → 메모리에 동시에 올라가 있는 프로세스의 수를 조절하는 역할
  • 단기 스케줄러(≒ CPU 스케줄러)
    : 준비상태의 프로세스 중에서 어떤 프로세스를 다음번에 실행상태로 만들것이지 결정
    : 준비 큐에 있는 여러 프로세스들 중 어떠한 프로세스에게 CPU를 할당할 것인지 결정
    → 밀리초 정도의 시간 단위로 매우 빈번하게 호출되기 때문에 수행 속도가 충분히 빨라야 함
  • 중기 스케줄러
    : 너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러
    • 스왑 아웃
      : 메모리에 올라와 있는 프로세스 중 일부를 선정해 이들로부터 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장
    • 중지 상태 추가

프로세스의 생성

  • 부모 프로세스
    : 시스템이 부팅된 후 최초의 프로세스는 운영체제가 직접 생산하지만 이미 존재하는 프로세스가 다른 프로세스를 복제 생성한다.
    → 후손 프로세스들을 연쇄적으로 종료시킨 후에야 본인이 종료됨
  • 자식 프로세스
    : 부모 프로세스가 자식 프로세스를 생성

자원을 획득하는 방법

생성된 프로세스가 작업을 수행하기 위해서는 자원이 필요하다.
자원을 획득하는 방법은 운영체제 및 자원의 종류에 따라 상이하다.

  • 운영체제로부터 직접 자원 할당
  • 부모 프로세스와 자원을 공유해서 사용
    • 자식과 부모가 같이 CPU를 획득하기 위해 경쟁하는 관계
  • 부모와 자식이 공존하며 수행되는 모델
  • 자식이 종료될 때 까지 부모가 기다리는 모델

프로세스가 생성되면 자신만의 독자적인 주소 공간을 갖게 된다.처음 주소공간을 생성할 때 부모 프로세스의 주소 공간 내용을 그대로 복사해 생성한다.

유닉스 시스템의 프로세스 계층도

  1. 프로세스가 마지막 명령을 수행한 후 운영체제에 이를 알려 이루어지는 자발적 종료
  2. 비자발적 종료로 부모 프로세스가 자식 프로세스의 수행을 강제로 종료시키는 것
    → abort() 함수 사용

프로세스가 자식 프로세스를 생성하는 법

  1. fork() 시스템 콜을 제공
  2. 프로세스가 fork() 시스템 콜을 하면 CPU의 제어권이 커널로 넘어감
  3. 커널은 fork()를 호출한 프로세스를 복제해 자식 프로세스를 생성
    → 부모의 프로세스의 주소공간, 프로그램 카운터, 레지스터 상태, PCB, 커널 스택 등 모든 문맥을 그대로 복제

    📌
    부모 프로세스의 처음부터 수행하는 것이 아닌 부모 프로세스가 현재 수행한 시점부터 수행하게 된다는 것

복제된 프로세스는 자기사 복제본이 아니라 원본이며, 자기를 복제해서 복제본이 생성됐다는 기억을 갖는다.
복제본이라는 단서는 fork() 함수의 결과값을 원본에는 양수로 주고 복제본에는 0을 준다.

프로세스 간의 협력

프로세스가 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않는다.
원칙적으로 다른 프로세스의 수생에 영향을 미칠 수 없는 독립적인 관계가 된다.
경우에 따라 협력을 통해 효율성을 증진시키는데 협력을 위한 메커니즘으로 IPC(Inter-Process Communication)가 있다.

  • IPC(Inter-Process Communication)
    : 하나의 컴퓨터 안에 실행 중인 서로 다른 프로세스 간에 발생하는 통신이며 동기화를 보장해준다.
    • 메시지 전달(Message passing)
      : 프로세스 간에 공유 데이터를 일체 사용하지 않고 메세지를 주고받으면서 통신하는 방법이며 send, receive 연산으로 제공받는다.
      • 직접 통신
        : 통신하려는 프로세스이 이름을 명시적으로 표시
      • 간접 통신
        : 메세지를 메일박스 또는 포트로부터 전달 받는다.
        → 두 방식의 차이는 연산의 인터페이스에 대한 차이일 뿐 실제 메세지 전송이 이뤄지는 내부 구현은 커널의 중재에 의해 사실상 동일한 방식으로 이뤄진다.
    • 공유 메모리(Shared Memory)
      : 주소 공간의 일부를 공유하며 프로세스들끼리 직접 공유메모리 접근에 대한 동기홤 문제를 책임져야한다
profile
정리하고 기억하는 곳

0개의 댓글