I/O์ IPC โญโญโญ
I/O์ IPC โญโญโญ¶
๊ฐ์¶
์ด ์ฅ์์๋ ์ด์์ฒด์ ์ ์ ์ถ๋ ฅ(I/O) ์์คํ ๊ณผ ํ๋ก์ธ์ค ๊ฐ ํต์ (IPC) ๋ฉ์ปค๋์ฆ์ ํ์ตํฉ๋๋ค. ํ๋์จ์ด ์ ์ด๋ถํฐ ๊ณ ์์ค ํต์ ๋ฐฉ๋ฒ๊น์ง ๋ค๋ฃน๋๋ค.
๋ชฉ์ฐจ¶
- I/O ํ๋์จ์ด
- I/O ๋ฐฉ์
- ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ
- ๋ฒํผ๋ง ์ ๋ต
- IPC ๊ฐ์
- ํ์ดํ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ
- ๋ฉ์์ง ํ์ ์์ผ
- ์ฐ์ต ๋ฌธ์
1. I/O ํ๋์จ์ด¶
1.1 I/O ์ฅ์น ๋ถ๋ฅ¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ I/O ์ฅ์น ๋ถ๋ฅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ๋ถ๋ฅ โ ์์ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ๋ธ๋ก ์ฅ์น โ ํ๋ ๋์คํฌ, SSD, USB ์ ์ฅ์ฅ์น โ โ
โ โ (Block Device) โ - ๊ณ ์ ํฌ๊ธฐ ๋ธ๋ก ๋จ์๋ก ์ ๊ทผ โ โ
โ โ โ - ์์ ์ ๊ทผ ๊ฐ๋ฅ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ๋ฌธ์ ์ฅ์น โ ํค๋ณด๋, ๋ง์ฐ์ค, ํ๋ฆฐํฐ, ์๋ฆฌ์ผ ํฌํธ โ โ
โ โ (Character Device) โ - ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ์ ๊ทผ โ โ
โ โ โ - ์์ฐจ ์ ๊ทผ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ๋คํธ์ํฌ ์ฅ์น โ ์ด๋๋ท, WiFi, Bluetooth โ โ
โ โ (Network Device) โ - ํจํท ๊ธฐ๋ฐ โ โ
โ โ โ - ์์ผ ์ธํฐํ์ด์ค โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ Linux ์ฅ์น ํ์ผ: โ
โ /dev/sda - ์ฒซ ๋ฒ์งธ SCSI/SATA ๋์คํฌ (๋ธ๋ก) โ
โ /dev/tty1 - ์ฒซ ๋ฒ์งธ ํฐ๋ฏธ๋ (๋ฌธ์) โ
โ /dev/null - ๋ ์ฅ์น (๋ฌธ์) โ
โ /dev/random - ๋์ ์์ฑ๊ธฐ (๋ฌธ์) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1.2 I/O ํ๋์จ์ด ๊ตฌ์กฐ¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ I/O ํ๋์จ์ด ๊ตฌ์กฐ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ CPU โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์์คํ
๋ฒ์ค โ โ
โ โโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ โ
โ โ โ โ โ โ
โ โผ โผ โผ โผ โ
โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโ โ
โ โ ๋ฉ๋ชจ๋ฆฌ โ โ ๋์คํฌ โ โ ๊ทธ๋ํฝ โ โ ๋คํธ์ํฌ โ โ
โ โ ์ปจํธ๋กค๋ฌ โ โ ์ปจํธ๋กค๋ฌ โ โ ์ปจํธ๋กค๋ฌ โ โ ์ปจํธ๋กค๋ฌ โ โ
โ โโโโโโโโโโโโโโ โโโโโโโฌโโโโโโโ โโโโโโโฌโโโโโโโ โโโโโโโฌโโโโโโโ โ
โ โ โ โ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ HDD โ โ GPU โ โ NIC โ โ
โ โ SSD โ โ โ โ โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ
โ ์ฅ์น ์ปจํธ๋กค๋ฌ ๊ตฌ์ฑ: โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์ํ ๋ ์ง์คํฐ โ ๋ช
๋ น ๋ ์ง์คํฐ โ ๋ฐ์ดํฐ ๋ ์ง์คํฐ โ โ
โ โ (Status) โ (Command) โ (Data) โ โ
โ โ - ์ค๋น/์๋ฃ โ - ์ฝ๊ธฐ/์ฐ๊ธฐ โ - I/O ๋ฐ์ดํฐ ๋ฒํผ โ โ
โ โ - ์ค๋ฅ โ - ์ ์ด ๋ช
๋ น โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
2. I/O ๋ฐฉ์¶
2.1 ํด๋ง (Polling / Programmed I/O)¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ํด๋ง ๋ฐฉ์ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ CPU๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ฅ์น ์ํ๋ฅผ ํ์ธ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ CPU ์ฅ์น ์ปจํธ๋กค๋ฌ โ โ
โ โ โ โ
โ โ 1. ๋ช
๋ น ์ ์ก โโโโโโโโโโโโโโโโโโโถ ๋ช
๋ น ๋ ์ง์คํฐ โ โ
โ โ โ โ
โ โ 2. while (์ํ == busy) { โโโ ์ํ ๋ ์ง์คํฐ โ โ
โ โ // ๊ณ์ ํ์ธ (CPU ๋ญ๋น!) โ โ
โ โ } โ โ
โ โ โ โ
โ โ 3. ๋ฐ์ดํฐ ์ ์ก โโโโโโโโโโโโโโโถ/โโโ ๋ฐ์ดํฐ ๋ ์ง์คํฐ โ โ
โ โ โ โ
โ โ 4. ์๋ฃ ํ์ธ โโโ ์ํ ๋ ์ง์คํฐ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ ์ฅ์ : โ
โ - ๊ตฌํ ๊ฐ๋จ โ
โ - ๋น ๋ฅธ ์ฅ์น์์๋ ์ค๋ฒํค๋ ์ ์ โ
โ โ
โ ๋จ์ : โ
โ - CPU ์๊ฐ ๋ญ๋น (Busy Waiting) โ
โ - ๋๋ฆฐ ์ฅ์น์์ ๋นํจ์จ์ โ
โ โ
โ ์ฌ์ฉ ์: ๋น ๋ฅธ ๋คํธ์ํฌ ์ฅ์น (๋์ ์ฒ๋ฆฌ๋) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
2.2 ์ธํฐ๋ฝํธ (Interrupt-Driven I/O)¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์ธํฐ๋ฝํธ ๋ฐฉ์ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ์๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโถ โ
โ โ
โ CPU: [๋ค๋ฅธ ์์
์ํ] [์ธํฐ๋ฝํธ ์ฒ๋ฆฌ] [๋ค๋ฅธ ์์
] โ
โ โ โฒ โ
โ โ I/O ์์ฒญ โ ์ธํฐ๋ฝํธ โ
โ โผ โ ์๋ฃ ์ ํธ โ
โ ์ฅ์น: [I/O ์์
์ํ...............] โ โ
โ โ โ
โ โ
โ ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ ๊ณผ์ : โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โ 1. ์ฅ์น๊ฐ ์ธํฐ๋ฝํธ ์ ํธ ๋ฐ์ โ โ
โ โ โ โ
โ โ 2. CPU๊ฐ ํ์ฌ ์์
์ค๋จ โ โ
โ โ - ๋ ์ง์คํฐ ์ ์ฅ โ โ
โ โ - PC (Program Counter) ์ ์ฅ โ โ
โ โ โ โ
โ โ 3. ์ธํฐ๋ฝํธ ๋ฒกํฐ ํ
์ด๋ธ ์กฐํ โ โ
โ โ ์ธํฐ๋ฝํธ ๋ฒํธ โ ํธ๋ค๋ฌ ์ฃผ์ โ โ
โ โ โ โ
โ โ 4. ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ (ISR) ์คํ โ โ
โ โ - ์ฅ์น ์ํ ํ์ธ โ โ
โ โ - ๋ฐ์ดํฐ ์ ์ก โ โ
โ โ - ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค ๊นจ์ฐ๊ธฐ โ โ
โ โ โ โ
โ โ 5. ๋ ์ง์คํฐ/PC ๋ณต์, ์๋ ์์
์ฌ๊ฐ โ โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ ์ฅ์ : CPU๊ฐ I/O ๋๊ธฐ ์ค ๋ค๋ฅธ ์์
๊ฐ๋ฅ โ
โ ๋จ์ : ์ธํฐ๋ฝํธ ์ค๋ฒํค๋, ๋น๋ฒํ I/O์์ ๋นํจ์จ์ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
2.3 DMA (Direct Memory Access)¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ DMA ๋ฐฉ์ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ CPU ๊ฐ์
์์ด ์ฅ์น์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ ์ง์ ๋ฐ์ดํฐ ์ ์ก โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โ โโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ CPU โโโ(1) ์ค์ โโโโโโโโถโ DMA ์ปจํธ๋กค๋ฌ โ โ โ
โ โ โ โโโ(4) ์ธํฐ๋ฝํธโโโโโ โ โ โ
โ โ โโโโโโโโ โ - ์์ค ์ฃผ์ โ โ โ
โ โ โ โ - ๋ชฉ์ ์ง ์ฃผ์ โ โ โ
โ โ โ (๋ค๋ฅธ ์์
์ํ) โ - ๋ฐ์ดํธ ์ โ โ โ
โ โ โ โ - ๋ฐฉํฅ โ โ โ
โ โ โ โโโโโโโโโโฌโโโโโโโโโ โ โ
โ โ โ โ โ โ
โ โ โผ (2)(3) ์ง์ ์ ์ก โ โ
โ โ โโโโโโโโโโโโ โ โ โ
โ โ โ ๋ฉ๋ชจ๋ฆฌ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ โ โ โ โ
โ โ โโโโโโโโโโโโ โ โ โ
โ โ โ โ โ
โ โ โโโโโโโโโโโโโผโโโโโโโโโโโโ โ โ
โ โ โ ๋์คํฌ ์ฅ์น โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ DMA ์ ์ก ๊ณผ์ : โ
โ 1. CPU๊ฐ DMA ์ปจํธ๋กค๋ฌ์ ์ ์ก ์ ๋ณด ์ค์ โ
โ 2. DMA๊ฐ ๋ฒ์ค ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ ์ก (Cycle Stealing) โ
โ 3. ์ ์ก ์ค CPU๋ ์บ์/๋ ์ง์คํฐ ์์
์ํ โ
โ 4. ์ ์ก ์๋ฃ ์ DMA๊ฐ ์ธํฐ๋ฝํธ ๋ฐ์ โ
โ โ
โ ์ฅ์ : ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ก ์ CPU ๋ถํ ์ต์ํ โ
โ ๋จ์ : DMA ์ปจํธ๋กค๋ฌ ๋น์ฉ, ๋ฒ์ค ๊ฒฝ์ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
3. ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ¶
3.1 ๋๋ผ์ด๋ฒ ๊ตฌ์กฐ¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ ๊ณ์ธต โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์ฌ์ฉ์ ์ ํ๋ฆฌ์ผ์ด์
โ โ
โ โ (open, read, write, ioctl) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์์คํ
์ฝ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ VFS ๊ณ์ธต โ โ
โ โ (Virtual File System) โ โ
โ โ ์ฅ์น ๋
๋ฆฝ์ ์ธ ์ถ์ํ ์ธํฐํ์ด์ค โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ ๋ธ๋ก ๋๋ผ์ด๋ฒโ โ ๋ฌธ์ ๋๋ผ์ด๋ฒโ โ ๋คํธ์ํฌ โ โ
โ โ (Block) โ โ (Character) โ โ ๋๋ผ์ด๋ฒ โ โ
โ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โ
โ โ โ โ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ SCSI/SATA โ โ TTY/Serial โ โ ์ด๋๋ท โ โ
โ โ ๋๋ผ์ด๋ฒ โ โ ๋๋ผ์ด๋ฒ โ โ ๋๋ผ์ด๋ฒ โ โ
โ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โ
โ โ โ โ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ ํ๋์จ์ด โ โ ํ๋์จ์ด โ โ ํ๋์จ์ด โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
3.2 Linux ๋๋ผ์ด๋ฒ ์์¶
// ๊ฐ๋จํ ๋ฌธ์ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ ๊ตฌ์กฐ
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#define DEVICE_NAME "mydevice"
static int major_number;
static char device_buffer[1024];
static int open_count = 0;
// ์ฅ์น ์ด๊ธฐ
static int device_open(struct inode *inode, struct file *file) {
open_count++;
printk(KERN_INFO "mydevice: opened %d time(s)\n", open_count);
return 0;
}
// ์ฅ์น ๋ซ๊ธฐ
static int device_release(struct inode *inode, struct file *file) {
printk(KERN_INFO "mydevice: closed\n");
return 0;
}
// ์ฅ์น์์ ์ฝ๊ธฐ
static ssize_t device_read(struct file *file, char __user *buffer,
size_t length, loff_t *offset) {
int bytes_to_read = min(length, sizeof(device_buffer) - (size_t)*offset);
if (*offset >= sizeof(device_buffer)) return 0;
if (copy_to_user(buffer, device_buffer + *offset, bytes_to_read)) {
return -EFAULT;
}
*offset += bytes_to_read;
return bytes_to_read;
}
// ์ฅ์น์ ์ฐ๊ธฐ
static ssize_t device_write(struct file *file, const char __user *buffer,
size_t length, loff_t *offset) {
int bytes_to_write = min(length, sizeof(device_buffer) - 1);
if (copy_from_user(device_buffer, buffer, bytes_to_write)) {
return -EFAULT;
}
device_buffer[bytes_to_write] = '\0';
return bytes_to_write;
}
// ํ์ผ ์ฐ์ฐ ๊ตฌ์กฐ์ฒด
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = device_open,
.release = device_release,
.read = device_read,
.write = device_write,
};
// ๋ชจ๋ ์ด๊ธฐํ
static int __init mydevice_init(void) {
major_number = register_chrdev(0, DEVICE_NAME, &fops);
if (major_number < 0) {
printk(KERN_ALERT "Failed to register device\n");
return major_number;
}
printk(KERN_INFO "mydevice: registered with major number %d\n",
major_number);
return 0;
}
// ๋ชจ๋ ์ ๋ฆฌ
static void __exit mydevice_exit(void) {
unregister_chrdev(major_number, DEVICE_NAME);
printk(KERN_INFO "mydevice: unregistered\n");
}
module_init(mydevice_init);
module_exit(mydevice_exit);
MODULE_LICENSE("GPL");
4. ๋ฒํผ๋ง ์ ๋ต¶
4.1 ๋ฒํผ๋ง ์ ํ¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๋ฒํผ๋ง ์ ํ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ 1. ๋จ์ผ ๋ฒํผ๋ง (Single Buffering) โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ ์ฅ์น โ โโโโถ โ ๋ฒํผ โ โโโโถ โ ํ๋ก์ธ์ค โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ
โ ๋ฌธ์ : ๋ฒํผ ์ฒ๋ฆฌ ์ค ์ฅ์น ๋๊ธฐ โ
โ โ
โ 2. ์ด์ค ๋ฒํผ๋ง (Double Buffering) โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ ์ฅ์น โ โโโโถ โ ๋ฒํผ A โ โโโโถ โ ํ๋ก์ธ์ค โ โ
โ โ โ โโโโโโโโโโโค โ โ โ
โ โ โ โโโโถ โ ๋ฒํผ B โ โโโโถ โ โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ
โ ์ฅ์น๊ฐ A์ ์ฐ๋ ๋์ ํ๋ก์ธ์ค๋ B์์ ์ฝ์ (๋ณ๋ ฌ ์ฒ๋ฆฌ) โ
โ โ
โ 3. ์ํ ๋ฒํผ๋ง (Circular Buffering) โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์ํ ๋ฒํผ ํ โ โ
โ โ โโโโโฌโโโโฌโโโโฌโโโโฌโโโโฌโโโโฌโโโโ โ โ
โ โ โ 0 โ 1 โ 2 โ 3 โ 4 โ 5 โ 6 โ โ โ
โ โ โโโโโดโโโโดโโโโดโโโโดโโโโดโโโโดโโโโ โ โ
โ โ โ โ โ โ
โ โ head tail โ โ
โ โ (์๋น ์์น) (์์ฐ ์์น) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ ์์ฐ์-์๋น์ ํจํด์์ ํจ์จ์ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
4.2 ์คํ๋ง (Spooling)¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์คํ๋ง โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ Simultaneous Peripheral Operations On-Line โ
โ โ
โ ํ๋ฆฐํฐ ์คํ๋ง ์: โ
โ โ
โ โโโโโโโโโโโ โ
โ โ ํ๋ก์ธ์ค1โโโโโ โ
โ โโโโโโโโโโโ โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ โ โ โ โ โ
โ โโโโโโโโโโโ โโโโโถโ ์คํ ๋๋ ํ ๋ฆฌ โโโโโถโ ํ๋ฆฐํฐ โ โ
โ โ ํ๋ก์ธ์ค2โโโโโค โ (๋์คํฌ ํ) โ โ ๋ฐ๋ชฌ โโโโโถ ํ๋ฆฐํฐ โ
โ โโโโโโโโโโโ โ โ โ โ (์์ฐจ์ฒ๋ฆฌ) โ โ
โ โ โ job1.spl โ โโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโ โ โ job2.spl โ โ
โ โ ํ๋ก์ธ์ค3โโโโโ โ job3.spl โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ
โ ํน์ง: โ
โ - ๋๋ฆฐ ์ฅ์น (ํ๋ฆฐํฐ)๋ฅผ ๊ฐ์ํ โ
โ - ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ "์ถ๋ ฅ" ๊ฐ๋ฅ โ
โ - ์ค์ ์ถ๋ ฅ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ โ
โ - ํ๋ก์ธ์ค๋ ์ฆ์ ๋ฐํ๋จ (๋น๋๊ธฐ) โ
โ โ
โ ๋ค๋ฅธ ์: ๋ฉ์ผ ์คํ, ๋ฐฐ์น ์์
ํ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
5. IPC ๊ฐ์¶
5.1 ํ๋ก์ธ์ค ๊ฐ ํต์ ๋ฐฉ์¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ IPC ๋ฐฉ์ ๋น๊ต โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ๋ฐฉ์ โ ํน์ง โ โ
โ โโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ํ์ดํ (Pipe) โ - ๋จ๋ฐฉํฅ (์ต๋ช
), ์๋ฐฉํฅ (๋ช
๋ช
) โ โ
โ โ โ - ๋ถ๋ชจ-์์ ํ๋ก์ธ์ค ๊ฐ ํต์ โ โ
โ โ โ - ๋ฐ์ดํธ ์คํธ๋ฆผ โ โ
โ โโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ โ - ๊ฐ์ฅ ๋น ๋ฆ (์ปค๋ ๊ฐ์
์ต์) โ โ
โ โ (Shared Memory) โ - ๋๊ธฐํ ํ์ (์ธ๋งํฌ์ด ๋ฑ) โ โ
โ โ โ - ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ํฉ โ โ
โ โโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ๋ฉ์์ง ํ โ - ๊ตฌ์กฐํ๋ ๋ฉ์์ง โ โ
โ โ (Message Queue) โ - ๋น๋๊ธฐ ํต์ โ โ
โ โ โ - ์ฐ์ ์์ ์ง์ ๊ฐ๋ฅ โ โ
โ โโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ์๊ทธ๋ (Signal) โ - ๋น๋๊ธฐ ์๋ฆผ โ โ
โ โ โ - ์ ํ๋ ์ ๋ณด ์ ๋ฌ โ โ
โ โ โ - ์ธํฐ๋ฝํธ์ ์ ์ฌ โ โ
โ โโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
โ โ ์์ผ (Socket) โ - ๋คํธ์ํฌ ํต์ โ โ
โ โ โ - ๋ค๋ฅธ ์์คํ
๊ฐ ํต์ ๊ฐ๋ฅ โ โ
โ โ โ - TCP/UDP ํ๋กํ ์ฝ โ โ
โ โโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
6. ํ์ดํ¶
6.1 ์ต๋ช ํ์ดํ (Anonymous Pipe)¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์ต๋ช
ํ์ดํ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ๋ถ๋ชจ-์์ ํ๋ก์ธ์ค ๊ฐ ๋จ๋ฐฉํฅ ํต์ โ
โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ ๋ถ๋ชจ โ ํ์ดํ โ ์์ โ โ
โ โ ํ๋ก์ธ์ค โ โ ํ๋ก์ธ์ค โ โ
โ โ โ โโโโโโโโโโโโโโโโโ โ โ โ
โ โ write(fd[1])โโโถโ===============โโโถโ read(fd[0]) โ โ
โ โ โ โโโโโโโโโโโโโโโโโ โ โ โ
โ โ close(fd[0]) โ close(fd[1])โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ
โ fd[0]: ์ฝ๊ธฐ ๋ (Read End) โ
โ fd[1]: ์ฐ๊ธฐ ๋ (Write End) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ์ต๋ช
ํ์ดํ ์์
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main() {
int pipefd[2];
pid_t pid;
char buffer[1024];
// ํ์ดํ ์์ฑ
if (pipe(pipefd) == -1) {
perror("pipe");
exit(1);
}
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
}
if (pid == 0) {
// ์์ ํ๋ก์ธ์ค: ํ์ดํ์์ ์ฝ๊ธฐ
close(pipefd[1]); // ์ฐ๊ธฐ ๋ ๋ซ๊ธฐ
ssize_t n = read(pipefd[0], buffer, sizeof(buffer));
printf("์์์ด ๋ฐ์: %.*s\n", (int)n, buffer);
close(pipefd[0]);
exit(0);
} else {
// ๋ถ๋ชจ ํ๋ก์ธ์ค: ํ์ดํ์ ์ฐ๊ธฐ
close(pipefd[0]); // ์ฝ๊ธฐ ๋ ๋ซ๊ธฐ
const char* message = "Hello from parent!";
write(pipefd[1], message, strlen(message));
printf("๋ถ๋ชจ๊ฐ ๋ณด๋: %s\n", message);
close(pipefd[1]);
wait(NULL);
}
return 0;
}
6.2 ๋ช ๋ช ํ์ดํ (Named Pipe / FIFO)¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๋ช
๋ช
ํ์ดํ (FIFO) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ํ์ผ ์์คํ
์ ์ด๋ฆ์ ๊ฐ์ง ํ์ดํ โ
โ ๊ด๋ จ ์๋ ํ๋ก์ธ์ค ๊ฐ ํต์ ๊ฐ๋ฅ โ
โ โ
โ โโโโโโโโโโโโโโโ /tmp/myfifo โโโโโโโโโโโโโโโ โ
โ โ ํ๋ก์ธ์ค A โ โ ํ๋ก์ธ์ค B โ โ
โ โ โ โโโโโโโโโโโโโโ โ โ โ
โ โ write() โโโโผโโถโ FIFO ํ์ผ โโโโถโ read() โ โ
โ โ โ โโโโโโโโโโโโโโ โ โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ
โ $ mkfifo /tmp/myfifo # ์์ฑ โ
โ $ ls -l /tmp/myfifo โ
โ prw-r--r-- 1 user group 0 Jan 15 10:00 /tmp/myfifo โ
โ # 'p'๊ฐ ํ์ดํ ์ ํ ํ์ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// FIFO ์์ฑ ๋ฐ ์ฌ์ฉ
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#define FIFO_PATH "/tmp/myfifo"
// Writer ํ๋ก์ธ์ค
void writer() {
mkfifo(FIFO_PATH, 0666);
int fd = open(FIFO_PATH, O_WRONLY);
const char* message = "Hello via FIFO!";
write(fd, message, strlen(message));
close(fd);
}
// Reader ํ๋ก์ธ์ค
void reader() {
int fd = open(FIFO_PATH, O_RDONLY);
char buffer[1024];
ssize_t n = read(fd, buffer, sizeof(buffer));
buffer[n] = '\0';
printf("Received: %s\n", buffer);
close(fd);
}
7. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ¶
7.1 POSIX ๊ณต์ ๋ฉ๋ชจ๋ฆฌ¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ํ๋ก์ธ์ค A ํ๋ก์ธ์ค B โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ โ โ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ โ โ
โ โ โ โ โ โ
โ โ โโโโโโโโโโโโโโโ โ โ โโโโโโโโโโโโโโโ โ โ
โ โ โ ์ฝ๋ โ โ โ โ ์ฝ๋ โ โ โ
โ โ โโโโโโโโโโโโโโโค โ โ โโโโโโโโโโโโโโโค โ โ
โ โ โ ๋ฐ์ดํฐ โ โ โ โ ๋ฐ์ดํฐ โ โ โ
โ โ โโโโโโโโโโโโโโโค โ โ โโโโโโโโโโโโโโโค โ โ
โ โ โ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ โโโผโโโโโโโโโโโโโโโโผโถโ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ โ โ โ
โ โ โ (0x7000) โ โ โ โ โ (0x9000) โ โ โ
โ โ โโโโโโโโโโโโโโโค โ โ โ โโโโโโโโโโโโโโโค โ โ
โ โ โ ํ โ โ โ โ โ ํ โ โ โ
โ โ โโโโโโโโโโโโโโโ โ โ โ โโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโ โ โโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ โ โ
โ โ โ โ
โ โ [๊ณต์ ์์ญ] โ โ
โ โ ํ๋ ์ 100-110 โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ ๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฅธ ๊ฐ์ ์ฃผ์๋ก ๋งคํ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// POSIX ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
#define SHM_NAME "/my_shm"
#define SHM_SIZE 4096
typedef struct {
int counter;
char message[256];
} SharedData;
int main() {
// ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์ฑ
int fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
ftruncate(fd, SHM_SIZE);
// ๋ฉ๋ชจ๋ฆฌ ๋งคํ
SharedData* shared = mmap(NULL, SHM_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
// ์ด๊ธฐํ
shared->counter = 0;
strcpy(shared->message, "Hello!");
pid_t pid = fork();
if (pid == 0) {
// ์์: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ/์์
printf("์์ ์ฝ์: counter=%d, message=%s\n",
shared->counter, shared->message);
shared->counter = 100;
strcpy(shared->message, "Modified by child");
munmap(shared, SHM_SIZE);
exit(0);
} else {
// ๋ถ๋ชจ: ์์ ๋๊ธฐ ํ ํ์ธ
wait(NULL);
printf("๋ถ๋ชจ ์ฝ์: counter=%d, message=%s\n",
shared->counter, shared->message);
// ์ ๋ฆฌ
munmap(shared, SHM_SIZE);
shm_unlink(SHM_NAME);
}
return 0;
}
7.2 ๋๊ธฐํ ํ์์ฑ¶
// ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ธ๋งํฌ์ด ๋๊ธฐํ
#include <semaphore.h>
typedef struct {
sem_t mutex; // ์ํธ ๋ฐฐ์
sem_t items; // ์์ดํ
์
sem_t spaces; // ๋น ๊ณต๊ฐ
int buffer[10];
int in, out;
} SharedBuffer;
// ์์ฐ์
void producer(SharedBuffer* sb, int item) {
sem_wait(&sb->spaces); // ๋น ๊ณต๊ฐ ๋๊ธฐ
sem_wait(&sb->mutex); // ์๊ณ ๊ตฌ์ญ
sb->buffer[sb->in] = item;
sb->in = (sb->in + 1) % 10;
sem_post(&sb->mutex); // ์๊ณ ๊ตฌ์ญ ํด์
sem_post(&sb->items); // ์์ดํ
์ถ๊ฐ ์๋ฆผ
}
// ์๋น์
int consumer(SharedBuffer* sb) {
sem_wait(&sb->items); // ์์ดํ
๋๊ธฐ
sem_wait(&sb->mutex); // ์๊ณ ๊ตฌ์ญ
int item = sb->buffer[sb->out];
sb->out = (sb->out + 1) % 10;
sem_post(&sb->mutex); // ์๊ณ ๊ตฌ์ญ ํด์
sem_post(&sb->spaces); // ๋น ๊ณต๊ฐ ์ถ๊ฐ ์๋ฆผ
return item;
}
8. ๋ฉ์์ง ํ์ ์์ผ¶
8.1 POSIX ๋ฉ์์ง ํ¶
// ๋ฉ์์ง ํ ์์
#include <mqueue.h>
#include <stdio.h>
#include <string.h>
#define QUEUE_NAME "/my_queue"
typedef struct {
long type;
char text[256];
} Message;
// ์ก์ ์
void sender() {
struct mq_attr attr = {
.mq_maxmsg = 10,
.mq_msgsize = sizeof(Message)
};
mqd_t mq = mq_open(QUEUE_NAME, O_CREAT | O_WRONLY, 0666, &attr);
Message msg;
msg.type = 1;
strcpy(msg.text, "Hello via Message Queue!");
mq_send(mq, (char*)&msg, sizeof(msg), 0);
mq_close(mq);
}
// ์์ ์
void receiver() {
mqd_t mq = mq_open(QUEUE_NAME, O_RDONLY);
Message msg;
mq_receive(mq, (char*)&msg, sizeof(msg), NULL);
printf("Received: %s\n", msg.text);
mq_close(mq);
mq_unlink(QUEUE_NAME);
}
8.2 ์์ผ ํต์ ¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์์ผ ํต์ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ ์๋ฒ ํด๋ผ์ด์ธํธ โ
โ โ
โ socket() โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ socket() โ
โ โ โ โ
โ โผ โ โ
โ bind() โ โ
โ โ โ โ
โ โผ โ โ
โ listen() โ โ
โ โ โ โ
โ โผ โผ โ
โ accept() โโโโโโโโโโ ์ฐ๊ฒฐ ์์ฒญ โโโโโโโโ connect() โ
โ โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โผ โ ๋ฐ์ดํฐ ๊ตํ โ โผ โ
โ read() โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโถโโโโwrite() โ
โ write()โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโถโโโโread() โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โผ โผ โ
โ close() โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ close() โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// TCP ์๋ฒ ์์
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_fd, client_fd;
struct sockaddr_in address;
socklen_t addrlen = sizeof(address);
char buffer[1024] = {0};
// ์์ผ ์์ฑ
server_fd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// ๋ฐ์ธ๋ฉ
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
// ๋ฆฌ์ค๋
listen(server_fd, 3);
printf("Server listening on port %d\n", PORT);
// ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์๋ฝ
client_fd = accept(server_fd, (struct sockaddr*)&address, &addrlen);
// ๋ฐ์ดํฐ ์์
read(client_fd, buffer, sizeof(buffer));
printf("Received: %s\n", buffer);
// ์๋ต ์ก์
send(client_fd, "Hello from server", 17, 0);
close(client_fd);
close(server_fd);
return 0;
}
์ฐ์ต ๋ฌธ์ ¶
๋ฌธ์ 1: I/O ๋ฐฉ์ ๋น๊ต¶
ํด๋ง, ์ธํฐ๋ฝํธ, DMA์ ์ ํฉํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ๊ฐ ์ ์ํ์์ค.
์ ๋ต ๋ณด๊ธฐ
1. ํด๋ง (Polling):
- ๋งค์ฐ ๋น ๋ฅธ ์ฅ์น (๊ณ ์ ๋คํธ์ํฌ ์นด๋)
- ์๋ต ์๊ฐ์ด ๋งค์ฐ ์งง์ ๊ฒฝ์ฐ
- ์ธํฐ๋ฝํธ ์ค๋ฒํค๋๋ฅผ ํผํ๊ณ ์ถ์ ๋
์: 10Gbps ๋คํธ์ํฌ, ์ ์ง์ฐ ํธ๋ ์ด๋ฉ ์์คํ
2. ์ธํฐ๋ฝํธ (Interrupt):
- ๋๋ฆฐ ์ฅ์น (ํค๋ณด๋, ๋ง์ฐ์ค)
- I/O ๋น๋๊ฐ ๋ฎ์ ๊ฒฝ์ฐ
- CPU๊ฐ ๋ค๋ฅธ ์์
๋ ํด์ผ ํ๋ ๊ฒฝ์ฐ
์: ์ผ๋ฐ ์
๋ ฅ ์ฅ์น, ์ ์ ์๋ฆฌ์ผ ํฌํธ
3. DMA (Direct Memory Access):
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ก
- ๋ธ๋ก ์ฅ์น (๋์คํฌ, SSD)
- ๋์ ์ฒ๋ฆฌ๋ ํ์
์: ๋์คํฌ I/O, ๋น๋์ค ์บก์ฒ, ๋์ฉ๋ ๋คํธ์ํฌ ์ ์ก
๋ฌธ์ 2: ํ์ดํ ํต์ ¶
๋ค์ ์ ๋ช ๋ น์ ๋ด๋ถ ๋์์ ํ์ดํ ๊ด์ ์์ ์ค๋ช ํ์์ค.
$ cat file.txt | grep "error" | wc -l
์ ๋ต ๋ณด๊ธฐ
1. ์์ด ๋ ๊ฐ์ ํ์ดํ ์์ฑ:
pipe1: cat โ grep
pipe2: grep โ wc
2. ์ธ ๊ฐ์ ์์ ํ๋ก์ธ์ค ์์ฑ:
ํ๋ก์ธ์ค 1 (cat):
- stdout์ pipe1[1]๋ก ๋ฆฌ๋ค์ด๋ ํธ
- exec("cat", "file.txt")
- ํ์ผ ๋ด์ฉ์ pipe1์ ์ฐ๊ธฐ
ํ๋ก์ธ์ค 2 (grep):
- stdin์ pipe1[0]์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ
- stdout์ pipe2[1]๋ก ๋ฆฌ๋ค์ด๋ ํธ
- exec("grep", "error")
- pipe1์์ ์ฝ์ด "error" ํํฐ๋ง ํ pipe2์ ์ฐ๊ธฐ
ํ๋ก์ธ์ค 3 (wc):
- stdin์ pipe2[0]์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ
- exec("wc", "-l")
- pipe2์์ ์ฝ์ด ๋ผ์ธ ์ ์นด์ดํธ
3. ๋ฐ์ดํฐ ํ๋ฆ:
file.txt โ cat โ pipe1 โ grep โ pipe2 โ wc โ stdout
๋ฌธ์ 3: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ vs ๋ฉ์์ง ํจ์ฑ¶
ํ๋ก๋์-์ปจ์๋จธ ๋ฌธ์ ๋ฅผ ๊ตฌํํ ๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉ์์ง ํ์ ์ฅ๋จ์ ์ ๋น๊ตํ์์ค.
์ ๋ต ๋ณด๊ธฐ
๊ณต์ ๋ฉ๋ชจ๋ฆฌ:
์ฅ์ :
- ๊ฐ์ฅ ๋น ๋ฅธ IPC (์ปค๋ ๊ฐ์
์์)
- ๋์ฉ๋ ๋ฐ์ดํฐ์ ํจ์จ์
- ์ ์ฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ฉ ๊ฐ๋ฅ
๋จ์ :
- ๋๊ธฐํ ์ง์ ๊ตฌํ ํ์ (์ธ๋งํฌ์ด, ๋ฎคํ
์ค)
- ๋ฐ์ดํฐ ๊ฒฝํฉ ์กฐ๊ฑด ์ฃผ์
- ๋จ์ผ ์์คํ
์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ณต์ก
๋ฉ์์ง ํ:
์ฅ์ :
- ๋๊ธฐํ ๋ด์ฅ (์ด์์ฒด์ ๊ฐ ์ฒ๋ฆฌ)
- ๊ตฌ์กฐํ๋ ๋ฉ์์ง ์ ๋ฌ
- ์ฐ์ ์์ ์ง์ ๊ฐ๋ฅ
- ๋ฉ์์ง ๊ฒฝ๊ณ ๋ช
ํ
๋จ์ :
- ๋ฐ์ดํฐ ๋ณต์ฌ ์ค๋ฒํค๋
- ๋ฉ์์ง ํฌ๊ธฐ ์ ํ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋๋ฆผ
์ ํ ๊ธฐ์ค:
- ๋์ฉ๋/๊ณ ์: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ
- ๊ฐํธํจ/์์ ์ฑ: ๋ฉ์์ง ํ
- ๋ถ์ฐ ์์คํ
: ์์ผ ๋๋ ๋คํธ์ํฌ ๋ฉ์์ง ํ
๋ฌธ์ 4: DMA ๊ณ์ฐ¶
1MB ํ์ผ์ ๋์คํฌ์์ ์ฝ์ ๋ DMA์ PIO(Programmed I/O)์ CPU ์ฌ์ฉ ์๊ฐ์ ๋น๊ตํ์์ค.
- ๋ธ๋ก ํฌ๊ธฐ: 512 ๋ฐ์ดํธ
- PIO: ๋ธ๋ก๋น CPU 100 ์ฌ์ดํด
- DMA: ์ค์ 1000 ์ฌ์ดํด, ์๋ฃ ์ธํฐ๋ฝํธ 500 ์ฌ์ดํด
- CPU ํด๋ญ: 1GHz
์ ๋ต ๋ณด๊ธฐ
ํ์ผ ํฌ๊ธฐ: 1MB = 1,048,576 ๋ฐ์ดํธ
๋ธ๋ก ์: 1,048,576 / 512 = 2,048 ๋ธ๋ก
PIO ๋ฐฉ์:
- CPU ์ฌ์ดํด = 2,048 ร 100 = 204,800 ์ฌ์ดํด
- CPU ์๊ฐ = 204,800 / 1,000,000,000 = 0.2048 ms
DMA ๋ฐฉ์:
- ์ค์ : 1,000 ์ฌ์ดํด
- ์๋ฃ ์ธํฐ๋ฝํธ: 500 ์ฌ์ดํด
- ์ด CPU ์ฌ์ดํด = 1,000 + 500 = 1,500 ์ฌ์ดํด
- CPU ์๊ฐ = 1,500 / 1,000,000,000 = 0.0015 ms
๋น๊ต:
- PIO: 0.2048 ms
- DMA: 0.0015 ms
- DMA๊ฐ ์ฝ 136๋ฐฐ ๋ ํจ์จ์
์ถ๊ฐ ๊ณ ๋ ค:
- DMA๋ ์ค์ ์ค๋ฒํค๋๊ฐ ์์ด ๋งค์ฐ ์์ ์ ์ก์๋ ๋นํจ์จ์
- ์์ต๋ถ๊ธฐ์ : 1500 / 100 = 15 ๋ธ๋ก = 7.5 KB
- 7.5 KB ์ด์์ ์ ์ก์์ DMA๊ฐ ์ ๋ฆฌ
๋ฌธ์ 5: ์์ผ ํ๋ก๊ทธ๋๋ฐ¶
TCP์ UDP ์์ผ์ ์ฐจ์ด์ ์ ์ค๋ช ํ๊ณ , ๊ฐ๊ฐ ์ ํฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ์์ค.
์ ๋ต ๋ณด๊ธฐ
TCP (Transmission Control Protocol):
ํน์ง:
- ์ฐ๊ฒฐ ์งํฅ์ (3-way handshake)
- ์ ๋ขฐ์ฑ ๋ณด์ฅ (์์, ์ฌ์ ์ก)
- ํ๋ฆ ์ ์ด, ํผ์ก ์ ์ด
- ๋ฐ์ดํธ ์คํธ๋ฆผ
์ ํฉํ ์ ํ๋ฆฌ์ผ์ด์
:
- ์น (HTTP/HTTPS)
- ์ด๋ฉ์ผ (SMTP, IMAP)
- ํ์ผ ์ ์ก (FTP, SCP)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
- SSH
UDP (User Datagram Protocol):
ํน์ง:
- ๋น์ฐ๊ฒฐํ
- ์ ๋ขฐ์ฑ ์์ (์์ค ๊ฐ๋ฅ)
- ์์ ๋ณด์ฅ ์์
- ๋ฐ์ดํฐ๊ทธ๋จ ๊ธฐ๋ฐ
- ๋ฎ์ ์ค๋ฒํค๋
์ ํฉํ ์ ํ๋ฆฌ์ผ์ด์
:
- ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ (๋น๋์ค, ์ค๋์ค)
- ์จ๋ผ์ธ ๊ฒ์
- DNS ์ฟผ๋ฆฌ
- VoIP
- IoT ์ผ์ ๋ฐ์ดํฐ
์ ํ ๊ธฐ์ค:
- ์ ๋ขฐ์ฑ ํ์: TCP
- ์๋/์ ์ง์ฐ ์ฐ์ : UDP
- ์ฝ๊ฐ์ ์์ค ํ์ฉ: UDP
- ์ ํํ ์ ๋ฌ ํ์: TCP
๋ค์ ๋จ๊ณ¶
์ด์์ฒด์ ์ด๋ก ํ์ต์ ์๋ฃํ์ต๋๋ค! ๋ค์ ๋จ๊ณ๋ก ์ถ์ฒํ๋ ํ์ต ๊ฒฝ๋ก:
์ฌํ ํ์ต¶
- Linux: ์ค์ ์ด์์ฒด์ ์์ ํ์ต ๋ด์ฉ ์ ์ฉ
- ํ๋ก์ธ์ค ๊ด๋ฆฌ:
ps,top,kill - ํ์ผ ์์คํ
:
mount,df,du - ๋คํธ์ํน:
netstat,ss,iptables
๊ด๋ จ ๋ถ์ผ¶
- Computer_Architecture: ํ๋์จ์ด ๊ด์ ์ดํด
- ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ
- ์บ์ ๋ฉ๋ชจ๋ฆฌ
- ์ ์ถ๋ ฅ ์์คํ
์ค์ต ํ๋ก์ ํธ¶
- ๋ฏธ๋ ์ ๊ตฌํ (ํ๋ก์ธ์ค ์์ฑ, ํ์ดํ)
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ตฌํ
- ํ์ผ ์์คํ ์๋ฎฌ๋ ์ดํฐ
- ์ค์ผ์ค๋ฌ ์๋ฎฌ๋ ์ดํฐ
์ฐธ๊ณ ์๋ฃ¶
- Silberschatz, "Operating System Concepts" Chapters 12-13
- Stevens, "Advanced Programming in the UNIX Environment"
- Linux man pages:
pipe(2),mmap(2),socket(2),shm_open(3) - Linux kernel documentation: https://www.kernel.org/doc/html/latest/
- Tanenbaum, "Modern Operating Systems" Chapters 5-6