본문 바로가기

프로그래밍/운영체제

[운영체제] Process

프로세스란?

실행중인 프로그램을 얘기한다.

 

 

Process Context

문맥? 프로그램이 어떻게 실행했는지, 현재 시점이 어떤 상태인지를 나타내기 위해 사용된다.

 

프로세스가 실행되면 프로세스만의 독자적인 주소공간이 생긴다.

CPU 가 이 프로그램에 해당되면 PC(프로그램 카운터)가 이 프로세스 코드 어느 부분을 가리키게된다.

 

기계어를 하나씩 읽어서 CPU 에 불러들인다 . R1~Rn 의 레지스터에 값을 넣고, ALU 연산 장치에서 뭔가 작업을 한다.

결과를 레지스터에 저장하거나 메모리에 저장하거나 한다.

 

이렇게 실행되는 중에 이 프로그램이 어디까지 진행이 되었나 볼 수 있는데

context다 

문맥을 보기위해서는 PC가 어딜 가리키고 있나 , 코드에 어느 부분까지 실행되었나 를 알아야한다.

또 메모리에 어떤 내용을 담고 있나,  함수 같은걸 실행을 하면 스택에 뭔가 내용이 쌓여있을 것

 

이런 모든 내용들을 프로세스의 문맥이라고 한다.

 

크게 3가지로 나뉠 수 있다.

 

1. CPU 수행 상태를 나타내는 하드웨어 문맥

프로세스는 CPU 를 잡고 매 순간 인스트럭션을 사용하는데 ,

현재 어디까지 실행되었는가를 알려면

레지스터에 어떤값을 넣고 있었고 PC 가 뭘 가리키고 있엇는지에 대한 내용

 

 

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

 

코드 , 데이터, 스택에 어떤 내용이 들어있는가 

 

3. 운영체제의 역할 중 하나인 프로세스의 관리가 있는데

프로세스를 관리하기 위해 PCB 라는 자료구조를 둔다.

 

이걸 왜 알아야 하냐면 현대 컴퓨터 시스템에서는 프로세스들이 번갈아 가면서 실행되기 때문에

백업해두지 않으면 , 즉 이 프로세스의 문맥을 모르면 앞부분부터 다시 실행해야되기 때문에

문맥을 정확히 알아야한다.

 

 

 

 

프로세스는 상태를 바꿔가면서 실행을 한다.

컴퓨터에는 대부분 CPU가 1개밖에 없다.

CPU를 잡고있는 프로세스는 매 순간 1개다.

 

그래서 실행되고 있는 상태를 Running 이라 한다.

CPU 를 기다리고 있을땐 Ready , 레디는 당장 필요한 부분은 모두 메모리에 올라가 있는 상황이다.

실행을 위한 모든 준비가 되어있는 상태.

 

Blocked 는 I/O 작업을 해야한다던지, 오래 걸리는 작업을 진행하고있는상태

당장 실행할 수 없는 상태.

 

 

new - 생성 중인 상태 - ready (실행가능 상태) - running (cpu 얻은 상태) 

- I/O 작업이 생긴 경우 blocked 상태로 넘어감.

- Timer 에 인터럽트 된 경우 ready 로 돌아감. 다시 줄 서있는 상황

역할을 다하면 terminated 로 간다.

 

커널의 Data 영역에 자료구조로 큐를 만들어놓고

프로세스 상태를 바꿔가면서 관리를 한다.

 

 

PCB - 각 프로세스마다 프로세스의 관련된 정보,

운영체제가 데이터 영역에 두고 있는 PCB 는 위와 같은 구성을 갖는다.

 

1. 운영체제가 관리 할때 사용되는 정보 문맥

프로세스 상태 , 프로세스의 CPU 를 주기위한 우선순위 정보 등

큐에서 프로세스를 가져와서 사용하는게 , 라운드 로빈 방식으로 가져와서 사용하는 것 같지만, 

사실은 우선순위가 있다.

 

 2. CPU 관련 정보 문맥

CPU 레지스터에 어떤 값들을 넣어서 사용하고 있었는가.

 

3. 메모리 관련 문맥

Code , data , stack 이 어느 메모리에 위치하는가

 

 

 

CPU 는 굉장히 빠른 자원이기 때문에

프로세스가 얻었다가 뺏겼다가 를 반복한다.

뺏기기전의 문맥을 기억했다가 얻었을때 다시 사용된다.

 

문맥교환 - CPU가 프로세스를 다른 프로세스로 넘겨주는 과정

프로세스 상태를 PCB 에 저장 하고 새로운 프로세스의 PCB를 읽어온다.

 

여기서 말하는 레지스터와 PC 는 하드웨어 자체를 말하고있고,

문맥교환 할때 save 하는건 커널 주소공간의 data 영역에서 PCB 로 저장을 하고 있다.

프로세스에서 다른 프로세스로 변경이 되어야 문맥 교환이라 할 수 있다.

보통은 인터룹투나 시스템콜이 발생해도 요청했던 프로세스에 제어권을 다시 돌려준다.

 

 

순서를 정해주는게 스케줄러다.

 

Long-term 스케줄러 --- Job 스케줄러

메모리를 어떤 프로세스에 줄 지 정한다.

프로세스가 new 상태에서 ready 상태로 넘어갈 때 , 메모리에 올리는 (admitted) 작업

 

 

Short-term 스케줄러  --- CPU 스케줄러

짧은 시간 단위로 스케줄이 발생한다.

어떤 프로세스에 CPU 를 줄지를 결정한다.

 

Medium- term 스케줄러  --- Swapper

우리가 사용하는 시분할 시스템에서는 프로세스가 실행되면 바로 메모리에 올리는데,

메모리에 너무 많은 프로그램이 올라가면 문제가 된다.

이 때 이 Swapper가 프로세스 통째로 디스크로 쫒아낸다.

 

 

 

Swapper로 인해 생겨난 프로세스 상태