Computer Science/OS

๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๋ฆฌ๋ˆ…์Šค ๊ตฌ์กฐ 2์žฅ. ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ(๊ธฐ์ดˆํŽธ)

์ฑ”๐Ÿป 2024. 1. 29. 09:08

์ถœ์ฒ˜: ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๋ฆฌ๋ˆ…์Šค ๊ตฌ์กฐ

๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๋ฆฌ๋ˆ…์Šค ๊ตฌ์กฐ - ์˜ˆ์Šค24
์„ ๋ฐฐ๊ฐ€ ์˜†์—์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ์•Œ๋ ค์ฃผ๋“ฏ ์นœ์ ˆํžˆ ์„ค๋ช…ํ•ด์ฃผ๋Š”์‹ค์Šต๊ณผ ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๋ฆฌ๋ˆ…์Šค ์ง€์‹์˜ ๋ชจ๋“  ๊ฒƒ * Go ์–ธ์–ด์™€ Python, Bash ์Šคํฌ๋ฆฝํŠธ ์‹ค์Šต ์ฝ”๋“œ ์ œ๊ณต* ์ด ๋„์„œ๋Š” ใ€Ž์‹ค์Šต๊ณผ ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๋ฆฌ๋ˆ…์Šค ๊ตฌ์กฐใ€์˜ ๊ฐœ์ •ํŒ์ž…๋‹ˆ๋‹ค.๋ฆฌ๋ˆ…์Šค ์ปค๋„ ์ฑ…์˜ ๋‘๊ป˜์™€ ๊นŠ์ด์— ...
https://www.yes24.com/Product/Goods/122109062

ps aux : ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ํ™•์ธ

  • โ€”no-header : ํ—ค๋” ์ถœ๋ ฅ ์ œ๊ฑฐ
  • ps aux --no-header | wc -l

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

๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค : ๋์— d๊ฐ€ ๋ถ™๋Š”๋‹ค.(์‹คํ–‰ ๋๋‚ด๊ณ  ์ฃฝ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ณ„์† ๋– ์žˆ์Œ)

ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• : fork(), execve()

<๋ชฉ์ >

  1. ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ ์ฒ˜๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์— ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ(ex. ์›น์„œ๋ฒ„์—์„œ ๋‹ค์ˆ˜์˜ ์š”์ฒญ๋ฐ›๊ธฐ)

    ์–˜๊ฐ€ ๋ชฉ์ ์ด๋ฉด fork()๋งŒ ์‚ฌ์šฉ

  1. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ(ex. bash์—์„œ ๊ฐ์ข… ํ”„๋กœ๊ทธ๋žจ์„ ์ƒˆ๋กœ ์ƒ์„ฑ)

    ์–˜๊ฐ€ ๋ชฉ์ ์ด๋ฉด fork() ์™€ execve() ๋‘˜ ๋‹ค

๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‘ ๊ฐœ๋กœ ๋ถ„์—ด์‹œํ‚ค๋Š” fork() ํ•จ์ˆ˜

fork() : ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‘ ๊ฐœ๋กœ ๋ถ„์—ด

  • ๋ฐ˜ํ™˜๊ฐ’

    ๋ถ€๋ชจ : ์ž์‹์˜ PID

    ์ž์‹ : 0

    ํ”„๋กœ์„ธ์Šค ID๋Š” ๋ฐ˜๋“œ์‹œ 1 ์ด์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ถ„ ๊ฐ€๋Šฅ

๋ถ€๋ชจ โ†’ ์ž์‹์œผ๋กœ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ์ž‘์—…์€ Copy-on-Write ๋•๋ถ„์— ๋ฌด์ฒ™ ์ ์€ ๋น„์šฉ์œผ๋กœ ๋๋‚จ.

โ†’ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ๋งŽ์ง€ ์•Š๋‹ค.

#!/usr/bin/python3

import os, sys

ret = os.fork()
if ret == 0:
    print("์ž์‹ ํ”„๋กœ์„ธ์Šค: pid={}, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ pid={}".format(os.getpid(), os.getppid()))
    exit()
elif ret > 0:
    print("๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค: pid={}, ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ pid={}".format(os.getpid(), ret))
    exit()

sys.exit(1)

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ๊ธฐ๋™ํ•˜๋Š” execve() ํ•จ์ˆ˜

= ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋Œ€์ฒด

