728x90
반응형

프로세스 제어블록 PCB는 프로세스를 실행하는데 필요한 정보를 보관하는 자료구조로 TCB(Task Control Box)라고도 한다. 모든 프로세스는 고유의 프로세스 제어 블록을 가지며, 프로세스 제어블록은 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기된다. 프로세스 제어 블록에 저장되는 정보는 무엇일까?

 

1. 포인터 : 프로세스 제어블록의 첫번째 블록에는 포인터가 저장된다. 준비 상태나 대기 상태는 큐로 운영되는데, 프로세스 제어블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용한다.

 

2. 프로세스 상태 : 프로세스 상태에는 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등이 있다. 이는 프로세스가 현재 어떤 상태에 있는지를 나타내며, 프로세스 제어블록의 두번째 블록에 저장된다.

 

3. 프로세스 구분자 : 운영체제 내의 여러 프로세스를 구별하기 위한 구분자를 저장한다. (PID)

 

4. 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터 값을 저장한다. (레지스터의 한 종류)

5. 프로세스 우선순위 : 프로세스 상태를 설명할 때 이해를 돕기위해 대기 상태에서 기다리는 모든 프로세스가 한 줄로 서있다고 가정했다. 이는 대기 큐waiting queue가 하나라는 의미로, 모든 프로세스의 우선 순위가 같다고 본 것이다. 그러나 실제로는 프로세스의 중요도가 각각 다르다. 사용자 프로세스보다 중요도가 큰 커널 프로세스는 우선순위가 높고, 사용자 프로세스끼리도 우선순위가 다르다. 

 다양한 우선순위의 프로세스가 대기 상태로 들어오기 때문에 대기 상태의 큐도 우선순위별로 따로 운영된다. 다시 말해, 우선순위에 따라 프로세스 제어블록들이 여러 줄로 서 있다. CPU스케쥴러가 준비상태에 있는 프로세스 중 실행상태로 옮겨야 할 프로세스를 선택할 때는 프로세스 우선순위를 기준으로 삼는다. 높은 우선순위의 프로세스가 낮은 우선순위의 프로세스보다 먼저 실행되고 더 자주 실행된다. 

 

6. 각종 레지스터 정보 : 프로세스 제어블록에는 프로세스가 실행되는 중에 사용하던 레지스터, 누산기(accumulator), 색인 레지스터(index register), 스택 포인터(stack pointer)와 같은 레지스터의 값이 저장된다. 이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 자신이 사용하던 레지스터의 중간값을 보관한다.

 

7. 메모리 관리 정보 : 프로세스 제어 블록에는 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장된다. 그 외에 세그먼테이션 테이블(segmentation table), 페이지 테이블(page table)등의 정보도 보관한다.

 

8. 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보를 말한다. 어떤 프로세스가 하드디스크에 저장된 파일을 열어서 작업하거나, 음악을 출력하기 위해 사운드카드에 접근하고 있다면, 파일이나 사운드카드에 대한 정보가 필요한데, 이러한 정보를 프로세스 제어 블록에 저장한다.

 

9. 계정정보 : 계정번호, CPU 할당시간, CPU 사용시간 등

 

10. 부모 프로세스 구분자와 자식 프로세스 구분자 : ParentPID(PPID), ChildPID(CPID)

 

**포인터의 역할**

 프로세스 제어블록의 맨 위에 있는 포인터의 역할을 알아보자. 입출력이 완료되기를 기다리는 프로세스는 대기상태로 모인다. 시스템 내에는 다양한 종류의 입출력장치가 있기 때문에 대기상태로 모이는 프로세스도 다양하다. 그런데 이것들을 하나로 모아놓으면 관리하기가 불편하다. 예를 들어, 하드디스크로부터 인터럽트가 들어왔을 때, 대기상태의 프로세스가 한군데에 모여 있다면 해당 프로세스를 찾기 위해 대기 상태의 모든 프로세스를 뒤져야 한다. 이러한 불편함이 없도록 대기 상태에는 같은 입출력을 요구한 프로세스끼리 모아놓는다.

 

