| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- git merge
- ๋ฉํฐํ๋ ์ฑ
- tcp ์ธ๊ทธ๋จผํธ
- well known ํฌํธ
- ํ ํฐ ๋ฒ์ค
- ์ค๋ ๋
- ์ฃผ๊ธฐ์ ํธ
- i-type
- ์ค๋ฅ๊ฒ์ถ
- ์ค๋ฅ์ ์ด
- ํ๋ ์ ๊ตฌ์กฐ
- ์๋น์ค ํ๋ฆฌ๋ฏธํฐ๋ธ
- ์ค๋ธ์
- xv6
- ๋ฐ์ดํฐ ์ ์ก
- ์์๋ฒํธ
- ํ๋ก์ด๋์์
- ๊ฐ๋ฐ์์ทจ์
- ๋น์ฃผ๊ธฐ์ ํธ
- mariadb
- 99ํด๋ฝ
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- reducible
- ์ฝ๋ฉํ ์คํธ์ค๋น
- ํญํด99
- java thread
- til
- IEEE 802
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์ฐ๋ถํฌdb
- Today
- Total
Unfazedโ๏ธ๐ฏ
์์ฉ ํ๋ก๊ทธ๋จ ๊ด์ ์์ ๋ณด๋ I/O ๋ณธ๋ฌธ
์์ฉ ํ๋ก๊ทธ๋จ ๊ด์ ์์ ๋ณด๋ I/O
9taetae9 2025. 9. 12. 13:21ํ์์ ์ฌ์ฉํ๋ printf, System.out.println, Scanner ๊ฐ์ ๊ฐ๋จํ API ํธ์ถ์ด ์ค์ ๋ก ์ด์์ฒด์ ์ ํ๋์จ์ด ์ฌ์ด์์ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์์๋ณด์.
1. ์ฌ์ฉ์ ๊ณต๊ฐ vs ์ปค๋ ๊ณต๊ฐ
1-1. ๊ฒฝ๊ณ์ ์ ์
ํ๋ OS๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉ์ ๊ณต๊ฐ๊ณผ ์ปค๋ ๊ณต๊ฐ์ผ๋ก ๋ถ๋ฆฌํ๋ค. ์ปค๋ ๊ณต๊ฐ์ ํน๊ถ(privilege) ๋ชจ๋(Ring 0)์์ ์คํ๋๋ฉฐ ํ๋์จ์ด์ ๋ฏผ๊ฐํ ์๋ฃ๊ตฌ์กฐ์ ์ ๊ทผํ ์ ์๋ค. ์ฌ์ฉ์ ๊ณต๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์คํ๋๋ ๋นํน๊ถ ๋ชจ๋๋ค. ์ด๋ ์์ ์ฑ, ๋ณด์์ ํต์ฌ์ด ๋๋ค.
1-2. ์ ์ค์ํ๊ฐ
์ฌ์ฉ์ ์ฝ๋๊ฐ ํ๋์จ์ด๋ฅผ ์ง์ ์กฐ์ํ๋ฉด ์์คํ ์ ์ฒด๊ฐ ๋ถ์์ ํด์ง๋ค. ๋ฐ๋ผ์ I/O ๊ฐ์ ํน๊ถ ์์ ์ ์ฌ์ฉ์ → ์ปค๋๋ก ํต์ ๋ ์์ฒญ(์์คํ ์ฝ) ํํ๋ก๋ง ์ด๋ฃจ์ด์ง๋ค. ์ด ์ ํ์ ์ปจํ ์คํธ/๋ชจ๋ ์ค์์น ๋น์ฉ์ ๋ฐ์์ํค๋ฏ๋ก ๊ณ ์ฑ๋ฅ ์ค๊ณ์์๋ ํด๋น ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ๊ฒ์ด ์ค์ํ๋ค.
2. ํต์ผ๋ ์ถ์ํ: Everything is a file
2-1. ํ์ผ ๋์คํฌ๋ฆฝํฐ์ VFS
UNIX ๊ณ์ด์ ํต์ฌ ์ฒ ํ์ “๋ชจ๋ ๊ฒ์ ํ์ผ”์ด๋ผ๋ ๊ฒ์ด๋ค. ๋์คํฌ ํ์ผ, ์์ผ, ํฐ๋ฏธ๋, ํ์ดํ, ๊ฐ์ ํ์ผ์์คํ (/proc, /sys) ๋ฑ ๋๋ถ๋ถ์ ์์์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ(fd)๋ก ํํ๋๋ค. ํ๋ก๊ทธ๋จ์ fd๋ผ๋ ์ ์๋ง ์๋ฉด ์ด๋ค ์์์๋ ๋์ผํ read/write API๋ก ์ ๊ทผํ ์ ์๋ค.
2-2. ํ์ค ์คํธ๋ฆผ(0,1,2)
ํ๋ก์ธ์ค๋ ์์ ์ fd=0(stdin), fd=1(stdout), fd=2(stderr)๋ฅผ ๊ฐ์ง๋ค. ํฐ๋ฏธ๋์์ ์คํํ๋ฉด 0์ ํค๋ณด๋, 1, 2๋ ํ๋ฉด์ผ๋ก ์ฐ๊ฒฐ๋๋ค. Shell์ ์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฆฌ๋ค์ด๋ ์ , ํ์ดํ ๋ฑ์ผ๋ก ์ฌ์ค์ ํ ์ ์๋ค.
3. ์์คํ ์ฝ์ ์๋ช ์ฃผ๊ธฐ(read/write/open)
3-1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ํผ(Wrapper) → ํธ๋ฉ → ์ปค๋ ํธ๋ค๋ฌ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํผ ํจ์๋ฅผ ํธ์ถํ๋ค. ๋ํผ๋ syscall ๋ฒํธ์ ์ธ์๋ฅผ ๋ ์ง์คํฐ์ ๋ฐฐ์นํ๊ณ syscall(๋๋ ์ํคํ ์ฒ๋ณ ํธ๋ฉ)์ ์คํํ๋ค. CPU๋ ์ฌ์ฉ์ ๋ชจ๋์์ ์ปค๋ ๋ชจ๋๋ก ์ ํ๋๊ณ ์ปค๋์ sys_call_table์์ ๋์ํ๋ sys_read/sys_write๋ฅผ ํธ์ถํ๋ค. ์์ ์ด ๋๋๋ฉด ์ปค๋์ ๋ฐํ๊ฐ์ ๋ ์ง์คํฐ์ ๋ฃ๊ณ ๋ค์ ์ฌ์ฉ์ ๋ชจ๋๋ก ๋ณต๊ท์ํจ๋ค.
3-2. open์ ๊ธฐ๋ฅ
open()์ ํ์ผ์ ์๋ณ ๊ฐ๋ฅํ ํธ๋ค๋ก ์ฐ๊ฒฐํด์ฃผ๋ ์์คํ ์ฝ์ด๋ค. ์ฑ๊ณตํ๋ฉด ์์์ ์์ด ์๋ ์ ์(fd)๋ฅผ ๋ฐํํ๋ค. fd๋ ์ดํ read/write/close ๋ฑ์์ ํด๋น ์์์ ๊ฐ๋ฆฌํค๋ ํค์ด๋ค. ํ์ค ์ ์ถ๋ ฅ์ ๋ณ๋ open() ์์ด๋ 0, 1, 2๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
3-3. read/write์ ๋์
read(fd, buf, n)์ ์ปค๋ ๊ณต๊ฐ์ ์์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ฌ์ฉ์ ๊ณต๊ฐ buf๋ก ๋ณต์ฌํ๋ค. write(fd, buf, n)์ ์ฌ์ฉ์ ๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ปค๋ ๋ฒํผ๋ก ๋ณต์ฌํ๊ณ ์ดํ ์ฅ์น/ํ์ผ ์์คํ ์ผ๋ก ์ ๋ฌํ๋ค. ํต์ฌ์ ๋ฒํผ ๊ฐ์ ์์ ํ ๋ณต์ฌ(copy_to_user / copy_from_user)๊ณ , ์ด์ค ๋ณต์ฌ๋ ํํ ๊ตฌ์กฐ๋ค(์ฅ์น → ์ปค๋ ๋ฒํผ(DMA) → ์ฌ์ฉ์ ๋ฒํผ).
4. ์ค์ ๋ฐ์ดํฐ ํ๋ฆ: Hello World์ ํค๋ณด๋ ์ ๋ ฅ ์์
4-1. Hello World ์ถ๋ ฅ ํ๋ฆ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด printf/System.out.println์ ํธ์ถํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๋ถ ๋ฒํผ์ ๋ฌธ์์ด์ ์ด๋ค.
- ์ถ๋ ฅ ํ์ด๋ฐ(๊ฐํ, ๋ฒํผ๊ฐ๊ฐ๋์ฐฌ ๊ฒฝ์ฐ ๋ฑ)์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ write(fd=1, ptr, len) ์์คํ ์ฝ์ ํธ์ถํ๋ค.
- sys_write๋ ์ฌ์ฉ์ ๋ฒํผ์ ๋ด์ฉ์ ์ปค๋ ๋ฒํผ๋ก ์์ ํ๊ฒ ๋ณต์ฌํ๋ค.
- ํฐ๋ฏธ๋ ๋๋ผ์ด๋ฒ/๊ทธ๋ํฝ ์๋ธ์์คํ ์ด ์ด๋ฅผ ๋๋ฐ์ด์ค์ ์ ๋ฌํด ํ๋ฉด์ ๋ ๋๋งํ๋ค.
- ํธ์ถ์๋ ์ฐ์ฌ์ง ๋ฐ์ดํธ ์๋ฅผ ๋ฐํ๋ฐ๋๋ค.
4-2. ํค๋ณด๋ ์ ๋ ฅ ํ๋ฆ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด read(fd=0, buf, n)์ ํธ์ถํ๋ฉด ์ปค๋์ ์ปค๋ ๋ด๋ถ ๋ฒํผ ์ํ๋ฅผ ํ์ธํ๋ค.
- ๋ง์ฝ ์ปค๋ ๋ฒํผ์ ์ ๋ ฅ์ด ์๋ค๋ฉด ํ์ฌ ์คํ ์ค์ธ ์ฐ๋ ๋(task)๋ฅผ ํด๋น ์์์ wait queue์ ๋ฑ๋กํ๊ณ ์ ๋ค๊ฒ(sleep)ํ๋ค.
- ์ฌ์ฉ์๊ฐ ํค๋ฅผ ๋๋ฅด๋ฉด ํค๋ณด๋ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํด ์ ๋ ฅ์ด ์ปค๋ ๋ฒํผ์ ์ฑ์์ง๋ค.
- ์ปค๋์ wait queue์ ๋ฑ๋ก๋ ํด๋น ์ฐ๋ ๋๋ฅผ ๊นจ์ด๋ค(๋ค์ ์คํ).
- ์ดํ ์ปค๋์ด copy_to_user()๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์ ๋ฒํผ๋ก ๋ณต์ฌํ๋ฉด read() ํธ์ถ์ด ๋ฐํ๋๋ค.
5. (์ฑ๋ฅ ๊ด์ ) ๋ณต์ฌ ๋น์ฉ๊ณผ ์ ๋ก-์นดํผ(zero-copy) ์ต์
5-1. ์ ๋ ๋ฒ ๋ณต์ฌ๋๋๊ฐ
์ฅ์น๊ฐ ์ง์ ์ฌ์ฉ์ ๋ฒํผ์ ์ฐ๋๋ก ํ์ฉํ๋ฉด ๋ณด์, ๋๊ธฐํ, ํ์ด์ง ๋ถ์ฌ(page-fault) ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ I/O๋ ์ฅ์น→์ปค๋(DMA) → ์ปค๋→์ฌ์ฉ์(copy_to_user) ์์ผ๋ก ์ต์ ๋ ๋จ๊ณ๊ฐ ๋ฐ์ํ๋ค. ์ด์ค ๋ณต์ฌ๊ฐ ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋๋ฏ๋ก ๊ณ ์ฑ๋ฅ ๊ฒฝ๋ก์์๋ ๋ณต์ฌ๋ฅผ ์ค์ด๋ ๊ธฐ์ ์ด ์๊ตฌ๋๋ค.
5-2. ์ ๋ก-์นดํผ(์: sendfile, mmap)
sendfile()์ ์ปค๋ ๋ด๋ถ์์ "ํ์ผ(๋์คํฌ)์์ ์์ผ์ผ๋ก ์ง์ ์ ์ก"ํ๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํด ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ํ ๋ฒ ๋ ๋ณต์ฌํ๋ ๋จ๊ณ๋ฅผ ์ ๊ฑฐํ๋ค. mmap()์ ํ์ผ์ ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ๋งคํํด ํ์ผ ๋ด์ฉ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ์ ๊ทผํ๊ฒ ํ์ฌ ๋ณต์ฌ ๋น์ฉ์ ๋ฎ์ถ๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ์ ๋์ ์ฒ๋ฆฌ๋์ ์๊ตฌํ๋ ๋คํธ์ํฌ ์๋ฒ์์ ์ค์ํ๋ค.
6. I/O ๋ชจ๋ธ ๋น๊ต: ๋ธ๋กํน, ๋ ผ๋ธ๋กํน, ๋ฉํฐํ๋ ์ฑ
6-1. ๋ธ๋กํน I/O
read()/write()๊ฐ ๋ฐ์ดํฐ ์ค๋น ๋๋ ๊ณต๊ฐ ํ๋ณด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ํธ์ถ ์ค๋ ๋๋ ๋๊ธฐํ๋ค.
๊ตฌํ์ด ๊ฐ๋จํ์ง๋ง ๋ค์์ ๋์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ ๋ ์ค๋ ๋ ์๊ฐ ๊ธ๊ฒฉํ ๋์ด๋๊ณ ์ปจํ ์คํธ ์ ํ ๋น์ฉ์ด ์ปค์ง๋ค.
6-2. ๋ ผ๋ธ๋กํน I/O
fd๋ฅผ ๋ ผ๋ธ๋กํน ๋ชจ๋๋ก ์ค์ ํ๋ฉด read()๋ ์ค๋น๋์ง ์์์ ๋ EAGAIN/EWOULDBLOCK์ ๋ฐํํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ํด๋ง์ผ๋ก ์ค๋น ์ํ๋ฅผ ํ์ธํ๋ฉด ์ฐ๋ ๋๋ ๋๊ธฐํ์ง ์์ง๋ง ๋ฐ๋ณต ํด๋ง์ CPU ๋ญ๋น๋ฅผ ์ด๋ํ๋ค.
6-3. ๋ฉํฐํ๋ ์ฑ(I/O ์ด๋ฒคํธ ๋ชจ๋ธ)
select → poll → epoll๋ก ๋ฐ์ ํด์๋ค.
- select๋ ๋นํธ๋ง์คํฌ ๋ฐฉ์์ผ๋ก FD ์ ์ ํ๊ณผ O(n) ์ค์บ ๋น์ฉ์ด ์๋ค.
- poll์ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด๋ก FD ์ ์ ํ์ ์์ด์ง๋ง ์ฌ์ ํ O(n)์ด๋ค.
- epoll์ ๋ฆฌ๋ ์ค ์ ์ฉ์ผ๋ก ์ปค๋์ด ์ค๋น๋ FD ๋ชฉ๋ก์ ์ ์งํด ์ค๋น๋ ๊ฒ๋ง ๋ฐํํ๋ฏ๋ก ํ์ฅ์ฑ์ด ์ฐ์ํ๋ค(๋๊ท๋ชจ ๋์์ฑ ํ๊ฒฝ์์ ์ค์). ์ด ๋ชจ๋ธ์ ๋จ์ผ ์ค๋ ๋๋ก ์์ฒ ๊ฐ์ ์ฐ๊ฒฐ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
7. ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ ค ํ ์ ์๋ ๊ฒ
7-1. ์์คํ ์ฝ ํ์๋ฅผ ์ค์ด์
์์ ์กฐ๊ฐ์ ์์ฃผ ์ฝ๋ ๋์ ๋ฒํผ๋ฅผ ํฌ๊ฒ ์ก์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ฉด syscall ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์ ๋ฒํผ๋ง(์: stdio, BufferedInputStream)์ ์ ์ ํ ํ์ฉํ์.
7-2. ๋ฌธ์ ๊ฐ ๋คํธ์ํฌ์ธ์ง ๋์คํฌ์ธ์ง ํ์ธํ์
I/O ๋ณ๋ชฉ ์ง๋จ์ ํจํท ์บก์ฒ, iostat, strace ๊ฐ์ ํด๋ก ์์คํ ์ฝ ๋น๋์ ๋๊ธฐ ์๊ฐ์ ํ์ธํ ์ ์๋ค. syscall ๋น๋, ๋ธ๋ก ์๊ฐ, ์ปจํ ์คํธ ์ค์์น ๋น์ฉ์ ํจ๊ป ๋ณด๋ฉด ์์ธ์ ๋น ๋ฅด๊ฒ ์ขํ ์ ์๋ค.
7-3. ๊ณ ์ฑ๋ฅ ์๋ฒ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๊ธฐ๋ณธ์ผ๋ก ์ค๊ณํ์
๋คํธ์ํฌ ์๋ฒ๋ผ๋ฉด epoll ๋๋ ๋น๋๊ธฐ I/O(AIO), ๋๋ ํ๋ ์์ํฌ(์: Netty)์ ์ถ์ํ๋ฅผ ๊ณ ๋ คํ์. ๋ํ zero-copy ๊ฐ๋ฅ ๊ฒฝ๋ก(sendfile, splice, mmap)๋ฅผ ์ฐพ์ ์ ์ ํ ํ์ฉํ์.
์ฐธ๊ณ ์๋ฃ:
์ง์๋คํ
I. CPU์ ๋์์์ด I/O ์ฅ์น๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ๋ฐฉ์, DMA์ ๊ฐ์ ๊ฐ. Direct Memory Access์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ, ํฌ์ธํฐ, ์นด์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ์น ์ ์ด๊ธฐ๊ฐ CPU์ ๋์ ์์ด DMA์ปจํธ๋กค๋ฌ๋ฅผ ์ด์ฉ
www.jidum.com
User space and kernel space - Wikipedia
From Wikipedia, the free encyclopedia Way of using computer memory "Kernel space" and "User space" redirect here. For the mathematical definition, see Null space. For the user space on Wikipedia, see Wikipedia:User pages. A modern computer operating system
en.wikipedia.org
https://www.geeksforgeeks.org/operating-systems/introduction-of-system-call/
System Call - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
www.geeksforgeeks.org
https://medium.com/@kaixin667689/zero-copy-principle-and-implementation-9a5220a62ffd
Zero-copy: Principle and Implementation
1. Introduction
medium.com
https://www.howtogeek.com/435903/what-are-stdin-stdout-and-stderr-on-linux/
What Are stdin, stdout, and stderr on Linux?
Mystified by stdin, stdout and stderr? Learn to use them in your Linux scripts.
www.howtogeek.com
'Operating System (์ด์์ฒด์ )' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฉํฐ์ค๋ ๋ฉ, ์ปจํ ์คํธ ์ค์์น, ์ค์ผ์ค๋ง, ํ๋ก์ธ์ค vs ์ค๋ ๋ (0) | 2025.02.06 |
|---|---|
| ์ค๋ ๋ ์์ ์ฑ Thread Safety (0) | 2024.01.29 |
| ํ์ด๋จธ ์ธํฐ๋ฝํธ(timer interrupt) ๋ฐ์ ์ฃผ๊ธฐ?/ tick interrupt, timer interrupt (+ xv6 ) (0) | 2023.10.18 |
| ํ๋ก๊ทธ๋จ๊ณผ ํ๋ก์ธ์ค์ ์ฐจ์ด/(feat. ์์คํ ์ฝ) (0) | 2023.10.16 |
| ELF ํ์ผ? ELF ํค๋? (0) | 2023.09.16 |