๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

OS

4์žฅ Process Management

 

reference: kocw์˜ ๋ฐ˜ํšจ๊ฒฝ ๊ต์ˆ˜๋‹˜ ๊ฐ•์˜์™€ ๊ถŒ์ง„์šฑ ๊ต์ˆ˜๋‹˜ ๊ฐ•์˜(๋Œ€ํ•™ ์ •๊ทœ ์ˆ˜์—…)
์ˆ˜์—…์„ ๋“ฃ๊ณ ๋‚˜์„œ ๊ฐ•์˜ ๊ต์žฌ๋ฅผ ํƒ€์ดํ•‘ํ•˜๊ณ  ํ•„๊ธฐํ•œ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์›น๋ทฐ์—์„œ toc๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
github์˜ md ํŒŒ์ผ๋กœ ๋ณด๋Š” ๊ฒŒ ํŽธํ•˜์‹œ๋‹ค๋ฉด, ์—ฌ๊ธฐ๋กœ ์ด๋™ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


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

  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ
  • ํ”„๋กœ์„ธ์Šค์˜ ํŠธ๋ฆฌ(๊ณ„์ธต ๊ตฌ์กฐ) ํ˜•์„ฑ
  • ํ”„๋กœ์„ธ์Šค๋Š” ์ž์›์„ ํ•„์š”๋กœ ํ•จ
    • ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๊ฐ๊ฐ ๋ฐ›๋Š”๋‹ค (๋Œ€๋ถ€๋ถ„)
    • ๋ถ€๋ชจ์™€ ๊ณต์œ ํ•œ๋‹ค (์ด๋ก€์ ์ž„)
  • ์ž์›์˜ ๊ณต์œ 
    • ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋ชจ๋“  ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋ธ
    • ์ผ๋ถ€ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋ธ
    • ์ „ํ˜€ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ (๋Œ€๋ถ€๋ถ„)
  • ์ˆ˜ํ–‰
    • ๋ถ€๋ชจ์™€ ์ž์‹์€ ๊ณต์กดํ•˜๋ฉฐ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋ธ
    • ์ž์‹์ด ์ข…๋ฃŒ๋  ๋•Œ๊ฐ€์ง€ ๋ถ€๋ชจ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ชจ๋ธ
  • ์ฃผ์†Œ ๊ณต๊ฐ„ (Address space - code, data, stack)
    • ์ž์‹์€ ๋ถ€๋ชจ์˜ ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•จ
    • ์ž์‹์€ ๊ทธ ๊ณต๊ฐ„์— ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์˜ฌ๋ฆผ
  • ์œ ๋‹‰์Šค์˜ ์˜ˆ
    • fork() ์‹œ์Šคํ…œ ์ฝœ๋กœ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œ ์ƒ์„ฑ
      • ๋ถ€๋ชจ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ (PID๋ฅผ ์ œ์™ธํ•œ OS data)
      • ์ฃผ์†Œ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›์Œ
    • fork ๋‹ค์Œ์— ์ด์–ด์ง€๋Š” exec() ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆผ.

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

<์ž๋ฐœ์ > : ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ์šด์˜์ฒด์ œ์—๊ฒŒ ์ด๋ฅผ ์•Œ๋ ค์คŒ (exit)

  • ์ž์‹์ด ๋ถ€๋ชจ์—๊ฒŒ output data๋ฅผ ๋ณด๋ƒ„
  • ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ์ข… ์ž์›๋“ค์ด ์šด์˜์ฒด์ œ์—๊ฒŒ ๋ฐ˜๋‚ฉ๋จ

<๊ฐ•์ œ๋กœ> : ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹์˜ ์ˆ˜ํ–‰์„ ์ข…๋ฃŒ์‹œํ‚ด (abort)

  • ์ž์‹์ด ํ• ๋‹น ์ž์›์˜ ํ•œ๊ณ„์น˜๋ฅผ ๋„˜์–ด์„ฌ
  • ์ž์‹์—๊ฒŒ ํ• ๋‹น๋œ ํƒœ์Šคํฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
  • ๋ถ€๋ชจ๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋ฉด?
    • ์šด์˜์ฒด์ œ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ, ์ž์‹์ด ๋” ์ด์ƒ ์ˆ˜ํ–‰๋˜๋„๋ก ๋‘์ง€ ์•Š๋Š”๋‹ค.
    • ์ƒ์† ๊ด€๊ณ„์—์„œ ๋ง๋‹จ์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ถ€ํ„ฐ ๋‹จ๊ณ„์ ์œผ๋กœ ์ข…๋ฃŒ๊ฐ€ ๋œ๋‹ค.

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

  • fork(): create a child (copy)
  • exec(): overlay new image
  • wait(): sleep until child is done
  • exit(): frees all the resources, notify parent
  • ์ž์›์„ ๋‹ค ๋ฐ˜๋‚ฉํ•˜๊ณ  ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋ณธ์ธ์ด ์ฃฝ๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ํ”„๋กœ์„ธ์Šค๋Š” ์šด๋ช…์„ ๋‹คํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ

