๐Ÿ“š ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ง๊ณ ์‚ฌ ์ •๋ฆฌ

๐Ÿ“š ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ง๊ณ ์‚ฌ ์ •๋ฆฌ

๊ธฐ๋ง๊ณ ์‚ฌ๋Œ€๋น„

9

์ปดํ“จํ„ฐ์˜๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‹คํ–‰ํ•จ. jump, branch, call, return ๋“ฑ์˜ ์ œ์–ด ํ๋ฆ„์˜ ๋ณ€๊ฒฝ์ด ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ instruction์— ์ •์˜๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ์ ์ธ ํ๋ฆ„์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ๊ฑธ ์ฒ˜๋ฆฌํ•ด์ค„ ๋งค์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค.

ํ•˜์œ„ : ์˜ˆ์™ธ โ†’ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋ฐ˜์‘. ์ œ์–ด์˜ ํ๋ฆ„ ๋ณ€๊ฒฝ. HW, OS SW ํ•จ๊ป˜ ์‚ฌ์šฉ

์ƒ์œ„ : ๋ฌธ๋งฅ์ „ํ™˜ โ†’ OS SW, HWํƒ€์ด๋จธ๋กœ ๊ตฌํ˜„?

์ƒ์œ„ : ์‹œ๊ทธ๋„ โ†’ OS SW๋กœ ๊ตฌํ˜„

์ƒ์œ„ : nonlocal ์ ํ”„ โ†’ ํ• ์ผ ์—†์„๊ฑฐ๋ผ๊ณ  ํ–ˆ์—ˆ์Œ.

์˜ˆ์™ธ์ƒํ™ฉ

ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ์—๋Œ€ํ•œ ๋ฐ˜์‘์œผ๋กœ ์ œ์–ด๊ฐ€ OS์ปค๋„๋กœ ์˜ฎ๊ฒจ๊ฐ. ์œ ์ €ํ”„๋กœ๊ทธ๋žจ์€ ์ œ์–ด๊ถŒ์„ ์žƒ๊ฒŒ๋œ๋‹ค. ( divide by zero, arithmetic overflow, page fault, ctrl + c, ๋“ฑ)

์ปค๋„์€ OS์— ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ ์žˆ๋Š” ์ฝ”๋“œ๋ผ๊ณ  ๋ณด๋ฉด๋จ. ์œ ์ €๊ฐ€ ์ง  ์ฝ”๋“œ์—์„œ OS์— ๋ฏธ๋ฆฌ ์งœ์—ฌ์ง„ ์–ด๋–ค ์ฝ”๋“œ๋กœ ์ œ์–ด๊ฐ€ ๋„˜์–ด๊ฐ„๋‹ค.

์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ์›๋ž˜์œ„์น˜๋กœ ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ ์›๋ž˜์œ„์น˜์˜ ๋‹ค์Œ์œผ๋กœ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋จ.

์˜ˆ์™ธํ…Œ์ด๋ธ”

๊ฐ ์ด๋ฒคํŠธ์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ๋ฒˆํ˜ธ๋กœ ๋งŒ๋“ค์–ด์ง„ ์˜ˆ์™ธํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค. ์˜ˆ์™ธ๋ฒˆํ˜ธ k๊ฐ€ exception table์˜ index๊ฐ€ ๋จ. ์ฆ‰ k๋ฒˆ์งธ ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ์˜ˆ์™ธ ํ…Œ์ด๋ธ”์˜ k ๋ฒˆ์งธ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”๊ฑฐ. ์ด๊ฑธ ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ๋ผ๊ณ  ๋ถ€๋ฆ„.

๋น„๋™๊ธฐํ˜• ์˜ˆ์™ธ : ASYNCHRONOUS EXCEPTION : INTERRUPT โ†’ ์™ธ๋ถ€์‚ฌ๊ฑด์œผ๋กœ๋ถ€ํ„ฐ ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒ, ํ•ธ๋“ค๋Ÿฌ์‹คํ–‰ ํ›„ ๋‹ค์Œ ์ˆ˜ํ–‰ํ•ด์•ผํ–ˆ์„ ๋ช…๋ น์–ด๋กœ ๋ณต๊ท€ํ•œ๋‹ค. ์ฒ˜๋ฆฌํ›„์— ํ˜„์žฌ, ๋‹ค์Œ, ์ข…๋ฃŒ 3๊ฐ€์ง€์˜ต์…˜

์ž…์ถœ๋ ฅ ์ธํ„ฐ๋ŸฝํŠธ : ctrl + c, z, ๋„คํŠธ์›ŒํฌํŒจํ‚ท์ž…๋ ฅ, ๋””์Šคํฌ์„นํ„ฐ์ฝ๊ธฐ

ํ•˜๋“œ๋ฆฌ์…‹, ์†Œํ”„ํŠธ๋ฆฌ์…‹(ctrl+alt+delete) ์ธํ„ฐ๋ŸฝํŠธ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃฌ๊ฑด ์ธํ„ฐ๋ŸฝํŠธ?/turn call

๋™๊ธฐํ˜• ์˜ˆ์™ธ : traps, faults, aborts SYNCHRONOUS EXCEPTION

traps : ์˜๋„์ ์ธ ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒ : systelcall, breakpoint, special instruction ์ฒ˜๋ฆฌ ํ›„ ๋‹ค์Œ์œผ๋กœ ๊ฐ„๋‹ค

faults : ์ •์ •ํ•  ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๋กœ ๋ฐœ์ƒ : page fault, protection fault, floating point exception. fault์ผ์œผํ‚จ๋†ˆ ๋‹ค์‹œ์‹คํ–‰(ํ˜„์žฌ๋กœ ๋Œ์•„๊ฐ)ํ•˜๊ฑฐ๋‚˜ ๋ณต๊ตฌ๋ถˆ๊ฐ€์ด๋ฉด abort

page fault : ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•˜๋“œ๋””์Šค์— ์œ„์น˜ํ•ด์„œ ์ ‘๊ทผ์ด ์•ˆ๋ ๋•Œ ๋ฐœ์ƒํ•จ. page handler๊ฐ€ ํ•˜๋“œ๋””์Šคํฌ์—์žˆ๋Š” page๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ์ด ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜. ์ด๊ฑฐ๋Š” ์ •์ •์ด ๊ฐ€๋Šฅํ•จ ๋”ฐ๋ผ์„œ ๋‹ค์‹œ ์‹œ๋„ํ•œ๋‹ค.

aborts : ๋ณต๊ตฌ ๋ถˆ๊ฐ€ ์—๋Ÿฌ. ํ•˜๋“œ์›จ์–ด ์˜ค๋ฅ˜๊ฐ™์€๊ฑฐ. ํŒจ๋ฆฌํ‹ฐ์—๋Ÿฌ, ์‹œ์Šคํ…œ์ฒดํฌ์—๋Ÿฌ ๋“ฑ. ๋ณต๊ท€๋ถˆ๊ฐ€๋Šฅ์ด๋‹ˆ๊นŒ ์ข…๋ฃŒํ•˜๋Š”์ˆ˜๋ฐ–์—..

์‹œ์Šคํ…œ ์ฝœ

์•„์ฃผ ์•„๋žซ๋‹จ์—์„œ ์ด๋ค„์ ธ์•ผ ํ•˜๋Š”์ผ๋“ค์„ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜? syscall instruction์€ syscall ๋ฒˆํ˜ธ๋ฅผ %rax์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ ์™ธ์— ๋‹ค๋ฅธ ์ธ์ž๋“ค์€ rdi, rsi, rdx, r10, r8, r9๋ฅผ ์‚ฌ์šฉํ•จ ๋ฆฌํ„ด๋„ rax์— ๋˜๋‹ˆ๊นŒ ๋‹ค๋ฅธ call์ด๋ž‘ ๋‹ค๋ฅธ๊ฑด syscall ๋ฒˆํ˜ธ๊ฐ€ rax์— ๋“ค์–ด๊ฐ„๋‹ค๋Š”๊ฑฐ.

ํ”„๋กœ์„ธ์Šค

๋…ผ๋ฆฌ์ ์ธ ์ œ์–ด์˜ ํ๋ฆ„. CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋…์ ํ•˜๋Š”๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚˜๋ˆ ๊ฐ€์ ธ๊ฐ„๋‹ค. โ†’ ์ปดํ“จํ„ฐ๋Š” ์กด1๋‚˜๊ฒŒ ๋น ๋ฅด๋‹ค. ์„œ๋กœ ๊ต๋Œ€๋กœ ์‹คํ–‰๋จ. ์ฃผ์†Œ๊ณต๊ฐ„์€ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ด€๋ฆฌ?์ด๊ฑด๋ฌด์Šจ์†Œ๋ฆฌ๋ƒ

์•ž์„œ๋งํ–ˆ๋˜ ๋ฌธ๋งฅ์ „ํ™˜์ด ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋Š”๊ฒƒ. CPU์™€ ๋ฉ”๋ชจ๋ฆฌ์ฒ˜๋Ÿผ ์ž์›์„ ๋…ธ๋‚˜์“ด๋‹ค. ์Šค์œ„์น˜ํ• ๋•Œ ๋ ˆ์ง€์Šคํ„ฐ์— ์žˆ๋˜๊ฑธ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด์„œ ๋น„์›Œ๋‘๋Š”๊ฑฐ์ž„. ์™œ๋ƒ๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด์™€์„œ ๋˜‘๊ฐ™์€ ๊ณต๊ฐ„์„ ์จ์•ผํ•˜๋‹ˆ๊นŒ? ํ˜„๋Œ€์—์„œ๋Š” ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ๊ธฐ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ CPU๊ฐ€ ๋Œ์•„๊ฐ€์ž–์•„? ๊ทธ๋ž˜์„œ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ณต์œ ํ•˜๊ณ  CPU์— ๊ฐ๊ธฐ ๋ ˆ์ง€์Šคํ„ฐ๋ž‘ ์ฒ˜๋ฆฌํ•˜๋Š” ํšŒ๋กœ๊ฐ€ ๋”ฐ๋กœ์žˆ์œผ๋‹ˆ๊นŒ ใ…‡ใ…‡ ๊ทธ๋ ‡๊ฒŒ๋Œ์•„๊ฐ.

๋™์‹œ์„ฑ ํ”„๋กœ์„ธ์Šค (concurrent)

๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์•ž์„œ๋งํ–ˆ๋“ฏ ๋Š์–ด์ง€๋ฉด์„œ ์‹คํ–‰๋จ(๊ทธ๋ ‡๊ฒŒ ์•ˆ๋ณด์ด์ง€๋งŒ) ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋“œ๋ฌธ๋“œ๋ฌธ ์‹คํ–‰๋˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์„œ๋กœ ์ค‘์ฒฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค(concurrent)๊ณ  ํ•œ๋‹ค.

The difference between concurrent and parallel processing

parallel์€ ๋ฉ€ํ‹ฐ์ฝ”์–ด์ธ ๊ฒฝ์šฐ๋ฅผ ๋งํ•˜๋Š”๊ฑฐ. concurrentํ•˜๊ฒŒ parallel๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ง€

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ overwrap๋˜์–ด์•ผํ•จ. 21ํŽ˜์ด์ง€์— B๋ž‘ C๊ฐ€ concurrent๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” B๊ฐ€ ๋๋‚œ ์ดํ›„์— C๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š์•„์„œ์•ผ!!!!

์—ฐ์Šต๋ฌธ์ œ 1 A 0~2, B 1~4, C 3~5์ด๋ฏ€๋กœ A์™€ B, A์™€ C, B์™€ C๊ฐ€ overwrap๋œ๋‹ค. concurrent ํ•˜๋‹ค.

์œ„ ์Šฌ๋ผ์ด๋“œ์—์„œ๋Š” ๋š๋š ๋Š์–ด์ง€๋Š”๊ฑฐ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ด๋†จ์ง€๋งŒ ์‹ค์ œ๋กœ ์ด๊ฑด ์กด๋‚˜๋น ๋ฅด๊ฒŒ ๋ฌธ๋งฅ์ „ํ™˜์ด ์ด๋ค„์ง€๊ธฐ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ๋Š” ๊ทธ๋ƒฅ ์„œ๋กœ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ. ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น, ํƒ€์ž„์Šฌ๋ผ์ด์‹ฑ

๋ฌธ๋งฅ์ „ํ™˜ (context switch)

ํ”„๋กœ์„ธ์Šค๋Š” ์šด์˜์ฒด์ œ์˜ ์ปค๋„์ด ๊ด€๋ฆฌํ•จ ์•„๊นŒ ์•ž์—์„œ ์‚ฌ์šฉ์ž์—์„œ ์ปค๋„๋กœ ์ œ์–ด๊ฐ€ ์˜ฎ๊ฒจ๊ฐ„๋‹ค๊ณ  ํ•œ๊ฑฐ๋ž‘ ๊ฐ™์€๋“ฏ. ์ปค๋„์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค??? ์œ ์ €ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ์‹คํ–‰

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐ€๋Š”๊ฒŒ ๋ฌธ๋งฅ์ „ํ™˜

ํ•˜๋‚˜์˜ ์œ ์ €ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹ค๋ฅธ ์œ ์ €ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ์šด์˜์ฒด์ œ์˜ ์ปค๋„์ด ์‚ฌ์šฉ๋˜๋Š”๊ฒƒ???? ์ฆ‰ ์œ ์ €ํ”„๋กœ์„ธ์Šค(์œ ์ €์ฝ”๋“œ)-๋ฌธ๋งฅ์ „ํ™˜(์ปค๋„์ฝ”๋“œ)โ†’์œ ์ €ํ”„๋กœ์„ธ์Šค(์œ ์ €์ฝ”๋“œ) ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๋“ฏ.

ํ”„๋กœ์„ธ์Šค ์ œ์–ด

pid_t getpid() : ํ•จ์ˆ˜ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค์˜ pid ๋ฐ˜ํ™˜

pid_t getppid() : ํ•จ์ˆ˜ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ pid๋ฅผ ๋ฐ˜ํ™˜

int fork() : ๋ถ€๋ชจ์™€ ๋™์ผํ•œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ฌ. ์ž์‹๊ณผ ๋ถ€๋ชจ๊ฐ€ ๋ถ„๊ธฐํ–ˆ์œผ๋ฏ€๋กœ ๋ถ€๋ชจ์˜๊ฒฝ์šฐ์™€ ์ž์‹์˜๊ฒฝ์šฐ๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์ด ๋‹ค๋ฅธ๋ฐ, ๋ถ€๋ชจ์˜ ๊ฒฝ์šฐ๋Š” ์ž์‹์˜ pid๋ฅผ ๋ฆฌํ„ด๋ฐ›๊ณ , ์ž์‹์˜๊ฒฝ์šฐ๋Š” 0์„ ๋ฆฌํ„ด๋ฐ›๋Š”๋‹ค. 0์„ ๋ฐ›์œผ๋ฉด ๋๋‹จ์ด๊ณ  0์ด์•„๋‹ˆ๋ฉด ๊ทธ๊ฒŒ ์ž์‹ pid๋ผ๊ณ ๋ณด๋ฉด๋ ๋“ฏ.

    void fork1(){
    	int x = 1;
    	pid_t pid = fork();        //fork๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ ์ž์‹ ๋ถ„๊ธฐ!
    	if(pid == 0){              //๋ถ„๊ธฐํ–ˆ์œผ๋ฏ€๋กœ ํ๋ฆ„์€ ๋‘๊ฐ€์ง€์ธ๋ฐ, 0์ธ๊ฒฝ์šฐ๋Š” ์ž์‹์ธ๊ฒฝ์šฐ
    		printf("child has x = %d\n", ++x);    //์ž์‹์˜ x ๋Š” 1 ๋”ํ•ด์ ธ์„œ ์ถœ๋ ฅ์ด๋ฏ€๋กœ 2 ์ถœ๋ ฅ
    	}
    	else{
    		printf("parend has x = %d\n", --x)    //๋ถ€๋ชจ์˜ x ๋Š” 1 ๋นผ์ ธ์„œ ์ถœ๋ ฅ๋˜๋ฏ€๋กœ 0 ์ถœ๋ ฅ
    	}
    	printf("bye from process %d with x = %d\n", getpid(), x);    //๋ถ€๋ชจ์™€ ์ž์‹ ๋ชจ๋‘ ๋๋‚ ๋• ์ด๊ฑธ ๋งŒ๋‚˜๊ธฐ๋•Œ๋ฌธ์— ๋ถ€๋ชจ์™€ ์ž์‹ pid์™€ x๊ฐ’์ด ๊ฐ๊ฐ ํ•œ์ค„์”ฉ ๋‘์ค„ ์ถœ๋ ฅ๋ ๊ฒƒ
    }

