Computer Science/OS

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

์ฑ”๐Ÿป 2024. 2. 9. 20:28

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

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

๋น ๋ฅธ ํ”„๋กœ์„ธ์Šค ์ž‘์„ฑ ์ฒ˜๋ฆฌ

fork() ํ•จ์ˆ˜ ๊ณ ์†ํ™”: ์นดํ”ผ ์˜จ ๋ผ์ดํŠธ

fork() ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ๋ชจ๋‘ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”๋งŒ ๋ณต์‚ฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ์™€ ์ž์‹ ์–‘์ชฝ ๋‹ค ํŽ˜์ด์ง€์— ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ฌดํšจํ™”ํ•œ๋‹ค.

๋ถ€๋ชจ์™€ ์ž์‹ ์ค‘ ์–ด๋А ํ•œ์ชฝ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํŽ˜์ด์ง€ ๊ณต์œ ๋ฅผ ํ•ด์ œํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ์ „์šฉ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.

<์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉด ์ผ์–ด๋‚˜๋Š” ์ผ>

ํŽ˜์ด์ง€์— ์ฒ˜์Œ์œผ๋กœ ์“ฐ๊ธฐ๋ฅผ ํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Copy On Write(CoW)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

โ†’ fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ˆœ๊ฐ„์—๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „๋ถ€ ๋ณต์‚ฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋นจ๋ผ์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ์ค„์–ด๋“ ๋‹ค.

RSS ๊ฐ’ : ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๋‚ด๋ถ€์—์„œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ํ•ฉ๊ณ„

๐Ÿ’กํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ณต์œ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ง€์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œย ps ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•œ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ RSS ๊ฐ’์„ ํ•ฉ์น˜๋ฉด ์ „์ฒด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์„ ๋„˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

execve() ํ•จ์ˆ˜์˜ ๊ณ ์†ํ™” : Demand paging

์‹ค์ œ๋กœ ์‚ฌ์šฉ ์‹œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” Demand paging์€ ํ”„๋กœ์„ธ์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ• ๋‹นํ•  ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ exevce() ํ•จ์ˆ˜ ํ˜ธ์ถœ์—๋„ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

execve() ํ•จ์ˆ˜ ํ˜ธ์ถœ ์งํ›„๋ผ๋ฉด ํ”„๋กœ์„ธ์Šค์šฉ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•„์ง ํ• ๋‹น๋˜์ง€ ์•Š์•˜๋‹ค.

์ดํ›„์— ํ”„๋กœ๊ทธ๋žจ์ด ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ์—์„œ ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๋ฉด ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ์— ๋Œ€์‘ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํŽ˜์ด์ง€ ํดํŠธ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋กœ ํ”„๋กœ์„ธ์Šค์— ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋œ๋‹ค.

ํ”„๋กœ์„ธ์Šค ํ†ต์‹ 

ํ”„๋กœ์„ธ์Šค ํ†ต์‹  : ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ์œ„ํ•œ OS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ

fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„์˜ ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํ•œ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ชฝ ํ”„๋กœ์„ธ์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

CoW ๊ธฐ๋Šฅ์œผ๋กœ ์“ฐ๊ธฐ ์ž‘์—…์„ ํ•˜๋ฉด ๋ณ„๋„์˜ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ.

โ†’ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์— ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ๋งคํ•‘ ๊ฐ€๋Šฅ

  • shared-memory.py
    #!/usr/bin/python3
    
    import os
    import sys
    import mmap
    from sys import byteorder
    
    PAGE_SIZE = 4096
    
    data = 1000
    print("์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์ „ ๋ฐ์ดํ„ฐ ๊ฐ’: {}".format(data))
    shared_memory = mmap.mmap(-1, PAGE_SIZE, flags=mmap.MAP_SHARED)
    
    shared_memory[0:8] = data.to_bytes(8, byteorder)
    
    pid = os.fork()
    if pid < 0:
        print("fork()์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค", file=os.stderr)
    elif pid == 0:
        data = int.from_bytes(shared_memory[0:8], byteorder)
        data *= 2
        shared_memory[0:8] = data.to_bytes(8, byteorder)
        sys.exit(0)
    
    os.wait()
    data = int.from_bytes(shared_memory[0:8], byteorder)
    print("์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ํ›„ ๋ฐ์ดํ„ฐ ๊ฐ’: {}".format(data))

์‹œ๊ทธ๋„