์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ : ์ตœ์ดˆ์— ์‹คํ–‰ํ•  ๋ช…๋ น(C์—์„œ๋Š” main ํ•จ์ˆ˜, Java์—์„œ main ๋ฉ”์„œ๋“œ)

fork() ํ•จ์ˆ˜๋กœ ํ”„๋กœ์„ธ์Šค ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค์— exevce() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฐ”๋€๋‹ค.

fork() ํ•จ์ˆ˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ „ํ˜€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์น˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.

cc -o puase -no-pie pause.c

-no-pie ์˜ต์…˜ : PIE ๋ฌดํšจํ™”(PIE = ASLR์— ๋Œ€์‘)

readelf -h : ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์ฃผ์†Œ ํ™•์ธํ•˜๊ธฐ

readelf -S : ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ์˜ ํŒŒ์ผ ์˜คํ”„์…‹, ํฌ๊ธฐ, ์‹œ์ž‘ ์ฃผ์†Œ

ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ ๋งต : /proc/<pid>/maps

ASLR๋กœ ๋ณด์•ˆ ๊ฐ•ํ™”

ASLR์€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๊ฐ€ ๊ฐ ์„น์…˜์„ ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋งตํ•‘ํ•œ๋‹ค.

โ†’ ํŠน์ • ์ฃผ์†Œ์— ๊ณ ์ •์œผ๋กœ ์กด์žฌํ•  ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์— ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Position Independent Execualbe(PIE) = ASLR์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

-no-pie ์˜ต์…˜ ์‚ฌ์šฉ ์‹œ PIE๋ฅผ ๋ฌดํšจํ™” ํ•œ๋‹ค.

no-pie

2๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ์žฅ์†Œ์— ๋ฉ”๋ชจ๋ฆฌ ๋งต๋˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„

<์ปดํ“จํ„ฐ ์ „์›์„ ์ผฐ์„ ๋•Œ์˜ ์‹œ์Šคํ…œ ์ดˆ๊ธฐํ™” ์ˆœ์„œ>

pstree : ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œ์‹œ

  • -p : PID๋„ ํ‘œ์‹œ

pid 1 = init ํ”„๋กœ์„ธ์Šค = systemd

[Column] fork() ํ•จ์ˆ˜์™€ execve() ํ•จ์ˆ˜ ์ด์™ธ์˜ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•

์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด fork(), execve() ํ•จ์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฑด ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—….

์ด๊ฑธ posix_spawn() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ๋Š” posix_spawn() ํ•จ์ˆ˜๋ฅผ ์จ์„œ echo ๋ช…๋ น์–ด๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋กœ ์ƒ์„ฑํ•˜๋Š” spawn.py ํ”„๋กœ๊ทธ๋žจ.

๐Ÿ’กfork() ํ•จ์ˆ˜ ํ˜ธ์ถœ ์งํ›„์— ๊ณง๋ฐ”๋กœ execve() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งŒ posix_spawn() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ ์™ธ ์ƒํ™ฉ์ด๋ผ๋ฉด ๋ชจ๋‘ fork() ํ•จ์ˆ˜์™€ exevce() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ.

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

ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋™ํ•œ ์‹œ๊ฐ ๋ฐ ์‚ฌ์šฉํ•œ CPU ์‹œ๊ฐ„ ํ•ฉ๊ณ„ โ†’ ps aux์˜ START ํ•„๋“œ ๋ฐ TIME ํ•„๋“œ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

<ํ”„๋กœ์„ธ์Šค ์ƒํƒœ(Process Status) ํ•„๋“œ = STAT ํ•„๋“œ>

  1. R: Running(์‹คํ–‰ ์ค‘)

    ์‹ค์ œ CPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ

  1. S: Sleeping(๋Œ€๊ธฐ ์ค‘)

    ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰๋œ ํ›„ ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ CPU๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ€๋งŒํžˆ ์žˆ๋‹ค.

  1. Z: Zombie(์ข…๋ฃŒ๋˜์—ˆ์ง€๋งŒ ์•„์ง ์‚ญ์ œ๋˜์ง€ ์•Š์Œ)

    ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ ์ข€๋น„ ์ƒํƒœ๊ฐ€ ๋˜๊ณ  ์กฐ๊ธˆ ์žˆ๋‹ค๊ฐ€ ์†Œ๋ฉธ.

  1. R: Runnable(์‹คํ–‰ ๊ฐ€๋Šฅ) : CPU๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ํ”„๋กœ์„ธ์Šค
  1. I: Idle(์•„์ด๋“ค) : ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š” ํŠน์ˆ˜ํ•œ ํ”„๋กœ์„ธ์Šค

    ๐Ÿ’กPC๋‚˜ ์Šค๋งˆํŠธํฐ์—์„œ ์•„๋ฌด๋Ÿฐ ํ”„๋กœ๊ทธ๋žจ๋„ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฐฐํ„ฐ๋ฆฌ๊ฐ€ ์˜ค๋ž˜๊ฐ€๋Š” ๊ฑด ๋…ผ๋ฆฌ CPU๊ฐ€ ์•„์ด๋“ค ์ƒํƒœ์ธ ์‹œ๊ฐ„์ด ๊ธธ์–ด์„œ ์†Œ๋น„ ์ „๋ ฅ์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์ž„.

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

