Frinee의 코드저장소

프로세스 관리

by Frinee
이 글은 반효경 저 - "운영체제와 정보기술의 원리"를 공부하고 정리하여 작성하였습니다.

 

1. 프로세스의 개념

1.1. 프로세스의 문맥(Context)

  • 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보
  • 시분할 시스템 환경에서는 짧은 시간동안 CPU를 점유하고 뺏기는 과정을 반복하며 CPU 관리가 이루어짐
  • 그렇기 때문에 CPU를 다시 획득했을 때 이전 CPU 시기에서 어디까지 명령이 수행했는지를 재현해야 한다.
  • 이때 정확한 재현을 위해 필요한 정보가 바로 프로세스의 문맥이다.

1.2. 프로세스의 문맥 정보

  • 프로세스의 주소 공간(코드, 데이터, 스택 상태)
  • 레지스터 값
  • 시스템 콜 등을 통해 커널에서 수행한 일의 상태
  • 프로세스와 관련되어 커널이 관리하고 있는 각종 정보

1.3. 프로세스 문맥의 분류

  1. 하드웨어 문맥
    1. CPU의 수행 상태
    2. 프로그램 카운터값과 각종 레지스터에 저장하고 있는 값들을 의미
  2. 프로세스의 주소 공간
    1. 코드, 데이터, 스택으로 구성되는 자기 자신만의 독자적인 주소 공간
  3. 커널상의 문맥
    1. 운영체제는 프로세스를 관리하기 위한 자료구조를 유지함.
    2. PCB와 커널 스택이 해당

 

2. 프로세스의 상태

2.1. 프로세스 상태 구분

  • 프로세스의 상태는 실행(running), 준비(ready), 봉쇄(blocked, wait, sleep)로 구분
    • 실행 상태
      • 프로세스가 CPU를 보유하고 기계어 명령을 실행하고 있는 상태
      • 컴퓨터 내에서 실제 실행 상태에 있는 프로세스는 매 시점 하나이다.
    • 준비 상태
      • 프로세스가 CPU만 보유하면 명령을 실행할 수 있지만 CPU를 할당 받지 못한 상태
    • 봉쇄 상태
      • CPU를 할당받더라도 당장 명령을 실행할 수 없는 상태
      • ex) 입출력 작업 진행 상황
    • 시작 상태
      • 프로세스 생성 중이지만 메모리 획득을 승인받지 못한 상태
    • 완료 상태
      • 프로세스가 종료된 상태이지만 운영체제가 프로세스 관련 자료구조를 정리하지 못한 상태

2.2. 문맥교환(Context Switch)

  • 프로세스를 변경하기 위해 실행 중인 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정
  • 이때 준비 상태에 있는 프로세스들 중 CPU의 제어권을 넘겨받는 과정을 CPU 디스패치라고 함.

2.3. 입출력 요청 프로세스의 상태 변화 과정

  • 프로세스 실행 중 디스크 파일 내용을 읽는 명령이 포함되어 있을 수 있음
  • 이 경우 읽어온 결과가 있어야 후속 명령 수행이 가능
  1. 디스크를 읽는 작업은 상대적으로 느리기 때문에 입출력이 완료될 때까지 디스크 입출력 서비스를 기다리며 봉쇄 상태로 바꿈
  2. 그 다음 준비 상태의 프로세스를 하나 선정해 CPU 할당
  3. 입출력을 요청한 프로세스는 디스크 입출력을 기다리는 큐에 줄 서 있음
  4. 그리고 자기 차례 때 디스크 컨트롤러부터 서비스를 받으면 PCU에게 인터럽트를 발생시켜 입출력 완료를 알림
  5. CPU는 실행 중인 프로세스를 멈추고 인터럽트 처리루틴을 수행
  6. 실행 중인 프로세스는 사용자모드 실행 → 커널모드 실행으로 바뀜
  7. 이후 입출력이 완료된 프로세스는 봉쇄 상태 → 준비상태로 바꾼 후 장치의 로컬버퍼의 내용을 메모리로 이동시키는 업무를 수행
  8. 인터럽트 처리를 끝낸 후 실행 중이었던 프로세스는 CPU를 다시 할당하여 그 프로세스 직전 수행 시점 이후의 코드 수행
    • 만약 입출력이 완료된 프로세스의 우선순위가 더 높다면 문맥교환을 통해 CPU 제어권을 이양할 수 있음.

 

