๐Ÿšง

ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ(Process&Thread)

purpplee 2021. 12. 19. 18:54

ํ”„๋กœ์„ธ์Šค๋ž€?

ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค.

 

ํ”„๋กœ์„ธ์Šค์˜ ๋ฌธ๋งฅ(context)

ํŠน์ • ์‹œ์ ์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋””๊นŒ์ง€ ์‹คํ–‰๋๋Š”์ง€์˜ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•œ ํ•˜๋“œ์›จ์–ด ๋ฌธ๋งฅ์ด๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ๋“ค์„ ๋ชจ๋‘ ํฌํ•จํ•ด ํ”„๋กœ์„ธ์Šค์˜ ๋ฌธ๋งฅ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ˜„๋Œ€ ์ปดํ“จํ„ฐ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ time sharing์„ ํ•˜๋ฉฐ ๋™์‹œ์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ์ด์ „ ํ”„๋กœ์„ธ์Šค์˜ ๋ฌธ๋งฅ์„ ์ €์žฅํ•ด๋†”์•ผ ๋‹ค์‹œ ๋Œ์•„์™”์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜๋“œ์›จ์–ด ๋ฌธ๋งฅ

๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” Program Counter ์™€ ๊ฐ์ข… register์˜ ์ •๋ณด

 

ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„

code, data, stack ์— ์–ด๋–ค ๋‚ด์šฉ์ด ๋“ค์–ด ์žˆ๋Š”๊ฐ€.

 

ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ ์ปค๋„ ์ž๋ฃŒ ๊ตฌ์กฐ

ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ธ PCB(Process Control Block) ์™€ ์šด์˜์ฒด์ œ์—์„œ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” kernel stack.

 

ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ(Process State)

ํ”„๋กœ์„ธ์Šค๋Š” ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉฐ ์ˆ˜ํ–‰๋œ๋‹ค. 

Ready๋Š” Memory ์— Address Space ๋ฅผ ์„ธํŒ…ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์ด ๋ชจ๋‘ ๋๋‚˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ CPU๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ๋‹ค. ์ดํ›„ CPU ์„ ์ฐจ์ง€ํ•˜๊ณ  instruction์„ ์ˆ˜ํ–‰์ค‘์ธ ์ƒํƒœ๋ฅผ Running ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋งŒ์•ฝ I/O ์ž‘์—…์„ ํ•˜๊ฑฐ๋‚˜ disk์—์„œ file์„ ์ฝ์–ด์˜ค๋Š” ๋“ฑ ์š”์ฒญํ•œ event ๊ฐ€ ๋งŒ์กฑ๋˜์ง€ ์•Š์•„ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š๋ผ CPU๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ๊ฐ€ ๋˜๋ฉด Blocked(=wait, sleep) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ New ๋ผ๋Š” ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์ค‘์ธ ์ƒํƒœ์™€ Terminated ๋ผ๋Š” ํ”„๋กœ์„ธ์Šค ์ˆ˜ํ–‰์ด ๋๋‚˜๊ณ  ๋๋‚ผ ์ค€๋น„๋ฅผ ํ•˜๋Š” ์ƒํƒœ๋„ ๊ฐ™์ด ๋งํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๋งŒ์•ฝ ๊ณ„์† ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ time sharing ๋•Œ๋ฌธ์— timer ๊ฐ€ ๋๋‚˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ CPU ์ œ์–ด๋ฅผ ๋„˜๊ธฐ๋ฉด ๋‹ค์‹œ Ready ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. 

์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ์˜ ์ฐจ๋ก€๊ฐ€ ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ์ค„ ์„œ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ Ready Queue / I/O queue ๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜๋“œ์›จ์–ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ๋„ ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ Resource queue ์— ์ค„์„ธ์šด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๊ณ  queue์— ์ค„์„ธ์šฐ๊ณ  ๊ฐ™์€ ์ž‘์—…๋“ค์€ ์šด์˜์ฒด์ œ์˜ ์ปค๋„์ด ๊ด€๋ฆฌํ•œ๋‹ค.

 

ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง ํ