exit_group() : ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ์Šคํ…œ ์ฝœ

๋‚ด๋ถ€์—์„œ ์ปค๋„์ด ๋ฉ”๋ชจ๋ฆฌ ๊ฐ™์€ ์ž์›์„ ํšŒ์ˆ˜ํ•จ

ํŒŒ์ด์ฌ exit() : ๋‚ด๋ถ€์—์„œ ์œ„์˜ ์‹œ์Šคํ…œ ์ฝœ ํ˜ธ์ถœํ•จ

ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ ์ข…๋ฃŒ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๋Š”๋ฐ, ์ด ๋ฐ˜ํ™˜๊ฐ’์— ๋”ฐ๋ผ ํ”„๋กœ์„ธ์Šค์˜ ์ •์ƒ, ๋น„์ •์ƒ ์ข…๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํŒ์ •ํ•ด์„œ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ›„์† ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

wait() : ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒํ•˜๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•ด ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ข€๋น„ ํ”„๋กœ์„ธ์Šค์™€ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค

์ข€๋น„ ํ”„๋กœ์„ธ์Šค : ์ข…๋ฃŒํ–ˆ์ง€๋งŒ ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์€ ์ƒํƒœ์˜ ํ”„๋กœ์„ธ์Šค

๐Ÿ’ก์ข€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€๋“ํ•ด์„œ ์ž์›๋งŒ ์žก์•„๋จน์ง€ ์•Š๋„๋ก, ๋ถ€๋ชจ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ์ œ๋•Œ ํšŒ์ˆ˜ํ•ด์„œ ์ž์›์„ ์ปค๋„๋กœ ๋Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค.

๊ณ ์•„ ํ”„๋กœ์„ธ์Šค : wait() ๊ณ„์—ด ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋จ (๋ถ€๋ชจ๊ฐ€ ๋จผ์ € ์ฃฝ์œผ๋ฉด ๊ณ ์•„๊ฐ€ ๋œ๋‹ค.)

๐Ÿ’ก์ปค๋„์€ init(systemd)์„ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ชจ๋กœ ์ง€์ •ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด init์— ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ฌ๋ ค๋“ฆ. ๊ทธ๋Ÿผ init์€ ์ •๊ธฐ์ ์œผ๋กœ wait() ๊ณ„์—ด ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•ด์„œ ์‹œ์Šคํ…œ ์ž์›์„ ํšŒ์ˆ˜ํ•œ๋‹ค.

์‹œ๊ทธ๋„

์‹œ๊ทธ๋„ : ํ”„๋กœ์„ธ์Šค์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด์„œ ์™ธ๋ถ€์—์„œ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ฐ•์ œ์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

  1. SIGINT : ์ฆ‰์‹œ ์ข…๋ฃŒ โ† ๋Œ€ํ‘œ์ !

    bash ๊ฐ™์€ ์…ธ์—์„œ Ctrl + C ๋ˆ„๋ฅด๋ฉด ๋ฐœ์ƒ.

  1. SIGCHLD : ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ๋ณด๋‚ด๋Š” ์‹œ๊ทธ๋„.
  1. SIGSTOP : ํ”„๋กœ์„ธ์Šค ์ผ์‹œ์ •์ง€. bash์—์„œ Ctrl + Z
  1. SIGCONT : SIGSTOP ๋“ฑ์œผ๋กœ ์ •์ง€ํ•œ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์žฌ๊ฐœ.