**문맥 교환**

1. 문맥 교환의 의미

 문맥 교환context switching은 CPU를 차지하던 프로세스가 나가소 새로운 프로세스를 받아들이는 작업을 말한다. 이때 두 프로세스 제어 블록의 내용이 변경된다. 실행상태에서 나가는 프로세스 제어 블록에는 지금까지의 작업 내용을 저장하고, 반대로 실행상태로 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅된다. 이와 같이 두 프로세스의 프로세스 제어 블록을 교환하는 작업이 문맥 교환이다. 

 

2. 문맥 교환의 절차

 실행상태에 있는 프로세스 P1이 자신에게 주어진 시간을 다 사용하여 타임아웃이 되면, P1의 프로세스 제어 블록에 현재까지의 작업결과가 저장되고, P1은 준비상태로 쫓겨난다. 준비 상태에 있던 프로세스 P2가 실행상태로 가면, CPU의 레지스터가 P2의 프로세스 제어 블록 값으로 채워진다.

728x90
반응형

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

[1] 운영체제의 발전  (0) 2022.03.07
프로세스의 연산  (0) 2020.11.03
프로세스의 개요  (0) 2020.10.29
병렬처리  (0) 2020.10.26
인터럽트  (0) 2020.10.26
728x90
반응형

운영체제에서 프로세스는 하나의 작업 단위이다. 사용자가 마우스를 더블클릭하여 프로그램을 실행하면 그 프로그램은 프로세스가 된다. 이렇게 실행된 프로세스는 복잡한 과정을 거쳐 사용자가 지시한 작업을 완료한다. 여기서는 운영체제의 프로세스 과정을 살펴보겠다. 

 

1. 프로세스의 개념

 프로그램과 프로세스의 차이는 뭘까? 프로그램은 하드디스크같은 저장장치에 보관되어 있다가 마우스로 더블클릭하면 실행된다. 폰 노이만 구조에서 프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와서 작업이 진행된다는 의미이다. 프로그램은 저장장치에 저장되어있는 정적인 상태이고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태이다. 프로세스는 컴퓨터 시스템의 작업 단위로 태스크task라고도 부른다. 

 

 따라서 프로그램이 실행되면 프로세스가 된다.

 

2. 프로그램에서 프로세스로의 전환 

 우선 운영체제는 프로그램을 메모리의 적당한 위치로 가져온다. 그와 동시에 작업지시서를 만든다. 작업지시서는 로세스 제어블록 Process Control Block PCB라는 것이다. 프로세스 제어블록에는 프로세스를 처리하는 데 필요한 다양한 정보가 들어있다. PCB가 없으면 프로그램이 프로세스로 전환되지 못한다. 어떤 프로그램이 프로세스가 된다는 것은 운영체제로부터 프로세스 제어블록을 받았다는 의미이다. 

 PCB에 있는 정보 중 대표적인 3가지는 다음과 같다. 

  • 프로세스 구분자 : 메모리에는 여러 개의 프로세스가 존재하므로 각 프로세스를 구분하는 구분자Identification ID가 필요하다 PID라고 부른다.
  • 메모리 관련 정보 : CPU는 실행하려는 프로세스가 메모리의 어디에 저장되어 있는지를 알아야 작업할 수 있다. 이를 위해 PCB에는 프로세스의 메모리 위치 정보가 담겨있다. 또한 메모리 보호를 위한 경계 레지스터와 한계 레지스터도 포함되어 있다.
  • 각종 중간값 : 프로세스 제어 블록에는 프로세스가 사용했던 중간값이 저장되는데, 니는 어떤 프로세스가 어느 정도 진행되었는지 표시하는 것과 유사하다. 시분할 시스템에서는 여러 프로세스가 번갈아가며 실행되기 때문에 각 프로세스는 일정시간 작업을 한 후 다른 프로세스에 CPU를 넘겨 주기 때문에 중간값을 기록해 두어야 한다.

 프로세스 A가 103번행까지 작업한 후 다른 프로세스에 CPU를 넘겨주었다고 가정하자. 시간이 흘러 다시 프로세스 A의 차례가 되면 104번행부터 작업을 시작해야 한다. 이를 위해 프로세스 제어 블록에는 다음에 작업해야 할 코드의 위치가 담긴 레지스터인 프로그램 카운터가 저장된다. 또한 작업의 중간값을 보관 중인 다른 레지스터도 같이 저장된다. 이렇게 저장된 값은 작업을 계속 진행할 수 있게 해준다. 

 

