본문 바로가기

CS/컴퓨터 시스템

Chap 7. 프로세스_1

✔️프로세스란

“실행중인 프로그램을 말한다”

 

✔️프로세스의 실행과정

(1) 프로세스가 실행되면 프로세스만의 독자적인 주소 공간이 생긴다(stack, data, code)

(2) 이 프로세스가 CPU를 잡게 되면 PC라는 레지스터가 이 프로세스의 코드 어느 부분을 가리키고 있고 [stack, data, code]

(3) 그러면 매순간 code부분에 있는 instruction을 하나씩 읽어서 CPU 안으로 불러들인다.

(4) 레지스터 안에다가 어떠한 값을 넣고 산술 논리 연산 장치에서 연산을 하고

(5) 그 결과를 레지스터에 저장하거나 또는 메모리에다가 저장하는 식으로 진행을 하고 있다.

- 이 과정을 반복하는데 특정 시점에 이 프로세스는 어디까지 와있는가를 규명하기 위해 필요한 요소로 “프로세스의 문맥”이라고 할 수 있다.

현재 시점의 프로세스의 문맥을 나타내기 위해서는 프로그램 카운터가 어디를 가리키고 있는가 즉 , 코드의 어느 부분까지 실행했는가를 알아야 하고 메모리에 어떤 내용을 담고 있는가 , 지금 변수의 값은 얼마이며 레지스터에 어떤 요소를 넣었는지 모든 상황을 알아야지만 프로세스의 현재 상태를 나타낼 수 있다.

 

 

[프로세스 문맥을 알아야 하는 이유]

= 현재 시스템에서는 time sharing, multitasking을 하기 때문에 프로세스들이 번갈아 실행된다. 프로세스의 실행 내용들을 백업해놓고 있지 않는다면 즉, 프로세스의 현재 문맥을 알고 있지 않으면 다음 번 CPU를 잡았을 때 앞부분부터 다시 실행해야 할 것이다.

따라서 해당 프로세스가 어디까지 실행되었는지 알고 있어야 그 다음부터 instruction을 실행할 수 있는 것이다. (현재 상태에 대한 정확한 정보를 얻기 위해)

 

그럼 프로세스 문맥에 대해서 더 자세히 알아보자

✔️프로세스 문맥이란

  • = 프로세스의 현재 상태를 나타내는데 필요한 모든 요소를 “프로세스의 문맥”이라고 한다.
  • 프로세스의 문맥은 다음과 같이 크게 3가지 정도로 설명할 수 있다.

1.CPU 수행 상태를 나타내는 하드웨어 문맥 (CPU와 관련)

  • 프로세스는 CPU를 잡고 매순간 instruction을 실행한다. 현재 시점의 프로세스가 instruction을 어디까지 실행했는가를 알기 위해서는 현재 레지스터에 어떤 값을 넣고 있었고 PC가 어디를 가리키고 있었고 이런 요소들이 필요하다.-각종 register가 어떤 값을 가지고 있었는가에 대해서 나타낸다.

2. 프로세스의 주소 공간 (메모리 관련)

  • [code, data, stack]에 어떠한 것이 담겼는가를 알아야 한다.

3. 프로세스 관련 커널 자료구조

(1) Kernel stack ⇒ 각 프로세스마다 커널 스택을 가지고 있어야 한다.
(2) PCB(process Control Block) =>  프로세스 관리 정보들을 가지고 있다.
프로그램(Program)이 실행되면 프로세스 주소 공간(Process Address Space)이 Memory에 할당(생성) 되는것을 볼 수 있다.
PCB는 프로세스 생성 시 만들어지며 주기억장치에 유지 된다.
  • 운영체제가 현재 프로세스들을 관리하는 역할을 하는데 프로세스가 하나 생길 때마다 운영체제는 그 프로세스를 관리하기 위해서 커널 주소 공간의 데이터 영역에 PCB라는 자료구조를 두고 있다.
  • 그래서 프로세스가 하나 실행될 때마다 운영체제는 PCB를 하나씩 두고 있으면서 그 프로세스에게 CPU는 얼머나 주어야 하는지, 메모리는 얼마나 주어야 하는지 등을 관리하는 역할을 한다. 즉, 운영체제가 그 프로세스에 대해서 어떠한 값을 가지고 있다.
  • 그러므로 메모리에 어떤 것을 담고 있느냐도 알아야하지만 운영체제가 이 프로세스에 대해서 어떠한 정보를 가지고 있는지를 알아야 한다.
  • 커널도 각각의 프로세스들에 대한 PCB를 가지고 있다(context에서 가장 핵심적인 부분이라고 할 수 있다).커널 코드는 여러 프로세스들이 공유하는 코드이다. (프로세스들은 운영체제에게 서비스를 요청할 수 있다) 그래서 커널에서 함수 호출이 이루어져서 스택에다가 정보를 쌓을 때는 프로세스 별로 별도의 스택을 두어 함수를 호출한다. (정보 꼬임을 막을 수 있다)
  • 각 프로세스가 자신의 코드를 실행중일 때는 만약 함수 호출이 이루어진다면 본인의 스택에 함수를 호출하고 리턴한다. 관련된 정보들을 쌓아 놓게 된다. 만약 시스템 콜을 해야 하는 상황이라면 PC(program counter)는 커널 주소 공간[stack, data, code]의 code를 가리키고 있으면서 커널의 코드를 실행한다. 커널도 함수가 있고 그것을 자신의 스택에 쌓아놓을 것이다. 그러므로 한 프로세스의 문맥을 알기 위해서는 커널 스택 또한 알아야 한다.

 

 

 

