프로세스

Sirius·2024년 8월 30일
0

프로세스의 개념

실행중인 프로그램

프로세스의 문맥

프로세스가 어떤 상태에서 수행되고 있는지를 나타내는 정보

1) CPU 수행상태를 나타내는 하드웨어 문맥 -> PC, 각종 레지스터
2) 프로세스의 주소공간 -> Code, Data, Stack
3) 프로세스 관련 커널 자료구조 -> PCB, 커널스택

CPU의 구성요소(3)

1) 레지스터(R1, R2, ...): 데이터 보관
2) ALU(산술 논리 연산 장치): CPU의 중앙 연산 장치
3) PC(Program Counter):
다음에 실행할 명령어의 메모리주소 가리킴 = 실행중인 프로세스의 코드영역, CPU가 명령어를 하나 실행할 때마다 이 주소가 업데이트된다.

주소공간에서 인스트럭션(기계어)을 통해 데이터를 레지스터로 가져온다.
만약 시스템 콜이 오면 PC가 커널 코드를 가리킨다.

프로세스의 상태(5)

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

2) Ready: CPU를 기다리는 상태(메모리에 올라와는 있다)

3) Running: CPU를 잡고 인스트럭션 수행중인 상태

Running에서 Ready로 돌아가는 경우는 할당시간 만료 되어서 Timer가 인터럽트 건거다.

4) Blocked: 오래걸리는 작업을 하고 있다(비동기식 처리를 위해 CPU못쓰게 한다)

  • CPU를 주어도 인스트럭션을 수행할 수 없는 상태
  • 프로세스 자신이 요청한 event가 즉시 만족되지 않아 이를 기다리는 상태
  • 디스크에서 파일을 읽어와야 하는 경우

5) Terminated: 수행이 끝난상태, 운영체제에 의해 자원 해제 등의 정리 작업까지는 아직 완료되지 않은 상태

프로세스 & CPU & I/O의 상호작용

프로세스는 실행중인 프로그램의 인스턴스이고 이 인스턴스는 가상 메모리를 가진다. 그리고 이것을 CPU가 참조한다.

1) 프로세스와 CPU의 상호작용:

CPU는 여러 프로세스들 중 하나를 선택하여 실행한다.
CPU가 현재 선택한 프로세스는 I/O 작업을 요청할 수 있으며, 이 경우 프로세스는 CPU를 떠나 해당 I/O 장치의 큐로 들어갑니다.

2) I/O 요청 처리와 Blocked 상태:

I/O 요청을 받은 프로세스는 I/O 장치에서 작업이 완료될 때까지 Blocked 상태로 전환된다.
이 동안 해당 프로세스는 CPU를 사용하지 않고, 다른 프로세스가 CPU를 사용할 수 있도록 한다.

3) I/O 완료 후 Ready 상태로 전환:

I/O 작업이 완료되면, DMA 컨트롤러에 의해 피지컬 메모리로 데이터가 올라간다.
MMU는 가상 주소를 물리 주소로 변환해주는 장치이다.
MMU를 통해 프로세스의 가상메모리에서 이 I/O 데이터에 접근할 수 있다.

해당 프로세스는 다시 Ready 상태로 돌아가고, 준비 큐에서 CPU가 할당되기를 기다린다.
CPU 스케줄러가 해당 프로세스를 다시 선택하면, 프로세스는 CPU에서 실행을 재개할 수 있다. (요청한 I/O 데이터를 가상메모리에서 접근할 수 있음)

PCB(Process Control Block)

  • OS가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보(구조체)
  • 프로세스마다 하나의 PCB까 만들어져 OS가 이를 관리한다.

1) OS가 관리상 사용하는 정보
ex> Process State, Process ID, Scheduling, Information, Priority

2) CPU 수행관련 하드웨어 값
ex> Program Counter, Registers

3) 메모리 관련
ex> Code, Data, Stack의 위치정보

4) 파일 관련
ex> Open File Discriptors

문맥교환(Context Switch)

앞으로 CPU 제어권을 다른 프로세스에게 넘기는 것을 문맥교환이라고 한다.

CPU가 사용자 프로세스 A로부터 사용자 프로세스 B로 넘어가는 과정
-> CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB로 저장
-> CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴

시스템콜이나 인터럽트가 발생한다고 반드시 Context Switch가 일어나는 것은 아니다.

오직 1) 타이머에 의한 인터럽트와 2) I/O 요청에 의한 System Call 만 문맥교환이 일어난다.
일반적으로 ISR은 보통 매우 짧고 빠른 작업을 수행하도록 설계되기 때문에, 처리하는 데 시간이 오래 걸리지 않는다. 따라서 문맥교환이 일어나지 않는다.

프로세스를 스케줄링 하기 위한 큐(3)