ํ”„๋กœ์„ธ๋Š” ๊ฐ ํ๋“ค์„ ์˜ค๊ฐ€๋ฉฐ ์ˆ˜ํ–‰๋œ๋‹ค.

 

Job queue

ํ˜„์žฌ ์‹œ์Šคํ…œ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ์ง‘ํ•ฉ

 

Ready queue

ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์— ์žˆ์œผ๋ฉด์„œ CPU ์ œ์–ด๊ถŒ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ง‘ํ•ฉ

 

Device queue

I/O device ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ง‘ํ•ฉ

 

PCB(Process Control Block)

์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์œ ์ง€ํ•˜๋Š” ์ •๋ณด์ด๋‹ค. ์ฆ‰, ํ”„๋กœ์„ธ์Šค์˜ ๋ฌธ๋งฅ์— ๋Œ€ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

 

(1) OS๊ฐ€ ๊ด€๋ฆฌ์ƒ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด

- Process state, Process ID

- Scheduling information, priority

์œ„์—์„œ๋Š” queue๋กœ ์ค„์„ธ์šฐ๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค ๊ทธ ์ค‘์—์„œ๋„ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ฒŒ๋” ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด priority ๋‹ค.

 

(2) CPU ์ˆ˜ํ–‰ ๊ด€๋ จ ํ•˜๋“œ์›จ์–ด ๊ฐ’

- Program counter, registers

 

(3) ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ

- code, data, stack ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋””์— ์œ„์น˜ํ•ด์žˆ๋Š”๊ฐ€ 

 

(4) ํŒŒ์ผ ๊ด€๋ จ 

- file, resource ...

 

๋ฌธ๋งฅ ๊ตํ™˜(Context Switch)

CPU๊ฐ€ ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๋Š” ๊ณผ์ •์ด๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜๊ฒจ์ค„ ๋•Œ ์ด์ „ ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ ์ €์žฅํ•˜๊ณ , ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ ์ฝ์–ด์˜ค๋ฉฐ ์‹คํ–‰ํ•œ๋‹ค.

 

์‹œ์Šคํ…œ์ฝœ์ด๋‚˜ Interrupt ๋ฐœ์ƒ ์‹œ์— ๋ฌด์กฐ๊ฑด context switch ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฌธ๋งฅ ๊ตํ™˜์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ƒ๋‹นํžˆ ํฐ ์ž‘์—…์ด๋‹ค. ๋”ฐ๋ผ์„œ (1)๋ฒˆ๊ฐ™์€ ๊ฒฝ์šฐ mode ๋งŒ ๋ฐ”๊พธ๊ณ , (2)๋ฒˆ๊ฐ™์ด ํ”„๋กœ์„ธ์Šค A์—์„œ B๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ์— ๋ฌธ๋งฅ๊ตํ™˜์ด ์ผ์–ด๋‚œ๋‹ค.

 

์Šค์ผ€์ค„๋Ÿฌ(Scheduler)

Short-term scheduler(=CPU scheduler)

์•„์ฃผ ์งง์€ ์‹œ๊ฐ„(millisecond ๋‹จ์œ„)์— ์ด๋ฃจ์–ด์ ธ์•ผํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ. ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ CPU ์—๊ฒŒ ์ค„์ง€, ์ฆ‰ running ์ƒํƒœ๋กœ ๋งŒ๋“ค์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

 

Long-term scheduler(=job scheduler)

