TL;DR

  • syscall์€ ๊ถŒํ•œ์ด ์ œํ•œ๋œ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์ปค๋„์—๊ฒŒ ํŠน๊ถŒ ์ž‘์—…์„ ์š”์ฒญํ•˜๋Š” ์œ ์ผํ•œ ๊ณต์‹ ํ†ต๋กœ
  • user mode์™€ kernel mode์˜ ๊ถŒํ•œ ๋ถ„๋ฆฌ๊ฐ€ ์กด์žฌ ์ด์œ ์ด๋ฉฐ, ํ˜ธ์ถœ๋งˆ๋‹ค ๋ชจ๋“œ ์ „ํ™˜ ๋น„์šฉ์ด ๋ถ™์Œ
  • readยทwriteยทmmapยทfork ๋“ฑ I/Oยท๋ฉ”๋ชจ๋ฆฌยทํ”„๋กœ์„ธ์Šค ์ž‘์—…์ด ์ „๋ถ€ syscall์ด๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋Š” ๊ทธ ์–‡์€ ๊ป๋ฐ๊ธฐ

AI-assisted


1. ์™œ ์žˆ๋‚˜ โ€” ๊ถŒํ•œ์ด ๋‚˜๋‰˜์–ด ์žˆ์–ด์„œ

CPU๋Š” ๊ถŒํ•œ์ด ๋‹ค๋ฅธ ๋‘ ๋ชจ๋“œ๋กœ ๋ˆ๋‹ค.

  • user mode: ๊ถŒํ•œ์ด ์ œํ•œ๋œ ์ƒํƒœ. ์šฐ๋ฆฌ๊ฐ€ ์ง  ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๊ธฐ์„œ ์‹คํ–‰๋œ๋‹ค(x86์˜ ring 3)
  • kernel mode: ๋ญ๋“  ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๊ถŒ ์ƒํƒœ. ์ปค๋„๋งŒ ์—ฌ๊ธฐ์„œ ์‹คํ–‰๋œ๋‹ค(ring 0)

์œ ์ € ํ”„๋กœ๊ทธ๋žจ์€ user mode์— ๊ฐ‡ํ˜€ ํ•˜๋“œ์›จ์–ด๋‚˜ ์ปค๋„ ์ž์›์„ ์ง์ ‘ ๊ฑด๋“œ๋ฆด ์ˆ˜ ์—†๋‹ค. ๋””์Šคํฌ์— ์ง์ ‘ ์“ฐ๊ฑฐ๋‚˜, ๋„คํŠธ์›Œํฌ ์นด๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณด๋Š” ๊ฒŒ ์ „๋ถ€ ๊ธˆ์ง€๋‹ค. ์ด์œ ๋Š” ๋‘˜์ด๋‹ค.

  • ๋ณด์•ˆ: ์•„๋ฌด ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋””์Šคํฌยท๋ฉ”๋ชจ๋ฆฌยท์žฅ์น˜๋ฅผ ์ง์ ‘ ๋งŒ์ง€๋ฉด ๊ฒฉ๋ฆฌ๊ฐ€ ๋ฌด๋„ˆ์ง„๋‹ค
  • ์•ˆ์ •์„ฑ: ์ž˜๋ชป๋œ ์ ‘๊ทผ ํ•˜๋‚˜๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ๋ฉด ์•ˆ ๋œ๋‹ค

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ํŠน๊ถŒ ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฉด ์ปค๋„์— ๋ถ€ํƒํ•ด์•ผ ํ•˜๊ณ , ๊ทธ ๋ถ€ํƒ์˜ ํ†ต๋กœ๊ฐ€ system call์ด๋‹ค.


2. syscall์ด๋ž€ โ€” ์ปค๋„์— ์ผ์„ ์‹œํ‚ค๋Š” ๊ณต์‹ ์ฐฝ๊ตฌ

system call(syscall, ์‹œ์Šคํ…œ ์ฝœ)์€ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์ปค๋„์—๊ฒŒ ํŠน๊ถŒ ์ž‘์—…์„ ์š”์ฒญํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.
์ปค๋„์ด ์œ ์ € ๊ณต๊ฐ„์— ๋…ธ์ถœํ•œ โ€œํ—ˆ์šฉ๋œ ์š”์ฒญ ๋ชฉ๋กโ€์ด๋ผ, ์œ ์ €๋Š” ์•„๋ฌด ์ปค๋„ ํ•จ์ˆ˜๋‚˜ ๋ถ€๋ฅด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ปค๋„์ด ์—ด์–ด๋‘” syscall๋งŒ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค์—๋Š” ๋Œ€๋žต ์ˆ˜๋ฐฑ ๊ฐœ๊ฐ€ ์žˆ๋‹ค.