child has x = 2 parent has x = 0 bye from process โ€œparent pidโ€ with x = 0 bye from process โ€œchild pidโ€ with x = 2

    void fork2(){
    	printf("L0\n");
    	fork();
    	printf("L1\n");
    	fork();
    	printf("Bye\n");
    }

fork๋ฅผ ํ–ˆ์ง€๋งŒ ๋ฐ˜ํ™˜์„ ์•ˆ๋ฐ›์€๊ฒƒ ๋ฟ, ๋™์ผํ•˜๋‹ค.

images
    void fork3(){
    	printf("L0\n");
    	fork();
    	printf("L1\n");
    	fork();
    	printf("L2\n");
    	fork();
    	printf("Bye\n");
    }

์‹œ์ ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์ถฐ์งˆ์ˆ˜๋Š” ์—†๋Š”๋“ฏ.

images
    void cleanup(void){
    	printf("cleaning up\n");
    }
    
    void fork6(){
    	atexit(cleanup);        //atexitํ•จ์ˆ˜๋กœ exit์‹œ์— ์‹คํ–‰ํ•  ํ•จ์ˆ˜ ๋“ฑ๋ก
    	fork();
    	exit(0);
    }

fork๋กœ ๋ถ„๊ธฐํ–ˆ์œผ๋‹ˆ๊นŒ 2๊ฐœ์˜ ํ๋ฆ„์ด์žˆ๊ณ  ๊ฒฐ๊ตญ์—” exitํ•˜๋‹ˆ๊นŒ cleanup์ด ๋‘๋ฒˆ ๋ถˆ๋ฆด๊ฑฐ๊ฐ™์€๋ฐ?

images

์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค!

    //์—ฐ์Šต๋ฌธ์ œ2
    
    int main(){
    	int x = 1;
    	if(fork() == 0)
    		printf("printf1 : x = %d\n", ++x);
    	printf("printf2 : x = %d\n", --x);
    	exit(0);
    }

์ž์‹์€ ๋‘์ค„์ถœ๋ ฅ ๋ถ€๋ชจ๋Š” ํ•œ์ค„์ถœ๋ ฅ์œผ๋กœ printf1 : x = 2 printf2 : x = 1 printf2 : x = 0

images
images

์‹ค์งˆ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ๋Š”๋ฐ ๋ถ€๋ชจ์—์„œ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋œ๊ฒŒ ์ข€๋น„ ๊ฒฐ๊ตญ ์‹ค์งˆ์ ์ธ ์ •๋ฆฌ๋Š” ๋ถ€๋ชจ๊ฐ€ ๋‹ค ํ•ด์ค˜์•ผํ•จ. ์ •๋ฆฌ์•ˆํ•˜๋ฉด init process๊ฐ€ ์ •๋ฆฌํ•ด์ฃผ๊ธด ํ•˜๋Š”๋ฐ, ์žฅ๊ธฐ๊ฐ„ ๋™์ž‘ํ•˜๋ฉด ์ข€๋น„ ์ปจํŠธ๋กค์„ ์ž˜ํ•ด์ค˜์•ผํ•จ. ์„œ๋ฒ„๊ฐ™์€๊ฒƒ๋“ค์€ ์ด๋Ÿฐ๊ฑฐ์— ์ทจ์•ฝํ•˜๊ฒ ์ฃ ?

    void fork7(){
    	if(fork() == 0){
    		printf("terminating child pid = %d\n", getpid());
    		exit(0);
    	}
    	else{
    		printf("running parent pid = %d\n". getpid());
    		while(1)
    	}
    }
images

์•ˆ๋๋‚œ๋‹ค. while loop์ด ๋ฌดํ•œ loop๋ผ ๋๋‚˜์ง€ ์•Š๋Š”๊ฑด ์ดํ•ด๊ฐ€๋˜๋Š”๋ฐ, ๊ทธ๋ƒฅ ๋ถ€๋ชจ๊ฐ€ ์•ˆ๋๋‚˜๋‹ˆ๊นŒ ์•ˆ์ฃฝ๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€..? โ† ใ…‡ใ…‡ ์•„๋‹Œ๋“ฏ ๋ณด๋‹ˆ๊นŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ด์•„์žˆ์Œ parent๋Š” loop์— ๋น ์ ธ ์ž์‹์„ ์ •๋ฆฌ๋ฅผ ์•ˆํ•ด์ค˜์„œ๊ทธ๋Ÿฐ๊ฑด๊ฐ€?

๋ถ€๋ชจ๊ฐ€ ์ •์ƒ์ข…๋ฃŒ๊ฐ€ ์•ˆ๋˜์–ด์„œ ์ž์‹์€ ์ข…๋ฃŒ๋˜์—ˆ๋Š”๋ฐ๋„ ๋‚จ์•„์žˆ๋Š”๊ฑฐ ๊ทธ๋ž˜์„œ defunct. ๋ถ€๋ชจ์ฃฝ์ด๋ฉด ๊ฐ™์ด์ฃฝ์Œ

    void fork8(){
    	if(fork() == 0){
    		printf("running child pid = %d\n", getpid());
    		while(1);
    	}
    	else{
    		printf("terminating parent pid = %d\n", getpid());
    		exit(0);
    	}
    }

์ž์‹์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ์ข€๋น„ ํ”„๋กœ์„ธ์Šค ๋ถ€๋ชจ๋Š” ์ฃฝ์—ˆ๋Š”๋ฐ ์ž์‹์€ ๊ณ„์†๋Œ์•„๊ฐ€๊ณ ์žˆ๋”ฐ. pid๋กœ ํ™•์ธ๊ฐ€๋Šฅ

images

10

์ข…๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค(์ž์›์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•œ ํ”„๋กœ์„ธ์Šค)๋ผ๊ณ ํ•ด๋„ ๋ถ€๋ชจ๊ฐ€ ์ œ๊ฑฐํ•ด์ค„๋•Œ๊นŒ์ง€ ์ข…๋ฃŒ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค(์ž์›์€ ๋ฐ˜ํ™˜ํ–ˆ์–ด๋„ PID๋Š” ์ ์œ ํ•˜๋Š” ์ƒํƒœ) ๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ์ฒญ์†Œ ์•ˆํ•˜๋ฉด init์œผ๋กœ ์ฒญ์†Œํ•ด์•ผํ•จ. ๊ทธ๋Ÿฌ๋‹ค ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ข…๋ฃŒ๋œ ์ž์‹๋“ค์€ ์ปค๋„์ด ์•Œ์•„์„œ init์œผ๋กœ ์ฒญ์†Œํ•ด์ค€๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๋ฉด waitํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค.

int wait(int *child_status) : ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ์ž์‹ ์ค‘ ํ•˜๋‚˜ ์ข…๋ฃŒ์‹œ๊นŒ์ง€ ๋Œ€๊ธฐ. ๋ฐ˜ํ™˜๊ฐ’์€ ์ข…๋ฃŒ๋œ ์ž์‹์˜ pid, child_status์— ์ข…๋ฃŒ์‹œํ‚จ ์‹œ๊ทธ๋„ ์ €์žฅ, ์ปค๋„์ด pid์ œ๊ฑฐ ํ•ด์คŒ โ†’ ๋ช…์‹œ์ ์ธ ์‚ญ์ œ

    void fork9(){
    	int child_status;
    	if(fork() == 0){
    		printf("HC : hello from child\n");
    	}
    	else{
    		printf("HP : hello from parent\n");
    		wait(&child_status);
    		printf("CT : child has terminated\n");
    	}
    	printf("bye\n");
    	exit();
    }

์ž์‹ ๋ถ€๋ชจ ๋ถ„๊ธฐํ•ด์„œ HC๋ž‘ HP์ค‘ ๋ญ ํ•˜๋‚˜ ๋จผ์ €์‹คํ–‰๋˜๊ณ  HCโ†’HP or HPโ†’HC HC์ข…๋ฃŒ bye ๊ทธ๋‹ค์Œ CTโ†’bye๋ ๋“ฏ

images