์‹คํ–‰๋œ ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘ ์–ด๋–ค ๊ฒƒ์„ momory๋ฅผ ์ค„์ง€, ์ฆ‰ Ready queue๋กœ ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ. Multiprogramming ์„ ์ œ์–ดํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ๋„ˆ๋ฌด ๋งŽ์€ ํ˜น์€ ๋„ˆ๋ฌด ์ ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜ฌ๋ ค๋‘๋ฉด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํ•˜๊ฒŒ ์กฐ์ ˆํ•ด์•ผ ํ•œ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ ์‹œ์Šคํ…œ, time sharing system ์—์„œ๋Š” ์žฅ๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์—†๊ณ  ์‹œ์ž‘๋˜๋ฉด ๋ฌด์กฐ๊ฑด ready ์ƒํƒœ๋กœ ์˜ฌ๋ ค์ง„๋‹ค.(๋ฌด์กฐ๊ฑด ์‹œ์ž‘๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋จ)

 

Medium-Term Scheduler(=Swapper)

๋ฉ”๋ชจ๋ฆฌ์— ๋„ˆ๋ฌด ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ฌ๋ผ๊ฐ€ ์žˆ์œผ๋ฉด ์—ฌ์œ  ๊ณต๊ฐ„ ๋งˆ๋ จ์„ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ต์งธ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋””์Šคํฌ๋กœ ์ซ“์•„๋‚ธ๋‹ค. ์ด๊ฒƒ์„ Swapper ๋ผ๊ณ  ํ•œ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ ์‹œ์Šคํ…œ์€ ์žฅ๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋‘์ง€ ์•Š๊ณ  ์ผ๋‹จ ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ ํ›„์— Swapper ๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ์ซ“์•„๋‚ผ์ง€ ์ •ํ•œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Multiprogramming ์„ ์ œ์–ดํ•œ๋‹ค.

 

์ด ์ค‘๊ธฐ ์Šค์ผ€์ค„๋Ÿฌ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๊ฐ€ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€๋œ ๊ฒƒ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ Suspended(=stopped) ์ƒํƒœ๋‹ค. ์™ธ๋ถ€์ ์ธ ์ด์œ ๋กœ ํ”„๋กœ์„ธ์Šค ์ˆ˜ํ–‰์ด ์ •์ง€๋ผ์„œ(ํ”„๋กœ์„ธ์Šค๋ฅผ ์ผ์‹œ ์ค‘์ง€ ์‹œํ‚ค๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ์— ๋„ˆ๋ฌด ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๊ฑฐ๋‚˜ ๋“ฑ) ํ†ต์งธ๋กœ ๋””์Šคํฌ์— swap out ๋œ ์ƒํƒœ๋‹ค. Blocked ๋Š” ์š”์ฒญํ•œ event ๊ฐ€ ๋งŒ์กฑ๋˜๋ฉด Ready ์ƒํƒœ๊ฐ€ ๋˜์ง€๋งŒ, suspended ๋Š” ์™ธ๋ถ€์—์„œ resume ํ•ด์ค˜์•ผ ๋‹ค์‹œ Active ๋œ๋‹ค.

 

์œ„์˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด์„œ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋„๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

Thread (=lighweight process)

ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์— CPU ์ˆ˜ํ–‰ ๋‹จ์œ„๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋Š” ๊ฒƒ. Adress Space๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ทธ ๋‚ด๋ถ€์—์„œ CPU ์ˆ˜ํ–‰ ๋‹จ์œ„๋งŒ ์ชผ๊ฐ ๋‹ค. ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ(code, data, os resources ๋“ฑ๋“ฑ)์„ ์ตœ๋Œ€ํ•œ ๊ณต์œ ํ•จ. ๋ณ„๋„๋กœ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” program counter, registers, stack ๋งŒ์„ ์Šค๋ ˆ๋“œ๋“ค์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ€์ง.

ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์ด๋ฏ€๋กœ PCB๋Š” 1๊ฐœ๋งŒ ์ƒ์„ฑ๋œ๋‹ค. ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„๋งŒ ๋ณ„๋„๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

์Šค๋ ˆ๋“œ์˜ ์žฅ์ 

