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/O | open, 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 |
| ๋๊ธฐํยทIPC | futex, 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๋ ์์์ ์ฒ๋ฆฌํ ๋ค ๊ฒฐ๊ตญwritesyscall๋ก ํ๋ฉด์ ๋ธ๋ค.malloc์ ๋๊ฐ ์ ์ ๊ณต๊ฐ์์ ๋ฏธ๋ฆฌ ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค, ๋ถ์กฑํ ๋๋งbrkยทmmapsyscall๋ก ์ปค๋์์ ๋ ๋ฐ์์จ๋ค - ๋ค๋ฅธ ์ธ์ด: 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ยท์ธํฐ๋ฝํธ๋ฅผ ๊ณ๊ธฐ๋ก ์ฃผ๋ํ๋ค