1) Job Queue : 현재 시스템 내에 있는 모든 프로세스의 집합
2) Ready Queue : Ready에 있으면 Device에서 빠짐
3) Device Queue: Device에 있으면 Ready에서 빠짐

스케줄러(3)

1) Long-Term 스케줄러(Job 스케줄러)

메모리를 어떤 프로세스에게 줄지 결정 (new -> ready)
메모리에 올라가 있는 프로세스의 수 제어 (Degree of Multi-Programming)

2) Short-Term 스케줄러(CPU 스케줄러)

짧은 시간 단위로 스케줄링이 이루어짐, 다음번에 어떤 프로세스에게 CPU 줄지 결정

3) Medium-Term 스케줄러(Swapper)

메모리에 다수의 프로그램이 존재하면 Swapper가 일부 프로그램 골라서 메모리에서 쫓아낸다. (Degree of Multi-Programming 제어)

결론: 현재는 메모리에 일단 다 올려놓고 Swapper가 일부 프로그램 골라서 메모리에서 쫓아내는 Medium-Term 채택중이다.

  • 스와퍼로 인해 생긴 상태: Suspended
    : 외부적인 이유로 프로세스의 수행이 정지된 상태, 프로세스는 통째로 디스크에 Swap Out 된다.

  • Blocked vs Suspended
    1) Blocked: 자신이 요청한 일을 하면서 오래 기다림 -> 자신이 요청한 event(I/O)가 끝나면 Device큐에서 Ready큐로 돌아감
    2) Suspended: 외부에서 정지시켜 놓은 상태 -> 외부에서 Resume 시켜야 Active됨

쓰레드(Thread)

프로세스 하나에 CPU 수행단위만 여러개 두는 것

1) CPU를 통해 인스트럭션을 실행하려면 주소공간의 코드의 어느부분을 실행하고 있는지 가리키는 PC(Program Counter)가 있어야 한다.

2) CPU에서 실행되면서 메모리의 레지스터 값들을 세팅해놓고 실행한다.

  • 프로세스마다 하나의 PCB를 가지고 OS가 이 PCB를 관리한다.

프로세스 하나에도 CPU 수행과 관련한 정보는 개별로 갖는다.
ex> PC, 레지스터, 스택

쓰레드의 구성(3)

1) PC(Program Counter): PC(어디 실행할지)
2) register set: 레지스터 상태: CPU가 참조하는 메모리
3) stack space: 스택 포인터

쓰레드가 동료 쓰레드와 공유하는 부분

1) Code Section
2) Data Section
3) OS resources

프로세스를 여러개 두는 것 보다 프로세스안에 쓰레드를 여러개 두는 것이 더 가볍다.
특히 쓰레드끼리의 빠른 문맥교환이 가능해지는데 이는 1)PC와 2)레지스터 3) 스택 포인터 상태만 CPU가 업데이트하면 되기 때문이다.

  • 쓰레드끼리의 문맥교환
    ex> CPU의 1)PC값, 2)레지스터값, 3)스택포인터를 쓰레드 1이 CPU로 부터 받아서 저장하고, 쓰레드 2의 1)PC값, 2)레지스터값, 3)스택포인터 를 CPU로 가지고 온다.

쓰레드의 장점: 서술식

다중 쓰레드로 구성된 태스크 구조에서 하나의 서버 쓰레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 쓰레드가 실행되어 빠른 처리를 할 수 있다.

동일한 일을 수행하는 다중 쓰레드가 협력하여 높은 처리율과 성능향상을 얻을 수 있다.

ex: 네이버 웹페이지 읽어오기(I/O 작업)

1) 읽어오는 동안 나의 웹브라우저는 blocked 상태가 된다.
-> 사용자는 답답함

2) 웹브라우저 프로그램이 여러개의 쓰레드를 가진다면?
가. 하나의 쓰레드가 웹페이지 그림들을 불러오는 동안에
나. 또 다른 쓰레드가 이미 읽어온 텍스트라도 화면에 보여준다.

쓰레드의 장점(4)

1) 응답성

위의 웹브라우저의 예시

2) 자원공유

쓰레드들끼리 자원을 공유만 하면 굳이 여러개의 프로세스 안만들어도 된다.

3) 경제성

프로세스간 문맥교환은 상당히 오버헤드가 크다. 그러나 쓰레드 간 문맥교환이 일어나는 것은 간단하다.

4) MP(Multi-Processor)구조에서의 유용성

병렬처리 유용

쓰레드의 시행

1) 커널 쓰레드

쓰레드가 여러개 있다는 사실을 OS 커널이 알고 있다.
커널이 하나의 쓰레드에서 다른 쓰레드로 넘기는 것을 스케줄링 한다.

2) 유저 쓰레드

쓰레드가 여러개 있다는 사실을 OS는 모른다.
유저 프로그램이 스스로 여러개의 쓰레드 관리(라이브러리 지원)

0개의 댓글