프로세스 관리 [운영체제 정보 기술의 원리 5장]

Sanghoon Han·2022년 1월 16일
0
post-thumbnail

1. 프로세스의 개념

프로세스(Process)란 실행 중인 프로그램(program in execution)을 뜻한다.

일반적으로 잡(job)이라는 용어와 프로세스를 혼용해 사용하기도 한다.

프로세스 문백(context)

  • 프로세스 문맥이란 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보를 의미한다.

💡 cpu를 다시 획득해 명령의 수행을 재개하는 시점이 되면 이전의 cpu 보유 시기에 어느 부분까지 명령을 수행했는지 직전 수행 시점의 정확한 상태를 재현할 필요가 있다.

프로세스 문맥에 담기는 정보

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

위 정보를 세가지로 분류하면

  • 하드웨어 문맥
  • 프로세스의 주소 공간
  • 커널상의 문맥 상태

2.프로세스의 상태

프로세스의 상태에는

  • 실행 (running)
  • 준비 (ready)
  • 봉쇄 (blocked, wait, sleep)

의 세 가지로 구분할 수 있다.

실행 상태(running)

  • 프로세스가 cpu를 보유하고, 기계어 명령을 실행하고 있는 상태를 가리킴
  • 일반적인 컴퓨터 시스템 내에 cpu는 하나뿐이므로 컴퓨터 내에서 여러 프로세스가 동시에 수행된다고 해도 실제로 실행 상태에 있는 프로세스는 매 시점 하나뿐이다.

준비 상태(ready)

  • 프로세스가 cpu만 보유하면 당장 명령을 실행할 수 있지만 cpu를 할당받지 못한 상태를 가리킴

봉쇄 상태(blocked, wait, sleep)

  • cpu를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태를 말한다.
  • 예시) 프로세스가 요청한 입출력 작업이 진행 중인 경우를 들 수 있다

시작 상태(new)

  • 생성 중이거나
  • 프로세스가 시작되어 그 프로세스를 위한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태

완료 상태(terminated)

  • 종류 중인 일시적 상태
  • 프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태

문맥교환(context switch)

  • 실행시킬 프로세스를 변경하기 위해 원래 수행 중이던 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 세팅하는 과정
  • 타이머 인터럽트 발생
  • 입출력 용청 등으로 봉쇄 상태로 바뀌는 경우

cpu 디스패치

  • 준비 상태에 있는 프로세스들 중에서 cpu를 할당받을 프로세스를 선택한 후 실제로 cpu의 제어권을 넘겨받는 과정

3. 프로세스 제어블록

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

  • 프로세스의 상태 - cpu를 할당해도 되는지 여부
  • 프로그램 카운터 - 다음에 수행할 명령의 위치
  • CPU 레지스터의 값 -cpu연산을 위해 현 시점에 레지스터에 어떤 값을 갖고 있는지
  • CPU 스케줄링 정보 -cpu 스케줄링
  • 메모리 관리 정보 - 메모리 할당
  • 자원 사용 정보 (accounting information) - 사용자에게 자원 사용 요금을 계산해 청구한느 등의 용도로 사용
  • 입출력 상태 정보 - 프로세스가 오픈한 파일 정보 등 프로세스의 입출력 관련 상태 정보

4. 문맥교환

문맥교환(context switch)이란 하나의 사용자 프로세스로부터 다른 사용자 프로세스로 cpu의 제어권이 이양되는 과정

🙅‍♂️주의

  • 프로세스가 실행 상태일 때 시스템 콜이나 인터럽트가 발생하면 cpu의 제어권이 운영체제로 넘어와 원래 실행 중이던 프로세스의 업무를 잠시 멈추고 운영체제 커널의 코드가 실행된다. 이 경우에도 cpu의 실행 위치 등 프로세스의 문맥 중 일부를 pcb에 저장하게 되지만 이러한 과정을 문맥교환 이라고 하지는 않는다.
  • 이는 하나의 프로세스의 실행모드만이 사용자모드에서 커널모드로 바뀌는 것일 뿐 cpu를 점유하는 프로세스가 다른 사용자 프로세스로 변경되는 과정은 아님

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