3. 프로세스 제어블록

  • 운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담은 커널 내의 자료구조
  • PCB 요소
    • 프로세스의 상태: CPU 할당 여부 결정을 위해 필요한 값
    • 프로그램 카운터의 값: 다음에 수행할 명령의 위치
    • CPU 레지스터의 값: CPU 연산을 위해 현 시점 레지스터값 저장
    • CPU 스케줄링 정보
    • 메모리 관리 정보
    • 자원 사용 정보: 사용자에게 자원 사용 요금을 계산해 청구하는 용도
    • 입출력 상태 정보: 프로세스가 오픈한 파일의 정보 등의 프로세스의 입출력 상태 정보

4. 문맥교환

  • 사용자 프로세스로부터 다른 사용자 프로세스로 CPU 제어권이 이양되는 과정
  • 타이머 인터럽트가 발생할 경우 CPU 제어권이 운영체제로 넘어감
  • 운영체제는 타이머 인터럽트 처리루틴으로 가서 수행 중이던 프로세스 문맥을 저장하고 새로운 프로세스에게 CPU를 이양
    • 원래 수행 중인 프로세스
      • 실행 상태 → 준비 상태
      • 프로세스의 문맥을 자신의 PCB에 저장
    • 새로 할당 받은 프로세스
      • 준비 상태 → 실행 상태
      • 예전에 저장된 프로세스 문맥을 PCB로부터 하드웨어로 복원
  • 문맥교환은 실행 중이던 프로세스가 입출력 요청이나 다른 조건을 충족하지 못해 CPU를 회수당하고 봉쇄 상태가 되는 경우에도 발생할 수 있음
  • 시스템 콜이나 인터럽트에 의해 실행 중인 프로세스가 커널의 코드에서 실행되는 경우에 프로세스 문맥 일부를 PCB에 저장하지만 이 과정은 문맥교환은 아니다.
  • (프로세스가 새롭게 바뀌는 것은 아니니깐)

❓문맥교환시간 = 오버헤드❓

더보기
  • 문맥교환에 소요되는 시간은 시스템 입장에서 일종의 오버헤드라 할 수 있음
  • CPU 할당 시간을 너무 작게 할 경우 문맥교환이 빈번해져 오버헤드가 상당히 커짐
  • 반대의 경우 시분할 시스템의 의미가 퇴색되어 적절한 CPU 할당시간을 설정해야 함

 

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

5.1. 준비 큐

  • 운영체제는 준비 상태에 있는 프로세스들을 줄 세우기 위해 준비 큐를 둠
  • 준비 큐에 프로세스를 줄 세우는 방법은 CPU 스케줄링 방법에 따라 달라짐

5.2. 장치 큐

  • 프로세스 준비 큐 외에도 운영체제는 자원별로 장치 큐를 둠
    • 하드웨어 자원: 디스크 입출력, 키보드 입출력, 프린터 및 화면 출력 등
    • 소프트웨어 자원: 공유 데이터 접근 권한
  • 공유 데이터 접근에 경우 어떤 프로세스가 사용 중에 다른 프로세스가 같은 자원을 사용하면 일관성이 훼손될 수 있음
  • 그래서 공유 데이터는 매 시점 하나의 프로세스만이 접근 가능
  • 다른 프로세스가 CPU에 할당되어도 해당 프로세스가 다 사용하고 반납할 때까지 동일한 데이터에 접근할 수 없음
  • 프로세스의 상태 관리는 커널 주소 영역 중 데이터 영역에 다양한 큐를 두어 수행