결론적으로 하나의 프로세스를 실행하려면 프로세스 구분자, 메모리 관련 정보, 프로그램 카운터와 각종 레지스터 같은 중간값을 관리해야 하며, 이러한 정보를 보관하는 데이터 구조가 프로세스 제어 블록이다. 프로그램이 프로세스가 되려면 메모리에 올라오는 것과 동시에 프로세스 제어블록이 생성되어야 한다

 프로세스 제어 블록은 운영체제가 해당 프로세스를 위해 관리하는 데이터 구조이기 때문에 운영체제 영역에 만들어진다. 또한 프로세스가 종료되면 프로세스가 메모리에서 삭제되고 프로세스 제어블록도 폐기된다. 

 

프로세스 = 프로그램 + PCB

프로그램 = 프로세스 - PCB

 

또 컴퓨터 내에 사용자가 실행한 프로세스만 있는 것은 아니다. 운영체제도 프로그램이기 때문에 프로세스 형태로 실행되어야 한다. 운영체제 프로세스를 메모리에 올리는 프로그램은 부트스트랩(부팅)이다. 부트스트랩이 많은 운영체제 관련 프로세스를 실행한 후 일반프로세스가 실행되므로 컴퓨터에는 일반 사용자의 사용자 프로세스user process 와 운영체제의 커널 프로세스kernel process가 섞여서 실행된다.

 

3. 프로세스의 상태

 운영체제에서는 여러가지 이유로 프로세스 상태process status가 변화된다. 일괄 작업 시스템의 경우 프로세스가 생성된 후 CPU를 얻어 실행되고 작업을 마치면 종료된다. 따라서 일괄 작업 시스템의 프로세스 상태는 생성create, 실행run, 완료terminate 이다. 시분할 시스템(요즘 프로그램들의 시스템)에서의 프로세스 상태는 일괄 작업 시스템보다 복잡하다. CPU를 얻어 실행 중인 프로세스가 중간에 다른 프로세스에 CPU를 넘겨주는 일이 빈번하기 때문이다. 운영체제에서 이제 막 프로세스가 되었거나 CPU를 사용하다가 쫓겨난 프로세스는 준비 상태에서 자기 순서를 기다린다. 

 