POSIX์—๋Š” SIGUSR1๊ณผ SIGUSR2 ์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์šฉ๋„๋ฅผ ์ •ํ•˜๋ฉด ๋˜๋Š” ์‹œ๊ทธ๋„์ด ์žˆ๋‹ค.

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

๐Ÿ’กdd ๋ช…๋ น์–ด์— SIGUSR1์„ ๋ณด๋‚ด๋ฉด ์ง„์ฒ™ ์ƒํ™ฉ์„ ํ‘œ์‹œํ•˜๋Š” ์ˆจ์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

ํŒŒ์ดํ”„

ํ”„๋กœ์„ธ์Šค๋Š” ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) bash ๊ฐ™์€ ์…€์—์„œ | ๋ฌธ์ž๋กœ ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์—ฐ๊ณ„

free | awk '(NR==2){print $2}'

์ด์™ธ์—๋„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๋„ ๊ฐ€๋Šฅํ•˜๊ณ  ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์†Œ์ผ“

= ๋‘ ํ”„๋กœ๊ทธ๋žจ(ํ”„๋กœ์„ธ์Šค)์ด ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด.

ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ์†Œ์ผ“์ด ์žˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ„ InputStream, OutputStream ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ

  1. ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“ : ๊ฐ™์€ ๊ธฐ๊ธฐ์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์—์„œ๋งŒ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•
  1. TCP ์†Œ์ผ“, UDP ์†Œ์ผ“ : ์ธํ„ฐ๋„ท์—์„œ ์‚ฌ์šฉ. ๋‹ค๋ฅธ ๊ธฐ๊ธฐ์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์—์„œ๋„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.(1๋ณด๋‹ค๋Š” ๋А๋ฆผ)

๋ฐฐํƒ€์  ์ œ์–ด

๋ฐฐํƒ€์  ์ œ์–ด : ์ž์›์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ

(๊ทธ๋ƒฅ ๋ฐฐํƒ€๋ฝ, ์“ฐ๊ธฐ๋ฝ)

<์ƒํ˜ธ ๋ฐฐ์ œ>

  • ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜(์ž„๊ณ„ ๊ตฌ์—ญ) : ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด ์•ˆ ๋˜๋Š” ์ฒ˜๋ฆฌ ํ๋ฆ„ โ†’ ๊ฑ ์ž„๊ณ„ ์˜์—ญ
  • ์•„ํ† ๋ฏน ์ฒ˜๋ฆฌ : ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ๋กœ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š” ์ฒ˜๋ฆฌ ํ๋ฆ„

    File lock์„ ํ†ตํ•ด ์•„ํ† ๋ฏน ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

    : flock()์ด๋‚˜ fcntl() ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์˜ lock/unlock ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋Œ๊ณ  ๋„๋Š” ๋ฐฐํƒ€์  ์ œ์–ด

File lock์€ ๊ธฐ๊ณ„์–ด๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.(C์–ธ์–ด ๊ฐ™์€ ๊ณ ๊ธ‰ ์–ธ์–ด๋กœ ใ„ดใ„ด)

lock = 1

unlock = 0

start:
	load r0 mem // mem ์ฃผ์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์–ด์„œ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ.  
	test r0 // r0์ด 0์ธ์ง€ ํ™•์ธ
	jmpz enter // r0์ด 0์ด๋ฉด enter ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„
	jmp start // r0์ด 0์ด ์•„๋‹ˆ๋ผ๋ฉด start ๋ ˆ์ด๋ธ”๋กœ ๋Œ์•„๊ฐ
enter:
	store mem 1 // mem์— 1์„ ์“ฐ๊ธฐ. ์ด๋•Œ lock ์ƒํƒœ๊ฐ€ ๋จ

...
<ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜>
...

store mem 0

๊ฐ์ž ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ์—์„œ 1์„ ๋™์‹œ์— ์‹คํ–‰ ์‹œ ๋‘˜ ๋‹ค ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์— ๋“ค์–ด๊ฐ€๋„ ๋œ๋‹ค๊ธฐ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ฝ”๋“œ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

1-5๋ฅผ ์•„ํ† ๋ฏน ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ.

โ†’ p.164 ์ฐธ๊ณ 

๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค : fork()๋‚˜ execve()๋ฅผ ์ด์šฉํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ†ต์‹  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌ

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ : ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ๋ฆ„์„ ์ž‘์„ฑ

<๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์˜ ์žฅ์ >

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

<๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋‹จ์ >

Column) ์ปค๋„ ์Šค๋ ˆ๋“œ์™€ ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ

: ps -eLF

์ฑ… ๋ณด๊ธฐ


Uploaded by N2T