3-1. fork() ์‹œ์Šคํ…œ ์ฝœ

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

int main() {
    int pid;
    pid = fork();
    if (pid == 0)
	// this is child
    else if (0 < pid)
        // this is parent
}

fork() ์‹œ์Šคํ…œ ์ฝœ์€ ํ•ด๋‹น ๊ตฌ์กฐ(์ฝ”๋“œ)๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๋•Œ ์ž๊ธฐ ์ž์‹ ์˜ context ์ฆ‰ memory ์ฃผ์†Œ ๊ณต๊ฐ„๊ณผ CPU์˜ ๋ฌธ๋งฅ (ํ˜„์žฌ register๊ฐ’, program counter)๋„ ๋ณต์ œ๋˜์–ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณต์ œ๋œ ํ”„๋กœ์„ธ์Šค๋„ if๋ฌธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋ถ€๋ชจ์˜ ๋ฌธ๋งฅ์„ ์ด์–ด๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Q. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‘˜์€ ๋ณ„๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค์ธ๋ฐ ์–ด๋–ป๊ฒŒ ๋ถ€๋ชจ-์ž์‹์„ ๊ตฌ๋ถ„ํ• ๊นŒ?

A. fork()๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๊ฐ’ (return value)๊ฐ€ ๋ถ€๋ชจ์ธ ๊ฒฝ์šฐ pid๋ฅผ ์–‘์ˆ˜๋กœ ๋ฐ›๊ณ  ์ž์‹์€ 0์„ ๊ฐ€์ง.

3-2. exec() ์‹œ์Šคํ…œ ์ฝœ

ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฎ์–ด ์”Œ์›Œ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ํ•จ.