์ •ํ™•ํ•˜๋‹ค์ด๊ฑฐ์•ผ~~~~~

    void fork10(){
    	pit_t pid[10];
    	int i;
    	int child_status;
    	for(i = 0; i < 10; i++)
    		if((pid[i] = fork()) == 0)
    			exit(100 + i);
    	for(i = 0; i < 10; i++){
    		pid_t wpid = wait(&child_status);
    		if(WIFEXITED(child_status))
    			printf("child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status));
    		else
    			printf("child %d terminate abnormally\n", wpid);
    	}
    }

10 ๊ฐœ ๋‹ค ์ •์ƒ์ข…๋ฃŒ๋ ๊ฑฐ๊ฐ™์€๋ฐ..? WIFEXITED๊ฐ€ ์ •์ƒ์ข…๋ฃŒ๋ฅผ ํ™•์ธํ•˜๋Š”๊ฑฐ. waitํ•จ์ˆ˜๋กœ ๊ธฐ๋กํ•œ๊ฑธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •์ƒ ์ข…๋ฃŒ๋ฅผ ํ™•์ธํ•œ๋‹ค. wait์„ ํ†ตํ•ด ์ข…๋ฃŒ๋œ๊ฑฐ๋‹ˆ๊นŒ ์ •์ƒ์ข…๋ฃŒ ๋งž์ง€ exitํ•จ์ˆ˜์— ์–ด๋–ค ๊ฐ’์ด ์ธ์ž๋กœ ๋“ค์–ด์™”๋ƒ๊ฐ€ ๋˜ WEXITSTATUS๋กœ ๋ฐ˜ํ™˜๋ฐ›์•„์ง€๋„คโ€ฆ ๋ชฐ๋ž๋˜ ์‚ฌ์‹ค..!

images
    void fork11(){
    	pit_t pid[10];
    	int i;
    	int child_status;
    	for(i = 0; i < 10; i++)
    		if((pid[i] = fork()) == 0)
    			exit(100 + i);
    	for(i = 0; i < 10; i++){
    		pid_t wpid = waitpid(pid[i], &child_status, 0);
    		if(WIFEXITED(child_status))
    			printf("child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status));
    		else
    			printf("child %d terminate abnormally\n", wpid);
    	}
    }
images

ํŠน์ • pid ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ–ˆ์œผ๋ฏ€๋กœ ๋ฐฐ์—ด ์ˆœ์œผ๋กœ, ์ฆ‰ ๋ฐฐ์—ด์— ๋งŒ๋“ค์–ด์ง„ ์ž์‹ ์ˆœ์œผ๋กœ ์ œ๊ฑฐ๊ฐ€๋˜๊ฒ ์ง€. ๊ทธ๋ž˜์„œ ์œ„์—๊ฑฐ๋Š” ๊ฑ ์ง€๋“ค๋ง˜๋Œ€๋กœ ์ˆœ์„œ์—†์ด ์ œ๊ฑฐ๋์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ œ๊ฑฐ๋œ๊ฑฐ๋‹ค ์ด๋ง์ด์•ผ~

    //์—ฐ์Šต๋ฌธ์ œ 1. waitpid
    
    int main(){
    	if(fork() == 0){
    		printf("a");
    	}
    	else{
    		printf("b");
    		waitpid(-1, NULL, 0);
    	}
    	printf("c");
    	exit(0);
    }

aโ†’c(์ž์‹), bโ†’c(๋ถ€๋ชจ) ๋‘๊ฐ€์ง€ ์ค„๊ธฐ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๊ทผ๋ฐ ๋ถ€๋ชจ์—์„œ ๋ชจ๋“  ์ž์‹์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋‹ˆ๊นŒ ๋ถ€๋ชจ๊ฐ€ ๋๋‚˜๊ธฐ ์ „์—๋Š” ์ž์‹์ด ๋‹ค ๋๋‚˜์•ผํ•จ a, b, c(์ž์‹) โ†’ c(๋ถ€๋ชจ) ๊ฐ€ ๋˜์–ด์•ผ ํ• ๋“ฏ. ๋”ฐ๋ผ์„œ ๊ฐ€๋Šฅํ•œ ์ถœ๋ ฅ์€ a b c c a c b c b a c c b c a c ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€ ์™œ๋ƒ๋ฉด b๋งŒ๋‚˜์˜ค๊ณ  a๋Š” ํ•œ๋ฒˆ๋„ ์•ˆ๋‚˜์˜จ์ƒํƒœ์—์„œ a๋ฅผ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜๋Š” ์—†์œผ๋‹ˆ๊นŒ ๋งˆ์ง€๋ง‰ c ๊ฐ€ ์ž์‹์˜ c๊ฐ€ ๋˜์–ด๋ฒ„๋ฆผ ๋”ฐ๋ผ์„œ ์œ„์˜ 3๊ฐ€์ง€๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅ

images
images

์™ ์ง„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ acbc๋งŒ ๋‚˜์˜จ๋‹ค. ์•”ํŠผ ๋ญ ๋งž๋Š”๋“ฏ

    //์—ฐ์Šต๋ฌธ์ œ waitpid2
    
    void waitpidtest2(){
    	int status;
    	pid_t pid;
    	
    	printf("hello\n");
    	pid = fork();
    	printf("%d\n", !pid);
    	if(pid != 0){
    		if(waitpid(-1, &status, 0) > 0){
    			if(WIFEXITED(status) != 0)
    				printf("%d\n", WEXITSTATUS(status));
    		}
    	}
    	printf("bye\n");
    	exit(2);
    }

hello 1(์ž์‹) 0(๋ถ€๋ชจ) bye(์ž์‹ exit) 2(๋ถ€๋ชจ์—์„œ ์ž์‹ ์ข…๋ฃŒ ๋Œ€๊ธฐ ํ›„ exit status ์ถœ๋ ฅ) bye(๋ถ€๋ชจ exit)

images

์–ด์ผ€๋งž์ท„๋…ธ ์‹œใ…‚๋ จ์•„

unsigned int sleep(unsigned int secs) : secs ์ดˆ ๋งŒํผ ์ •์ง€์‹œํ‚ด. ์ •์ƒ์ข…๋ฃŒ โ†’ ๋‹ค ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋๋‚˜๋ฉด 0๋ฆฌํ„ด, ๊ทธ์™ธ์— ์ค‘๋„์ •์ง€๋ฉด ๋‚จ์€ secs๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. int pause(void) : signal์„ ๋ฐ›์„ ๋•Œ ๊นŒ์ง€ ์ณ ์ž”๋‹ค.

    //์—ฐ์Šต๋ฌธ์ œ 3 sleep
    
    unsigned int snooze(unsigned int secs){
    	unsigned int actuallSlept = sleep(secs);
    	printf("Slept for %u of %u secs.\n", secs - actuallSlept, secs);
    }

์ค‘๋‹จ์‹œ์— ์ค‘๋‹จ๋˜๋ฉด์„œ ๋ช‡์ดˆ๊นŒ์ง€ sleep ํ–ˆ๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š”๊ฒŒ ํ•ต์‹ฌ์ธ๊ฑฐ๊ฐ™์€๋ฐ, ์‰˜ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š”๊ฑด์ง€ ์ž˜์•ˆ๋จ.

images

tsh ์—์„œ ํ•ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ๋ฐ???

int execve(char *filename, char **argv[] char **envp[]) : filename์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ envp๋ฅผ ์ด์šฉํ•ด ์ธ์ž argv๋กœ ์‹คํ–‰ํ•จ. argv๋ฐฐ์—ด์ด code, data, stack์„ ๋ฎ์–ด์”Œ์šด๋‹ค. ์ด๊ฒŒ ์•„๋งˆ ๋ฌธ๋งฅ์ „ํ™˜์ธ๊ฒƒ๊ฐ™์Œ. argv๋ž‘ envp๋Š” ๋‘˜๋‹ค ๋ฌธ์ž์—ด์ด๋‹ˆ๊นŒ(?) ๋„๋ฌธ์ž๋กœ ๋๋‚˜๋Š” ํฌ์ธํ„ฐ ๋ฐฐ์—ด. ์—๋Ÿฌ๋ฐœ์ƒ์‹œ ๋ฆฌํ„ด๋จ.

์‰˜ shell

์‰˜์—์„œ ์ž…๋ ฅ์€ ๋ฃจํ”„์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ฒŒ์ž„์—”์ง„์ด๋ž‘ ๋˜‘๊ฐ™์Œ. ๋ฌดํ•œ๋ฃจํ”„ ๋Œ๋ฉด์„œ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์ด main์— ์žˆ๋‹ค. utility์™€ built-in ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ. builtin์€ ์‰˜์—์„œ ์ง€์›ํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์„ ์ด์•ผ๊ธฐํ•˜๋Š”๊ฑฐ๊ณ  ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์„ค์น˜๋œ๊ฑฐ, ์‰ฝ๊ฒŒ์ƒ๊ฐํ•˜๋ฉด ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค!!!

job : shell์—์„œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค. FG์™€ BG ๋ชจ๋‘ job์ด๊ณ  ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆŒ์ˆ˜๋„์žˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค์—์„œ foreground์ž‘์—…์— IO๊ฐ€ ์ง‘์ค‘๋˜๋Š”๋ฐ ์ด๋ฅผ ๋ฉˆ์ถ”๋Š”๊ฑด control+Z๋กœ sittstp ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๋Š”๊ฑฐ๊ณ  ์ด๋ ‡๊ฒŒ ์ •์ง€๊ฐ€๋œ๊ฑธ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ ค๋ฉด sigcont๋กœ ํ•˜๋ฉด๋œ๋‹ค๊ณ  ํ•จ. FG๋กœ ํ• ์ง€ BG๋กœ ํ• ์ง€๋„ ๊ฒฐ์ • ๊ฐ€๋Šฅ. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ๊ทธ๋ƒฅ์‹คํ–‰์‹œํ‚ค๋ฉด ํฌ์–ด๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ์•„๊ฐ. ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ๋ฆฌ๊ณ ์‹ถ์œผ๋ฉด &์„ ์ถ”๊ฐ€ํ•˜๋ฉด๋œ๋‹ค.

sleep ๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค???

eval ํ•จ์ˆ˜์—์„œ๋Š” ์ปค๋งจ๋“œ๋ฅผ ๋ฐ›์•„ ๊ทธ ์ปค๋งจ๋“œ๊ฐ€ ๋นŒํŠธ์ธ์ธ์ง€, ์™ธ๋ถ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ธ์ง€๋ฅผ ํ™•์ธํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ด ๋•Œ ์ž์‹ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ž์‹์ด ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•จ. ๋ถ€๋ชจ์—์„œ๋Š” ๋งŒ์•ฝ ์ž์‹์ด ์ˆ˜ํ–‰ํ•˜๋Š”๊ฒŒ ํฌ์–ด๊ทธ๋ผ์šด๋“œ๋ฉด ์ œ์–ด๊ถŒ์„ ์ž์‹์ด ๊ฐ€์ ธ๊ฐ”์œผ๋ฏ€๋กœ ๊ธฐ๋‹ค๋ ค์ค˜์•ผํ•˜๊ณ , ๊ทธ๊ฒŒ์•„๋‹ˆ๋ผ๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์ด๋ฏ€๋กœ ๋ถ€๋ชจ๊ฐ€ ์ œ์–ด๋ฅผ ๊ณ„์† ์œ ์ง€ํ•œ๋‹ค.

์‰˜์€ ํฌ์–ด๊ทธ๋ผ์šด๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์•Œ์•„์„œ ์ œ๊ฑฐ๋ฅผ ํ•ด์ฃผ์ง€๋งŒ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์žก์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. โ†์ข€๋น„ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚จ์•„์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๊ถ๊ทน์ ์œผ๋ก  ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ๊นŒ์ง€ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Œ. signal์„ ํ†ตํ•ด ์ œ๊ฑฐํ•ด์ค€๋‹ค.

11

์‹œ๊ทธ๋„ : ์–ด๋– ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์Šคํ…œ์— ๋ฐœ์ƒํ–ˆ์Œ์„ ์ „๋‹ฌํ•˜๋Š” ๋ฉ”์‹œ์ง€

์˜ˆ์™ธ์ƒํ™ฉ๊ณผ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ปค๋„์—์„œ ์ •์ˆ˜ ID๋กœ ์ถ”์ƒํ™”ํ•œ๊ฒƒ(1~30) ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด์ฃผ๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์ „๋‹ฌ๋˜๋Š” ์‹œ๊ทธ๋„์ •๋ณด๋Š” ์‹œ๊ทธ๋„ ID์™€ ์ „๋‹ฌ์œ ๋ฌด. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

  • divide-by-zero : SIGFPE
  • terminate ctrl+c : SIGINT
  • ์ž์‹์ด ์ข…๋ฃŒ๋จ : SIGCHLD

์‹œ๊ทธ๋„์„ ๋ฐ›์œผ๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ๊ทธ์—๋Œ€ํ•œ ๋ฐ˜์‘์„ ํ•ด์•ผํ•จ. ๋ฌด์‹œ, ์ข…๋ฃŒ, ์บ์น˜๊ฐ€์žˆ๋‹ค.

์บ์น˜ : ์œ ์ €์ˆ˜์ค€์˜ ํ•จ์ˆ˜์ธ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹œ๊ทธ๋„์— ๋Œ€์‘ํ•œ๋‹ค.

๋Œ€๊ธฐ : ์ „์†กํ–ˆ์ง€๋งŒ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์€ ์‹œ๊ทธ๋„. ๋™์ผํ•œ ์‹œ๊ทธ๋„์€ ํ•˜๋‚˜๋งŒ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ์Œ. ๋น„ํŠธ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋Œ€๊ธฐ ์‹œ๊ทธ๋„๋“ค์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.???

๋ธ”๋Ÿญ : ํŠน์ • ์‹œ๊ทธ๋„์„ ๊ฑฐ์ ˆ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ. SIGKILL์€ ๊ฑฐ์ ˆํ•  ์ˆ˜ ์—†๋‹ค. ๋ถˆ๊ฐ€ํ•ญ๋ ฅ

์ปค๋„์ด ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ์— pending, block ๋น„ํŠธ ๋ฒกํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋Œ€๊ธฐ์‹œ๊ทธ๋„๊ณผ ๋ธ”๋Ÿญ์‹œ๊ทธ๋„๋“ค์„ ํ‘œ์‹œํ•ด๋‘”๋‹ค. pending ๋ฒกํ„ฐ์˜ k๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ 1์ด๋ฉด k๋ฒˆ์งธ ์‹œ๊ทธ๋„์ด ๋Œ€๊ธฐ์ค‘์ด๋ผ๋Š” ๋œป์ž„. sigprocmask๋ฅผ ํ†ตํ•ด์„œ blockํ•ด๋ดค์ž–์•„? ๊ทธ๊ฑฐ์ฒ˜๋Ÿผ ์‹œ๊ทธ๋„ ๋ธ”๋Ÿญ๋„ ์ด๋ค„์ง

ํ”„๋กœ์„ธ์Šค๊ทธ๋ฃน : ํ”„๋กœ์„ธ์Šค๋“ค์€ ๊ฐ๊ธฐ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์— ์†ํ•ด์žˆ๋‹ค. ์ž์‹์€ ๋ถ€๋ชจ์˜ ๋ณต์ œ์ด๊ธฐ๋•Œ๋ฌธ์— ์ž์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋ถ€๋ชจ์™€ ๊ฐ™์€ ๊ทธ๋ฃน์— ์†ํ•จ. ๋ฐ”๊ฟ”์ฃผ๊ณ ์žํ•˜๋ฉด ์ž„์˜๋กœ ๋ฐ”๊พธ๋Š”๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

getpgrp() : ํ”„๋กœ์„ธ์Šค๊ทธ๋ฃน ๋ฆฌํ„ด

setpgid() : ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน ์„ค์ •

kill -9 pid or pgid : pidํ˜น์€ pgid์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์ž„

์‹œ๊ทธ๋„ ๋ณด๋‚ด๊ธฐ

SIGINT SIGTSTP์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ•˜๋ฉด ํฌ์–ด๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์˜ ๋ชจ๋“  ์ž‘์—…์œผ๋กœ ์‹œ๊ทธ๋„์ด ์ „๋‹ฌ๋œ๋‹ค.

์œ ์ €์ž…๋ ฅ์œผ๋กœ ์‹œ๊ทธ๋„๋ฐœ์ƒ โ†’shell์—์„œ ์‹œ๊ทธ๋„์บ์น˜โ†’ํฌ์–ด๊ทธ๋ผ์šด๋“œ๊ทธ๋ฃน์œผ๋กœ ์‹œ๊ทธ๋„์ „๋‹ฌ

๊ทธ๋ฃน์ด ๋‹ค๊ฐ™์ด ์ข…๋ฃŒ/์ค‘์ง€๋œ๋‹ค ์ด๊ฑฐ์•ผ~

    void fork12_original(){
        pid_t pid[10];
        int i, child_status;
        for(i = 0; i < 10; i++)
            if((pid[i] = fork()) == 0)
               while(1);
        for(i = 0; i < 10; i++){
            printf("killing process %d\n", pid[i]);
            kill(pid[i], SIGINT);                       //10๊ฐœ ์ˆœํšŒํ•˜๋ฉฐ SIGINT๋ณด๋‚ธ๋‹ค.
        }
        for(i = 0; i < 10; i++){
            pid_t wpid = wait(&child_status);           //์ž์‹ ์ข…๋ฃŒ๋˜๋ฉด ๊ทธ pid ๋ฐ›์•„์˜ค๊ณ  ๋ญ๋กœ ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋ก
            if(WIFEXITED(child_status))                 //์ข…๋ฃŒ์‹œ๊ทธ๋„์„ ๋ณด๋‹ˆ SIGINT๋กœ ์ข…๋ฃŒ๋œ๊ฑฐ๋ผ๋ฉด ์ถœ๋ ฅ ์ฆ‰ ์ด๊ฒƒ๋„ 10๋ฒˆ ์ถœ๋ ฅ๋ ๋“ฏ
                printf("child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status));
    	      else
                printf("child %d terminated abnormally\n", wpid);
        }
    }
images

๋‚ด ์˜ˆ์ƒ killing process 0000 child 0000 terminated with exit status 2 ์œ„์™€๊ฐ™์€๊ฑฐ 10๋ฒˆ ๋ฐ˜๋ณต

ํ‹€๋ ธ๋‹ค. ์‚ฌ์‹ค ํ‹€๋ฆฐ๊ฒŒ ๋งž์Œ. ์ •์ƒ์ข…๋ฃŒ ์•„๋‹ˆ๋ฉด ๋น„์ •์ƒ์ข…๋ฃŒ์ž„. ํ• ๊ฑฐ ๋‹คํ•˜๊ณ  ๋๋‚˜์•ผ (exit) ์ •์ƒ์ข…๋ฃŒ์ž–์•„? ๊ทธ๋‹ˆ๊นŒ ์ด๊ฑด ๋น„์ •์ƒ์ข…๋ฃŒ๊ฐ€ ๋œฌ๋‹ค. ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœํ•˜๋ ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ..

    void fork12_configured(){
        pid_t pid[10];
        int i, child_status;
        for(i = 0; i < 10; i++)
            if((pid[i] = fork()) == 0)
               while(1);
        for(i = 0; i < 10; i++){
            printf("killing process %d\n", pid[i]);
            kill(pid[i], SIGINT);                       //10๊ฐœ ์ˆœํšŒํ•˜๋ฉฐ SIGINT๋ณด๋‚ธ๋‹ค.
        }
        for(i = 0; i < 10; i++){
            pid_t wpid = wait(&child_status);           //์ž์‹ ์ข…๋ฃŒ๋˜๋ฉด ๊ทธ pid ๋ฐ›์•„์˜ค๊ณ  ๋ญ๋กœ ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋ก
            if(WIFEXITED(child_status))                 //์ข…๋ฃŒ์‹œ๊ทธ๋„์„ ๋ณด๋‹ˆ SIGINT๋กœ ์ข…๋ฃŒ๋œ๊ฑฐ๋ผ๋ฉด ์ถœ๋ ฅ ์ฆ‰ ์ด๊ฒƒ๋„ 10๋ฒˆ ์ถœ๋ ฅ๋ ๋“ฏ
                printf("child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status));
            else if(WIFSIGNALED(child_status))
                printf("child %d terminated with SIGINT signal %d\n", wpid, WTERMSIG(child_status));
            else
                printf("child %d terminated abnormally\n", wpid);
        }
    }
images

signal์„ ํ†ตํ•ด ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ, WIFSIGNALED๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๊ฒŒํ•˜๋ฉด ๋จ. WTERMSIG๋ฅผ ํ†ตํ•ด์„œ ์ข…๋ฃŒ์‹œํ‚จ ์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ๋„ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋”ฐ.

์ปค๋„์ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ์—์„œ ํ”„๋กœ์„ธ์Šค๋กœ ๋‹ค์‹œ ๋„˜์–ด์˜ฌ๋•Œ pending๋ผ์—ˆ๊ณ  block๋˜์ง€ ์•Š์€๊ฒƒ๋“ค์„ ๊ณ„์‚ฐํ•œ๋‹ค. (๋Œ€๊ธฐ์ค‘์ด๊ณ  ๋ธ”๋ฝ๋˜์ง€์•Š์€๊ฒƒ) ๋งŒ์•ฝ ์—†๋‹ค๋ฉด(0์ด๋ผ๋ฉด) ๊ทธ๋ƒฅ ์ œ์–ด๋ฅผ ํ”„๋กœ์„ธ์Šค์— ๋„˜๊ฒจ์ค˜๋ฒ„๋ฆฌ๋ฉด ๋˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด 1์ธ ๋น„ํŠธ๋ฅผ ์ฐพ์•„๊ฐ€ ๊ทธ ๋น„ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ์‹œ๊ทธ๋„์„ ์ˆ˜์‹ ํ•ด์„œ ๊ทธ ์‹œ๊ทธ๋„์—๋Œ€ํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•จ. ์ด๊ฑธ ๋ฐ˜๋ณตํ•ด์„œ pnb๊ฐ€ 0์ด๋˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ๋Œ€๊ธฐ์ค‘์ธ ์‹œ๊ทธ๋„์ด ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋˜๋Š”๊ฑฐ์ง€. ์ด๊ฒŒ ๋‹ค ํ•ด๊ฒฐ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค์— ๋Œ๋ ค์ฃผ๋ฉด๋œ๋‹ค.

๋””ํดํŠธ ์•ก์…˜ : ๊ฐ ์‹œ๊ทธ๋„๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์ „ ์ •์˜๋œ ๋™์ž‘๋“ค์ด ์žˆ์Œ.

  • ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
  • ์ข…๋ฃŒ ํ›„ core dump
  • ์ •์ง€ (SIGCONT์ž…๋ ฅ์‹œ๊นŒ์ง€)
  • ๋ฌด์‹œ

signal()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ๋™์ž‘๋„ ์ˆ˜์ •์ด๊ฐ€๋Šฅํ•˜๋‹ค SIGSTOP์ด๋ž‘ SIGKILL์€ ๋ง‰์„์ˆ˜์—†๋Š” ์˜ˆ์™ธ์ž„

images

์šฐ๋ฆฌ ๊ณผ์ œ์—์„œ Signalํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น signal์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๊ฐ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋Œ๋ฆฐ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ. ์ €๊ฑฐ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ ํ•œ๊ฑฐ๋ž‘ ์ฃผ์„ ๋‹ค์‹œ ํ’€๊ณ  ํ•œ๊ฑฐ ๋ฐ‘์— ๋น„๊ต ์šฐ๋ฆฌ๊ณผ์ œ์—์„œ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ์ด๋ฏธ ๊ธฐ๋ณธ๋™์ž‘ default action์ด ์ •์˜๋˜์–ด์žˆ๋Š”๋ฐ ๊ทธ๊ฑธ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉด ์‰˜์ด์ข…๋ฃŒ๊ฐ€๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋‹ˆ๊นŒ ๊ทธ๊ฑธ ๋ง‰์œผ๋ ค๊ณ  ์ด๋ ‡๊ฒŒ ์žฌ์ •์˜ํ•ด์ค€๊ฑฐ!

images

handler_t *signal(int signum, handler_t *handler) : signum์— ํ•ด๋‹นํ•˜๋Š” ์‹œ๊ทธ๋„์— ๋Œ€ํ•ด ํ•ธ๋“ค๋Ÿฌ๋ฅผ handler(์ฃผ์†Œ์— ์œ„์น˜ํ•œ ํ•ธ๋“ค๋Ÿฌ)๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. handler ๋ถ€๋ถ„์— SIG_IGN์ด ๋“ค์–ด๊ฐ€๋ฉด ์‹œ๊ทธ๋„ ๋ฌด์‹œ, SIG_DFL์ด ๋“ค์–ด๊ฐ€๋ฉด ๊ธฐ๋ณธ ์‹œ๊ทธ๋„๋กœ ๋‹ค์‹œ ๋ณต๊ท€์‹œํ‚จ๋‹ค..!? ํ…Œ์ŠคํŠธํ•ด๋ด…์‹œ๋‹ค.

images
images

๊ฐ๊ธฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•ด์ค€๊ฑฐ ๋’ค์—๋‹ค๊ฐ€ SIG_DFL๋กœ ๋‹ค์‹œ์„ค์ •ํ•ด์ฃผ๋‹ˆ ๋ณด๋‹ค์‹œํ”ผ ์ฃผ์„ ์ œ๊ฑฐํ•œ๊ฑฐ๋ž‘ ๋˜‘๊ฐ™์ด, ์ฆ‰ ํ•ธ๋“ค๋Ÿฌ ์ง€์ • ์•ˆํ•œ๊ฑฐ๋ž‘ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

signum์— ํ•ด๋‹นํ•˜๋Š” ์‹œ๊ทธ๋„ ์ˆ˜์‹ ํ•˜๋ฉด handler์— ํ•ด๋‹นํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋กœ ์ œ์–ด๊ฐ€ ์ด๋™ํ•˜๊ฒŒํ•œ๋‹ค (catching, ์ฒ˜๋ฆฌํ•œ๋‹ค) ํ•ธ๋“ค๋Ÿฌ๊ฐ€ return ์„ ๋งŒ๋‚˜๋ฉด ์ œ์–ด๊ถŒ์€ ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ค‘๋‹จ๋˜์—ˆ๋˜ ์›๋ž˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐ€๋Š”๊ฒƒ~~

    void int_handler(int sig){
    	printf("process %d received signal %d\n", getpid(), sig);
    	exit(0);
    }
    
    void fork13(){
    	pid_t pid[10];
    	int i, child_status;
    	signal(SIGINT, int_handler);    //int_handler๋กœ ๋ณด๋‚ด๋ฒ„๋ ท~~
      for(i = 0; i < 10; i++)
    	  if((pid[i] = fork()) == 0) 
    	    while(1);
    	for(i = 0; i < 10; i++){
    		printf("killing process %d\n", pid[i]);
        kill(pid[i], SIGINT);                       //10๊ฐœ ์ˆœํšŒํ•˜๋ฉฐ SIGINT๋ณด๋‚ธ๋‹ค.
      }
      for(i = 0; i < 10; i++){
    	  pid_t wpid = wait(&child_status);           //์ž์‹ ์ข…๋ฃŒ๋˜๋ฉด ๊ทธ pid ๋ฐ›์•„์˜ค๊ณ  ๋ญ๋กœ ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋ก
    	    if(WIFEXITED(child_status))                 //์ข…๋ฃŒ์‹œ๊ทธ๋„์„ ๋ณด๋‹ˆ SIGINT๋กœ ์ข…๋ฃŒ๋œ๊ฑฐ๋ผ๋ฉด ์ถœ๋ ฅ ์ฆ‰ ์ด๊ฒƒ๋„ 10๋ฒˆ ์ถœ๋ ฅ๋ ๋“ฏ
    	      printf("child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status));
    	    else
            printf("child %d terminated abnormally\n", wpid);
        }
    }
images

์ข€ ์• ๋งคํ•˜๊ธดํ•œ๋ฐ ์•„๋ฌดํŠผ ์˜ˆ์ƒ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ธฐ๋Š” ํ•จ

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ ์ด์ƒ๋™์ž‘????? ๋ญ๊ฐ€๋ฌธ์ œ์ธ์ง€ ์ž˜ ์ดํ•ด ์•ˆ๋จ.

    int ccount = 0;
    
    void child_handler(int sig){
    	int child_status;
    	pid_t pid = wait(&child_status);
    	ccount--;
    	printf("received signal %d from process %d\n", sig, pid);
    	sleep(2);
    }
    
    void fork14(){
    	pid_t pid[10];
    	int i, child_status;
    	signal(SIGCHLD, child_handler);
    	for(i = 0; i < 10; i++){
    		if((pid[i] = fork() == 0){
    			sleep(1);
    			exit(0);
    		}
    	}
    	while(ccount > 0){
    		pause();
    	}
    }
images
images

์œ„ WNOHANG์‚ฌ์šฉ, ์•„๋ž˜ sleep๋งŒ ์‚ฌ์šฉ ์ž์‹๋“ค์˜ ์ข…๋ฃŒ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š”๋ฐ handler๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์‹œ๊ทธ๋„๋งŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ๋Œ€๊ธฐ ํ๊ฐ€ ๋”ฐ๋กœ ์—†๊ธฐ๋•Œ๋ฌธ์— ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ์— ํ—›๋ฐœ์งˆ์ด ๋ฐœ์ƒํ•œ๋‹ค. waitpid(-1, &child_status, WNOHANG) ์—์„œ -1์˜ต์…˜์„ ์ค˜์„œ ์•„๋ฌด ์ž์‹ํ”„๋กœ์„ธ์Šค๋‚˜ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒํ•˜๊ณ  WNOHANG์„ ํ†ตํ•ด ์ข…๋ฃŒํ• ๊ฑฐ์—†์„๋• ์ฆ‰๊ฐ๋๋‚ด๊ฒŒํ•ด์„œ ์ž์‹ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์‹œ ์ฆ‰๊ฐ ์ฒ˜๋ฆฌ, ๋ถ€๋ชจ๋Š” ๋‹ค๋ฅธ์ผ์„ ๋ฐ”๋กœํ•œ๋‹ค. while(ccount > 0) pause(); ๋ฅผ ํ†ตํ•ด์„œ ๋ถ€๋ชจ๋Š” ๋‹ค์‹œ ์‹œ๊ทธ๋„์ด ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์ฃผ๋ฉด์„œ ๋ณด์กฐ๋ฅผ ๋งž์ถ˜๋‹ค.

๋ฐ˜๋ฉด wait(&child_status)๋Š” ๋งน๋ชฉ์ ์œผ๋กœ ์ž์‹์ด ๋๋‚˜๋Š” ๊ฑธ ๊ธฐ๋‹ค๋ฆฐ๋‹ค ์ž์‹์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ๊ฐ€ ๋ธ”๋ฝ๋œ๋‹ค. ์ฆ‰ ์ž์‹์ด ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๋‹ค๋ฅธ๊ฑธ๋ชปํ•˜๋ฏ€๋กœ, ์ž์‹์€ ์šฐํ›„์ฃฝ์ˆœ์œผ๋กœ ๋๋‚˜๋Š”๋ฐ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋Œ€์‘ํ•ด์ค„์ˆ˜๊ฐ€ ์—†๋‹ค. โ†’ ์‹ค์งˆ์ ์œผ๋ก  ์ข…๋ฃŒ๋์ง€๋งŒ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋˜๋Š” ์ข€๋น„ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ๊ธฐ๊ฒŒ๋œ๋‹ค.

(์ž์‹)โ€”์‹œ๊ทธ๋„โ€”>(์ปค๋„) (๋ถ€๋ชจ) (์ž์‹)โ†-์ข…๋ฃŒโ€”โ€”(์ปค๋„)โ€”์ „๋‹ฌ-โ†’(๋ถ€๋ชจ) ์ž์‹์™„์ „์ข…๋ฃŒ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š”๊ฒŒ wait. ๊ทธ๋™์•ˆ ์ข…๋ฃŒ๋˜๋Š” ๋‹ค๋ฅธ ์ž์‹๋“ค์€ ์ปค๋„์ด ์ •์ƒ์ •์œผ๋กœ ์ข…๋ฃŒ์‹œํ‚ค์ง€๋งŒ ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅธ ์ž์‹ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ๋•Œ๋ฌธ์— ๋ถ€๋ชจ์—์„œ ์ „๋‹ฌ์ด ์•ˆ๋œ๋‹ค. ์ฆ‰ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋จ. waitpid์™€ WNOHANG์„ ์จ์ฃผ๋ฉด ์ปค๋„์ด ์ž์‹์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š”๊ฑธ ๋”ฐ๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ์ฆ‰๊ฐ์ฆ‰๊ฐ ์ฒ˜๋ฆฌ๊ฐ€๋˜๊ณ  ๋ถ€๋ชจ๊ฐ€ ์–ด๋””์— ๋ถ™์žกํžˆ์ง€์•Š์œผ๋‹ˆ๊นŒ ์ •์ƒ์ ์œผ๋กœ ๋‹ค ์ฒ˜๋ฆฌ๋จ.

    //๋‚ด๋ถ€ ๋ฐœ์ƒ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ
    
    int beeps = 0;
    
    void bombHandler(int sig){
    	prinf("BEEP\n");
    	fflush(stdout);
    	
    	if(++beeps < 5)
    		alarm(1);
    	else{
    		printf("BOOM!\n");
    		exit(0);
    	}
    }
    
    int main(){
    	signal(SIGALRM, bombHandler);
    	alarm(1);
    	while(1);                          //while์ด ์—ฌ๊ธฐ์—†์œผ๋ฉด main์ด ์ฃฝ์–ด๋ฒ„๋ฆฌ๋ฉด์„œ ๋๋‚จ 
    }
images

์œ„์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋˜๋‹ค์‹œ ์ธํ„ฐ๋ŸฝํŠธ๋กœ ํ•ธ๋“ค๋Ÿฌ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์žฌ๊ท€์‹์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๊ฐ€๋Š”๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€๋Šฅํ•จ. ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์‹คํ–‰๋จ.

๋ฌต์‹œ์  ๋ธ”๋ก : ์ปค๋„์€ ํ˜„์žฌ ์ฒ˜๋ฆฌ์ค‘์ธ ์‹œ๊ทธ๋„๊ณผ ๋™์ผํ•œ ํƒ€์ž…์˜ ๋Œ€๊ธฐ ์‹œ๊ทธ๋„์€ ๋ธ”๋ก โ†’ ์ง„ํ–‰์ค‘์ธ ์‹œ๊ทธ๋„์ด๋ž‘ ๊ฐ™์€๊ฒŒ ๋“ค์–ด์˜ค๋ฉด ๋ฌต์‹œ์ ์œผ๋กœ ๋ธ”๋ก๋œ๋‹ค

๋ช…์‹œ์  ๋ธ”๋ก : sigprocmaskํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๋ธ”๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) : how โ†’ SIG_BLOCK : blocked์— set์„ ์ถ”๊ฐ€, SIG_UNBLOCK : blocked set์—์„œ set์„ ์ œ๊ฑฐ, SIG_SETMASK : blockedset์ด set

sigemptyset() : ๋นˆ ์‹œ๊ทธ๋„ ์ง‘ํ•ฉ ์ƒ์„ฑ

sigfillset() : ์ง‘ํ•ฉ์˜ ์‹œ๊ทธ๋„์„ ๋ชจ๋‘ 1๋กœ ์„ค์ •

sigaddset() : ์ง‘ํ•ฉ์— ํŠน์ • ์‹œ๊ทธ๋„์„ 1๋กœ

sigdelset : ์ง‘ํ•ฉ์— ํŠน์ • ์‹œ๊ทธ๋„์„ 0์œผ๋กœ

pdf 24ํŽ˜์ด์ง€ ์ฐธ์กฐ

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๊ฑด ์กด๋‚˜ ๊นŒ๋‹ค๋กญ๋‹ค. ์ง€๋ง˜๋Œ€๋กœ ํˆญํˆญ ํŠ€์–ด๋‚˜์˜ค๋Š”๊ฑฐ๋‹ˆ๊นŒ ํž˜๋“ค์ˆ˜๋ฐ–์—.. ์–ธ์ œ ์–ด๋””์„œ ์‹œ๊ทธ๋„์ด ์ˆ˜์‹ ๋ ์ง€ ์ง๊ด€์ ์ด์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ๋งˆ๋‹ค ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ๋ฐ ๋ฉ”์ธ๊ณผ ํ•จ๊นจ๋Œ์•„๊ฐ€๋ฉด์„œ ์ „์—ญ๋ณ€์ˆ˜๋“ค๋„ ๋ง˜๋Œ€๋กœ๊ฐ–๋‹ค์”€ ๊ทธ๋ž˜์„œ ๋ฌธ์ œ๊ฐ€๋จ.

    pid_t pid;
    int counter = 2;
    
    void handler1(int sig){
    	counter = counter -1;
    	printf("%d, counter);
    	fflush(stdout);
    	exit(0);
    }
    
    int main(){
    	signal(SIGUSR1, handler1);
    
    	printf("%d", counter);
    	fflush(stdout);
    
    	if((pid = fork()) == 0){
    		while(1){};
    	}
    	kill(pid, SIGUSR1);
    	waitpid(-1, NULL, 0);
    	counter = counter + 1;
    	printf("%d", counter);
    	exit(0);
    }

์ถœ๋ ฅ์„ 212๋กœ ์˜ˆ์ƒํ–ˆ์œผ๋‚˜ 213์ด๋‚˜์™”๋‹ค. ๊ทผ์ ‘ํ–ˆ์ง€๋งŒ ํ•œ๊ฐ€์ง€ ๋†“์นœ๊ฒŒ ๋ถ€๋ชจ ์ž์‹์ด ๋ถ„๊ธฐํ•˜๋ฉด์„œ counter๋Š” ๋ชจ๋‘ 2๋กœ ๊ฐ€์ ธ๊ฐ„๋‹ค. ๋”ฐ๋ผ์„œ ์ž์‹์ด handler๋ฅผ ํ†ตํ•ด 1๋กœ๋–จ์–ด์ง„๊ฒŒ ์ถœ๋ ฅ๋œ ํ›„ ๋ถ€๋ชจ์—์„œ 1์ฆ๊ฐ€ํ•œ๋‹ค๊ณ ํ•ด์„œ 2 - 1 + 1์ด๋˜๋Š”๊ฒŒ์•„๋‹ˆ๋ผ 2, 2-1, 2+1์ด ๋˜๋Š”๊ฒƒ!

images

race condition : concurrentํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ž์›์— ์ ‘๊ทผํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์‹œ์ง„์ž…์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ฑฐํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

27ํŽ˜์ด์ง€๋ž‘ 29ํŽ˜์ด์ง€์—์„œ ์ฐจ์ด๋Š” emptyset์„ ๋งŒ๋“ค์–ด ์‹œ๊ทธ๋„ ๋„ฃ์–ด์ฃผ๊ณ  fork ์ „ํ›„์— block unblock์„ ๋ผ์›Œ์ค€๊ฑฐ

race condition

๋™์ผํ•œ์ž์›์— ๋™์‹œ์ ‘๊ทผํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ((pid = fork()) == 0) ์ด๋ผ๊ณ ํ•˜๋ฉด pid๊ฐ€ fork ๋  ๋•Œ concurrentํ•˜๋ฉด 0์ธ์นœ๊ตฌ๋“ค์ด ๋งŽ์•„์ ธ์„œ ๋™์‹œ์ ‘๊ทผ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ์ˆ˜์žˆ๋”ฐ?

์ „์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ• ๋• ์‹œ๊ทธ๋„์„ ๋ธ”๋Ÿญ์‹œํ‚จ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํฌํฌํ• ๋•Œ๋„ ์‹œ๊ทธ๋„์„ ๋ธ”๋Ÿญํ•ด์ค€๋‹ค.

๊ทธ๋ƒฅ๋ญ”๊ฐ€ race condition์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์˜ ์ „ํ›„๋กœ ๋ธ”๋ฝ์„ํ•ด์ค˜์•ผํ•˜๋‚˜?

images
images

ํฌํฌํ•˜๊ณ  addjob๋˜๋Š”๊ฑฐ๋ณด๋‹ค ์ž์‹์ด ๋จผ์ € ์‹คํ–‰๋ ์ˆ˜๋„์žˆ๋Š”๋ฐ, ์ž์‹์ด ๋งŒ์•ฝ ์‹คํ–‰๋˜์–ด์„œ ๋ฐ”๋กœ ์ค‘์ง€๋˜์–ด๋ฒ„๋ฆฌ๋ฉด addjob์ด ์‹คํ–‰๋˜๊ธฐ๋„ ์ „์— , ์ฆ‰ global ๋ณ€์ˆ˜์ธ job list์— ์ถ”๊ฐ€๋˜๊ธฐ๋„์ „์— ์ œ๊ฑฐ๊ฐ€ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค. concurrentํ•œ ์ปดํ“จํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋‹ค๋ณด๋‹ˆ ์ด๋Ÿฐ ๊ฒฝ์ฃผ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. ๊ทธ๋ž˜์„œ ์ž์‹์ด ์‹คํ–‰๋ ๋•Œ๋Š” signal์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š”๊ฒƒ! SIGCHLDํ•ธ๋“ค๋Ÿฌ์—์„œ๋„ delete์ „ํ›„๋กœ ๋งˆ์Šคํฌํ•ด์ค€๋‹ค.

images
images

main์—์„œ child๊ฐ€ fork ๋˜์–ด๋‚˜์˜ค๋ฉด pid๋Š” 0์ด๊ณ  ์ˆ˜ํ–‰์ด๋œ๋‹ค์Œ์— SIGCHLD๊ฐ€ ๋ถˆ๋ฆฌ๋ฉด, (์ด ์ด์ „๊นŒ์ง€๋Š” ๋ธ”๋ฝ๋˜์–ด์žˆ์–ด์„œ ๋ฌธ์ œ๊ฐ€ ์•ˆ๋œ๋‹ค) handler์—์„œ pid๋ฅผ ์ข…๋ฃŒ๋œ pid, ์ฆ‰ 0์ด ์•„๋‹Œ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”๋†“๊ฒŒ๋˜๊ณ , ๋ฐ”๊ฟ”๋†“๊ฒŒ ๋˜๋Š”์ˆœ๊ฐ„ ๋ถ€๋ชจํ”„๋กœ์„ธ์Šค์—์„œ while๋ฌธ์ด ์ค‘๋‹จ๋˜๋ฉด์„œ ๋‹ค์Œ ํ–‰์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ๋˜๋Š”๊ฒƒ. ์ด๋Ÿฐ์‹์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์‹œ๊ทธ๋„์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒํ•  ์ˆ˜ ์žˆ๋‹ค.

images
images

suspend๋ฅผ ์‚ฌ์šฉํ•˜๋Š”ํŽธ์ด pause๋ฅผ ์“ฐ๋Š”๊ฒƒ๋ณด๋‹ค ๋‚ซ๊ณ (race๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค), sleep์„ ์“ฐ๋Š”๊ฑฐ๋ณด๋‹ค ๋น ๋ฅด๋‹ค.

์‹œ๊ทธ๋„์€ ํ”„๋กœ์„ธ์Šค ์ˆ˜์ค€์˜ ์˜ˆ์™ธ๋ฐฉ๋ฒ•. ์œ ์ €๊ฐ€ ๋”ฐ๋กœ ์ •์˜ํ• ์ˆ˜๋„ ์žˆ์ง€๋งŒ. ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ปค์„œ ์„ฑ๋Šฅ์— ์ข‹์ง€์•Š๊ณ , ํ๊ฐ€์•„๋‹ˆ๋ฏ€๋กœ ์‹œ๊ทธ๋„์ด ๋Œ€๊ธฐํ• ์ˆ˜์—†๋‹ค. ๋˜ concurrentํ•œ ์ปดํ“จํ„ฐ ๊ฐœ๋…์ด๋ฏ€๋กœ ์‹œ๊ทธ๋„๊ฐ„์— ๋ฐœ์ƒํ•˜๋Š” race์— ์ฃผ์˜ํ•ด์•ผํ•จ.

12

๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฌดํ•œํ•˜์ง€ ์•Š๊ณ , ์ฐธ์กฐ๋ฒ„๊ทธ๋Š” ์น˜๋ช…์ ์ด๋ฉฐ, ์„ฑ๋Šฅ์€ ์ผ์ •ํ•˜์ง€์•Š๋‹ค(๊ทธ๋ž˜๋ณด์ด์ง€๋งŒ)

ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋Œ€๋žต์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์—์„œ ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜์–ด์•ผํ•œ๋‹ค.

๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด malloc์œผ๋กœ heap์— ํ• ๋‹นํ•˜๊ณ  free๋ฅผ ํ†ตํ•ด ํ•ด์ œํ•œ๋‹ค. ์ž๋ฐ”๋Š” ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์•ˆ์“ฐ๋Š”๊ฑฐ๊ฐ™์œผ๋ฉด ์•Œ์•„์„œ ์ˆ˜๊ฑฐํ•ด๊ฐ€๋Š” ๋ฐฉ์‹

์Šคํƒ์€ ์œ„์—์„œ RSP๊ฐ€ ๋‚ด๋ ค์˜ค๋Š” ๋ฐฉ์‹์ด์ง€๋งŒ ํž™์€ ๋ฐ‘์—์„œ BRK๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.

(๋ฐ‘) textโ†’dataโ†’bssโ†’heapโ†’librariesโ†’stackโ†’user code(kernel virtual memory)

์Šคํƒ์—์„œ push popํ•˜๋“ฏ malloc free๋ฅผ ํ•˜๊ณ , ๊ณต๊ฐ„์ด ๋ถ€์กฑํ• ๊ฒฝ์šฐ๋Š” brk์— ๊ฐ’์„ ๋”ํ•ด์„œ ํฌ๊ธฐ๋ฅผ ํ™•๋ณดํ•œ๋‹ค. ๊ทธ๊ฒŒ sbrkํ•จ

malloc : ์ž…๋ ฅ๋œ ์‚ฌ์ด์ฆˆ๋งŒํผ์˜ ๋ธ”๋ก ํฌ์ธํ„ฐ ๋ฐ˜ํ™˜. 8๋ฐ”์ดํŠธ์— ๋งž์ถฐ์คŒ

realloc : ์ž…๋ ฅ๋œ ๋ธ”๋กํฌ์ธํ„ฐ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฐ”๊ฟˆ.

free : ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ œ๊ฑฐํ•จ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์›Œ๋“œ๋‹จ์œ„๋กœ ํ• ๋‹น๋œ๋‹ค. 1์ฐจ์› ๋ฉ”๋ชจ๋ฆฌ๋ฐฐ์—ด์—์„œ ํ•˜๋‚˜๋Š” ํ•œ์›Œ๋“œ์ž„

๋น„์–ด์žˆ๊ณ  ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜๋ฉด ๊ฑฐ๊ธฐ์— ์ƒˆ๋กœํ• ๋‹นํ•œ๋‹ค. ์ค‘์š”ํ•œ๊ฑด ํ• ๋‹น์ด๋ž‘ ๋ฐ˜ํ™˜์ด ๋ชจ๋‘ ์ผ๋ จ์˜ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋Š”๊ฒƒ. ์š”์ฒญ๋  ๋•Œ๋งˆ๋‹ค ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ์ˆœ์„œ๊ฐ€ ์—†๋‹ค.

์š”์ฒญ์˜ ์ˆœ์„œ๋ฅผ ๋ฒ„ํผ์— ์ €์žฅํ•ด์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Œ ๋”ฐ๋ผ์„œ ํ• ๋‹น ๋‹น์‹œ์— ํ”„๋ฆฌ๋ฉ”๋ชจ๋ฆฌ ์ค‘ ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•œ๊ณณ์— ํ• ๋‹นํ•ด์•ผํ•จ โ† ๋˜ ๋งž์ถค์š”๊ฑด์— ๋งŒ์กฑํ•ด์•ผํ•จ 8๋ฐ”์ดํŠธ ์ •๋ ฌํ•œ๋‹ค.

๊ณต๊ฐ„์ด์šฉ๋ฅ ๊ณผ ์‹œ๊ฐ„์„ฑ๋Šฅ ๋ชจ๋‘ ์ข‹์€ malloc ๊ณผ free๊ฐ€ ์ข‹์€๊ฒƒ์ด๋‹ค. ๋‹จํŽธํ™”์˜ ๋ฐœ์ƒ์„ ์ตœ์†Œํ™” ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์•ผํ•จ

์‹œ๊ฐ„์„ฑ๋Šฅ, ์ฒ˜๋ฆฌ๋Ÿ‰ throughput์„ ๋†’์ด๊ธฐ์œ„ํ•ด์„œ๋Š” malloc, realloc, free์˜ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด ์ตœ์†Œํ™”๊ฐ€ ๋˜์–ด์•ผํ•จ.

๋˜ ์ง€์—ญ์„ฑ์„ ํ™•๋ณดํ•ด์•ผํ•œ๋‹ค. ์‹œ๊ฐ„์ ์œผ๋กœ ์ธ์ ‘ํ•œ๊ฑด ๊ณต๊ฐ„์ ์œผ๋กœ ์ธ์ ‘ํ•ด ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ์— ์œ ๋ฆฌํ•ด์•ผํ•จ.

๊ฒฌ๊ณ ์„ฑ : ์œ ํšจํ•œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด์ˆ˜ํ–‰๋˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•จ. (์ฒดํฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ)

๋ฉ”๋ชจ๋ฆฌ ํ•œ ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ ์•ˆ์— ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ํŒจ๋”ฉ์ด ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๊ฑฐ ๋‹ค ํ•ฉ์นœ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ธ”๋Ÿญ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋˜๋Š” ๊ฒƒ.

์—ฐ์Šต๋ฌธ์ œ 1 ํ—ค๋”4๋ฐ”์ดํŠธ, ๋ธ”๋ก ํฌ๊ธฐ 8๋ฐฐ์ˆ˜ malloc(1) โ†’ ํ—ค๋” 4 + ํŽ˜์ด๋กœ๋“œ 1 = 5 ์ธ์ ‘ํ•œ 8๋ฐฐ์ˆ˜๋Š” 8 ๋”ฐ๋ผ์„œ ํŒจ๋”ฉ 3๋ฐ”์ดํŠธ, ๋ธ”๋กํ—ค๋”๋Š” ์‚ฌ์ด์ฆˆ 8 + ํ• ๋‹น 1 = 9 โ†’ 0x9 malloc(5) โ†’ ํ—ค๋” 4 + ํŽ˜์ด๋กœ๋“œ 5 = 9, ์ธ์ ‘ํ•œ 8๋ฐฐ์ˆ˜๋Š” 16. ๋”ฐ๋ผ์„œ ํŒจ๋”ฉ 7๋ฐ”์ดํŠธ, ํ—ค๋”๋Š” ์‚ฌ์ด์ฆˆ 16 + ํ• ๋‹น 1 = 17 โ†’ 0x11 malloc(12) โ†’ ํ—ค๋” 4 + ํŽ˜์ด๋กœ๋“œ 12 = 16, ์ธ์ ‘ 8๋ฐฐ์ˆ˜๋Š” 16, ๋”ฐ๋ผ์„œ ํŒจ๋”ฉ ์—†์Œ, ํ—ค๋”๋Š” ์‚ฌ์ด์ฆˆ 16 + ํ• ๋‹น 1 = 17 โ†’ 0x11 malloc(13) โ†’ ํ—ค๋” 4 + ํŽ˜์ด๋กœ๋“œ 13 = 17, ์ธ์ ‘ 8๋ฐฐ์ˆ˜๋Š” 24, ๋”ฐ๋ผ์„œ ํŒจ๋”ฉ 7๋ฐ”์ดํŠธ, ํ—ค๋”๋Š” ์‚ฌ์ด์ฆˆ 24 + ํ• ๋‹น 1 = 25 โ†’ 0x19

๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ๋  ๋•Œ free ๋ธ”๋Ÿญ์„ ์ฐพ๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

first fit, ์ตœ์ดˆํ• ๋‹น : ์ฒ˜์Œ๋ถ€ํ„ฐ ์ผ์ผํžˆ ๊ฒ€์ƒ‰ํ•ด์„œ ๋งจ์ฒ˜์Œ ํฌ๊ธฐ๊ฐ€ ๋งž๋Š”๊ณณ์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• โ†’ ๋ชจ๋“  ๋ธ”๋Ÿญ์„ ์ˆœํšŒํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ชจ๋“  ๋ธ”๋Ÿญ์— ๋น„๋ก€ํ•œ ์ƒ์ˆ˜์‹œ๊ฐ„์ด ๊ฑธ๋ฆผ. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์‹œ์ž‘๋ถ€๋ถ„์— ์ž‘์€ ์กฐ๊ฐ์ด ๋‹ค์ˆ˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ, ์ดํ•ด๊ฐ€ ์•ˆ๋จ

    p = start;
    while((p < end) && ((*p & 1)||(*p <= len)))    //p๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋๋ณด๋‹จ ์ž‘๊ณ , ํ• ๋‹น์ด ๋˜์–ด์žˆ๊ฑฐ๋‚˜, ๋“ค์–ด๊ฐ€๊ธฐ์— ์‚ฌ์ด์ฆˆ๊ฐ€ ๋„ˆ๋ฌด ์ž‘๋‹ค๋ฉด ํ• ๋‹น ๋ชปํ•œ๋‹ค. 
    	p = p + (*p & -2);                           //ํ˜„์žฌ ์œ„์น˜์˜ ์‚ฌ์ด์ฆˆ๋งŒํผ ๋”ํ•ด์ฃผ๋ฉด ๋‹ค์Œ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค. 

ํ˜„์žฌ ๋ธ”๋Ÿญ์˜ ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š”๊ณณ์€ ๋ธ”๋Ÿญ์˜ ์ฒซ๋ถ€๋ถ„์œผ๋กœ, ๋ธ”๋Ÿญ์˜ ์‚ฌ์ด์ฆˆ์™€ ํ• ๋‹น ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 1๊ณผ and ํ•ด์ฃผ๋ฉด ํ• ๋‹น์—ฌ๋ถ€๋ฅผ, -2ํ˜น์€ -7๊ณผ and ํ•ด์ฃผ๋ฉด ์‚ฌ์ด์ฆˆ๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ.

next fit , ๋‹ค์Œํ• ๋‹น : ์ด์ „ ๊ฒ€์ƒ‰์ด ์ข…๋ฃŒ๋œ ์œ„์น˜๋ถ€ํ„ฐ ๊ฒ€์ƒ‰์„ ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์‹์€ first fit๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

best fit : ์ตœ์ ํ• ๋‹น : ๋ฆฌ์ŠคํŠธ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ ๊ฐ€์žฅ ๊ทผ์ ‘ํ•œ ํฌ๊ธฐ๋ฅผ ์„ ํƒํ•œ๋‹ค. ๊ฐ€์žฅ ๊ทผ์ ‘ํ•œ ํฌ๊ธฐ์˜ free๋ธ”๋ฝ์„ ์„ ํƒํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋‹จํŽธํ™”๋ฅผ ๊ฐ€์žฅ ์ ๊ฒŒํ•ด์ฃผ์ง€๋งŒ ํƒ์ƒ‰์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋ฏ€๋กœ ๋А๋ฆฌ๋‹ค.

ํ—ค๋”๋งคํฌ๋กœ

#define SIZEMASK (~0x7) 7์„ not์—ฐ์‚ฐํ•˜๋ฉด 1111 1000์ด ๋‚˜์˜ด. ์ด๊ฑฐ๋กœ and ์—ฐ์‚ฐํ•ด์„œ ์‚ฌ์ด์ฆˆ ์–ป์–ด์˜ค๋Š”๋ฐ ์“ด๋‹ค.

#define PACK(size, alloc ((size)|(alloc) size์— alloc์—ฌ๋ถ€๋ฅผ ์“ฐ๋Š”๋“ฏ

#define getSize(x) ((x)->size & SIZEMASK) size์™€ SIZEMASK์˜ and ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์‚ฌ์ด์ฆˆ๋ฅผ ์–ป์–ด์˜จ๋‹ค.

    struct{
    	unsigned allocated : 1;
    	unsigned size : 31;
    }Header;

์‚ฌ์‹ค ์ด๊ฑด ๋ญํ•˜๋Š”๊ฑด์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹คโ€ฆ

ํ• ๋‹น์„ free์‹œํ‚ค๋Š” ๊ณผ์ •์ด ๋” ๊นŒ๋‹ค๋กญ๋‹ค. ํ• ๋‹นํ–ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” allocate ๋น„ํŠธ๋งŒ(ํ• ๋‹นํ”Œ๋ž˜๊ทธ) 0์œผ๋กœ ํ‘œ์‹œํ•ด์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค. free ๋ธ”๋Ÿญ ๋‘๊ฐœ๊ฐ€ ์—ฐ์†ํ•œ๊ฒฝ์šฐ ๊ณต๊ฐ„์ด ์žˆ์ง€๋งŒ, ๋‘ ๋ธ”๋Ÿญ์œผ๋กœ ๋‚˜๋‰˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ƒ‰์‹œ ์ฐพ์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๋Š”๊ฒƒ.

free๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•ž ๋’ค์˜ free๋ธ”๋Ÿญ์ด์žˆ๋‹ค๋ฉด ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

    void free_block(ptr p){
    	*p = *p & -2;
    	next = p + *p;        //p์˜ ์ฃผ์†Œ์— p์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋”ํ•จ, ๋‹ค์Œ ๋ธ”๋Ÿญ
    	if((*next & 1) == 0)  //next์˜ ํ• ๋‹น์ด 0, ์ฆ‰ free๋ผ๋ฉด
    		*p = *p + *next;    //p์™€ next์˜ ์‚ฌ์ด์ฆˆ ์ •๋ณด๋ฅผ ํ•ฉ์ณ์„œ p์— ํ†ตํ•ฉ
    }

๊ทธ์น˜๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์•ž์„œ ์‚ฌ์šฉํ•ด์™”๋˜ ๋ฐฉ์‹์˜ ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ํ—ค๋”๋งŒ ์กด์ œํ•˜๊ธฐ๋•Œ๋ฌธ์— ์•ž์˜ ๋ธ”๋Ÿญ์€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค. ์•ž์˜ ๋ธ”๋Ÿญ๋„ ํ™•์ธํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„  ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๋‹ค.

์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ : ๊ฒฝ๊ณ„ ํƒœ๊ทธ Boundary Tags

๋ฆฌ์ŠคํŠธ๋ฅผ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์„ ์†Œ๋ชจํ•ด footer๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. (ํ—ค๋”์™€ ๋‚ด์šฉ์€ ๋™์ผํ•จ)

ํ—ค๋”์™€ ํ‘ธํ„ฐ์—๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋ถ€์—ฐ์„ค๋ช… ํ—ค๋”๋Š” ์‚ฌ์ด์ฆˆ์ •๋ณด์™€ ํ• ๋‹น์ •๋ณด๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ์›๋žœ freeํ• ๋•Œ๋„ ์ฃผ์†Œ๋ž‘ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฐ›์•„์•ผํ•˜๋Š”๋ฐ, ํ—ค๋”์™€ ํ‘ธํ„ฐ์— ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐ™์ด ๊ธฐ๋กํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์‚ฌ์ด์ฆˆ๋Š” ์•ˆ๋ฐ›์•„๋„ ๋˜๋Š”๊ฑฐ์ž„. ๊ทธ๋ฆฌ๊ณ  ํ‘ธํ„ฐ๋Š” ํ—ค๋”๋ž‘ ๋˜‘๊ฐ™์€ ์ •๋ณด์ธ๋ฐ ๊ตณ์ด ๋„ฃ๋Š”์ด์œ ๊ฐ€ ์•ž์—์„œ ์•ž ๋ธ”๋Ÿญ๊ณผ ํ•ฉ์น˜๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์•ž์œผ๋กœ ํƒ์ƒ‰ํ•  ํ•„์š”๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ. ํ˜„์žฌ ๋ธ”๋Ÿญ ํ—ค๋” -4 ํ•˜๋ฉด ์•ž ๋ธ”๋Ÿญ ํ‘ธํ„ฐ ํ˜„์žฌ ๋ธ”๋Ÿญ ํ‘ธํ„ฐ +4 ํ•˜๋ฉด ๋’ท ๋ธ”๋Ÿญ ํ—ค๋”

allocatedโ†’freeโ†’allocated

allocatedโ†’freeโ†’free โ†’ allocateโ†’free

freeโ†’freeโ†’allocated โ†’ freeโ†’allocated

freeโ†’freeโ†’free โ†’ free

13

๋ธ”๋Ÿญํ• ๋‹น ์ •์ฑ… : 3๊ฐ€์ง€ ํ• ๋‹น ์ •์ฑ…์ด ์žˆ์ง€๋งŒ(first fit, next fit, best fit) ์„ธ๊ฐ€์ง€ ๋ชจ๋‘ ์•„์ฃผ ์ด์ƒ์ ์ธ๊ฑด ์—†์—ˆ๋‹ค. ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ๋‹จํŽธํ™”์˜ ์ตœ์†Œํ™” ์‚ฌ์ด์—์„œ์˜ ์ ˆ์ถฉ์ด ์š”๊ตฌ๋จ.

๋ธ”๋Ÿญ์„ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹๊ณผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ด ์„ธ๋ถ€์ ์œผ๋กœ ์ข€๋‹ค๋ฆ„. ์–ธ์ œ ๋ธ”๋Ÿญ์„ ๋‚˜๋ˆŒ๊ฑฐ๊ณ  ์–ผ๋งˆ๋‚˜ ๋‹จํŽธํ™”๋˜๋Š”๊ฑธ ํ—ˆ์šฉํ• ๊ฒƒ์ธ์ง€๋ถ€ํ„ฐ, ์–ธ์ œ ํ†ตํ•ฉํ• ๊ฑด์ง€ (free์‹œ ๋ฐ”๋กœ ํ†ตํ•ฉ๋˜๋Š”๊ฒŒ ์•ž์„œ ๋ณธ๊ฒƒ์ด๊ณ , ํŠน์ • ์‹œ์ , ์˜ˆ์ปจ๋Œ€ ๋‹จํŽธํ™”์˜ ์–‘์œผ๋กœ ํŒ๋ณ„ํ•˜๋Š”๊ฒƒ๊ณผ ๊ฒ€์ƒ‰์‹œ ํ†ตํ•ฉํ•˜๋Š” ๋“ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๋Š”๊ฒƒ๋„ ์žˆ๋‹ค.

๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ๋Š” ์•ž์„œ ๋ณด์•˜๋“ฏ ์„ ํ˜•์ ์ธ ์‹œ๊ฐ„์„ ๊ฐ–๋Š”๋‹ค. (๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ์–ด๋–ค ํ• ๋‹น ์ •์ฑ…์„ ์„ ํƒํ–ˆ๋А๋ƒ(first fit, next fit, best fit)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

์‹ค์ œ malloc/free๊ตฌํ˜„์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํŠน์ˆ˜๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•จ

๊ทธ๋ž˜๋„ ์•ž์„œ ๊ตฌํ˜„ํ•œ ๋ธ”๋Ÿญ ๋‚˜๋ˆ„๊ธฐ, ๊ฒฝ๊ณ„ํƒœ๊ทธ๋กœ free ๋ธ”๋Ÿญ ํ•ฉ์น˜๊ธฐ๋Š” universalํ•˜๊ฒŒ ์ด์šฉ๋จ

์—ฐ์Šต๋ฌธ์ œ 1. ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ์„ค๊ณ„ single word allign : allocated, header, footer โ‡’ ์ตœ์†Œ 1 + 4 + 4 = 9, ์ธ์ ‘ 4๋ฐฐ์ˆ˜ 12 โ†’ padding 3, ์ตœ์†Œํฌ๊ธฐ 12 free, header, footer โ‡’ ์ตœ์†Œ 0 + 4 + 4 = 8, ์ธ์ ‘ 4๋ฐฐ์ˆ˜ 8 โ†’ padding 0, ์ตœ์†Œํฌ๊ธฐ 8 double word allign : allocated, header โ‡’ ์ตœ์†Œ 1 + 4 = 5 ์ธ์ ‘ 8๋ฐฐ์ˆ˜ 8 โ†’ padding 3, ์ตœ์†Œํฌ๊ธฐ 8 free, header, footer โ‡’ ์ตœ์†Œ 0 + 4 + 4 = 8, ์ธ์ ‘ 8๋ฐฐ์ˆ˜ 8 โ†’ padding 0, ์ตœ์†Œํฌ๊ธฐ 8

์ง์ ‘๋ฆฌ์ŠคํŠธ

๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์„ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด๋ค˜๋‹ค.

์ง์ ‘๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ€์šฉ ๋ธ”๋ก ๋‚ด๋ถ€์— ํฌ์ธํ„ฐ๋ฅผ ๋‘์–ด์„œ ์ผ๋ฐ˜์ ์ธ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์™€ ๋” ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.

์ด์ „์—๋Š” ํ• ๋‹น๋œ ๋ฆฌ์ŠคํŠธ๋„ ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ ์ง์ ‘๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์šฉ ๋ธ”๋ก์˜ ๋ฆฌ์ŠคํŠธ๋งŒ์„ ๊ด€๋ฆฌ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๊ฐ€์šฉ๋ธ”๋Ÿญ์€ ํ• ๋‹น๋œ ๋ธ”๋Ÿญ์— ์˜ํ•ด ์‹ค์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ์—์„œ์ฒ˜๋Ÿผ ๋ธ”๋Ÿญ์‚ฌ์ด์ฆˆ๋กœ ์ˆœํšŒํ• ์ˆ˜์—†๋‹ค. ์‹ค์ œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ํฌ์ธํ„ฐ ์ฃผ์†Œ๋ฅผ ํ™œ์šฉํ•ด์•ผํ•จ.

๋ธ”๋ก ์—ฐ๊ฒฐ์€ ๊ฒฝ๊ณ„ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ€์šฉ๋ธ”๋Ÿญ์˜ ๋ฐ์ดํ„ฐ์˜์—ญ์— ์•ˆ์“ฐ๋Š” ๋ถ€๋ถ„์„ ํ™œ์šฉํ•ด์„œ pred์™€ succ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ, ์‹ค์ œ ๋ธ”๋Ÿญ๋“ค์˜ ์ˆœ์„œ์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฃผ์†Œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€๋œ๋‹ค.

free๋“ค์˜ pred์™€ succ๋ฅผ ํ†ตํ•ด ํƒ์ƒ‰ํ•˜๋ฉฐ ์‚ฌ์ด์ฆˆ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ฅผ ํ†ตํ•ด ํ• ๋‹นํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ํ• ๋‹นํ•ด์ฃผ๊ฒŒ๋˜๋ฉด splitting์„ ํ†ตํ•ด ์งค๋ผ์ฃผ๊ณ , ์ž˜๋ ค์ ธ ๋‚˜์˜จ ์ƒˆ๋กœ์šด ๊ฐ€์šฉ ๋ธ”๋Ÿญ์— ๋Œ€ํ•ด์„œ ์ฃผ์†Œ์ž‘์—…์„ ๋‹ค์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  • ๋ฐ˜ํ™˜๋œ ๋ธ”๋Ÿญ์€ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ๋„ฃ์–ด์ค€๋‹ค. LIFO๋ฐฉ์‹์„ ์ทจํ•จ(์Šคํƒ) ์ƒ์ˆ˜์‹œ๊ฐ„๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ, ๋‹จํŽธํ™”๊ฐ€ ์‹ฌํ•˜๋‹ค
  • ๊ฐ€์šฉ๋ธ”๋Ÿญ์˜ ์ฃผ์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜๋„๋ก ์‚ฝ์ž…ํ•˜๋ฉด๋จ. ๋‹จ์ ์œผ๋ก  ๋ฆฌ์ŠคํŠธ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ฃผ์†Œ์— ์•Œ๋งž์€ ๊ณต๊ฐ„์— ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค๋Š”๊ฒƒ. ๊ทธ์น˜๋งŒ ๋‹จํŽธํ™”๋Š” ๋œํ•˜๋‹ค.

Explicit(์ง์ ‘๋ฆฌ์ŠคํŠธ) LIFOdd : free๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด free๋œ ๊ฐ€์šฉ๊ณต๊ฐ„์ด ๋งจ ์•ž ๋…ธ๋“œ๊ฐ€๋œ๋‹ค. ์ด์ „์˜ ๋…ธ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋งจ ์•ž ๋…ธ๋“œ(๋ฐฉ๊ธˆ free๋œ ์นœ๊ตฌ)์˜ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

๋ชจ๋“  ๋ธ”๋Ÿญ ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ€์šฉ ๋ธ”๋Ÿญ์ˆ˜์— ์„ฑ๋Šฅ์ด ๋น„๋ก€ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์ด ์ฐจ์žˆ๋Š” ์ƒํƒœ์— ์„ฑ๋Šฅ์ด ๋น ๋ฅธํŽธ์ด๋‹ค. (๊ฐ€์šฉ๋ธ”๋Ÿญ์ด ์ ์„์ˆ˜๋ก ๋น ๋ฅด๋‹ค๋Š”๊ฑฐ). ๋ธ”๋ก์„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์ด ๋ณต์žกํ•จ. ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ตฌํ˜„๋˜๋ฏ€๋กœ ๋ธ”๋ก๋งˆ๋‹ค ๋งํฌํฌ์ธํ„ฐ์˜ ์ €์žฅ์„์œ„ํ•ด 2์›Œ๋“œ์”ฉ ์ถ”๊ฐ€๋กœํ•„์š”ํ•จ. โ†’ ์ด๊ฒƒ๋„ ์‹ค์ œ๋กœ ์“ฐ์ด์ง„์•Š๊ณ  ๊ตฌ๋ถ„๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ๋ž‘ ๊ฐ™์ด์“ฐ์ž„

๊ตฌ๋ถ„๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ : ๋ธ”๋ก๋“ค์ด ์œ ์‚ฌํ•œ ํฌ๊ธฐ์˜ ๊ฐ€์šฉ๋ธ”๋Ÿญ๋“ค๋ผ๋ฆฌ ๋”ฐ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค. (ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค) ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํ•„์š”ํ•œ ํฌ๊ธฐ์— ์•Œ๋งž๋Š” ๋ธ”๋Ÿญ์„ ์ฐพ๋Š”๋ฐ ์œ ๋ฆฌํ•˜๋‹ˆ๊นŒ ํƒ์ƒ‰์˜ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ๋˜ ์•Œ๋งž์€ ๋ธ”๋Ÿญ์„ ์ฐพ์•˜์„ ๋•Œ ๊ฐ€์šฉ ๊ณต๊ฐ„์„ ์ž๋ฅด๋Š”๋ฐ๋„ ์œ ๋ฆฌํ•˜๋‹ค. ์•ˆ์ž๋ฅผ ํ™•๋ฅ ์ด ๊ฝค ๋†’๊ธฐ๋•Œ๋ฌธ.

๊ทธ์น˜๋งŒ ์‚ฌ์ด์ฆˆ๋ณ„๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋”ฐ๋กœ์žˆ๋‹ค๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค๋Š” trade off๋Š” ํ”ผํ•  ์ˆ˜ ์—†๋‹ค.

๋ธ”๋กํ• ๋‹น๋ฐฉ๋ฒ•

n์‚ฌ์ด์ฆˆ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ธ”๋ก์œผ๋กœ ํ• ๋‹นํ•ด์ค€๋‹ค. ๊ฐ„์ ‘๋ฐฉ์‹ ์ง์ ‘๋ฐฉ์‹ ๋ชจ๋‘ ์‚ฌ์šฉ๊ฐ€๋Šฅ

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ n์‚ฌ์ด์ฆˆ์˜ ๋ธ”๋Ÿญ์„ ์ฐพ๋Š”๋ฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ๊ฐ€์šฉ ๋ธ”๋Ÿญ์ด ์—†๋Š”๊ฑฐ๋‹ˆ๊นŒ ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ํ• ๋‹น๋ฐ›์•„์˜จ๋‹ค (sbrk๋กœ ํž™์„ ๋Š˜๋ฆฐ๋‹ค) ๊ทธ ํŽ˜์ด์ง€์˜ ๋ชจ๋“ ๋ธ”๋Ÿญ์œผ๋กœ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์œ„์—์„œํ•œ๊ฒƒ์ฒ˜๋Ÿผ ์ฒซ ๋ธ”๋ก์œผ๋กœ ํ• ๋‹นํ•ด์ค€๋‹ค.

๋ธ”๋ก๋ฐ˜ํ™˜๋ฐฉ๋ฒ•

๊ฐ€์šฉ๋ธ”๋Ÿญ์œผ๋กœ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€

์žฅ์ 

๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ ๊ธฐ์ค€์œผ๋กœ ์ฐพ์œผ๋‹ˆ๊นŒ ์•Œ๋งž๋Š”๊ฑธ ๋นจ๋ฆฌ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งค์šฐ ๋น ๋ฅธ ์ƒ์ˆ˜์‹œ๊ฐ„์˜ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์ด์šฉ๋ฅ ๋„ ์ข‹์Œ

images

malloc์€ payload์˜ ์‹œ์ž‘์ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค..?

14

๋งํ‚น โ† ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ld

์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์ €์žฅํ•˜๊ณ  ์‹ค์ œ ํ•˜๋‚˜์˜ ํŒŒ์ผ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ๋˜๋„๋ก ํ•˜๋Š”๊ฒƒ. ์ปดํŒŒ์ผ์‹œ, ๋Ÿฐํƒ€์ž„์‹œ์— ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„ํ• ํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์–ด ์ปค๋‹ค๋ž€ ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๋ถ€ ์ˆ˜์ •์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•  ํ•„์š” ์—†์ด, ์ˆ˜์ •๋œ ๋ถ€๋ถ„๋งŒ ์ปดํŒŒ์ผ๋˜๋ฉด ๋œ๋‹ค.

sum์€ sum์—์„œ๋Š” ์ •์˜๊ฐ€๋˜์–ด์žˆ๊ณ  main์—์„œ๋Š” ์„ ์–ธ๊ณผ ํ˜ธ์ถœ์ด ๋˜๊ณ  ์žˆ๋‹ค.

์—ฌ๋Ÿฌ ํŒŒ์ผ์˜ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๊ฐ์ž ์ปดํŒŒ์ผ๋œ๋‹ค. ์ด๋ฅผ relocatable์ด๋ผ๊ณ  ํ•จ

relocatable๋“ค์„ ์—ฎ์–ด์„œ(๋งํฌํ•ด์„œ) ์‹คํ–‰๊ฐ€๋Šฅํ•œ(executable)ํ•œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”๊ฒƒ์ด ๋ง์ปค์˜ ์—ญํ• 

์žฅ์  1. ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ์†Œ์Šค๋ฅผ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑ ๊ฐ€๋Šฅํ•จ

์‹œ๊ฐ„์ ์œผ๋กœ ํšจ์œจ์ ์ด๋‹ค : ์ˆ˜์ •์ด ์—†๋Š” ํŒŒ์ผ๋“ค์„ ์žฌ ์ปดํŒŒ์ผ ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ˆ˜์ •๋œ๊ฑฐ๋งŒ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‹ค์‹œ ๋งํฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๋™์‹œ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณต๊ฐ„์ ์œผ๋กœ ํšจ์œจ์ ์ด๋‹ค : ์ž์ฃผ ์“ฐ๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ์•„๋†“์„ ์ˆ˜ ์žˆ๋‹ค.

์ •์ ๋งํ‚น : ์ปดํŒŒ์ผํƒ€์ž„์— ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ ์žฌํ•จ

์ปดํŒŒ์ผ์ฝ”๋“œ ์•ˆ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ์–ด์ผ€๋ณด๋ฉด ์ข‹์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ผ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•ด์ง. ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ค‘๋ณต ์ ์žฌ๋œ๋‹ค.

๋™์ ๋งํ‚น : ๋Ÿฐํƒ€์ž„์— ๊ทธ๋•Œ๊ทธ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ ์žฌํ•จ?

์ปดํŒŒ์ผ์ฝ”๋“œ ์•ˆ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ทธ ๋•Œ ๊ทธ ๋•Œ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ. ์œ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ค‘๋ณต ์ ์žฌ๊ฐ€ ํ•ด๊ฒฐ๋จ.

๋‹จ์ ์ด๋ผ ํ•œ๋‹ค๋ฉด ๋ฐ”๋กœ๋ฐ”๋กœ ๊ฐ–๋‹ค์“ธ์ˆ˜์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ณต์œ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ€๋ถ„์„ ์ฐพ์•„๊ฐ€์•ผํ•˜๋‹ˆ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ . ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฐ„์ ์ธ ์ธก๋ฉด์—์„œ ์ •์ ๋งํ‚น์€ ๋„ˆ๋ฌด๋‚˜๋„ ์†ํ•ด๋‹ค. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋”ฐ๋กœ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์ด๊ธฐ๋„ ํ•จ.

์žฅ์  2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์žฌํ™œ์šฉ์„ฑ์„ ๋Š˜๋ฆฐ๋‹ค.

์‹ฌ๋ณผ ํ•ด์„

๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ์Šค๋ฅผ ์ชผ๊ฐœ์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ •์˜๋œ ์‹ฌ๋ณผ๋“ค์„ ์ฐธ์กฐ ๋ฐ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค. ๋ง์ปค๋Š” ์ด ์‹ฌ๋ณผ๋“ค์„ ์ •์˜ ์ฐธ์กฐํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์˜ ์‹ฌ๋ณผํ…Œ์ด๋ธ”์— ์‹ฌ๋ณผ ์ •์˜ : ์ด๋ฆ„๊ณผ ํฌ๊ธฐ, ์œ„์น˜์ •๋ณด๋ฅผ ๊ฐ–๋Š”๋‹ค. ์‹ฌ๋ณผ ํ•ด์„ ์‹œ ๋ง์ปค๊ฐ€ ์‹ฌ๋ณผํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์‹ฌ๋ณผ์„ ์ฐธ์กฐํ•˜๋„๋ก ํ•ด์ค€๋‹ค.

์žฌ๋ฐฐ์น˜

ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ๋กœ ์ชผ๊ฐœ์–ด์ ธ ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค. ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ์™€ ์ฝ”๋“œ ์˜์—ญ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์•ผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค (executable). ๊ฐ oํŒŒ์ผ์ด relocatable์ธ ์ด์œ ๊ฐ€ ์–˜๋„ค๋“ค์„ ์žฌ๋ฐฐ์น˜ํ•ด์„œ executableํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž„. ๋”ฐ๋ผ์„œ ๊ฐ oํŒŒ์ผ (relocatable)์—์„œ์˜ ์‹ฌ๋ณผ ์œ„์น˜๊ฐ€ executable์—์„œ์˜ ์ตœ์ข…์ ์ธ ์œ„์น˜๋กœ ์žฌ๋ฐฐ์น˜๋˜์–ด์•ผํ•จ.

์˜ค๋ธŒ์ ํŠธํŒŒ์ผ ELF

relocatable : .o ๋‹ค๋ฅธ relocatable๊ณผ ์—ฐ๊ฒฐ๋  ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ์˜์—ญ๋“ค. .c๋กœ๋ถ€ํ„ฐ๋งŒ๋“ค์–ด์ง

shared : .so DLL์ด๋ผ๊ณ  ๋ณด๋ฉด ๋จ. ํŠน์ˆ˜์ผ€์ด์Šค. ํ•„์š”ํ•  ๋•Œ ์ ์žฌ๋˜์–ด ๋™์ ์œผ๋กœ ๋งํฌ

executable : .out ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ์˜์—ญ์ด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„๊ฑฐ relocatable๋“ค์ด ์—ฎ์–ด์ง„ ๊ฒƒ

images
images

์‹ฌ๋ณผ๋ถ„๋ฅ˜

์ „์—ญ์‹ฌ๋ณผ : ํ•ด๋‹น ๋ชจ๋“ˆ์—์„œ ์ •์˜๋˜์–ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ณผ. non static ํ•จ์ˆ˜, ์ „์—ญ๋ณ€์ˆ˜

์™ธ๋ถ€์‹ฌ๋ณผ : ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ •์˜๋˜์–ด ํ•ด๋‹น ๋ชจ๋“ˆ์—์„œ ์ฐธ์กฐํ•˜๋Š” ์‹ฌ๋ณผ. ์ „์—ญ์‹ฌ๋ณผ์„ ๋‹ค๋ฅธ๋ฐ์„œ ๊ฐ–๋‹ค์“ฐ๋ฉด ์™ธ๋ถ€์‹ฌ๋ณผ

์ง€์—ญ์‹ฌ๋ณผ : ํ•ด๋‹น ๋ชจ๋‘˜์—์„œ ์ •์˜๋˜์–ด ํ•ด๋‹น ๋ชจ๋“ˆ์—์„œ๋งŒ ์ฐธ์กฐํ•˜๋Š” ์‹ฌ๋ณผ. staticํ•จ์ˆ˜์™€ ์ „์—ญ๋ณ€์ˆ˜ ๊ฑ static์ด๋ฉด ์ผ๋‹จ ์ง€์—ญ์ด๋‹ค!??!?!?

๊ทธ๋ƒฅ ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์–ด์งœํ”ผ ๋ง์ปค๊ฐ€ ์‹ ๊ฒฝ์“ธ๊ฒŒ ์•„๋‹ˆ๋‹ˆ๊นŒ ์‹ฌ๋ณผ์ฒ˜๋ฆฌ ์ž์ฒด๋ฅผ ์•ˆํ•˜๋Š”๊ฑฐ๊ฐ™์Œ

static : ์ง€์—ญ, ์ „์—ญ์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ์„ ์–ธ๋œ ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค๋Š”๊ฑฐ๊ฐ™์Œ. ์ „์—ญ์ด๋ƒ ์ง€์—ญ์ด๋ƒ ์ด๋Ÿฐ๊ฑธ ํƒ€์ง€ ์•Š๋Š”๋‹ค. ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ฐ™์ดํ•œ๋‹ค. ๋‹จ ์„ ์–ธ๋œ ์Šค์ฝ”ํ”„๋Š” ๋”ฐ๋ผ๊ฐ. ํ•ด๋‹น ์Šค์ฝ”ํ”„ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์‹ฌ๋ณผ๋ถ„๋ฅ˜ revisited ์ „์—ญ์‹ฌ๋ณผ : nonstaticํ•จ์ˆ˜์™€ nonstatic ์ „์—ญ๋ณ€์ˆ˜ ์ง€์—ญ์‹ฌ๋ณผ : static ๋ชจ๋‘ donโ€™t care : ์ง€์—ญ๋ณ€์ˆ˜

images
images

๋ง์ปค๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋Š” careํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹จ ์ง€์—ญ๋ณ€์ˆ˜๋”๋ผ๋„ static ๋ณ€์ˆ˜๋ผ๋ฉด bss์™€ data์— ์ €์žฅ๋˜๋Š” ๋ณ€์ˆ˜๋กœ ์‹ฌ๋ณผ์„ ๋ถ€์—ฌ๋ฐ›๋Š” ์ง€์—ญ์‹ฌ๋ณผ์ด๋‹ค. ์ด์ ์— ์œ ์˜ํ•ด์•ผํ•จ. ์œ„์— ์‹ฌ๋ณผ๋ถ„๋ฅ˜ revisited๋ฅผ ํ™•์ธํ•˜์ž.

images

๋ง์ปค๊ฐ€ ์ค‘๋ณต๋œ๊ฒฝ์šฐ ์ŠคํŠธ๋กฑ์ด ์žˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด๋ฌด์กฐ๊ฑด์ด์•ผ strongํ•œ ์‹ฌ๋ณผ์„ ๋”ฐ๋ผ๊ฐ„๋‹ค. ์—†๋‹ค๋ฉด weak์ค‘ ๋žœ๋คํ•˜๊ฒŒ ์„ ํƒํ•œ๋‹ค.

strong์‹ฌ๋ณผ : ํ•จ์ˆ˜(ํ”„๋กœ์‹œ์ ธ)๋Š” ๋ฌด์กฐ๊ฑด strongํ•˜๋‹ค. ์ดˆ๊ธฐํ™”๋œ ๋ณ€์ˆ˜๋„ strongํ•จ. strong์€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์—†๊ฒ ์ฃ ?

weak์‹ฌ๋ณผ : ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด weakํ•˜๋‹ค. extern์ด๋กœ ์„ ์–ธ๋œ ๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ pdf 22ํŽ˜์ด์ง€ ํผ์ฆ ๋ณด๊ธฐ

relocation : ์—ฌ๋Ÿฌ relocatable objectํŒŒ์ผ์˜ .text์™€ .data์˜์—ญ (์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ)๋ฅผ ํ•˜๋‚˜์˜ .text์™€ .data๋กœ ํ•ฉ์ณ์ฃผ๊ธฐ์œ„ํ•ด ์œ„์น˜๋ฅผ ์žก์•„์ฃผ๋Š” ๊ณผ์ • โ†’ executable๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •

relocation์ด ์ด๋ค„์ง€๊ธฐ ์ „์—๋Š” ์‹ฌ๋ณผ์˜ ์ •ํ™•ํ•œ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. ์ƒ๋Œ€์ ์ธ ์ฃผ์†Œ๊ฐ™์€๊ฒŒ ๋“ค์–ด๊ฐ„๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ•จ์ˆ˜๋“ค์„ ํ•˜๋‚˜์˜ ์†Œ์Šค์— ๋งŒ๋“ค์–ด์„œ ๋งํฌํ•œ๋‹ค โ†’ ์‹œ๊ณต๊ฐ„์ ์œผ๋กœ ๋น„ํšจ์œจ์ ์ž„ ์•ˆ์“ฐ๋Š”๊ฒŒ ์„ž์ด๋‹ˆ๊นŒ

๊ฐ ํ•จ์ˆ˜๋ฅผ ๊ฐ ํŒŒ์ผ์—(cโ†’o) ๊ตฌํ˜„ํ•˜๊ณ  ํ•„์š”ํ•œ๊ฑธ ๋‹ค includeํ•œ๋‹ค. โ†’ ์žฌ๋ฃŒ : ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋ถ„๋ง 25g

ํ•ด๊ฒฐ์ฑ… :

์ •์ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ์•„์นด์ด๋ธŒํŒŒ์ผ .a โ†’ ์˜ค๋ธŒ์ ํŠธํŒŒ์ผ(๊ฐœ๋ณ„ ํ•จ์ˆ˜๋“ค)์„ ์—ฎ์–ด์„œ ์ธ๋ฑ์Šค๋ฅผํ†ตํ•ด ์ฐธ์กฐํ•˜๋„๋ก ํ•œ๋‹ค. ๋ง์ปค์˜ ๊ฐ•ํ™”๋ฒ„์ „. ์‹ฌ๋ณผ ์ฐธ์กฐ์‹œ ์•„์นด์ด๋ธŒ์˜ ํ…Œ์ด๋ธ”์„ ํ›‘์–ด์„œ ์‹ฌ๋ณผ์ด ์žˆ๋Š”์ง€ ํ™•์ธ, ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜๋„๋ก ๋งํฌํ•ด์ค€๋‹ค.์ด ํ›‘๋Š” ๊ณผ์ •์ด ๊ทผ๋ฐ ์ˆœ์„œ๊ฐ€ ์žˆ์Œ

cํŒŒ์ผ์„ oํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์„œ archive๋กœ ์—ฎ์„ ์ˆ˜ ์žˆ๋‹ค. executable์ด๋ž‘ ๋น„์Šทํ•œ๋“ฏ?

libc.a๋Š” ๊ธฐ๋ณธ ํฌํ•จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. libc์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ์ •์ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ž์—๋Š” lib์ด ๋ถ™๋Š”๋‹ค.

vector.h๋ฅผ includeํ•˜๋ฉด libvector.a๋ฅผ ๋งํฌํ•œ๋‹ค.

images
images

gcc -static -o prog2c main2.o -L -lvector โ† ์—ฌ๊ธฐ์— ์“ฐ์ด๋Š” ์ˆœ์„œ๊ฐ€ ๊ณง ํ™•์ธ ์ˆœ์„œ๋‹ค. ์•„์นด์ด๋ธŒ๊ฐ€ ๋’ค์— ์™€์•ผํ•จ

์œ„์—์„œ ๋งํ–ˆ๋“ฏ ์ •์  ๋งํฌ๋Š” ํ•˜๋‚˜๋กœ ์—ฎ์–ด์„œ ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ๋•Œ๋ฌธ์— ํฌ๊ธฐ๊ฐ€ ๊ต‰์žฅํžˆ ์ปค์ง„๋‹ญ

.o์™€ .a๊ฐ€ ์ฃผ์–ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ์Šค์บ”์„ํ•จ.main์ด ๋จผ์ € ์ฝํžˆ๊ณ  ํ•„์š”ํ•œ ์‹ฌ๋ณผ์„ ์•„์นด์ด๋ธŒ์—์„œ ์ฐพ์•„์•ผํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ˆœ์„œ๋Œ€๋กœ ์Šค์บ”ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€๋  ์ˆ˜ ์žˆ์Œ.

๊ณต์œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ์–ด์งœํ”ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์ž์ฃผ์“ฐ๋Š”๊ฑธ ๋ฌถ์–ด๋†จ๋‹ค๋ฉด ์กด๋‚˜ ์ค‘๋ณตํ•ด์„œ ์“ธํ…๋ฐ ๊ทธ๊ฑธ ์ค‘๋ณตํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š”๊ฑด ๋น„ํšจ์œจ์ด๋‹ค. ์ปดํŒŒ์ผ์‹œ์— executable์— ํฌํ•จ๋˜๊ฒŒ ํ•˜์ง€ ๋ง๊ณ  ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•˜๋ฉด ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋Š” ๋™์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์ž โ†’ Dynamic Link Library .so (shared object)

์‹คํ–‰๋  ๋•Œ ๋™์ ์œผ๋กœ ๋งํฌ๋œ๋‹ค. (load time linking)

์‹คํ–‰ ์ค‘์—๋„ ๋งํฌ๋  ์ˆ˜ ์žˆ๋‹ค (๋Ÿฐํƒ€์ž„ ๋งํ‚น, dlopen())

images

๋ง์ปค๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋งํฌํ•˜๋Š”๊ฑด ๋˜‘๊ฐ™์€๋ฐ loadํ›„์— ํ•„์š”ํ•˜๋ฉด ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋‹ˆ๊นŒ ์‹คํ–‰ํŒŒ์ผ์— ๋‹ค ํฌํ•จ๋˜์–ด์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์‹คํ–‰ํŒŒ์ผ์€ ์—†์ด ๋งŒ๋“ค์–ด๋†“๊ณ  ํ•„์š”ํ•  ๋•Œ ๋™์ ์œผ๋กœ so๋ฅผ ๊ฐ€์ ธ๋‹ค ์จ๋ผ ์ด๊ฑฐ์ง€ ์ด๊ฒŒ load time์— ๋™์ ๋งํฌํ•˜๋Š”๊ฑฐ๊ณ  ๋” ์‹ฌํ™”์ ์œผ๋กœ run time ์— ๋งํฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ๋งํฌํ•˜๋Š”๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

images

์ด๋ฒˆ์—” ์—์„ผ์…œํ•œ libc๋งŒ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๋งํฌํ•˜๊ณ  libvector๋Š” ์ง„์งœ ์“ธ์ผ์ด ์ƒ๊ธฐ๋ฉด dlopen์œผ๋กœ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ด๋‹ค. ๋ง๊ทธ๋Œ€๋กœ ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ๊ฐ–๋‹ค์“ฐ๋Š”๊ฑฐ.

์กฑ๋ณด

๋‹จํŽธํ™”

  • ๋‚ด๋ถ€ ๋‹จํŽธํ™” : ๊ฐ€์šฉ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ๊ฐ€ ํ• ๋‹นํ•  ๋ฐ์ดํ„ฐ๋ณด๋‹ค ํฐ ๋ธ”๋Ÿญ์— ๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ๋˜๋ฉด ์‹ค์ œ ์“ฐ๋Š” ๊ณต๊ฐ„๋ณด๋‹ค ๋ธ”๋Ÿญ์ด ํฐ๋ฐ ๊ฑฐ๊ธฐ์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ฒŒ๋จ. ์ด๊ฑธ ๋‚ด๋ถ€๋‹จํŽธํ™”๋ผํ•จ splitting์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•œ๋‹ค.

    images

</figure>

์˜ค๋ฒ„ํ—ค๋“œ๋„ ๋‹จํŽธํ™”์— ํฌํ•จ๋˜๋Š” ๊ฒƒ ๊ฐ™์Œ.
  • ์™ธ๋ถ€ ๋‹จํŽธํ™” : ๊ฐ€์šฉ๋ธ”๋Ÿญ์˜ ์ „์ฒด ํฌ๊ธฐ ํ•ฉ์€ ์ถฉ๋ถ„ํžˆ ํฌ์ง€๋งŒ, ์‹ค์งˆ์ ์œผ๋กœ ์–˜๋„ค๊ฐ€ ๋‹ค ์ชผ๊ฒŒ์ ธ์žˆ์–ด์„œ ๋” ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ coalesce ๋˜์ง€ ์•Š์€ free๋ธ”๋Ÿญ์˜ ์—ฐ์†์„ ์ƒ๊ฐํ•˜๋ฉด ์ข‹๋‹ค. coalescing์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•œ๋‹ค.

coalesce

  • ์ฆ‰์‹œ ํ†ตํ•ฉ : free ์‹œ coalesce
  • ์ง€์—ฐ ํ†ตํ•ฉ : malloc์‹œ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์‹œ์ , ํ˜น์€ ์™ธ๋ถ€๋‹จํŽธํ™”๊ฐ€ ์ผ์ • ์–‘์„ ๋„˜์–ด์„œ๋Š” ๋•Œ์— ์ผ๊ด„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹

waitpidํ•˜๋ฉด..

images

์„ ์„ โ€ฆ์œผ๋กœ ํ‘œ์‹œํ•ด์ฃผ์ž.

addjob after deletejob

images

child์˜ ์‹คํ–‰์ด ๋” ๋นจ๋ผ์„œ delete๊ฐ€ ๋จผ์ €์ผ์–ด๋‚˜๊ณ  add๊ฐ€ ์ผ์–ด๋‚˜๋ฉด add๋œ job์€ ๋ˆ„๊ฐ€์‚ญ์ œํ•ด์คŒ? โ†’ ์ข€๋น„๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

zombie

์ข€๋น„ํ”„๋กœ์„ธ์Šค ์ž์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์•ˆ์žก์•„๋จน์ง€๋งŒ, PID์˜ ์ˆ˜๊ฐ€ ์ œํ•œ์ ์ด๋ผ ์ข€๋น„๊ฐ€ ๋„ˆ๋ฌด๋งŽ์•„์ง€๋ฉด ๊ฐ€์šฉ PID๊ฐ€ ๋ชจ๋‘ ์†Œ๋ชจ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ฐ ๋ฐฉ์‹๋ณ„ ํŠน์ง•

  • ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ(implicit) : ํฌ๊ธฐ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋ธ”๋Ÿญ์„ ์—ฐ๊ฒฐํ•œ ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•จ
    • ๋ชจ๋“  ๋ธ”๋Ÿญ์„ ์ˆœํšŒํ•˜๋‹ค๋ณด๋‹ˆ ๋ชจ๋“  ๋ธ”๋Ÿญ์˜ ๊ฐœ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ์ƒ์ˆ˜์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ์ง์ ‘ ๋ฆฌ์ŠคํŠธ(explicit) : ํฌ๊ธฐ๋กœ ๊ฐ„์ ‘์ ์œผ๋กœ ๋ชจ๋“ ๋ธ”๋Ÿญ์„ ์—ฐ๊ฒฐํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ ์ฃผ์†Œ๋กœ ๊ฐ€์šฉ๋ธ”๋Ÿญ๋“ค๋งŒ ์—ฐ๊ฒฐํ•ด์„œ ๊ด€๋ฆฌํ•จ
    • ๊ฐ€์šฉ๋ธ”๋Ÿญ๋“ค๋กœ๋งŒ ์ด๋ค„์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ฐพ๋‹ค๋ณด๋‹ˆ ๋ชจ๋“  ๋ธ”๋Ÿญ์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ๋ณด๋‹ค๋Š” ํƒ์ƒ‰์ด ๋น ๋ฅด๋‹ค. ๊ฐ€์šฉ๋ธ”๋Ÿญ ์ˆ˜๋งŒํผ์— ํ•ด๋‹นํ•˜๋Š” ์ƒ์ˆ˜์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ๊ตฌ๋ถ„ ๋ฆฌ์ŠคํŠธ(segregated) : ์ง์ ‘๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ์ฃผ์†Œ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ํฌ๊ธฐ๋ณ„๋กœ ์—ฌ๋Ÿฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•จ
    • ํฌ๊ธฐ๋ณ„๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์šด์šฉํ•˜๋‹ˆ๊นŒ ๋Œ€๊ฐ• ์•Œ๋งž์€ ํฌ๊ธฐ ์ฐพ๊ธฐ์— ์œ ๋ฆฌํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฝ์ž…์— ์‹œ๊ฐ„์ด ๋น ๋ฅผ ๋ฟ ๋งŒ ์•„๋‹ˆ๋ผ ๋‹จํŽธํ™”๋„ ์ ์€ํŽธ์— ํ•ด๋‹นํ•œ๋‹ค. first-fit๋ฐฉ์‹์œผ๋กœ๋„ best-fit์— ๋งž๋จน๋Š” ์„ฑ๋Šฅ utilization๋„ ์ข‹๋‹ค๊ณ ๋Š” ์•ˆํ–ˆ๋‹ค!!
    • LIFO : ๋ธ”๋Ÿญ์„ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ๋ฐฐ์น˜ํ•œ๋‹ค ๋”ฐ๋ผ์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ฃผ์†Œ ๊ณ„์‚ฐํ• ํ•„์š” ์—†์ด ๋ฐ”๋กœ ์‚ฝ์ž…๋˜๋‹ˆ๊นŒ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. ๊ทธ์น˜๋งŒ ์ฃผ์†Œ์ •๋ ฌ๋ณด๋‹จ ๋‹จํŽธํ™”๊ฐ€ ๋Š˜์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
    • ์ฃผ์†Œ์ •๋ ฌ : LIFO๋ฐฉ์‹์ด๋ž‘ ๋‹ฌ๋ฆฌ ๋ชจ๋“  ๊ฐ€์šฉ๋ธ”๋Ÿญ๋“ค์˜ ์ฃผ์†Œ๋ฅผ ๋น„๊ตํ•ด์„œ ์ฃผ์†Œ์ˆœ์œผ๋กœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌ๋˜๋„๋ก ์‚ฝ์ž…ํ•˜๋ฏ€๋กœ LIFO๋ณด๋‹ค๋Š” ๋А๋ฆฌ๋‹ค. ๊ทธ๋ž˜๋„ ๋‹จํŽธํ™”๋Š” LIFO๋ณด๋‹ค ์ข€ ๋‚ซ๋‹ค ํ•˜๋„ค์š”

์˜ˆ์™ธ

interrupt๊ฒ€์ƒ‰ํ•ด๋ด ๊ฑฐ๊ธฐ ์žฅํ™ฉํ•˜๊ฒŒ ๋‚˜์˜ด

  • interrupt : ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋น„๋™๊ธฐํ˜•. ํ˜„์žฌ ๋‹ค์Œ ์ข…๋ฃŒ
  • trap : ์‹œ์Šคํ…œ์ฝœ, ๋ธŒ๋ ˆ์ด๋ผ ๋“ฑ. ๋‹ค์Œ์œผ๋กœ
  • fault : ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, ํŽ˜์ด์ง€ํดํŠธ ๋“ฑ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•œ๊ฑฐ. ํ˜„์žฌ๋กœ
  • abort : ํ•˜๋“œ์›จ์–ด์ ์ธ ๋ฌธ์ œ, ๋ณต๊ตฌ ๋ถˆ๊ฐ€. ์ข…๋ฃŒ

SIGPROCMASK์˜ ์ธ์ž๋“ค

images
images
images
Share: Twitter Facebook
Seunghun Yang's Picture

About Seunghun Yang

Seunghun is undergraduate student at Computer Science Engineering in CNU(Chungnam National University).

Daejeon, South Korea

Comments