Responsiveness

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ์•ˆ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋‘๊ฒŒ ๋˜๋ฉด ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ blocked  ์ƒํƒœ์—์„œ๋„ ๋™์ผํ•œ ํƒœ์Šคํฌ ๋‚ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ running ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํ‚น ์Šค๋ ˆ๋“œ๋Š” ์„œ๋ฒ„์™€ ์ž…์ถœ๋ ฅ์„ ํ•˜๊ณ , ๊ทธ๋™์•ˆ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ UI๋ฅผ ๋ฏธ๋ฆฌ ๊ทธ๋ ค๋†“๋Š” ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋งŒ ์‹คํ–‰๋˜๋‹ˆ ๋„คํŠธ์›Œํ‚น์„ ํ•˜๋Š” ๋™์•ˆ blocked ์ƒํƒœ๊ฐ€ ๋˜๋‹ˆ ๋‹ค๋ฅธ ์ผ์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค. (์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ž‘์—…)

 

Resource Sharing

๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋„์›Œ๋†“๋Š” ๊ฒฝ์šฐ, code/data/os resources ๋ฅผ ๋” ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ณต์œ ํ•˜๋ฏ€๋กœ ์ž์›์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Economy

Process ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๊ฑด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ๋‚ด์— Thread ํ•˜๋‚˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ์ง€ ์•Š๋‹ค. ๋˜ Process Context Switching ์€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ์ง€๋งŒ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ Thread Context Switching ์€ ๋Œ€๋ถ€๋ถ„์ด ๋™์ผํ•˜๋ฏ€๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ์ง€ ์•Š๋‹ค. ์ฆ‰, ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ์ž‘์—… ๊ฐ™์€ ๊ฒฝ์šฐ Thread ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  CPU Switching ์„ ํ•˜๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

Utillzation of MP(Multi Processor) Architectures

ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜์ง€๋งŒ CPU๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ ์„œ๋กœ ๋‹ค๋ฅธ CPU ๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ผ์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ๊ณผ ์ข…๋ฃŒ

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

๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ˜•์„ฑ๋จ. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ž์›์€ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋ฐ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋ธ๋„ ์žˆ๊ณ  ์•„๋‹Œ ๋ชจ๋ธ๋„ ์žˆ๋‹ค. ๋˜ ๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ณต์กดํ•˜๋ฉฐ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋ธ๋„ ์žˆ๊ณ  ํ˜น์€ ์ž์‹์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ชจ๋ธ๋„ ์žˆ๋‹ค.

 

์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•˜๊ณ  ๋ณต์‚ฌํ•œ ๊ณต๊ฐ„์— ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์˜ฌ๋ฆฐ๋‹ค. ์œ ๋‹‰์Šค์—์„œ๋Š” fork() ๋ผ๋Š” ์‹œ์Šคํ…œ ์ฝœ๋กœ ๋ณต์‚ฌ๋ฅผ ํ•˜๊ณ  exec() ๋ผ๋Š” ์‹œ์Šคํ…œ์ฝœ๋กœ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ๋ฎ์–ด ์”Œ์šด๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋• ์šด์˜์ฒด์ œ์—๊ฒŒ ์š”์ฒญํ•ด์„œ ์ƒ์„ฑํ•จ.

 

ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ์—๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ exit call ์„ ๋ณด๋‚ด ์ข…๋ฃŒ์‹œํ‚จ๋‹ค. ์ค‘๊ด„ํ˜ธ๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ return 0์„ ํ•˜๊ฑฐ๋‚˜ ๋“ฑ ์ž์‹์ด ๋ถ€๋ชจ์—๊ฒŒ output data ๋ฅผ ๋ณด๋‚ด๋ฉด(wait) ๊ฐ์ข… ์ž์›๋“ค์ด ์šด์˜์ฒด์ œ์—๊ฒŒ ๋ฐ˜๋‚ฉ๋œ๋‹ค. ์ด๊ฑด ์ž์‹์ด ์ž์‹ ์˜ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น ์ž์›์˜ ํ•œ๊ณ„์น˜๊ฐ€ ๋„˜์–ด์„œ๊ฑฐ๋‚˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋”์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ํ˜น์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ(exit) ๋˜๋Š” ๊ฒฝ์šฐ ๋‹จ๊ณ„์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค(abort)

 

ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๋ จ๋œ ์‹œ์Šคํ…œ ์ฝœ