int main() {
    int pid;
    pid = fork();
    if (pid == 0) {
		// this is child
        execlp("/bin/date", "/bin/date", (char *) 0);
    	// ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„์„ 2๋ฒˆ ์ ์–ด์ฃผ๊ณ  3๋ฒˆ์งธ ์ธ์ž๋ถ€ํ„ฐ๋Š” ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•  argument๋ฅผ ๋‚˜์—ฐํ•œ ๋’ค์— zero pointer (character null)๋ฅผ ์“ฐ๋ฉด ์‹คํ–‰๋œ๋‹ค.
    	printf("์ถœ๋ ฅ ์•ˆ๋จ, exec ์ดํ›„์˜ ์ฝ”๋“œ๋Š” ์‹คํ–‰ ์•ˆ ๋จ.");
        //  ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฎ์—ฌ์„œ ์‹œ์ž‘๋ถ€๋ถ„๋ถ€ํ„ฐ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ. 
        // return value ์ฒ˜๋Ÿผ ๋˜๋Œ์•„์˜ค๊ณ  ์ด๋Ÿฐ ๊ฑฐ ์ „ํ˜€ ์—†์Œ. 
        // ์˜จ์ „ํžˆ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ์œผ๋กœ ํƒœ์–ด๋‚˜์„œ ๊ทธ ์„ธ๊ณ„์—์„œ ํ‰์ƒ ์‚ด์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    } else if (0 < pid)
        // this is parent
}

3-3. wait() ์‹œ์Šคํ…œ ์ฝœ

  • ํ”„๋กœ์„ธ์Šค A๊ฐ€ wait() ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๋ฉด ์ปค๋„์€ child๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค A๋ฅผ sleep ์‹œํ‚จ๋‹ค (block ์ƒํƒœ)
  • Child process๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ปค๋„์€ ํ”„๋กœ์„ธ์Šค A๋ฅผ ๊นจ์šด๋‹ค (ready ์ƒํƒœ)
int main {
    int pid;
	pid = fork();
    if (pid == 0)
	// this is child
    else if (0 < pid)
        // this is parent
        wait();
}

Q. ์™œ ์ด ๊ธฐ๋Šฅ์„ ์ง€์›? ์–ธ์ œ ์“ฐ์ด์ง€?

A. Linux command๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. vi editor ํŽธ์ง‘ ์ข…๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋œจ๋Š” ๊ฒŒ ์—†๋‹ค๊ฐ€ (๋ถ€๋ชจ๋Š” blocked) ์ข…๋ฃŒํ•˜๋ฉด ๋‹ค์‹œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋จ.

linux์—์„œ command๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ shell์ด๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋– ์žˆ๊ณ  ls ์ด๋Ÿฐ ํ•˜๋‚˜์˜ process (์ด๋ฉด์„œ ๋ช…๋ น์–ด)๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค ํ˜•ํƒœ๋กœ ์‹คํ–‰๋จ.

๋ถ€๋ชจ๊ฐ€ wait์„ ์•ˆํ•˜๋ฉด ๊ฒฝ์Ÿ ๊ด€๊ณ„๊ฐ€ ๋œ๋‹ค. CPU๋ฅผ ๋จผ์ € ์–ป์œผ๋ ค๋Š” ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์Šค์ด๊ธฐ์—.

3-4. exit() ์‹œ์Šคํ…œ ์ฝœ

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

  • ์ž๋ฐœ์  ์ข…๋ฃŒ
    • ๋งˆ์ง€๋ง‰ statement ์ˆ˜ํ–‰ ํ›„ exit() ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์ข…๋ฃŒ๋จ
    • ํ”„๋กœ๊ทธ๋žจ์— ๋ช…์‹œ์ ์œผ๋กœ ์ ์–ด์ฃผ์ง€ ์•Š์•„๋„ main ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๋˜๋Š” ์œ„์น˜์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋„ฃ์–ด์คŒ
  • ๋น„์ž๋ฐœ์  ์ข…๋ฃŒ
    • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒ์‹œํ‚ด
      • ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•œ๊ณ„์น˜๋ฅผ ๋„˜์–ด์„œ๋Š” ์ž์›Œ ์š”์ฒญ (OS๊ฐ€ ์ฃฝ์ผ ์ˆ˜๋„ ์žˆ์Œ)
      • ์ž์‹์—๊ฒŒ ํ• ๋‹น๋œ ํƒœ์Šคํฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
    • ํ‚ค๋ณด๋“œ๋กœ kill, break ๋“ฑ์„ ์นœ ๊ฒฝ์šฐ
    • ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ
      • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์ž์‹๋“ค์ด ๋จผ์ € ์ข…๋ฃŒ๋จ

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

4-1. ๋…๋ฆฝ์  ํ”„๋กœ์„ธ์Šค(Indepedent process)

ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ์ž์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ, ์›์น™์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜ํ–‰์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ๋ชปํ•จ

4-2. ํ˜‘๋ ฅ ํ”„๋กœ์„ธ์Šค(Cooperating process)

ํ”„๋กœ์„ธ์Šค ํ˜‘๋ ฅ ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜ํ–‰์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ

  • message passing: ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•
    • Direct Communication: ํ†ต์‹ ํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ
    • Indirect Communication: mailbox (๋˜๋Š” port)๋ฅผ ํ†ตํ•ด ๋ฉ”์„ธ์ง€๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์ „๋‹ฌ
    • P๋Š” message๋ฅผ mailbox์— ๋‹ด๊ณ  ์šด ์ข‹๊ฒŒ Q๊ฐ€ mailbox๋ฅผ ์—ด์–ด๋ณด๋ฉด message๋ฅผ ๋ฐ›๊ฒŒ ๋˜๊ฑฐ๋‚˜ ์•„๋‹˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ mailbox๋ฅผ ์—ด์–ด ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Œ
  • ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์— ๊ณต์œ  ๋ณ€์ˆ˜๋ฅผ ์ผ์ฒด ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปค๋„์„ ํ†ตํ•ด ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ†ต์‹ ํ•œ๋‹ค.
  • shared memory: ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๊ฐ„์—๋„ ์ผ๋ถ€ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๊ฒŒ ํ•˜๋Š” shared memort ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์Œ.
  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ์— system call๋กœ ๊ฐ™์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๊ณ  ๋ถ€ํƒํ•˜๋ฉด, ์„œ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ๋ฉ”๋ชจ๋ฆฌ ์ผ๋ถ€๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋กœ ํ˜‘๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

'OS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

7์žฅ Deadlock  (0) 2021.06.19
6์žฅ Process Synchronization  (0) 2021.06.19
5์žฅ CPU scheduling  (0) 2021.06.18
3์žฅ Process  (0) 2021.06.18
2์žฅ System Structure & Program Execution  (0) 2021.06.18
1์žฅ Introduction to Operating System  (0) 2021.06.18