운영체제는 준비 상태에 있는 프로세스들을 줄 세우기 위해 준비 큐를 둠

운영체제는 특정 자원을 기다리는 프로세스들을 줄 세우기 위해 자원별로 장치 큐를 둔다.

  • 디스크에 입출력 서비스를 요청한 프로세스들은 디스크 입출력 큐에 줄 서게 된다.
  • 공유 데이터에 동시에 접근하려고 할 경우 공유 데이터를 기다리는 큐에 줄 서게 하여 현재 그 데이터를 사용하고 있는 프로세스가 데이터를 반납하기 전까지 접근하지 못하게 하고, 반납할 경우 큐에 줄 서 있는 순서대로 데이터의 접근 권한을 주는 방법을 사용하게 된다.

작업 큐

  • 시스템 내의 모든 프로세스를 관리하기 위한 큐로, 프로세스의 상태와 무관하게 현재 시스템 내의 모든 프로세스가 작업 큐에 속함
  • 작업 큐에 있다고 해서 반드시 메모리를 가지고 있는 것은 아님

작업 큐가 가장 넓은 범위 준비 큐와 장치 큐 모두 작업 큐에 속해 있다.

6. 스케줄러

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

장기 스케줄러

  • 어떤 프로세스를 준비 큐에 진입시킬지 결정하는 역할을 함
  • 프로세스에게 메모리를 할당하는 문제에 관여함
  • 시작 상태의 프로세스들 중 어떠한 프로세스를 준비 큐에 삽입할 것인지 결정하는 역할
  • 수십 초 내지 수 분 단위로 가끔 호출되기 때문에 상대적으로 속도가 느린 것이 허용됨
  • 메모리에 동시에 올라가 있는 프로세스의 수를 조절하는 역할을 함

💡 현대의 시분할 시스템에서 사용되는 운영체제에는 일반적으로 장기 스케줄러를 두지 않는 경우가 대부분이다. 프로세스 시작 상태가 되면 장기 스케줄러 없이 곧바로 그 프로세스에 메모리를 할당해 준비 큐에 넣어주게 됨

단기 스케줄러

  • 준비 상태의 프로세스 중에서 어떤 프로세스를 다음번에 실행 상태로 만들 것인지 결정함
  • 준비 큐에 있는 여러 프로세스들 중 어떠한 프로세스에게 cpu를 할당할 것인가를 단기 스케줄러가 결정
  • 밀리초 정도의 시간 단위로 매우 빈번하게 호출되기 때문에 수행 속도가 충분히 빨라야함

중기 스케줄러

  • 너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러.
  • 메모리에 올라와있는 프로세스 중 일부를 선정해 이들로 부터 메모리를 통째로 빼앗아 그 내용을 디스크의 스왑 영역에 저장해둔다. (스왑아웃)
  • 프로세스당 보유 메모리양이 지나치게 적어진 경우 이를 완화시키기 위해
  • 이때 스왑아웃 당하는 0순위 프로세스는 봉쇄 상태에 있는 프로세스들이다.

중기 스케줄러로 인해 중지(suspended stopped)상태가 추가됨

7.1 프로세스의 생성

💡 시스템이 부팅된 후 최초의 프로세스는 운영체제가 직접 생성하지만 그다음부터는 이미 존쟇나느 프로세스가 다른 프로세스를 복제 생성하게 된다.

  • 프로세스를 생성한 프로세스를 부모 프로세스
  • 새롭게 생성된 프로세스를 자식 프로세스라고 함

부모와 자식이 공존하며 수행되는 모델,

  • 자식과 부모가 같이 cpu를 획득하기 위해 경쟁하는 관계

자식이 종료될 때까지 부모가 기다리는모델

  • 자식 프로세스가 종료될 때까지 부모 프로세스는 아무 일도 하지 않고 봉쇄상태에 머물러 있다가, 자식 프로세스가 종료되면 그때 부모 프로세스가 준비 상태가 되어 cpu를 얻을 권한이 생김
  • 프로세스 종료를 기다리며 봉쇄 상태에 머물러서 기다리고 있음
main() {
	if (fork() == 0) 
		printf("\n hello, I am child! \n");
	else 
		printf("\n Hello, I am parent!\n");
}