5.3. 작업 큐

  • 시스템 내의 모든 프로세스를 관리하기 위한 큐
  • 프로세스의 상태와 무관하게 현재 시스템 내에 있는 모든 프로세스가 속함
  • 작업 큐가 가장 넓은 개념이고 준비 큐와 장치 큐에 있는 프로세스들은 모두 작업 큐에 속함

5.4. 운영체제의 자료구조 구현

  • 큐는 각 프로세스의 PCB를 연결 리스트 형태로 관리하며 포인터를 사용해 순서를 정함
  • 프로세스가 수행 중 입출력 요청이 발생하면 해당 장치 큐에 줄을 서면서 대기
  • 장치 큐에 속한 프로세스는 봉쇄 상태에 있다가 서비스를 받고나서 인터럽트를 발생시키면 준비상태로 바뀌면서 준비 큐로 이동

 

6. 스케줄러

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

6.1. 스케줄러의 역할

  1. 장기 스케줄러
    1. 작업 스케줄러라고도 불리며, 어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할
    2. 프로세스가 CPU에서 실행되기 위해서는 메모리를 보유해야 하기 때문에 메모리 할당 문제에 관여
    3. 시작 상태의 프로세스들 중 어떤 프로세스를 준비 큐에 삽입할 지를 결정하는 역할
  2. 단기 스케줄러
    1. CPU 스케줄러라고도 하며, 준비 상태의 프로세스 중 실행 상태로 바꿀 프로세스를 결정함
    2. 준비 큐에 있는 프로세스들 중 어떤 프로세스에 CPU를 할당할 지를 결정
    3. 시분할 시스템에서 타이머 인터럽트가 발생하면 단기 스케줄러가 호출

6.2. 스케줄러의 특성

  • 단기 스케줄러
    • 밀리초 단위로 호출되기 때문에 수행 속도가 빨라야 함.
  • 장기 스케줄러
    • 수십 초 내지 수분 단위로 호출되기 때문에 속도가 느린 것이 허용됨
    • 메모리에 동시에 올라가 있는 프로세스의 수를 조절함
    • 시작 상태의 프로세스에서 메모리 할당을 승인할지 여부를 정하기 때문
  • 하지만 현대의 시분할 시스템에서는 장기 스케줄러를 두지 않음
  • 현대 시분할 시스템용 운영체제는 프로세스가 시작되면 곧바로 프로세스에 메모리를 할당해 준비 큐에 넣음
  • 현대에는 장기 스케줄러 대신 중기 스케줄러를 두는 경우가 많음

6.3. 중기 스케줄러

  • 너무 많은 프로세스에게 메모리를 할당해 성능이 저하되는 경우를 해결하기 위해 메모리에 적재된 프로세스 수를 동적으로 조절함.
  • 프로세스 수가 너무 많아지면 일부 프로세스의 메모리를 통째로 빼앗아 디스크의 스왑 영역에 저장하는 스왑 아웃(swap out)을 실행
  • 스왑 아웃을 시키는 0순위 프로세스는 봉쇄 상태에 있는 프로세스들이다.
  • 이후에 스왑 아웃이 필요한 경우에는 타이머 인터럽트가 발생해 준비 큐로 이동하는 프로세스를 스왑 아웃시킴
  • 중기 스케줄러의 등장으로 프로세스의 상태는 실행, 준비, 봉쇄, 중지 상태로 구분하게 됨.

  • 중지(suspended, stopped) 상태
    • 외부적인 이유로 프로세스의 수행이 정지된 상태를 말함
    • 메모리 자원이 당장 필요하지 않기 때문에 메모리를 통째로 빼앗고 디스크로 스왑 아웃시킴
    • 중지준비 상태중지봉쇄 상태로 세분화할 수 있음
      • 중지준비 상태: 준비 상태에 있던 프로세스가 중기 스케줄러에 의해 디스크로 스왑 아웃된 상태
      • 중지봉쇄 상태: 봉쇄 상태에 있던 프로세스가 중기 스케줄러에 의해 디스크로 스왑 아웃된 상태
    • 중지봉쇄 상태이던 프로세스가 봉쇄되었던 조건을 만족하면 중지준비 상태로 바뀜

 