✔️ 프로세스의 상태

프로세스의 상태(state)는 계속 바뀌게 된다. (변경되며 수행된다)

프로세스 상태도

(1) Running

• CPU를 잡고 instruction을 수행중인 상태(실행)

 

(2) Ready

• CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)

 

메모리를 어느 정도 가지고 있어서 지금 실행중인 프로세스가 CPU 점유를 끝내면 그 다음 프로세스가 CPU를 점유하고 실행하게 된다.

보통 레디큐라고도 한다. (큐의 방식으로 실행되기 때문에, 줄서있다. 새치기하는 경우는 없다. )

차례대로 줄을 서있으면 하나씩 running 상태로 갔다가 다시 맨뒤에 줄서기한다.

 

(3) Blocked (wait, sleep)

• CPU를 주어도 당장 instruction을 수행할 수 없는 상태

• Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태

 

• (예) 디스크에서 file을 읽어와야 하는 경우

해당 작업이 끝나고 바로 running 상태로 가는 것이 아니고 ready 상태인 프로세스들의 끝으로 가서 줄 서야 한다.

만약 A가 수행이 되다가 IO작업을 해야해서 인터럽트가 걸린다면 IO 작업이 끝날 때까지 A는 다시 실행될 수 없다.

B와 C가 다 끝나도 A는 실행될 수 없다. 왜냐하면 IO작업이 B, C를 수행하는 것보다 느리기 때문에 B, C가 다 실행이 되었다고 해도 A는 다 실행되지 않았을 것이다.

→ 자기 차례가 오면 Blocked 상태로 빠지게 된다. 그리고 순서대로 ready 상태의 것들을 실행된다.

 

[여기까지가 흔히 프로세스 상태라고 하고 만약 프로세스 상태가 5가지라고 한다면 new, terminated를 추가한 것이다]

(4) New

: 프로세스가 생성중인 상태

워드라는 프로그램을 처음 실행할 때 세팅해야하는 부분이 많으므로 시간이 조금 오래걸리는 것을 볼 수 있다.

이 상태가 New의 상태

 

(5) Terminated

: 수행(execution)이 끝난 상태

메모리를 내리기 같은 정리하는 작업을 한다

 

 

 

 

프로세스 실행 과정(프로세스 상태를 중심으로 본)

(1) new로 프로세스를 시작

(2) 시작하면 바로 ready 상태가 된다. (CPU만 얻으면 실행 가능한 상태)

(3) 여기서 자신의 차례가 되어 CPU를 얻게 되면 running 상태가 된다.

       a) 자진 종료 → IO같은 오래 걸리는 작업하기 → block 상태로 넘어옴

       b) timer가 다 되어서 CPU가 뺏기는 경우 → ready에서 다시 줄 서서 기다리기

 

Ready queue = 먼저 들어온 것이 먼저 실행

-디스크 장치 들에도 각각의 Disk IO queue가 있다. 큐방식으로 진행하는데 컨트롤러 지휘 하에 순서대로 처리를 할 것이다.

→ 작업이 끝나면 controller가 cpu에게 인터럽트를 걸 것이다.

그러면 cpu는 하던 작업을 멈추고 CPU 제어권이 운영체제 커널로 넘어갈 것이다. (운영체제는 IO 작업했던 것을 메모리에 담고 해당 프로세스의 상태를 blocked 에서 ready로 바꾸어서 CPU를 얻을 수 있는 자격을 준다.

  • 이렇게 하드웨어에 가서 줄을 서는 경우도 있지만 소프트웨어 자원도 있음

예를 들어, 공유 데이터가 있다.

공유데이터에 여러 프로세스들이 접근하면 하나의 프로세스가 접근하는 와중에 CPU를 뺏기고 다른 프로세스가 공유 데이터에 접근하려고 한다면 일관성이 깨진다. 그러므로 어떤 프로세스가 공유데이터를 접근하고 있으면 다른 프로세스가 공유 데이터에 접근하려고 왔을 때 접근을 막아주는 것이 필요하다. 이 때 resource queue에서 기다리게 한다. → 이 상태에서 blocked 상태로 한다.

 

*즉, 외부에서 가는 작업의 종류에 따라 각각 다른 queue에서 줄을 서게 되고 끝나면 다시 ready queue에 줄서게 되는 것이다.

 

*여기서 큐라는 것은 운영체제의 커널이 [stack, data, code]부분에서 data 영역에 queue를 만들어 놓고 프로세스의 상태를 바꾸어가면서 CPU를 주고 안주고를 관리하는 것이다.

'CS > 컴퓨터 시스템' 카테고리의 다른 글

동기식 입출력과 비동기식 입출력  (0) 2023.04.16
Chap 7_2. 프로세스  (0) 2022.08.20
Chap 6. 프로그램 실행  (0) 2022.05.21
Chap 5. 컴퓨터 시스템 구조  (0) 2022.05.19
Chap 4. 운영체제란?  (0) 2022.05.18