๐Ÿ€ Knowledge/์šด์˜์ฒด์ œ(OS)

[์šด์˜์ฒด์ œ] I/O Control : Polling, Interrupt Driven I/O, DMA๋ฐฉ๋ฒ•์ด๋ž€?

TIlearn 2024. 5. 13. 13:15

 

I/O, ์ฆ‰ ์ž…์ถœ๋ ฅ์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

  1. Polling
  2. Interrupt Driven I/O
  3. Direct Memory Access(DMA)

 

์œ„ ๋ฐฉ๋ฒ• ์ค‘์—์„œ ๋จผ์ € Polling ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

 

 

Polling์ด๋ž€?

 

Polling์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž…์ถœ๋ ฅ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ณผ์ •๋ถ€ํ„ฐ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

 

 

๊ทธ๋ฆผ์—์„œ System Call์ด ๋จผ์ € ํ˜ธ์ถœ๋œ๋‹ค.

์•ž์„œ์„œ ๋ฐฐ์› ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, Interrupt์— ์˜ํ•ด Kernel ์˜์—ญ์œผ๋กœ ์‹คํ–‰์˜ ํ๋ฆ„์ด ์˜ฎ๊ฒจ์ง„๋‹ค.

์ด๋•Œ I/O Management์—์„œ ์‹ค์ œ๋กœ ์ž…/์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์žฅ์น˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํŒ๋‹จํ•œ๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ค‘๊ฐ„์— Device-drive-interface๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Device-drive-interface๋Š” ์‹ค์ œ Device Driver์™€ I/O Management๋ฅผ ์ด์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ Device Driver๊ฐ€ ์˜ค๋”๋ผ๋„ I/O Management์™€ ํ˜ธํ™˜์‹œ์ผœ ์ค€๋‹ค.

 

Device Driver๋Š” ํ•ด๋‹น ์žฅ์น˜๋ฅผ ๋งŒ๋“  ํšŒ์‚ฌ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์šด์˜์ฒด์ œ ์ž…์žฅ์—์„œ๋Š” ๋„ˆ๋ฌด๋‚˜๋„ ๋งŽ์€ ์žฅ์น˜๊ฐ€ ์ž์‹ ์˜ ์šด์˜์ฒด์ œ์— ์žฅ์ฐฉ(?)๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜์‹œ์ผœ ์ค„ I/O Management๋งŒ ํ•„์š”ํ•˜์ง€, Device Driver๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ด๋Ÿฌํ•œ Device Driver๋Š” ์žฅ์น˜๊ฐ€ ์–ด๋– ํ•œ ์ž…๋ ฅ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์–ด๋–ค ์ถœ๋ ฅ(๋™์ž‘)์„ ๋‚ด๋†“์„์ง€ ์ •์˜ํ•ด ๋†“์•„์•ผ๋งŒ ํ•œ๋‹ค.

 

Polling์„ ํ•œ ์ค„๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด, "๋๋‚  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฌป๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ์žฅ์น˜ ๋‚ด๋ถ€์˜ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋™์ž‘ ๊ณผ์ •์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

์ด๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๋‹ค. ์žฅ์น˜๋Š” Control Register, Status Register, ๊ทธ๋ฆฌ๊ณ  Internal Buffer๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, Control Register๋Š” Command(๋ช…๋ น)์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ์ด๊ณ , Status Register๋Š” ํ˜„์žฌ I/O๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€, ์ง„ํ–‰ ์ค‘์ธ์ง€ ํ˜น์€ ์˜ค๋ฅ˜ ๋“ฑ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ ˆ์ง€์Šคํ„ฐ์ด๋‹ค.

 

๋จผ์ €, ๋ชจ๋“  ๋ ˆ์ง€์Šคํ„ฐ๋Š” Controller์•ˆ์— ์œ„์น˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ Host์™€ Device๊ฐ€ ๋ฐ”๊พธ์–ด ๊ฐ€๋ฉฐ, ์ž…/์ถœ๋ ฅ ๋กœ์ง์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

์ตœ์ดˆ์— ์žฅ์น˜๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด, Controller์•ˆ์˜ busy bit์ด๋ผ๋Š” ๋น„ํŠธ๋ฅผ ์ฝ์œผ๋ฉฐ, ํ•ด๋‹น ๋น„ํŠธ๊ฐ€ 1์ผ ๋•Œ๋Š” ์žฅ์น˜๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ I/O๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ผ๊ณ  ํŒŒ์•…ํ•œ๋‹ค. ๋งŒ์•ฝ 1์ด ์•„๋‹Œ 0์ด๋ผ๋ฉด Control register์•ˆ์— ์žˆ๋Š” write bit๋ฅผ 1๋กœ ์„ธํŒ…ํ•˜๊ณ , data-out register์— ์ž…๋ ฅ ๋ฐ”์ดํŠธ ๊ฐ’์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ์ด data-out register๋Š” Internal Buffer์— ํ•ด๋‹น๋˜๋ฉฐ, ์ž„์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€์˜ ์ƒํƒœ๋ฅผ command-ready ์ƒํƒœ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋Š” Host๊ฐ€ Deviceํ•œํ…Œ ์ž…/์ถœ๋ ฅํ•  ์ค€๋น„๋์–ด์š”~ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 