3.1 프로세스의 네가지 상태

 프로세스는 생성상태에서 PCB(프로세스 제어 블록)을 얻으면 준비상태가 된다. 여기서 디스패치되면 실행상태가 되고, 실행상태에서 타임아웃(인터럽트)가 되면 준비 상태가 된다. 실행완료하면 PCB가 떨어지고 완료상태가 된다. 아래에서 더 자세히 설명하겠다.

  • 생성상태 create status : 프로세스가 메모리에 올라와 실행준비를 완료한 상태. 프로세스를 관리하는데 필요한 프로세스 제어 블록(PCB)가 생성된다. (작업 : 메모리 할당, 프로세스 제어 블록 생성)
  • 준비상태 ready status : 생성된 프로세스가 CPU를 얻을때까지 기다리는 상태. CPU가 하나인 컴퓨터에서는 한번에 하나의 프로세스만 실행할 수 있기 때문에 자기 실행 순서가 될 때까지 준비 상태에서 기다려야 한다.
  • 실행상태 running status : 준비상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태로 execute status 라고 표현하기도 한다. 실행 상태에 들어간 프로세스는 일정 시간동안 CPU를 사용할 권리를 가진다. 만약 주어진 시간을 다 사용하고도 작업이 끝나지 않았다면 프로세스는 준비상태로 돌아와 다음 차례를 기다린다. 프로세스는 자신의 작업이 끝날때까지 준비상태와 실행상태를 왔다갔다한다.
  • 완료상태 terminate status : 실행 상태의 프로세스가 주어진 시간동안 작업을 마치면 완료상태로 진입한다. 완료상태는 프로세스 제어 블록이 사라진 상태를 의미한다. 

 준비상태에 있는 여러 프로세스 중 다음에 진행할 프로세스를 선정하는 일은 CPU스케쥴러(CPU Scheduler)가 담당한다. CPU스케쥴러는 준비상태의 맨 앞에서 기다리고 있는 프로세스 제어 블록을 CPU에 전달하여 작업이 이루어지도록 한다. 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU스케쥴러의 작업을 디스패치dispatch라고 한다.  CPU스케쥴러는 프로세스의 모든 상태, 즉 생성, 실행, 완료에 관여하여 모든 프로세스의 작업이 원만하게 이루어지도록 관리한다.

 

 CPU스케쥴러에 의해 선택된 프로세스는 실행상태에서 일정 시간동안 작업을 하는데, 프로세스에 배당된 작업시간을 타임 슬라이스 또는 타임 퀸텀이라고 부른다. 프로세스는 자신에게 주어진 하나의 타임 슬라이스 동안 작업을 끝내지 못하면 다시 준비 상태로 돌아가는데 이를 타임아웃time out이라고 한다.

 

 새로운 프로세스가 실행상태로 돌아오면 CPU는 일정시간(타임슬라이스)이 흐른 뒤 알려달라고 클럭에 요청한다. 이는 알람을 맞춰놓는 것과 같다. 타임아웃, 인터럽트는 클럭으로부터의 인터럽트이다.

 

3.2 프로세스의 다섯가지 상태

 프로세스는 생성, 준비, 실행, 완료라는 네가지 상태만으로 작업을 진행하는데 큰 문제가 없다. 그러나 오늘날의 운영체제의 효율성을 고려하여 한가지 상태를 더 만들었다. 어떤 프로세스가 실행 상태에 들어가 입출력을 요구했다고 가정해보자. 인터럽트 시스템에서 프로세스가 입출력을 요구하면 CPU가 직접 데이터를 가져오지 않고 입출력 관리자에게 명령을 내린다. 이 상태에서 프로세스는 요청한 작업이 끝날때까지 다음 작업을 할 수 없다. 따라서 CPU는 아무작업을 하지않고 기다리게 되어 효율성이 떨어진다.

 

 입출력을 요구한 프로세스가 입출력이 완료될때까지 기다리는 상태를 대기상태blocking state 라고 한다. 이는 작업 효율성을 높이기 위해 입출력을 요청한 프로세스를 실행상태에 두지 않고 대기상태로 옮기는 것이다. 입출력을 요구한 프로세스가 대기 상태로 옮겨지면 CPU스케쥴러는 준비 상태에 있는 프로세스 중 하나를 가져다 실행상태로 만든다. 그러면 시스템 입장에서는 새로운 작업을 진행하게 되어 효율성이 높아진다.

 

 대기상태의 프로세스는 요청한 입출력이 완료되면 입출력 관리자로부터 인터럽트를 받는다. 대기 상태에서 입출력이 끝난 프로세스는 준비상태로 돌아가 자기 차례를 기다린다.

