Computer Science/Basics and Concepts

๐Ÿ’Operating Systems Fundamentals 2 - Process 1/2

metamong 2024. 11. 1.

Process & Thread

 

๐Ÿš€ Process: ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰์ค‘์ธ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ. ํ”„๋กœ๊ทธ๋žจ์€ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด์˜ ์ง‘ํ•ฉ. ๊ฐ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค RAM์˜ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ํž™, ์Šคํƒ)์„ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค(์œ„ ํ”„๋กœ์„ธ์Šค A ์—ฐ๋‘์ƒ‰ ๋ฉ”๋ชจ๋ฆฌ์™€ ํ”„๋กœ์„ธ์Šค B ๋…ธ๋ž€์ƒ‰ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•œ๋‹ค)

 

๐Ÿš€ ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค PCB(ํ”„๋กœ์„ธ์Šค ์ œ์–ด ๋ธ”๋ก)์ด ๋งŒ๋“ค์–ด์ง„๋‹ค. PCB๋Š” RAM ๋‚ด์—์„œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ณ„๋„ ๊ด€๋ฆฌ๋˜๋ฉฐ, kernel mode์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค(์•ž์˜ ํฌ์ŠคํŒ…์—์„œ kernel mode์™€ user mode์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๋‹ค. user mode์ผ ๋•Œ๋Š” ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๊นŒ์ง€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์‹ค์ œ ์ค‘์š”ํ•œ PCB๋Š” ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. kernel mode๋งŒ ๊ฐ€๋Šฅ)

 

๐Ÿš€ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ์ž์„ธํžˆ

(1) stack: ์ง€์—ญ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜๋˜๋Š” ์ฃผ์†Œ ๊ฐ’ ๋“ฑ์ด ์ €์žฅ๋˜๋Š” ์˜์—ญ. ๋†’์€ ์ฃผ์†Œ ๊ฐ’์—์„œ ๋‚ฎ์€ ์ฃผ์†Œ ๊ฐ’์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น. ์˜์—ญ ํฌ๊ธฐ๋Š” ์ปดํŒŒ์ผ ๋•Œ ๊ฒฐ์ •. LIFO ๋ฐฉ์‹.

 

(2) heap: ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ผ์–ด๋‚จ. ๋‚ฎ์€ ์ฃผ์†Œ ๊ฐ’์—์„œ ๋†’์€ ์ฃผ์†Œ ๊ฐ’์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น. ์˜์—ญ ํฌ๊ธฐ๋Š” ๋Ÿฐํƒ€์ž„ ๋•Œ ๊ฒฐ์ • (C์–ธ์–ด์˜ malloc()). FIFO ๋ฐฉ์‹

 

โ€ป stack๊ณผ heap์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ์˜ ์˜์—ญ์„ ์นจ๋ฒ”ํ•  ์ˆ˜ ์žˆ๋‹ค. stack์ด heap์„ ์นจ๋ฒ”ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” stack overflow / ๊ทธ ๋ฐ˜๋Œ€๋Š” heap overflow.

 

(3) data: ์ „์—ญ ๋ณ€์ˆ˜, ์ •์  ๋ณ€์ˆ˜, ๋ฐฐ์—ด, ๊ตฌ์กฐ์ฒด ๋“ฑ์ด ์ €์žฅ. BSS(Block Stated Symbol)์ธ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ์ €์žฅ / Data ์˜์—ญ์ธ ์ดˆ๊ธฐํ™”ํ•œ ๋ณ€์ˆ˜ ์ €์žฅ์œผ๋กœ ๋‚˜๋‰จ.

 

(4) code: ์‹คํ–‰ํ•  ์ฝ”๋“œ๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ๋˜์–ด ์ €์žฅ๋˜๋Š” ์˜์—ญ. text ์˜์—ญ

 

๐Ÿš€ ํ”„๋กœ์„ธ์Šค๋Š” 1๊ฐœ ์ด์ƒ์˜ thread๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. thread๋ž€ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ํ๋ฆ„์˜ ๋‹จ์œ„. thread๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” stack ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ• ๋‹น ๋ฐ›์Œ. ๊ทธ ์™ธ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” heap, data, code๋Š” ๊ณต์œ .

 