๋น„์œ ํ•˜๋ฉด, ํ˜ธํ…” ์†๋‹˜(์œ ์ € ํ”„๋กœ๊ทธ๋žจ)์€ ์ž๊ธฐ ๋ฐฉ์—๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ์ฃผ๋ฐฉยท์ „๊ธฐ์‹คยท๊ธˆ๊ณ (ํ•˜๋“œ์›จ์–ดยท์ปค๋„ ์ž์›)์—” ๋ชป ๋“ค์–ด๊ฐ„๋‹ค. ์Œ์‹์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์„ค๋น„๋ฅผ ๊ณ ์น˜๋ ค๋ฉด ํ”„๋ŸฐํŠธ์— ์ „ํ™”(syscall)ํ•ด์„œ ์ง์›(์ปค๋„)์—๊ฒŒ ๋ถ€ํƒํ•œ๋‹ค. ์ง์›์€ ๋งˆ์Šคํ„ฐํ‚ค(kernel mode)๋ฅผ ๊ฐ–๊ณ  ์–ด๋””๋“  ๊ฐ€๊ณ , ์†๋‹˜์€ ๋ฐฉ(user mode)์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค.

์ฆ‰ syscall์€ ์œ ์ € ๊ณต๊ฐ„๊ณผ ์ปค๋„ ๊ณต๊ฐ„์„ ๊ฐ€๋ฅด๋Š” ์„ ์ด์ž, ๊ทธ ์„ ์„ ๋„˜๋Š” ์œ ์ผํ•œ ํ†ต์ œ๋œ ๋ฌธ์ด๋‹ค.


3. ๋ฌด์—‡์ด syscall์ธ๊ฐ€

ํŠน๊ถŒ์ด ํ•„์š”ํ•œ ์ž‘์—…์€ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ์ด๋ ‡๊ฒŒ ๋‚˜๋‰œ๋‹ค.

๋ถ„๋ฅ˜๋Œ€ํ‘œ syscall
ํŒŒ์ผยท๋””์Šคํฌ I/Oopen, read, write, close, lseek, stat, fcntl, dup
๋„คํŠธ์›Œํฌsocket, bind, listen, accept, connect, send, recv
ํ”„๋กœ์„ธ์Šคfork, execve, exit, wait, clone
๋ฉ”๋ชจ๋ฆฌmmap, munmap, brk
์‹œ๊ฐ„ยท์Šค์ผ€์ค„nanosleep, clock_gettime, sched_yield
๋™๊ธฐํ™”ยทIPCfutex, pipe, shmget
I/O ๊ฐ์‹œselect, poll, epoll_create1, epoll_ctl, epoll_wait

๊ณตํ†ต์ ์€ ์ „๋ถ€ ์ปค๋„๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ syscall์ด ์•„๋‹Œ ๊ฒƒ๋„ ๋ถ„๋ช…ํ•˜๋‹ค.
์ˆœ์ˆ˜ ๊ณ„์‚ฐ(a + b), ๋ฉ”๋ชจ๋ฆฌ ์•ˆ ๋ฐ์ดํ„ฐ ์กฐ์ž‘, strlenยทmemcpy ๊ฐ™์€ ์œ ์ € ๊ณต๊ฐ„ ์ฒ˜๋ฆฌ ๋“ฑ์€ ์ปค๋„ ๋„์›€ ์—†์ด CPU๊ฐ€ user mode์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ syscall์ด ์•„๋‹ˆ๋‹ค.


4. ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜ โ€” ๋ชจ๋“œ ์ „ํ™˜

๊ฐ syscall์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™๋Š”๋‹ค(x86-64 ๋ฆฌ๋ˆ…์Šค์—์„œ read๋Š” 0, write๋Š” 1, open์€ 2 ์‹์ด๋‹ค). ํ˜ธ์ถœ ํ๋ฆ„์€ ์ด๋ ‡๋‹ค.

์œ ์ € ํ”„๋กœ๊ทธ๋žจ (user mode)
   โ”‚  โ‘  syscall ๋ฒˆํ˜ธ(rax) + ์ธ์ž(rdi, rsi, rdx, ...)๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ์„ธํŒ…
   โ”‚  โ‘ก `syscall` ๋ช…๋ น ์‹คํ–‰ โ”€โ”€โ”€โ”€ ๋ชจ๋“œ ์ „ํ™˜ โ”€โ”€โ”€โ”€โ–ถ
   โ–ผ
