본문 바로가기
Computer Science/운영체제

[운영체제] ep2) 프로세스(process)

by 클레어몬트 2024. 4. 8.

ㅁ프로세스(process): 실행 중인 프로그램 (실행/스케줄링의 단위 및 자료구조)

보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간, 그 프로그램은 프로세스가 된다

그리고 이 과정을 "프로세스를 생성한다"라 표현한다

프로세스의 구조

 

 

 

+ 프로세스를 직접 확인하는 방법

- Windows: 작업 관리자 프로세스 탭

 

- UNIX체계: ps 명령어

ps는 process state의 약자이다

 

 

 

포그라운드(foreground) 프로세스: 사용자가 볼 수 있는 앞 공간에서 실행되는 프로세스

vs

백그라운드(background) 프로세스: 사용자가 보지 못하는 뒷 공간에서 실행되는 프로세스

이 백그라운드 프로세스 중에서 사용자와 상호작용하지 않고 혼자 묵묵히 일을 수행하는 프로세스들을 Windows에서는 서비스(service)라 하고 UNIX체계에서는 데몬(daemon)이라고 한다

 

여담) 데몬이 '눈에 보이지 않는' 악마이지 않는가? 우리말로 직역하면 귀신프로세스 느낌으로 받아들이면 될 것 같다

 

 

 

ㅇPCB(Process Control Block): 프로세스와 관련된 여러 정보를 저장하는 자료구조

프로세스 제어 블록(PCB)

 

쉽게 말하면 옷가게 옷에 있는 태그 같은 느낌이다

이 태그들을 이용해서 수많은 프로세스들을 식별한다

"PCB는 커널영역에 적재된다"

(PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다)

 

타이머 인터럽트는 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 HW 인터럽트

 

 

 

[PCB에 담기는 정보 4가지] (OS마다 약간씩 상이하다)

1. PID(Process ID): 고유한 프로세스 식별 번호

PPID: Parent PID

가운데에 PID값을 확인할 수 있다

 

2. Processor State Information: 레지스터 값들 - PC, 스택 포인터, PSW 등

프로세스는 이전까지 진행했던 작업들을 그대로 이어 실행하기 위해 레지스터의 중간값들을 모두 복원한다

 

3. Process Control Information: 자원 + 실행 관련 정보들

[자원 관련 정보들]

- memory management 정보 3가지

 프로세스가 어느 주소에 저장되어 있는지(페이지 테이블 정보)

 HDD Swapping area 어디에 있는지

 베이스 레지스터, 한계 레지스터

- resource ownership

- utilization: 장치를 얼마나 많이 사용했는지

- process privileges

[실행 관련 정보들]

- CPU Schduling 방식

- Process State

- IPC(Inter-Process Communication) e.g. 메시지 큐, 파이프, 공유 메모리 등

- data structuring

 process 포인터

 process image 포인터

 process tree 포인터 (부모-자식 관계)

 

4. 사용한 파일과 I/O 장치 목록

어떤 파일들을 열었는지, 어떤 I/O가 이 프로세스에 할당되었는지

 

 

User processes in VM

 

 

 

ㅁ프로세스가 배치되는 사용자 영역 4가지

프로그래밍에 있어 매우 중요한 내용이므로 잘 알아두자

 

 

1. 코드 영역(텍스트 영역): CPU가 실행하는 기계어(명령어) 저장

쓰기가 금지되어 있는 읽기 전용 공간이다(read-only)

 

2. 데이터 영역: 프로그램이 실행되는 동안 유지할 데이터를 저장

e.g. 전역 변수(global variable), static 변수

 

3. 힙(heap) 영역: 개발자가 직접 할당할 수 있는 저장공간

e.g. malloc() 함수, free() 함수

힙 영역에 메모리 공간을 할당하면 무조건 후에 해당 메모리 공간을 반환해야 한다

메모리 공간을 반환하지 않는다면 메모리 내에 계속 남아 메모리 낭비가 된다, 이런 문제를 메무리 누수(leak)이라 한다

 

+ 최신 프로그래밍 언어는 "가비지 컬렉션"을 통해 메모리 누수를 자동으로 막아주기도 한다

e.g. java, python

 

※ 자료구조의 힙(Heap)과 컴퓨터 메모리의 힙 영역(Heap Area)은 완전히 다른 개념이다

 

4. 스택(stack) 영역: 데이터를 일시적으로 저장하는 공간

e.g. 지역 변수(local variable), 매개 변수

PUSH: 일시적으로 사용할 데이터를 저장