๋” ๋งŽ์€ ์‹œ๊ทธ๋„ ๋ชฉ๋ก์€ man 7 signal ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

SIGINT๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณง๋ฐ”๋กœ ์ข…๋ฃŒํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ์ง€๋งŒ ๊ผญ ๊ทธ๋Ÿฐ ๊ฑด ์•„๋‹ˆ๋‹ค.

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

์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Ctrl + C๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ์ข…๋ฃŒํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

#!/usr/bin/python3

import signal

# SIGINT ์‹œ๊ทธ๋„์„ ๋ฌด์‹œํ•˜๋„๋ก ์„ค์ •.
# ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•  ์‹œ๊ทธ๋„(์—ฌ๊ธฐ์„œ๋Š” signal.SIGINT)
# ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์—๋Š” ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ(์—ฌ๊ธฐ์„œ๋Š” signal.SIG_IGN)๋ฅผ ์ง€์ •
signal.signal(signal.SIGINT, signal.SIG_IGN)

while True:
    pass

์ด๋ ‡๊ฒŒ ์•ˆ ์ฃฝ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ๋ฆฌ๊ณ  ์ฃฝ์ด๋ฉด ๋œ๋‹ค.

  1. Ctrl + Z๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ๋ฆฌ๊ธฐ
  1. kill๋กœ ์ข…๋ฃŒ

SIGKILL : ๋ฐ˜๋“œ์‹œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์ด๋Š” ์‹œ๊ทธ๋„. SIGINT ๋“ฑ์„ ์จ๋„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ตœํ›„์˜ ์ˆ˜๋‹จ ๊ฐ™์€ ์‹œ๊ทธ๋„์ด๋‹ค.

์…€ ์ž‘์—… ๊ด€๋ฆฌ ๊ตฌํ˜„

์ž‘์—…(job) : bg ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๋™์ž‘ ๊ตฌ์กฐ

$ sleep infinity & 
[1] 3857                                   // 1์ด ์ž‘์—… ๋ฒˆํ˜ธ
$ sleep infinity &
[2] 3858                                   // 2๊ฐ€ ์ž‘์—… ๋ฒˆํ˜ธ
$ jobs                                     // ์ž‘์—… ๋ชฉ๋ก ํ‘œ์‹œ
[1]-  Running          sleep infinity &
[2]+  Running          sleep infinity &
$ fg 1                                     // 1๋ฒˆ ์ž‘์—…์„ ํฌ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ๋งŒ๋“ฆ
sleep infinity
^Z // Ctrl+Z๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋‹ค์‹œ bash๋กœ ์ œ์–ด๊ฐ€ ๋Œ์•„์˜ด (bg job์œผ๋กœ ๋ณ€๊ฒฝ)
[1]+  Stopped          sleep infinity

์„ธ์…˜

= ์‚ฌ์šฉ์ž๊ฐ€

๋ชจ๋“  ์„ธ์…˜์—๋Š” ํ•ด๋‹น ์„ธ์…˜์„ ์ œ์–ดํ•˜๋Š” ๋‹จ๋ง(terminal)์ด ์กด์žฌํ•œ๋‹ค. ๋ณดํ†ต์€ pty<n> ์ด๋ ‡๊ฒŒ ์ด๋ฆ„ ๋ถ™์€ ๊ฐ€์ƒ ๋‹จ๋ง์ด ๊ฐ๊ฐ์˜ ์„ธ์…˜์— ํ• ๋‹น๋œ๋‹ค.

ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน

๋ฐ๋ชฌ

๋ฐ๋ชฌ : ์ƒ์ฃผํ•˜๋Š” ํ”„๋กœ์„ธ์Šค

์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋ผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์‹คํ–‰ํ•˜๊ณ  ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ข…๋ฃŒํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ๋ชฌ์€ ์‹œ์Šคํ…œ ์‹œ์ž‘๋ถ€ํ„ฐ ์ข…๋ฃŒ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์กด์žฌํ•˜๋ฉฐ ์‹คํ–‰๋œ๋‹ค.

<ํŠน์ง•>

ps ajx๋ฅผ ํ†ตํ•ด ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ๋ชฌ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

PPID๊ฐ€ 1์ด๊ณ , ์„ธ์…˜ID๋Š” PID์™€ ๋™์ผํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  TTY ๊ฐ’์ด ํ„ฐ๋ฏธ๋„๊ณผ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฑธ ๋œปํ•˜๋Š” โ€˜?โ€™์ด๋‹ค.