프로세스의 다섯가지 상태

  • 생성상태 create status : 프로그램이 메모리에 올라오고 운영체제로부터 프로세스 제어 블록을 할당받은 상태
  • 준비상태 ready status : 실행 대기 중인 프로세스가 자기 순서를 기다리는 상태. 프로세스 제어 블록을 준비 큐ready queue에서 기다리며 CPU스케쥴러에 의해 관리된다. 지금까지 준비 큐가 하나인 것처럼 설명했지만 실제로는 다수의 준비 큐가 운영된다. CPU 스케쥴러는 준비 상태에서 큐를 몇 개 운영할지, 큐에 있는 어떤 프로세스의 프로세스 제어 블록을 실행 상태로 보낼지를 결정한다. 
     CPU스케쥴러가 어떤 프로세스 제어 블록을 선택하는 작업은 dispatch(PID)명령으로 처리하는데, 여기서 PID는 프로세스 구분자이다. CPU 스케쥴러가 dispatch(PID)를 실행하면 해당 프로세스가 준비 상태에서 실행상태로 바뀌어 작업이 이루어진다. 
  • 실행상태 running status : 프로세스가 CPU를 할당받아 실행되는 상태. 준비상태에 있는 많은 프로세스 중 실행상태에 들어가는 프로세스는 CPU의 개수 만큼이다. 실행상태에 있는 프로세스는 자신에게 주어진 시간, 즉 타임슬라이스 동안만 작업할 수 있다. 그 시간을 다 사용하면 timeout(PID)가 실행된다. 
     timeout(PID)는 프로세스 제어 블록을 실행상태에서 준비상태로 옮긴다. 만약 실행상태동안 작업이 완료되면 exit(PID)가 실행되어 프로세스가 정상 종료된다. 실행상태에 있는 프로세스가 입출력을 요구하면 block(PID)를 실행한다.
  • 대기상태 blocking state : 효율성을 위해 만들어진 상태이다. 입출력이 완료되면 인터럽트가 발생하고, 대기상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾는데 이것이 wakeup(PID)이다. wakeup(PID)로 해당 프로세스의 프로세스 제어 블록이 준비상태로 이동하게 된다. 어떤 프로세스가 대기 상태에서 준비 상태로 이동하는 것은 인터럽트 때문이다. 인터럽트는 이렇게 입출력으로도 발생하고, 어떤 이벤트에 의해서도 발생한다.
  • 완료상태 terminate status

3.3 휴식 상태와 보류 상태

 대부분의 프로세스는 생성, 준비, 실행, 대기, 완료 상태로 운영된다. 이것을 활성상태 active status 라고 한다. 프로세스의 상태는 활성 상태외에 또다른 상태가 있다.

  • 휴식 상태 pause status : 프로세스가 작업을 일시적으로 쉬고 있는 상태. 유닉스에서 프로그램 실행 도중에 ctrl+z를 하면 볼 수 있다. 해당 프로그램이 종료된 것처럼 보이지만, 사실은 실행을 잠시 멈춘 것이다. jobs나 ps명령어로 프로세스의 상태를 보면 'stop'인 것을 알 수 있다. 
  • 보류 상태 suspend status : 프로세스가 메모리에서 잠시 쫓겨난 상태. 휴식상태와 차이가 있다. 다음과 같은 경우에 보류 상태가 된다.

    1. 메모리가 꽉차서 일부 프로세스를 메모리 밖으로 내보낼 때
    2. 프로그램에 오류가 있어서 실행을 미뤄야 할 때
    3. 바이러스 같이 악의적인 공격을 하는 프로세스라고 판단될 때

    보류상태로 들어간 프로세스는 메모리 영역에서 쫓겨나 스왑영역swap area에 보관된다. 보류상태는 대기 상태에서 옮겨진 보류 대기 상태 block suspend status와 준비 상태에서 옮겨진 보류 준비 상태로 구분되며, 보류 대기 상태에서 입출력이 완료되면 보류 준비 상태로 옮겨간다. 
728x90
반응형

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

프로세스의 연산  (0) 2020.11.03
프로세스 제어블록(Process Control Block)  (0) 2020.10.29
병렬처리  (0) 2020.10.26
인터럽트  (0) 2020.10.26
[운영체제] 컴퓨터 기본 구성  (0) 2020.10.13

+ Recent posts