์ปค๋„ (kernel mode)
   โ”‚  โ‘ข syscall table[๋ฒˆํ˜ธ]์—์„œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์•„ ์‹คํ–‰ (๊ถŒํ•œ ๊ฒ€์‚ฌ + ์‹ค์ œ ์ž‘์—…)
   โ”‚  โ‘ฃ ๊ฒฐ๊ณผ๋ฅผ rax์— ๋‹ด์•„ ๋ณต๊ท€ โ”€โ”€โ”€โ”€ ๋ชจ๋“œ ์ „ํ™˜ โ”€โ”€โ”€โ”€โ–ถ
   โ–ผ
์œ ์ € ํ”„๋กœ๊ทธ๋žจ (user mode) โ€” ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ›๊ณ  ์ด์–ด์„œ ์‹คํ–‰

ํ•ต์‹ฌ์€ โ‘กยทโ‘ฃ์˜ ๋ชจ๋“œ ์ „ํ™˜์ด๋‹ค.
ํŠน์ˆ˜ํ•œ CPU ๋ช…๋ น(x86-64์˜ syscall, ์˜ˆ์ „์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ int 0x80)์ด user mode์—์„œ kernel mode๋กœ ๋„˜์–ด๊ฐ€๋ฉฐ ์ปค๋„์˜ ๊ณ ์ •๋œ ์ง„์ž…์ ์œผ๋กœ ์ ํ”„์‹œํ‚ค๊ณ , ์ปค๋„์€ ๋ฒˆํ˜ธ๋กœ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•œ ๋’ค ๋‹ค์‹œ user mode๋กœ ๋Œ๋ ค๋ณด๋‚ธ๋‹ค.
์œ ์ € ํ”„๋กœ๊ทธ๋žจ์€ ์ปค๋„์˜ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ๋ชป ๋ถ€๋ฅด๊ณ , ์˜ค์ง ์ด ์ •ํ•ด์ง„ ์ง„์ž…์ ์œผ๋กœ ๋ฒˆํ˜ธ๋กœ ์ง€์ •๋œ syscall๋งŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.


5. ์™œ ๋น„์‹ผ๊ฐ€, ๊ทธ๋ฆฌ๊ณ  ์ค„์ด๋Š” ๋ฒ•

syscall์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ณด๋‹ค ๋น„์‹ธ๋‹ค. ๊ฐ™์€ user mode ์•ˆ์—์„œ ์ ํ”„๋งŒ ํ•˜๋ฉด ๋˜๋Š” ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ, syscall์€ ๊ถŒํ•œ ๋ ˆ๋ฒจ์„ ๋ฐ”๊พธ๊ณ  ์ปค๋„๋กœ ๋“ค์–ด๊ฐ”๋‹ค ๋‚˜์˜ค๋Š” ์™•๋ณต์ด ๋ถ™๋Š”๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ ์ €์žฅยท๋ณต์›, ๋ชจ๋“œ ์ „ํ™˜, ํŒŒ์ดํ”„๋ผ์ธยท์บ์‹œ ์˜ํ–ฅ๊นŒ์ง€ ๋”ํ•ด ๋Œ€๋žต ์ˆ˜์‹ญ์—์„œ ์ˆ˜๋ฐฑ ๋‚˜๋…ธ์ดˆ๊ฐ€ ๋“ ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ˆ˜ ๋‚˜๋…ธ์ดˆ์ธ ๊ฒƒ๊ณผ ๋Œ€๋น„๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์€ syscall ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„๋œ๋‹ค.

  • batching: ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•œ ๋ฒˆ์˜ syscall๋กœ ๋ฌถ๋Š”๋‹ค. writev(์—ฌ๋Ÿฌ ๋ฒ„ํผ๋ฅผ ํ•œ ๋ฒˆ์— ์“ฐ๊ธฐ), sendmmsg(์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ•œ ๋ฒˆ์—), ๊ทธ๋ฆฌ๊ณ  epoll์ด ๊ด€์‹ฌ ๋ชฉ๋ก์„ ๋งค๋ฒˆ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  epoll_ctl๋กœ ํ•œ ๋ฒˆ๋งŒ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ™์€ ๋ฐœ์ƒ์ด๋‹ค
  • vDSO: gettimeofdayยทclock_gettime์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์ „์šฉ์ด๊ณ  ๋นˆ๋ฒˆํ•œ ์ผ๋ถ€ ํ˜ธ์ถœ์€, ์ปค๋„์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ € ๊ณต๊ฐ„์— ๋งคํ•‘ํ•ด์ค˜ ๋ชจ๋“œ ์ „ํ™˜ ์—†์ด ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•œ๋‹ค. ์‹œ๊ฐ„ ์กฐํšŒ์— ๋งค๋ฒˆ ์ปค๋„๋กœ ์•ˆ ๋“ค์–ด๊ฐ€๋„ ๋œ๋‹ค
  • io_uring: ์ตœ์‹  ๋ฆฌ๋ˆ…์Šค์˜ ๋น„๋™๊ธฐ I/O ์ธํ„ฐํŽ˜์ด์Šค. ์œ ์ €์™€ ์ปค๋„์ด ๊ณต์œ ํ•˜๋Š” ๋ง ๋ฒ„ํผ๋กœ ์š”์ฒญยท์™„๋ฃŒ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„ I/O๋งˆ๋‹ค syscall์„ ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค. ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„๊ฐ€ syscall ๋ณ‘๋ชฉ์„ ์ค„์ด๋Š” ์ตœ์‹  ์ˆ˜๋‹จ์ด๋‹ค

6. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋Š” syscall์˜ ๊ป๋ฐ๊ธฐ

๋ณดํ†ต syscall์„ ์ง์ ‘ ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋กœ ๋ถ€๋ฅธ๋‹ค. ์—ฌ๊ธฐ์„œ โ€œํ•จ์ˆ˜์ธ๊ฐ€ syscall์ธ๊ฐ€โ€๋Š” ์ธต์œ„๋ฅผ ๋‚˜๋ˆ  ๋ด์•ผ ํ•œ๋‹ค.

  • ์–‡์€ ๋ž˜ํผ: C์˜ read()ยทwrite()๋Š” glibc๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ž˜ํผ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์„ธํŒ…ํ•˜๊ณ  syscall ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š”, ์‚ฌ์‹ค์ƒ syscall ๊ทธ ์ž์ฒด์˜ ๊ป๋ฐ๊ธฐ๋‹ค
  • ๊ณ ์ˆ˜์ค€ ํ•จ์ˆ˜: printf๋Š” ์„œ์‹์„ ์ฒ˜๋ฆฌํ•œ ๋’ค ๊ฒฐ๊ตญ write syscall๋กœ ํ™”๋ฉด์— ๋‚ธ๋‹ค. malloc์€ ๋Œ€๊ฐœ ์œ ์ € ๊ณต๊ฐ„์—์„œ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋‹ค, ๋ถ€์กฑํ•  ๋•Œ๋งŒ brkยทmmap syscall๋กœ ์ปค๋„์—์„œ ๋” ๋ฐ›์•„์˜จ๋‹ค
  • ๋‹ค๋ฅธ ์–ธ์–ด: Python์˜ open()ยทsocketยทtime.sleep()๋„ CPython์ด C ๋ ˆ๋ฒจ์—์„œ ํ•ด๋‹น syscall์„ ๋ถ€๋ฅธ๋‹ค

์ง์ ‘ ๋ถ€๋ฅด๊ณ  ์‹ถ์œผ๋ฉด libc์˜ ๋ฒ”์šฉ ๋ž˜ํผ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

#include <unistd.h>
#include <sys/syscall.h>
 
write(1, "hi\n", 3);                 // ๋ณดํ†ต์€ ์ด๋ ‡๊ฒŒ (libc ๋ž˜ํผ)
syscall(SYS_write, 1, "hi\n", 3);    // ์‹ค์ œ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๋ชจ์Šต (๋ฒˆํ˜ธ๋กœ ์ง์ ‘)

7. ๋ˆˆ์œผ๋กœ ๋ณด๊ธฐ โ€” strace

ํ”„๋กœ๊ทธ๋žจ์ด ์‹ค์ œ๋กœ ์–ด๋–ค syscall์„ ๋ถ€๋ฅด๋Š”์ง€๋Š” strace๋กœ ์—ฟ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

strace ./program        # ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“  syscall์„ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ
strace -c ls            # syscall๋ณ„ ํ˜ธ์ถœ ํšŸ์ˆ˜ยท์‹œ๊ฐ„ ์š”์•ฝ
strace -f python app.py # ์ž์‹ ํ”„๋กœ์„ธ์Šค๊นŒ์ง€ ์ถ”์ 

-c ์š”์•ฝ์„ ๋ณด๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ปค๋„์— ๋ฌด์—‡์„ ์–ผ๋งˆ๋‚˜ ์š”์ฒญํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค.

% time     calls    syscall
------ --------- ----------------
 ...      ...     openat
 ...      ...     read
 ...      ...     write
 ...      ...     mmap