자식 프로세스는 부모 프로세스의 처음부터 수행을 시작하는 것이 아니라 부모 프로세스가 현재 수행한 시점 부터 수행하게 된다는 것이다. 현재 그 라인까지 수행했다는 기억조자도 똑같은 자식 프로세스가 생성되는 것

8. 프로세스 간의 협력

IPC

  • 하나의 컴퓨터 안에서 실행중인 서로 다른 프로세스간 에 발생하는 통신을 말함
  • 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘을 의미
  • 공유데이터를 서로 다른 두 프로세스가 사용 할 수 있다고 하면 데이터가 불일치 하게됨

메시지 전달

  • 공유 데이터를 사용 안함
  • 메시지를 주고받으면서 통신하는 방식
  • 프로세스의 주소 공간이 다르므로 메시지 전달을 직접 할 순 없음
  • 커널이 그 역할을 대신해줌
  • 커널에 의해 send(message)와 receiver(message)라는 두 가지 연산을 제공 받음
  • 시스템 콜 방식으로 요청함
  • 특권명령임

직접통신

  • 연산의 인터페이스만 다름
  • 프로세스의 이름을 명시적으로 표시
  • send(P, message) 프로세스 P에게 메시지를 전송
  • receive(Q, message) 프로세스 Q로부터 메시지를 전달받는 것
  • 링크는 자동적으로 생성
  • 하나의 링크는 정확히 한 쌍의 프로세스에게 할당됨
  • 단방향성 일 수 있으나 대부분의 경우 양방향성

간접통신

  • 메일박스 또는 포트로부터 전달받음
  • 메일박스에는 고유의 id가 있음
  • 메일박스를 공유한느 프로세스들만 서로 통신 할 슁ㅆ음
  • 하나의 링크가 여러 프로세스들에게 할당될 수 있으며
  • 각 프로세스의 쌍은 여러 링크를 공유할 수 있다
  • 간접통신에서는 새로운 메일박스를 생성하는 연산
  • send(A, message)라는 A라는 메일박스에 메시지를 전송
  • receive(A, message)라는 A라는 메일박스로 부터 메시지를 전달 받음
  • 메일박스를 공유하기 때문에 다음과 같은 의문 상황이 발생할 수 있음
  • p1, p2, p3가 메일박스 A를 공유하는 경우
  • p1이 메시지를 보냈다면
  • p2,p3 어느 프로세스가 메시지를 받게 되는가
  • p2, p3에게 각각 따로 링크를 생성하는 것
  • 혹은 링크에 대한 receive() 연산을 매 시점 하나의 프로세스만 수행할 수 있도록 하는 방법
  • 시스템이 메시지 수신자를 임의로 결정해 누가 메시지를 받았는지 송신자에게 통신해주는 방식

공유 메모리

  • 공유 데이터를 사용함
  • 원칙적으로 서로 다른 프로세스 A와 B는 각자 독립적인 주소 공간을 가짐
  • 프로세스 A가 자신의 주소 공간에 특정한 내용을 쓸 경우 자신만 볼 수 있게됨
  • 공유 메모리를 사용하는 시스템 콜을 지원함
  • 서로 다른 프로세스들이 그들의 주소 공간 중 일부를 공유할 수 있도록 함
  • 공유 메모리 영역은 각자의 주소 공간에 공통적으로 포함되는 영역
  • 프로세스가 읽고 쓰는 것이 가능 함
  • 프로세스 A, B가 독자적인 주소 공간을 가지고 있지만 이 주소 공간이 물리적 메모리에 매핑될 때 공유메모리 주소 영역에 대해서는 동일한 물리적 메모리 주소로 매핑 됨
  • 통신을 수월하게 만드는 인터페이스를 제공
  • 서로의 데이터 일관성 문제가 유발됨
  • 커널이 책임지지 않기에 프로세스들끼리 직접 공유메모리 접근에 대한 동기화 문제를 책임져야 함

Reference

반효경, 운영체제와정보기술의원리, 이화여자대학교출판문화원, 2020.05.04, p113~144

profile
Fail Fast learn Faster

0개의 댓글