๐Ÿš€ ์Šค๋ ˆ๋“œ๋ฅผ ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ง€์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ / ์ปค๋„ ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ 2๊ฐœ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. 3๊ฐ€์ง€ ๊ด€๊ณ„๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งบ์„ ์ˆ˜ ์žˆ๋‹ค.

 

(1) many-to-one model

: ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ n๊ฐœ์— ์ปค๋„ ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ 1๊ฐœ๊ฐ€ ๋งคํ•‘๋˜์–ด ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ์—์„œ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ. ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ์ด ์ค‘ 1๊ฐœ๊ฐ€ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ๋Š” ์ปค๋„ ๋ ˆ๋ฒจ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฉ€ํ‹ฐ ์ฝ”์–ด์˜ ๋ณ‘๋ ฌ์„ฑ ์ด์šฉ ๋ถˆ๊ฐ€

 

(2) one-to-one model

: ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ 1๊ฐœ์— ์ปค๋„ ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ 1๊ฐœ๊ฐ€ ๋”ฑ ๋งคํ•‘๋œ๋‹ค. many-to-one model์˜ ๋‹จ์  ํ•ด๊ฒฐ. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ ์ˆ˜๋งŒํผ ์ปค๋„ ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜ ๋‹จ์ 

 

(3) many-to-many model

: ์‚ฌ์šฉ์ž ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ n๊ฐœ์— ์ปค๋„ ๋ ˆ๋ฒจ ์Šค๋ ˆ๋“œ m๊ฐœ๊ฐ€ ๋งคํ•‘๋œ๋‹ค. m์€ n์ดํ•˜. many-to-one model๊ณผ one-to-one model์˜ ์žฅ์ ์„ ํฌํ•จํ•˜๋‚˜ ๊ตฌํ˜„ ์–ด๋ ค์šด ๋‹จ์ 

PCB

๐Ÿš€ OS๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค์˜ ๊ณ ์œ  ์ •๋ณด๋ฅผ PCB์— ์ €์žฅํ•œ๋‹ค. ์ฆ‰, ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค PCB๊ฐ€ ๊ณ ์œ ํ•˜๊ฒŒ ์ƒ์„ฑ. PCB์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

 

๐Ÿš€

(1) ํ”„๋กœ์„ธ์Šค์˜ ํ˜„์žฌ ์ƒํƒœ

(2) PID: ํ”„๋กœ์„ธ์Šค ๊ณ ์œ  ID

(3) ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ID

(4) ์ž์‹ ํ”„๋กœ์„ธ์Šค ID

(5) PC(Program Counter): ๋‹ค์Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ

(6) ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„

(7) ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ

ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ

๐Ÿš€ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์€ ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค์—์„œ fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ๋‹ค. ์ฆ‰, fork() ํ•จ์ˆ˜๋Š” ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค / ๋ณต์‚ฌ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ํ•œ๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ fork()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๊ธฐ์กด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ƒˆ๋กญ๊ฒŒ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ. fork() ์ดํ›„ ์•„๋ž˜ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” fork() ๊ฒฐ๊ณผ๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID ๋ฐ˜ํ™˜ / ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” 0์ด ๋ฐ˜ํ™˜๋œ๋‹ค. ์ฆ‰, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์‹œ์ ์— ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ.

#include <stdio.h>
#include <unistd.h>

int main(){
	printf("start!\n");
    int forkRet = fork();
    if (forkRet == 0){
    	printf("child process %d\n", getpid());
    } else {
    	printf("forkRet: %d parent process: %d\n", forkRet, getpid());
    }
    return 0;
}

zombie & orphan process

