๐ ์์คํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ง๊ณ ์ฌ ์ ๋ฆฌ
๊ธฐ๋ง๊ณ ์ฌ๋๋น
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๋ฅผ ํ์ง๋ง ๋ฐํ์ ์๋ฐ์๊ฒ ๋ฟ, ๋์ผํ๋ค.
void fork3(){
printf("L0\n");
fork();
printf("L1\n");
fork();
printf("L2\n");
fork();
printf("Bye\n");
}
์์ ์ด ์๋ฒฝํ๊ฒ ๋ง์ถฐ์ง์๋ ์๋๋ฏ.
void cleanup(void){
printf("cleaning up\n");
}
void fork6(){
atexit(cleanup); //atexitํจ์๋ก exit์์ ์คํํ ํจ์ ๋ฑ๋ก
fork();
exit(0);
}
fork๋ก ๋ถ๊ธฐํ์ผ๋๊น 2๊ฐ์ ํ๋ฆ์ด์๊ณ ๊ฒฐ๊ตญ์ exitํ๋๊น cleanup์ด ๋๋ฒ ๋ถ๋ฆด๊ฑฐ๊ฐ์๋ฐ?
์ ํํฉ๋๋ค!
//์ฐ์ต๋ฌธ์ 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
์ค์ง์ ์ผ๋ก ์ข ๋ฃ๋์๋๋ฐ ๋ถ๋ชจ์์ ์ ๋ฆฌ๊ฐ ์๋๊ฒ ์ข๋น ๊ฒฐ๊ตญ ์ค์ง์ ์ธ ์ ๋ฆฌ๋ ๋ถ๋ชจ๊ฐ ๋ค ํด์ค์ผํจ. ์ ๋ฆฌ์ํ๋ฉด 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)
}
}
์๋๋๋ค. 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๋ก ํ์ธ๊ฐ๋ฅ
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๋ ๋ฏ
์ ํํ๋ค์ด๊ฑฐ์ผ~~~~~
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๋ก ๋ฐํ๋ฐ์์ง๋คโฆ ๋ชฐ๋๋ ์ฌ์ค..!
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);
}
}
ํน์ 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๊ฐ์ง๊ฒฝ์ฐ๋ง ๊ฐ๋ฅ
์ ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง 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)
์ด์ผ๋ง์ท๋ ธ ์ใ ๋ จ์
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 ํ๋์ง ์ถ๋ ฅํ๋๊ฒ ํต์ฌ์ธ๊ฑฐ๊ฐ์๋ฐ, ์ํ๊ฒฝ์์ ์คํํด์ผํ๋๊ฑด์ง ์์๋จ.
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);
}
}
๋ด ์์ 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);
}
}
signal์ ํตํด ์ข ๋ฃ๋ ๊ฒฝ์ฐ, WIFSIGNALED๋ฅผ ํตํด ์ถ๋ ฅํ๋๋ก ํ๊ฒํ๋ฉด ๋จ. WTERMSIG๋ฅผ ํตํด์ ์ข ๋ฃ์ํจ ์๊ทธ๋ ๋ฒํธ๋ ์ป์ด์ฌ ์ ์๋ฐ.
์ปค๋์ด ์์ธ์ฒ๋ฆฌ์์ ํ๋ก์ธ์ค๋ก ๋ค์ ๋์ด์ฌ๋ pending๋ผ์๊ณ block๋์ง ์์๊ฒ๋ค์ ๊ณ์ฐํ๋ค. (๋๊ธฐ์ค์ด๊ณ ๋ธ๋ฝ๋์ง์์๊ฒ) ๋ง์ฝ ์๋ค๋ฉด(0์ด๋ผ๋ฉด) ๊ทธ๋ฅ ์ ์ด๋ฅผ ํ๋ก์ธ์ค์ ๋๊ฒจ์ค๋ฒ๋ฆฌ๋ฉด ๋์ง๋ง, ๊ทธ๋ ์ง ์๋ค๋ฉด 1์ธ ๋นํธ๋ฅผ ์ฐพ์๊ฐ ๊ทธ ๋นํธ์ ํด๋นํ๋ ์๊ทธ๋์ ์์ ํด์ ๊ทธ ์๊ทธ๋์๋ํด์ ์ฒ๋ฆฌ๋ฅผ ์งํํจ. ์ด๊ฑธ ๋ฐ๋ณตํด์ pnb๊ฐ 0์ด๋๋๋ก ๋ง๋ค์ด์ผ ๋๊ธฐ์ค์ธ ์๊ทธ๋์ด ๋ชจ๋ ์ฒ๋ฆฌ๋๋๊ฑฐ์ง. ์ด๊ฒ ๋ค ํด๊ฒฐ๋๋ฉด ํ๋ก์ธ์ค์ ๋๋ ค์ฃผ๋ฉด๋๋ค.
๋ํดํธ ์ก์ : ๊ฐ ์๊ทธ๋๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ ์ ์๋ ๋์๋ค์ด ์์.
- ํ๋ก์ธ์ค ์ข ๋ฃ
- ์ข ๋ฃ ํ core dump
- ์ ์ง (SIGCONT์ ๋ ฅ์๊น์ง)
- ๋ฌด์
signal()ํจ์๋ฅผ ํตํด ๊ธฐ๋ณธ๋์๋ ์์ ์ด๊ฐ๋ฅํ๋ค SIGSTOP์ด๋ SIGKILL์ ๋ง์์์๋ ์์ธ์
์ฐ๋ฆฌ ๊ณผ์ ์์ Signalํจ์๋ฅผ ํตํด ํด๋น signal์ ๊ธฐ๋ณธ ๋์์ ๊ฐ ํธ๋ค๋ฌ๋ก ๋๋ฆฐ๊ฒ์ ํ์ธํ ์ ์์. ์ ๊ฑฐ ์ฃผ์์ฒ๋ฆฌํ๊ณ ํ๊ฑฐ๋ ์ฃผ์ ๋ค์ ํ๊ณ ํ๊ฑฐ ๋ฐ์ ๋น๊ต ์ฐ๋ฆฌ๊ณผ์ ์์ ์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ์ด๋ฏธ ๊ธฐ๋ณธ๋์ default action์ด ์ ์๋์ด์๋๋ฐ ๊ทธ๊ฑธ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ๋ฉด ์์ด์ข ๋ฃ๊ฐ๋์ด๋ฒ๋ฆฐ๋ค. ๊ทธ๋๊น ๊ทธ๊ฑธ ๋ง์ผ๋ ค๊ณ ์ด๋ ๊ฒ ์ฌ์ ์ํด์ค๊ฑฐ!
handler_t *signal(int signum, handler_t *handler) : signum์ ํด๋นํ๋ ์๊ทธ๋์ ๋ํด ํธ๋ค๋ฌ๋ฅผ handler(์ฃผ์์ ์์นํ ํธ๋ค๋ฌ)๋ก ๋ณ๊ฒฝํด์ค๋ค.
handler ๋ถ๋ถ์ SIG_IGN์ด ๋ค์ด๊ฐ๋ฉด ์๊ทธ๋ ๋ฌด์, SIG_DFL์ด ๋ค์ด๊ฐ๋ฉด ๊ธฐ๋ณธ ์๊ทธ๋๋ก ๋ค์ ๋ณต๊ท์ํจ๋ค..!? ํ
์คํธํด๋ด
์๋ค.
๊ฐ๊ธฐ ํธ๋ค๋ฌ๋ฅผ ์๋ก ์ ์ํด์ค๊ฑฐ ๋ค์๋ค๊ฐ 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);
}
}
์ข ์ ๋งคํ๊ธดํ๋ฐ ์๋ฌดํผ ์์๋๋ก ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ธฐ๋ ํจ
์๊ทธ๋ ํธ๋ค๋ฌ ์ด์๋์????? ๋ญ๊ฐ๋ฌธ์ ์ธ์ง ์ ์ดํด ์๋จ.
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();
}
}
์ 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์ด ์ฃฝ์ด๋ฒ๋ฆฌ๋ฉด์ ๋๋จ
}
์์์ ๋ณธ ๊ฒ์ฒ๋ผ ํธ๋ค๋ฌ๊ฐ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ๋๋ค์ ์ธํฐ๋ฝํธ๋ก ํธ๋ค๋ฌ๋ก ๊ฐ ์ ์๋ค. ์ฌ๊ธฐ์๋ ์ฌ๊ท์์ผ๋ก ์ฒ๋ฆฌํ์ง๋ง, ๋ค๋ฅธ ํธ๋ค๋ฌ๋ก ๊ฐ๋๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๋ฅํจ. ๋ชจ๋ ํธ๋ค๋ฌ๊ฐ ์ข ๋ฃ๋๋ฉด ๋ฉ์ธ์ผ๋ก ๋์๊ฐ์ ์คํ๋จ.
๋ฌต์์ ๋ธ๋ก : ์ปค๋์ ํ์ฌ ์ฒ๋ฆฌ์ค์ธ ์๊ทธ๋๊ณผ ๋์ผํ ํ์ ์ ๋๊ธฐ ์๊ทธ๋์ ๋ธ๋ก โ ์งํ์ค์ธ ์๊ทธ๋์ด๋ ๊ฐ์๊ฒ ๋ค์ด์ค๋ฉด ๋ฌต์์ ์ผ๋ก ๋ธ๋ก๋๋ค
๋ช ์์ ๋ธ๋ก : 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์ด ๋๋๊ฒ!
race condition : concurrentํ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ํ๋์ ์์์ ์ ๊ทผํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ๋์์ง์ ์ ๊ฐ๋ฅ์ฑ์ ์ ๊ฑฐํด์ฃผ์ด์ผ ํ๋ค.
27ํ์ด์ง๋ 29ํ์ด์ง์์ ์ฐจ์ด๋ emptyset์ ๋ง๋ค์ด ์๊ทธ๋ ๋ฃ์ด์ฃผ๊ณ fork ์ ํ์ block unblock์ ๋ผ์์ค๊ฑฐ
race condition
๋์ผํ์์์ ๋์์ ๊ทผํ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ((pid = fork()) == 0) ์ด๋ผ๊ณ ํ๋ฉด pid๊ฐ fork ๋ ๋ concurrentํ๋ฉด 0์ธ์น๊ตฌ๋ค์ด ๋ง์์ ธ์ ๋์์ ๊ทผ๋ฌธ์ ๊ฐ ์๊ธธ์์๋ฐ?
์ ์ญ๋ณ์์ ์ ๊ทผํ ๋ ์๊ทธ๋์ ๋ธ๋ญ์ํจ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ํฌํฌํ ๋๋ ์๊ทธ๋์ ๋ธ๋ญํด์ค๋ค.
๊ทธ๋ฅ๋ญ๊ฐ race condition์ด ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ์ ์ ํ๋ก ๋ธ๋ฝ์ํด์ค์ผํ๋?
ํฌํฌํ๊ณ addjob๋๋๊ฑฐ๋ณด๋ค ์์์ด ๋จผ์ ์คํ๋ ์๋์๋๋ฐ, ์์์ด ๋ง์ฝ ์คํ๋์ด์ ๋ฐ๋ก ์ค์ง๋์ด๋ฒ๋ฆฌ๋ฉด addjob์ด ์คํ๋๊ธฐ๋ ์ ์ , ์ฆ global ๋ณ์์ธ job list์ ์ถ๊ฐ๋๊ธฐ๋์ ์ ์ ๊ฑฐ๊ฐ ์ํ๋ ์ ์๋ค. concurrentํ ์ปดํจํฐ์์ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ค์ด ๋์์ ์ํ๋๋ค๋ณด๋ ์ด๋ฐ ๊ฒฝ์ฃผ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒ. ๊ทธ๋์ ์์์ด ์คํ๋ ๋๋ signal์ ์ํฅ์ ๋ฐ์ง ๋ชปํ๊ฒํ๋๊ฒ! SIGCHLDํธ๋ค๋ฌ์์๋ delete์ ํ๋ก ๋ง์คํฌํด์ค๋ค.
main์์ child๊ฐ fork ๋์ด๋์ค๋ฉด pid๋ 0์ด๊ณ ์ํ์ด๋๋ค์์ SIGCHLD๊ฐ ๋ถ๋ฆฌ๋ฉด, (์ด ์ด์ ๊น์ง๋ ๋ธ๋ฝ๋์ด์์ด์ ๋ฌธ์ ๊ฐ ์๋๋ค) handler์์ pid๋ฅผ ์ข ๋ฃ๋ pid, ์ฆ 0์ด ์๋๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๊ฒ๋๊ณ , ๋ฐ๊ฟ๋๊ฒ ๋๋์๊ฐ ๋ถ๋ชจํ๋ก์ธ์ค์์ while๋ฌธ์ด ์ค๋จ๋๋ฉด์ ๋ค์ ํ์ผ๋ก ๋์ด๊ฐ๊ฒ๋๋๊ฒ. ์ด๋ฐ์์ผ๋ก ๋ช ์์ ์ผ๋ก ์๊ทธ๋์ ๊ธฐ๋ค๋ฆฌ๊ฒํ ์ ์๋ค.
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๋ก ํ์ ๋๋ฆฐ๋ค) ๊ทธ ํ์ด์ง์ ๋ชจ๋ ๋ธ๋ญ์ผ๋ก ๊ฐ์ฉ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์์์ํ๊ฒ์ฒ๋ผ ์ฒซ ๋ธ๋ก์ผ๋ก ํ ๋นํด์ค๋ค.
๋ธ๋ก๋ฐํ๋ฐฉ๋ฒ
๊ฐ์ฉ๋ธ๋ญ์ผ๋ก ๋ง๋ค๊ณ ํด๋น ํด๋์ค์ ๊ฐ์ฉ๋ฆฌ์คํธ์ ์ถ๊ฐ
์ฅ์
๊ฐ์ฉ๋ฆฌ์คํธ ๊ธฐ์ค์ผ๋ก ์ฐพ์ผ๋๊น ์๋ง๋๊ฑธ ๋นจ๋ฆฌ์ฐพ์ ์ ์๋ค. ๊ทธ๋์ ๋งค์ฐ ๋น ๋ฅธ ์์์๊ฐ์ ์ฒ๋ฆฌ์๊ฐ์ ๊ฐ์ง๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ด์ฉ๋ฅ ๋ ์ข์
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๋ค์ด ์ฎ์ด์ง ๊ฒ
์ฌ๋ณผ๋ถ๋ฅ
์ ์ญ์ฌ๋ณผ : ํด๋น ๋ชจ๋์์ ์ ์๋์ด ๋ค๋ฅธ ๋ชจ๋์์ ์ฐธ์กฐํ ์ ์๋ ์ฌ๋ณผ. non static ํจ์, ์ ์ญ๋ณ์
์ธ๋ถ์ฌ๋ณผ : ๋ค๋ฅธ ๋ชจ๋์์ ์ ์๋์ด ํด๋น ๋ชจ๋์์ ์ฐธ์กฐํ๋ ์ฌ๋ณผ. ์ ์ญ์ฌ๋ณผ์ ๋ค๋ฅธ๋ฐ์ ๊ฐ๋ค์ฐ๋ฉด ์ธ๋ถ์ฌ๋ณผ
์ง์ญ์ฌ๋ณผ : ํด๋น ๋ชจ๋์์ ์ ์๋์ด ํด๋น ๋ชจ๋์์๋ง ์ฐธ์กฐํ๋ ์ฌ๋ณผ. staticํจ์์ ์ ์ญ๋ณ์ ๊ฑ static์ด๋ฉด ์ผ๋จ ์ง์ญ์ด๋ค!??!?!?
๊ทธ๋ฅ ์ง์ญ๋ณ์๋ ์ด์งํผ ๋ง์ปค๊ฐ ์ ๊ฒฝ์ธ๊ฒ ์๋๋๊น ์ฌ๋ณผ์ฒ๋ฆฌ ์์ฒด๋ฅผ ์ํ๋๊ฑฐ๊ฐ์
static : ์ง์ญ, ์ ์ญ์์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ. ์ ์ธ๋ ๋ฒ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค๋๊ฑฐ๊ฐ์. ์ ์ญ์ด๋ ์ง์ญ์ด๋ ์ด๋ฐ๊ฑธ ํ์ง ์๋๋ค. ํ๋ก๊ทธ๋จ๊ณผ ๋ผ์ดํ์ฌ์ดํด์ ๊ฐ์ดํ๋ค. ๋จ ์ ์ธ๋ ์ค์ฝํ๋ ๋ฐ๋ผ๊ฐ. ํด๋น ์ค์ฝํ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ฌ๋ณผ๋ถ๋ฅ revisited ์ ์ญ์ฌ๋ณผ : nonstaticํจ์์ nonstatic ์ ์ญ๋ณ์ ์ง์ญ์ฌ๋ณผ : static ๋ชจ๋ donโt care : ์ง์ญ๋ณ์
๋ง์ปค๋ ์ง์ญ๋ณ์๋ careํ์ง ์๋๋ค.
๋จ ์ง์ญ๋ณ์๋๋ผ๋ static ๋ณ์๋ผ๋ฉด bss์ data์ ์ ์ฅ๋๋ ๋ณ์๋ก ์ฌ๋ณผ์ ๋ถ์ฌ๋ฐ๋ ์ง์ญ์ฌ๋ณผ์ด๋ค. ์ด์ ์ ์ ์ํด์ผํจ. ์์ ์ฌ๋ณผ๋ถ๋ฅ revisited๋ฅผ ํ์ธํ์.
๋ง์ปค๊ฐ ์ค๋ณต๋๊ฒฝ์ฐ ์คํธ๋กฑ์ด ์๋ค๋ฉด ๋ฌด์กฐ๊ฑด๋ฌด์กฐ๊ฑด์ด์ผ 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๋ฅผ ๋งํฌํ๋ค.
gcc -static -o prog2c main2.o -L -lvector โ ์ฌ๊ธฐ์ ์ฐ์ด๋ ์์๊ฐ ๊ณง ํ์ธ ์์๋ค. ์์นด์ด๋ธ๊ฐ ๋ค์ ์์ผํจ
์์์ ๋งํ๋ฏ ์ ์ ๋งํฌ๋ ํ๋๋ก ์ฎ์ด์ ์คํํ์ผ์ ๋ง๋ค๊ธฐ๋๋ฌธ์ ํฌ๊ธฐ๊ฐ ๊ต์ฅํ ์ปค์ง๋ญ
.o์ .a๊ฐ ์ฃผ์ด์ง ์์๋๋ก ์ค์บ์ํจ.main์ด ๋จผ์ ์ฝํ๊ณ ํ์ํ ์ฌ๋ณผ์ ์์นด์ด๋ธ์์ ์ฐพ์์ผํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์๋๋ก ์ค์บํ๊ธฐ๋๋ฌธ์ ๋ฌธ์ ๊ฐ๋ ์ ์์.
๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ์ด์งํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ ์์ฃผ์ฐ๋๊ฑธ ๋ฌถ์ด๋จ๋ค๋ฉด ์กด๋ ์ค๋ณตํด์ ์ธํ ๋ฐ ๊ทธ๊ฑธ ์ค๋ณตํด์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋๊ฑด ๋นํจ์จ์ด๋ค. ์ปดํ์ผ์์ executable์ ํฌํจ๋๊ฒ ํ์ง ๋ง๊ณ ๋ฐํ์์ ํ์ํ๋ฉด ๊ฐ์ ธ๋ค ์ธ ์ ์๋ ๋์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ โ Dynamic Link Library .so (shared object)
์คํ๋ ๋ ๋์ ์ผ๋ก ๋งํฌ๋๋ค. (load time linking)
์คํ ์ค์๋ ๋งํฌ๋ ์ ์๋ค (๋ฐํ์ ๋งํน, dlopen())
๋ง์ปค๊ฐ ๋ช ์์ ์ผ๋ก ๋งํฌํ๋๊ฑด ๋๊ฐ์๋ฐ loadํ์ ํ์ํ๋ฉด ๊ฐ์ ธ๋ค ์ฐ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋๊น ์คํํ์ผ์ ๋ค ํฌํจ๋์ด์๋๊ฒ ์๋๋ผ ์คํํ์ผ์ ์์ด ๋ง๋ค์ด๋๊ณ ํ์ํ ๋ ๋์ ์ผ๋ก so๋ฅผ ๊ฐ์ ธ๋ค ์จ๋ผ ์ด๊ฑฐ์ง ์ด๊ฒ load time์ ๋์ ๋งํฌํ๋๊ฑฐ๊ณ ๋ ์ฌํ์ ์ผ๋ก run time ์ ๋งํฌํ ์๋ ์๋ค.
๋ฐํ์์ ๋์ ์ผ๋ก ๋งํฌํ๋๋ฒ์ ์๋์ ๊ฐ๋ค.
์ด๋ฒ์ ์์ผ์ ํ libc๋ง ๊ฐ์ ธ๋ค๊ฐ ๋งํฌํ๊ณ libvector๋ ์ง์ง ์ธ์ผ์ด ์๊ธฐ๋ฉด dlopen์ผ๋ก ๊ฐ์ ธ๋ค๊ฐ ์ด๋ค. ๋ง๊ทธ๋๋ก ๋ฐํ์์ ๋์ ์ผ๋ก ๊ฐ๋ค์ฐ๋๊ฑฐ.
์กฑ๋ณด
๋จํธํ
-
๋ด๋ถ ๋จํธํ : ๊ฐ์ฉ๋ธ๋ญ์ ํฌ๊ธฐ๊ฐ ํ ๋นํ ๋ฐ์ดํฐ๋ณด๋ค ํฐ ๋ธ๋ญ์ ๊ทธ๋ฅ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ๊ฒ๋๋ฉด ์ค์ ์ฐ๋ ๊ณต๊ฐ๋ณด๋ค ๋ธ๋ญ์ด ํฐ๋ฐ ๊ฑฐ๊ธฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ ์ ์๊ฒ๋จ. ์ด๊ฑธ ๋ด๋ถ๋จํธํ๋ผํจ splitting์ ํตํด ํด๊ฒฐํ๋ค.
</figure>
์ค๋ฒํค๋๋ ๋จํธํ์ ํฌํจ๋๋ ๊ฒ ๊ฐ์.
- ์ธ๋ถ ๋จํธํ : ๊ฐ์ฉ๋ธ๋ญ์ ์ ์ฒด ํฌ๊ธฐ ํฉ์ ์ถฉ๋ถํ ํฌ์ง๋ง, ์ค์ง์ ์ผ๋ก ์๋ค๊ฐ ๋ค ์ชผ๊ฒ์ ธ์์ด์ ๋ ํ ๋นํ ์ ์๋ ๊ฒฝ์ฐ coalesce ๋์ง ์์ free๋ธ๋ญ์ ์ฐ์์ ์๊ฐํ๋ฉด ์ข๋ค. coalescing์ ํตํด ํด๊ฒฐํ๋ค.
coalesce
- ์ฆ์ ํตํฉ : free ์ coalesce
- ์ง์ฐ ํตํฉ : malloc์ ๊ฐ์ฉ๋ฆฌ์คํธ๋ฅผ ๊ฒ์ํ๋ ์์ , ํน์ ์ธ๋ถ๋จํธํ๊ฐ ์ผ์ ์์ ๋์ด์๋ ๋์ ์ผ๊ด ํตํฉํ๋ ๋ฐฉ์
waitpidํ๋ฉด..
์ ์ โฆ์ผ๋ก ํ์ํด์ฃผ์.
addjob after deletejob
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์ ์ธ์๋ค
Comments