POP: 더 이상 필요하지 않은 데이터를 삭제

 

※ 자료구조의 스택(Stack)과 컴퓨터 메모리의 스택 영역(Stack Area)은 완전히 다른 개념이다

- 자료구조 스택: 힙 영역

- 지역변수 저장, 함수 호출: 스택 영역

 

 

 

 

 

 

 

ㅇContext Switching(문맥 교환): A 프로세스의 문맥을 PCB에 백업하고, B 프로세스의 PCB로부터 문맥을 가져와 B 프로세스를 실행하는 것

여기서 context(문맥)이란 하나의 프로세스 수행을 재개하기 위해 기억해야 할 중간정보를 말한다

정확히는 CPU 안에 있는 레지스터값들을 의미한다

실행 문맥을 백업해 두면 언제든 해당 프로세스의 실행을 재개할 수 있다

 

 

문맥 교환이 자주 일어나면 프로세스가 그만큼 빨리 번갈아 가며 수행되기 때문에 "프로세스들이 동시에 실행되는 것처럼 보인다"

(하지만 문맥 교환을 너무 자주 하면 오버헤드가 발생할 수 있다)

 

 

 

 

 

ㅁ프로세스 상태(process state) - 기본적으로 5가지이다 (OS마다 조금씩 다르며 추가된다)

Process States for Trace

 

1. New(생성 상태): 프로세스를 생성 중인 상태 = 프로세스가 아직 메모리로 로딩 x

(PCB는 이미 할당받음)

 

2. Ready(준비 상태): CPU를 할당받으면 실행가능

ready에서 running으로 전환되는 것을 디스패치(dispatch)라 한다

※ 디스패쳐(dispatcher): 스위칭해 주는 프로그램

 

3. Running(실행 상태): CPU를 할당받아 실행 중

 할당된 시간 모두 사용 시(Timer 인터럽트 발생 시) ready 상태로

 실행 도중 I/O를 사용하면 I/O작업이 끝날 때까지 blocked 상태로

 

4. Blocked/Waiting(대기 상태): 프로세스가 실행 도중 I/O를 사용하는 경우, I/O작업을 기다리는 상태

(CPU를 받아도 실행 못함)

 

5. Exit/Terminated(종료 상태): 프로세스가 종료된 상태

PCB, 프로세스의 메모리 영역 정리

 

<프로세스 상태 다이어그램>

Five-State Process Model

 

<Single Blocked Queue>: 현재 실행될 수 없고, 특정 이벤트(예: I/O 완료, 리소스 접근 가능 등)를 기다리고 있는 모든 프로세스들을 포함하는 큐

※ 큐 안에 프로세스가 있는 게 아니다!

프로세스는 굉장히 크고 메모리에 고정되어 있으며, 큐 안에는 Primary Process Table - 최소한의 정보(PID, process image 포인터 등)이 들어있다

 

<Multiple Blocked Queues>

 

 

 

ㅇ스와핑(Swapping): m.m.에 적재된 process를 HDD에 잠시 적재했다가 필요할 때 다시 꺼내서 사용하는 메모리 교체 기법

(Swapping area는 file영역이 아니다)

 

스와핑이 필요한 이유 2가지

1. I/O 작업속도가 CPU 작업속도에 비해 굉장히 느려서 ready queue가 비어있게 된다

2. 메모리 공간이 한정적이다

 

 

<프로세스 상태 다이어그램> - Suspend State 추가

+ Blocked/Suspend: HDD로 옮겨진 Blocked 상태

+ Ready/Suspend: HDD로 옮겨진 Ready 상태

앞의 상태도에서 2개만 추가됐다

 

What is Process Suspension?

메모리에서 실행하고 있던 프로그램이 아래 5가지의 이유로 HDD의 Swapping area로 쫓겨나가는 상황

1. Swapping: 메모리가 꽉 차서

 

2. Other OS reason

① 데몬은 천천히 실행해도 괜찮아서 suspend 1순위다

② OS는 이상한 행동을 감지하면 일단 suspend 시키고 HDD의 Swapping area로 보낸다

 

3. Interactive user request: 유저가 suspend 시켜달라 요청

e.g. 동기화, 디버깅

 

4. Timing: 실행주기가 있는 데몬은 사용하지 않을 때 Swapping area에 박아둔다

 

5. Parent process request: 부모 process가 suspend 요청

 

 

 

 

ㅁ프로세스 생성과정(Process Creation) - New 상태가 되는 과정

Terminate는 반대로 하면 된다! (PID가 가장 마지막까지 남는다)

 

 

 

 

 