๐Ÿš€ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค: ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ ์ค‘์ธ๋ฐ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋จผ์ € ์ข…๋ฃŒ๋˜์–ด์„œ ๋‚จ๊ฒจ์ง„ ์ž์‹ ํ”„๋กœ์„ธ์Šค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— SIGCHLD๋ผ๋Š” ์‹œ๊ทธ๋„์„ ๋ณด๋‚ธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ wait() ํ•จ์ˆ˜(์‹œ์Šคํ…œ ์ฝœ)๋ฅผ ํ˜ธ์ถœํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ๋ฐ›๊ณ  ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ž์› ํšŒ์ˆ˜ ์™„๋ฃŒ. ํ•˜์ง€๋งŒ, ํ•ด๋‹น ์—ญํ• ์„ ํ•˜๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” init ํ”„๋กœ์„ธ์Šค(๋ถ€ํŒ… ์‹œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค)์˜ PID๋ฅผ 1๋กœ ๋ฐ”๊พธ์–ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ ์„ค์ •. ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ init ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์„ ํšŒ์ˆ˜ํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ.

 

๐Ÿš€ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค: ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์œผ๋‚˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›์„ ์ œ๋Œ€๋กœ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•ด ๋‚จ๊ฒจ์ง„ ์ž์‹ ํ”„๋กœ์„ธ์Šค. ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์›์„ ๋‚ญ๋น„ํ•˜๋Š” ๋ฌธ์ œ์  ๋ฐœ์ƒ. 

ํ”„๋กœ์„ธ์Šค ์ƒํƒœ๋„

๐Ÿš€ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ๊ฒฐ๊ตญ CPU์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธํ•œ๋‹ค.

(1) ์ƒ์„ฑ) ํ”„๋กœ์„ธ์Šค๊ฐ€ PCB๋ฅผ ๊ฐ€์ง„ ์ƒํƒœ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ๋‹จ, RAM์— load๋œ ํ›„, OS๋กœ๋ถ€ํ„ฐ CPU์— ์˜ฌ๋ผ๊ฐ€๋Š” ์Šน์ธ ๋ฐ›๊ธฐ ์ „์˜ ์ƒํƒœ

(2) ์ค€๋น„) OS๋กœ๋ถ€ํ„ฐ ๋“œ๋””์–ด ์Šน์ธ์„ ๋ฐ›๊ณ  RAM๋‚ด์˜ ready queue์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค. / ๋˜๋Š” ์‹คํ–‰ ์ƒํƒœ์—์„œ CPU์˜ ๋…์  ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ž ์‹œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ready queue๋กœ ๋‹ค์‹œ ๋“ค์–ด๊ฐ„๋‹ค. / ๋˜๋Š” ๋Œ€๊ธฐ ์ƒํƒœ์—์„œ ์ด์ œ ์ž…์ถœ๋ ฅ ๋˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜์–ด wait queue์—์„œ ready queue๋กœ ๋‹ค์‹œ ๋“ค์–ด๊ฐ„๋‹ค.

(3) ์‹คํ–‰) ๋ณธ๊ฒฉ์ ์œผ๋กœ OS์— ์˜ํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU์— ๋“ค์–ด๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ด ๋•Œ, wait queue๊ฐ€ ์•„๋‹ˆ๋ผ ready queue์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค ์ค‘ ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ dispatch๋˜์–ด ์‹คํ–‰๋œ๋‹ค.

(4) ๋Œ€๊ธฐ) CPU์— ์˜ํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘, ์ž…์ถœ๋ ฅ์ด๋‚˜ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด CPU ์‚ฌ์šฉ์„ ๋ฉˆ์ถ”๊ณ  wait queue๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

(5) ์ข…๋ฃŒ) ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ. CPU์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋๋‚˜์„œ ์ข…๋ฃŒ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

'Computer Science > Basics and Concepts' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿ“API / RESTful API  (0) 2025.03.02
๐Ÿ’ Operating Systems Fundamentals 1  (0) 2024.10.30
jupyter notebook markdown *์ˆ˜์‹œ ์—…๋ฐ์ดํŠธ  (0) 2023.02.07
Data Handling  (0) 2022.07.15
feature scaling  (0) 2022.06.22

๋Œ“๊ธ€