fork()

์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ fork() ํ˜ธ์ถœ๋œ ์‹œ์ ์—์„œ ๋ฌธ๋งฅ์ด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋˜๊ณ , ๋ฌธ๋งฅ์ด ๋ณต์‚ฌ๋œ ๊ฒƒ์ด๋ฏ€๋กœ ์‹คํ–‰ ์‹œ์ (PC)๋„ ๋ณต์‚ฌ๋์œผ๋‹ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ fork() ๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„์˜ ์‹œ์ ์—์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์ฆ‰ fork() ์œ—๋ถ€๋ถ„์˜ printf ๋ถ€๋ถ„์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.  fork() ์˜ return value ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋ถ€๋ชจ/์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

exec()

execlp ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๊ทธ ์‹œ์ ์—์„œ ๋‹ค๋ฅธ ๋‚ด์šฉ์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง€๊ณ , ๊ทธ ๋‚ด์šฉ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ๋Œ์•„์˜ค์ง€ ์•Š๋Š”๋‹ค. exec() ์€ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ์—์„œ๋งŒ ์“ฐ์ง€๋Š” ์•Š๋Š”๋‹ค.

 

wait()

wait() ์‹œ์Šคํ…œ ์ฝœ์ด ํ˜ธ์ถœ๋˜๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ blocked ์ƒํƒœ๋กœ sleep ์‹œํ‚จ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊นจ์–ด๋‚˜๊ณ  ready ์ƒํƒœ๋กœ ๋ฐ”๋€๋‹ค. ์ž์‹์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” wait ๋ชจ๋ธ์— ํ•ด๋‹น๋œ๋‹ค.

 

exit()

ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ฌ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ exit() ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ main ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๋˜๋Š” ์œ„์น˜์— ๋„ฃ์–ด์ค€๋‹ค. ๋ณดํ†ต์€ ์ž๋ฐœ์ ์œผ๋กœ ์ข…๋ฃŒํ• ๋•Œ ์“ฐ์ด๋Š”๋ฐ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋•Œ๋ฌธ์— ์ž์‹์„ ์ฃฝ์ด๋Š” ๋“ฑ์˜ ์™ธ๋ถ€์—์„œ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๋น„์ž๋ฐœ์  ์ข…๋ฃŒ์—๋„ ์“ฐ์ธ๋‹ค.

 

ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ˜‘๋ ฅ

์›์น™์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹์ด๋“  ๋ถ€๋ชจ๋“  ๊ด€๊ณ„ ์ƒ๊ด€ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋„ ์ „๋ถ€ ๋…๋ฆฝ์ ์ด๋ผ CPU ๋ฅผ ๊ฒฝ์Ÿ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ํ˜‘๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ด๊ฒƒ์„ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ˜‘๋ ฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜(IPC, Interprocess Communication) ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ์Šค๋ ˆ๋“œ๋Š” ์ฃผ์†Œ๊ณต๊ฐ„์„ ์™„์ „ํžˆ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ ๊ฐ„์—๋Š” ์™„์ „ํ•œ ํ˜‘๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

message passing

ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ์ผ์ฒด ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ปค๋„์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•จ. 

 

shared memory

code ๋‚˜ stack ์„ ๊ฐ์ž ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ ์ผ๋ถ€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๊ณต์œ ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋…ผ๋ฆฌ์ ์ธ Address space ๋Š” ๋”ฐ๋กœ ๋งŒ๋“ค๋˜ ์ผ๋ถ€ ๊ณต๊ฐ„์„ Memory ์ƒ์—์„œ ๊ฒน์ณ์„œ ํ• ๋‹น๋ฐ›๋Š” ๊ฒƒ.

๋ฐ˜์‘ํ˜•