์ด๋‚ด, Controller๋Š” command-ready๊ฐ€ 1๋กœ set ๋œ ๊ฒƒ์„ ๋ณด๊ณ  busy bit๋ฅผ 1๋กœ set ํ•œ๋‹ค. ์žฅ์น˜๋Š” ์ด์ œ control register(write command)๋ฅผ ์ฝ๊ณ , data-out register๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ ๊ฐ’์„ ๋ฐ›์•„๋“ค์—ฌ I/O๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

Polling ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์žฅ์น˜์— ๋Œ€ํ•ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ status๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํ•˜์ง€๋งŒ, Device Driver์˜ ์ฝ”๋“œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰์‹œ์ผœํ•˜๊ธฐ ๋•Œ๋ฌธ์— busy wating์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.(Pragrammed I/O)

 

 

 

 

 

Interrupt-Driven I/O๋ž€?

 

Polling ๋ฐฉ์‹์—์„œ๋Š” ์ž…/์ถœ๋ ฅ์ด ๋น ๋ฅธ ๊ฒƒ์—๋Š” ํšจ์œจ์ ์ด๋‚˜, ์ž…/์ถœ๋ ฅ์ด ๋А๋ฆฐ ๊ฒƒ์—๋Š” ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค. ๋งค๋ฒˆ busy waiting์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด์— ๋”ฐ๋ผ Interrupt-Driven I/O ๋ฐฉ์‹์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

์ด ๋ฐฉ์‹์€ User Process์—์„œ I/O ์š”์ฒญ์ด ์ผ์–ด๋‚˜๋ฉด, Device Driver๊ฐ€ Device๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ Device๊ฐ€ I/O ์ž‘์—…์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค๋ฉด ํ˜„์žฌ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ Block ์‹œํ‚จ๋‹ค.

 

์ฆ‰, I/O ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ Block ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ Block ๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์ธํ•ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐ”๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ CPU๊ฐ€ Block ๋œ ํ”„๋กœ์„ธ์Šค์˜ I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” IRQ(Interrupt Request)๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋ฉด, IRQ๋ฅผ ๋ฐ›์Œ์œผ๋กœ ์ธํ•ด ISR(Interrupt Service Routine)์ด ์‹คํ–‰๋˜๊ณ  ์ธํ„ฐ๋ŸฝํŠธ์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , Block ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ Ready ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.

 

์ด์ œ, Kernel Mode์—์„œ ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค. ์ด๋•Œ ๋Œ์•„๊ฐ€๊ธฐ ์ „์— ํ”„๋กœ์„ธ์Šค์— ๋„์ฐฉํ•œ ์‹œ๊ทธ๋„์ด ์žˆ๋Š”์ง€, ํ˜น์€ ๋‚จ์€ ISR์ด ์žˆ๋Š”์ง€ ๋“ฑ์„ ํ™•์ธํ•œ๋‹ค.

 

์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด์ œ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„๊ฐˆ ๊ฒƒ์ด๋ƒ์ด๋‹ค.

I/O์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„๊ฐˆ ๊ฒƒ์ธ์ง€, ํ˜น์€ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„๊ฐˆ ๊ฒƒ์ธ์ง€ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์€ ์Šค์ผ€์ฅด๋Ÿฌ๊ฐ€ ๊ฒฐ์ •ํ•˜๋ฉฐ, ๋งŒ์•ฝ I/O ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’๋‹ค๋ฉด ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋กœ ๋Œ์•„๊ฐ„๋‹ค. 

 

 

 

 

Direct Memory Access(DMA)

 

์ž…/์ถœ๋ ฅ์€ ํ•ญ์ƒ Processor๋ฅผ ๊ฑฐ์ณ์„œ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ๋‚˜๊ฐ„๋‹ค.

ํ•˜์ง€๋งŒ ์ž…/์ถœ๋ ฅ์ด ๊ต‰์žฅํžˆ ๋งŽ์•„์ง„๋‹ค๋ฉด, ์ธํ„ฐ๋ŸฝํŠธ๋„ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์ด ๋‚˜์˜จ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ์ •์ƒ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด DMA์ด๋‹ค.

 

ํ”„๋กœ์„ธ์„œ๋Š” I/O ์ž‘์—…์„ DMA ๋ชจ๋“ˆ๋กœ ์œ„์ž„ํ•œ๋‹ค. ์ด๋•Œ DMA ๋ชจ๋“ˆ์€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ I/O๋ฅผ ํ”„๋กœ์„ธ์„œ์˜ ํ˜„์žฌ ๋™์ž‘๊ณผ ๊ด€๊ณ„์—†์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ดํ›„, I/O์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋ฉด, DMA๋Š” ์Œ“์•„๋†“์€ I/O ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ”„๋กœ์„ธ์„œ๋กœ ํ•œ ๋ฒˆ์— ์†ก์‹ ํ•œ๋‹ค.