7. 프로세스의 생성

  • 최초의 프로세스는 운영체제가 직접 생성한다.
  • 하지만 그다음부터는 존재하는 프로세스가 다른 프로세스를 복제 생성한다.
  • 이때 프로세스를 생성하면 부모 프로세스이고 새롭게 생성되는 건 자식 프로세스라 함.
  • 부모 프로세스를 종료하려고 하면 그의 자식 프로세스를 연쇄적으로 종료한 후에 종료가 가능함.

7.1. 프로세스 자원 획득과 수행 모델

  • 자원을 획득하는 방법은 운영체제 및 자원에 종류에 따라 상이함
    • 운영체제로부터 직접 할당
    • 부모 프로세스와 자원을 공유해서 사용
  • 프로세스 수행 모델
    • 부모와 자식이 공존하며 수행되는 모델
      • 자식과 부모가 CPU를 얻기 위해 경쟁하는 관계가 됨
    • 자식이 종료될 때까지 부모가 기다리는 모델
      • 자식 프로세스가 종료될 때까지 봉쇄 상태에 머묾
      • 자식 프로세스가 종료되면 부모 프로세스는 준비 상태가 됨

7.2. 프로세스의 생성과 종료

(ex) 유닉스

  • 프로세스가 생성되면 독자적인 주소 공간을 가짐
  • 자식 프로세스는 생성될 때 부모의 주소 공간을 복사하여 주소 공간을 생성
  • 자식 프로세스가 다른 프로그램을 수행하면 생성된 주소 공간 위에 덮어씌워 실행
  • fork() 시스템 콜을 통해 자식 프로세스를 생성할 때 부모 프로세스의 내용을 복제 생성
  • 자식 프로세스는 exec()시스템 콜을 통해 새로운 프로그램으로 주소 공간을 덮어 씌운다.

7.2.1. 프로세스 종료

  1. 자발적 종료
    • 프로그램이 마쳐지는 코드에 exit()라는 시스템 콜을 넣게 되어있음.
    • 프로세스는 시스템 콜을 통해 종료함을 운영체제에게 알림.
    • 이에 운영체제는 프로세스로부터 자원을 회수하고 프로세스를 정리하게 됨
  2. 비자발적 종료
    • 부모 프로세스가 자식 프로세스의 수행을 강제로 종료시킴
    • abort() 함수를 통해 이루어짐
    • 강제종료가 발생하는 경우
      1. 자식 프로세스가 할당 자원 한계치를 넘는 자원을 요구할 때
      2. 자식 프로세스에게 할당된 작업이 더 이상 필요하지 않을 때
      3. 부모 프로세스가 종료되는 경우
❓ 로그아웃 후에도 프로그램이 수행되야 하는 경우
이때에는 모든 자식 프로세스들이 종료되기 때문에
종료되지 않을 다른 프로세스의 양자로 자식 프로세스를 보내는 작업을 수행하게 된다.
이러한 방식을 통해 부모가 죽기 전 자식이 먼저 죽게 된다는 원칙을 지키게 됨.

7.2.2. 프로세스 생성

  • 프로세스가 fork() 시스템 콜을 하게 되면 CPU의 제어권이 커널로 넘어감
  • 커널은 fork()  를 호출한 프로세스를 복제하여 자식 프로세스를 생성
  • 복제된 자식 프로세스는 부모의 주소공간, 프로그램 카운터, PCB 및 커널스택 등 문맥 동일함.
  • 자식 프로세스는 부모 프로세스가 현재 수행한 시점부터 수행하게 됨.
  • fork() 함수의 결과값이 1이면 원본, 0이면 복제본이 되어 구분할 수 있음
  • exec() 시스템 콜은 프로세스가 지금까지 수행했던 상태를 잊고 새롭게 시작하도록 하는 시스템 콜
  • 프로세스 생성과 관련된 fork()  , exec()는 특권명령에 해당함.
  • wait() 시스템 콜은 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태로 머물게 함.
  • 자식 프로세스가 종료되면 부모를 준비 상태로 변경하여 프로세스간의 동기화를 가능하게 함.

 