ㅁOS Control Structure - 테이블 4가지

1. Memory Table: m.m. / HDD 어디에 적재되어 있는지에 대한 페이지 테이블

사용할 수 없는 프로세스를 shared memory로부터 보호한다

 

2. I/O Table: 여러 I/O 디바이스들의 state 정보 + m.m. 어느 프로세스 위치로 전달하고 어느 위치로 출력할지

 

3. File Table: File이 HDD 어디에 있는지 + File 크기, 소유주, 권한, open 됐는지, 어디까지 읽었는지/썼는지 등

 

(중요)                                최소한의 정보             대부분의 정보

4. Process Table: Primary Process Table + Process Image

General Structure of Operating System Control Tables

 

ㅇ Primary Process Table: 최소한의 정보 저장

- PID (구조체 배열의 인덱스라 생각하자)

- process image 포인터

- location in memory (메모리 어디에 process가 저장되어 있는지)

 

ㅇProcess Image: 나머지 모든 정보

[사용자 영역]

- 데이터 영역

- 코드 영역

- 스택

- 힙

[커널 영역]

- PCB

 

 

 

 

 

ㅁOS의 실행방식 3가지

1. Non-process Kernel: OS의 전체코드가 메모리에 항상 상주

예전 방식이다(OS의 크기가 매우 작을 때 채택)

Separate Kernel

 

 

 

2. Execution Within User Processes: OS function들을 프로세스 안에서 실행시키는 방식

e.g. UNIX - 속도 중시

OS functions execute within user processes

 

불필요한 스위칭 필요 x -> 실행속도 fast

Process Image: OS Executes Within User Space

 

 

 

3. Process-Based Operating System: OS를 프로세스로 만들어서 다 똑같이 처리

멀티코어 시스템에 적합하다 (각각의 CPU에서 서로 다른 process를 실행)

e.g. Windows - 확장성 good, 수정 용이 / slow

OS functions execute as separate processes


단점: 불필요한 process switching을 할 수가 있다 (아무리 작은 OS 작업이라도 process switching 작업 필요)

 

 

 

 

 

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

(이하 내용은 UNIX 계열을 다루며 Windows 운영체제와는 관련이 없다)

ㅁUNIX 계열의 프로세스 계층 구조: 부모 프로세스 + 자식 프로세스

트리(tree) 구조

 

 

+ 최초의 프로세스: 최초의 프로세스 PID는 항상 1번이다(= 1번 프로세스)

프로세스 계층 구조를 보여주는 명령어: pstree

 

OS별 1번 프로세스 (UNIX와 Linux의 0번 프로세스는 스와핑 작업용)

- UNIX: init

- Linux: systemd

- macos: launched

 

 

 

ㅁUNIX 계열의 프로세스 생성 기법 - fork와 exec로 복제와 옷 갈아입기

- 부모 프로세스: fork()

자신의 복사본을 자식 프로세스로 생성(복제)

※ PPID: Parent PID

 

"자식 프로세스는 부모 프로세스의 자원들을 상속받는다"

e.g. 메모리 내의 내용, 열린 파일들의 목록 등

 

 

- 자식 프로세스: exec()

자신의 메모리 공간을 새로운 프로그램으로 덮어씀(옷 갈아입기)

 

 

※ fork와 exec 모두 시스템 콜이다

※ fork를 통해 복사된 자식프로세스도 fork를 할 수 있다

 

 

 

ㅁUNIX 계열의 프로세스 상태 다이어그램

Ready 상태에서 Running 상태가 되기 위해서는 커널코드를 거쳐야 한다

UNIX Process State Transition Diagram

 

 

Q. 왜 상태도에 Preemptyed 상태에서 Kernel Running 상태를 안 거치고 바로 User Running 상태로 가는 화살표가 있는가?

A. 이미 Kernel Running 상태를 거친 애들이기 때문에 time-out만 아니면 바로 실행될 수가 있다

 

 

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

(+ 추가지식)

IPC(Inter-Process-Communication): 프로세스 간 통신

프로세스 간의 자원을 공유하고 데이터를 주고 받는 것을 말한다

e.g. 파일을 통한 프로세스 간 통신, 전역 변수를 통한 통신, 소켓이나 파이프를 이용한 통신

공유 메모리: 프로세스들이 공유할 수 있는 메모리 영역

 

 

 

 

 

 

참고 및 출처: Operating Systems: Internals and Design Principles(William Stalling), Operating System Concepts(Silberschatz, Abraham), 혼공컴운(강민철)