์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํŒ” ๋•Œ๋„ ์œ ์šฉํ•˜๋‹ค. ๊ฐ™์€ ์ผ์„ ํ•˜๋ฉด์„œ syscall์„ ๊ณผ๋„ํ•˜๊ฒŒ ๋ถ€๋ฅด๋ฉด(์˜ˆ: ํ•œ ๋ฐ”์ดํŠธ์”ฉ read) ์—ฌ๊ธฐ์„œ ๋“œ๋Ÿฌ๋‚œ๋‹ค.


8. blocking๊ณผ syscall โ€” ๋Œ€๊ธฐ๋Š” syscall ์•ˆ์—์„œ ์ผ์–ด๋‚œ๋‹ค

non-blocking์—์„œ โ€œ๋ธ”๋กœํ‚น ๋Œ€๊ธฐโ€๊ฐ€ ์‹ค์ œ๋กœ ๋ฒŒ์–ด์ง€๋Š” ์ž๋ฆฌ๊ฐ€ ๋ฐ”๋กœ syscall ๋‚ด๋ถ€๋‹ค.
blocking readยทacceptยทfutex๋Š” ์กฐ๊ฑด์ด ์•ˆ ๋งž์œผ๋ฉด syscall ์•ˆ์—์„œ ์ปค๋„์ด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๋ฅผ ์žฌ์šด๋‹ค(Blocked). ์ปค๋„์ด ๊ทธ ์Šค๋ ˆ๋“œ๋ฅผ ํ•ด๋‹น ์ž์›์˜ ๋Œ€๊ธฐ ํ์— ๊ฑธ๊ณ  sleep์‹œ์ผฐ๋‹ค๊ฐ€, ์ค€๋น„๋˜๋ฉด ๊นจ์›Œ syscall์„ ๋งˆ์ € ์ง„ํ–‰์‹œํ‚จ๋‹ค.

  • blocking: syscall์ด ์กฐ๊ฑด ์ถฉ์กฑ๊นŒ์ง€ ์•ˆ ๋Œ์•„์˜จ๋‹ค. ๊ทธ๋™์•ˆ ์Šค๋ ˆ๋“œ๋Š” ์ปค๋„ ์•ˆ์—์„œ ์ž ๋“ค์–ด CPU๋ฅผ ๋†“๋Š”๋‹ค
  • non-blocking(O_NONBLOCK): ์ง€๊ธˆ ๋ชป ํ•˜๋ฉด syscall์ด ์ฆ‰์‹œ EAGAIN์„ ๋Œ๋ ค์ฃผ๊ณ  ๋Œ์•„์˜จ๋‹ค. ์žฌ์šฐ์ง€ ์•Š๋Š”๋‹ค

๊ทธ๋ž˜์„œ Blocked ์ƒํƒœ, busy polling์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์žฌ์šฐ๋Š” ๋น„์šฉ, epoll์ด ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ epoll_wait์—์„œ ์ž ๋“œ๋Š” ๊ฒƒ์ด ์ „๋ถ€ โ€œsyscall ์•ˆ์—์„œ ์ปค๋„์ด ์Šค๋ ˆ๋“œ๋ฅผ sleep์‹œํ‚จ๋‹คโ€๋Š” ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๋‹ค๋ฅธ ์–ผ๊ตด์ด๋‹ค.


9. ๊ด€๋ จ ๊ฐœ๋…

  • Python GIL: ์ปค๋„์ด ์กด์žฌ๋ฅผ ๋ชจ๋ฅด๋Š” ์œ ์ € ๊ณต๊ฐ„ ์ž ๊ธˆ. syscall์˜ ๋ฐ˜๋Œ€ํŽธ์— ์žˆ๋‹ค
  • IO Multiplexing - select, poll, epoll: selectยทepoll์ด ๋ชจ๋‘ syscall์ด๊ณ , epoll์€ ๊ทธ ํ˜ธ์ถœยท์ „๋‹ฌ์„ ์ค„์ธ๋‹ค
  • Socket: socketยทsendยทrecv๊ฐ€ syscall์ด๋ฉฐ, fd์˜ ์„ธ ์ธต ๊ตฌ์กฐ๋„ ์—ฌ๊ธฐ์„œ ์ด์–ด์ง„๋‹ค
  • Concurrency and Parallelism: context switch์™€ blocking ๋ชจ๋‘ ์ปค๋„์ด syscallยท์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๊ณ„๊ธฐ๋กœ ์ฃผ๋„ํ•œ๋‹ค