8. 프로세스 간의 협력

  • 프로세스는 원칙적으로 다른 프로세스 수행에 영향을 끼칠 수 없음
  • 경우에 따라서는 프로세스들이 협력할 때 업무의 효율성이 증진됨.

8.1. IPC(Inter-Process Communication)

  • 운영체제가 제공하는 대표적인 프로세스 간의 협력 메커니즘
  • IPC(Inter-Process Communication): 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신
  • 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘
  • 공유 데이터를 사용하는가에 따라 메시지 전달 방식공유메모리 방식로 나뉨

8.1.1. 메시지 전달 방식

  • 프로세스 간에 공유 데이터를 일체 사용하지 않고 메시지를 주고 받으면서 통신하는 방식
  • 두 프로세스의 주소 공간이 다르기 때문에 커널이 메시지 전달 역할을 함
  • 메시지 통신을 하는 시스템은 커널에 의해 send와 receive 연산을 제공받음
  • 운영체제는 메시지를 주고받는 연산을 특권명령으로 규정하여 커널을 통해서만 하게 함.
  • 통신을 원하는 두 프로세스는 커뮤니케이션 링크를 생성한 후 sendreceive를 통해 메시지를 주고받음
  • 메시지 전송 대상에 따라 직접통신간접통신으로 나뉨.
  • 이 두가지 방식의 차이는 연산의 인터페이스에 대한 차이일 뿐, 내부 구현은 동일함.
  1. 직접통신
    • 통신하려는 프로세스의 이름을 명시적으로 표시
    • send(P, message) : 프로세스 P에게 메시지 전송
    • receive(Q, message) : 프로세스 Q로부터 메시지를 전달 받는 것을 말함
    • 커뮤니케이션 링크는 자동으로 생성되고 하나의 링크는 한 쌍의 프로세스에게 할당
    • 링크는 단방향성일 수 있지만 대부분 양방향성이다.
  2. 간접통신
    • 메시지를 메일 박스 또는 포트로부터 전달받음
    • 각 메일박스에는 고유 ID가 있고 메일박스를 공유하는 프로세스끼리만 통신함
    • 하나의 링크가 여러 프로세스들에게 할당될 수 있고 각 프로세스의 쌍은 여러 링크를 공유할 수 있음
    • 링크는 단방향성 또는 양방향성이다.
    • send(P, message) : P라는 메일박스에 메시지 전송
    • receive(Q, message) : 메일박스 Q로부터 메시지를 전달 받음
    • 메일박스를 공유하는 경우, 메시지를 전달받는 프로세스가 누군지 혼동할 수 있다.
    • 각 프로세스를 1:1 연결하는 링크들을 메일박스를 생성할 때 구성한다.
    • 그리고 메시지 내용에 받는 프로세스 대상을 명시하여 전달하도록 한다.
  3. 공유메모리 방식
    • 프로세스들이 주소 공간의 일부를 공유함.
    • 운영체제는 공유메모리를 사용하는 시스템 콜을 지원하여 상대의 주소 공간 중 일부를 공유할 수 있도록 함
    • 공유메모리 영역은 각자의 주소 공간에 포함되는 영역이므로 여러 프로세스가 읽고 쓰는 것이 가능
    • 고유메모리 주소영역에 대해서는 동일한 물리적 메모리 주소가 매핑됨
    • 하지만 서로의 데이터 일관성 문제가 발생할 수 있음

 

자료

  • 운영체제와 정보기술의 원리 (반효경 저, 2020.5)

'[컴퓨터 과학자 스터디] > 운영체제' 카테고리의 다른 글

메모리 관리  (0) 2024.11.01
CPU 스케줄링  (0) 2024.10.27
프로그램의 구조와 실행  (0) 2024.10.21
컴퓨터 시스템의 동작 원리  (0) 2024.10.15
운영체제 개요  (1) 2024.10.11

블로그의 정보

프리니의 코드저장소

Frinee

활동하기