โ“ํ€ด์ฆˆ

์—ฌ๊ธฐ์—์„œ ํ€ด์ฆˆ๋ฅผ ์ค€๋น„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ€ด์ฆˆ 1: ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

  1. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ ์‹œ์ž‘๋ถ€ํ„ฐ ์ข…๋ฃŒ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  1. ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค๋Š” ํ•ญ์ƒ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์— ์†ํ•ด ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค๋Š” TTY (ํ„ฐ๋ฏธ๋„)์™€ ํ•ญ์ƒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค์˜ PPID (๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ID)๋Š” 0์ž…๋‹ˆ๋‹ค.

ํ€ด์ฆˆ 2: ๋ฌดํ•œ ๋ฃจํ”„๋กœ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ Ctrl + C๋ฅผ ์‚ฌ์šฉํ•ด ์ข…๋ฃŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ค ์‹œ๊ทธ๋„์„ ์‚ฌ์šฉํ•˜๋‚˜์š”?

  1. SIGSTOP
  1. SIGCONT
  1. SIGINT
  1. SIGCHLD

ํ€ด์ฆˆ 3: ์ข€๋น„ ํ”„๋กœ์„ธ์Šค์™€ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  1. ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋Š” ํ•ญ์ƒ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํšŒ์ˆ˜๋ฐ›์ง€๋งŒ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๋Š” ํšŒ์ˆ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  1. ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๋Š” SIGKILL ์‹œ๊ทธ๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒํ•˜์ง€๋งŒ ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋Š” SIGCHLD๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1. ์ข€๋น„ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ PID๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํšŒ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
  1. ์ข€๋น„ ํ”„๋กœ์„ธ์Šค์™€ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์ฐจ์ด์ ์€ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด ํ€ด์ฆˆ์— ๋‹ต๋ณ€์„ ํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›ํ•˜์‹œ๋Š” ๊ฒฝ์šฐ ํ€ด์ฆˆ ๋‹ต๋ณ€์„ ์ œ์ถœํ•˜์‹œ๋ฉด ํ”ผ๋“œ๋ฐฑ์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์ œ๊ณตํ•œ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ ์œผ๋กœ ํ€ด์ฆˆ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ ํ€ด์ฆˆ์ž…๋‹ˆ๋‹ค.

  1. "์ข‹์€ ์˜ˆ์‹œ"์—์„œ ์–ด๋–ค ํ˜•ํƒœ๋กœ ๊ณต๋ถ€ ๋‚ด์šฉ์„ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ์ด๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์˜€๋‚˜์š”?
  1. fork() ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’ ์ค‘ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ PID์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID๋Š” ๊ฐ๊ฐ ๋ฌด์—‡์ธ๊ฐ€์š”?
  1. "์ข€๋น„ ํ”„๋กœ์„ธ์Šค"๊ฐ€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•˜๋‚˜์š”?
  1. ๋ฐ๋ชฌ ํ”„๋กœ์„ธ์Šค์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
  1. ์„ธ์…˜๊ณผ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
  1. ์„ธ์…˜ ID์™€ ํ”„๋กœ์„ธ์Šค ID(PID)๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
  1. ํ”„๋กœ์„ธ์Šค ์ƒํƒœ ํ•„๋“œ "I: Idle(์•„์ด๋“ค)"์ด ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
  1. ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์˜ ์—ญํ• ์€ ๋ฌด์—‡์ด๋ฉฐ ์–ธ์ œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋‚˜์š”?
  1. ๊ฐ€์žฅ ๋‚ฎ์€ ํƒœ๊ถŒ๋„ ๋‹จ๊ณ„์™€ ๊ทธ ๋‹จ๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
  1. "์Šค๋ฆด๋Ÿฌ" ์•จ๋ฒ”์˜ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ฐ€์ˆ˜๋Š” ๋ˆ„๊ตฌ์ด๋ฉฐ ์–ด๋–ค ์Œ์•… ์Šคํƒ€์ผ๋กœ ์œ ๋ช…ํ•œ๊ฐ€์š”?

์ด๋Ÿฌํ•œ ํ€ด์ฆˆ๋ฅผ ์ด์šฉํ•ด ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ต๋ณ€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ง์”€ํ•ด ์ฃผ์„ธ์š”!


Uploaded by N2T