๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ–ฅ CS/์šด์˜์ฒด์ œ

[์šด์˜์ฒด์ œ] I/O์˜ ์ˆ˜ํ–‰ - ์ธํ„ฐ๋ŸฝํŠธ(Interrupt)์™€ ์‹œ์Šคํ…œ ์ฝœ(System Call)

๋ณธ ๊ฒŒ์‹œ๊ธ€์€ KOCW ์ดํ™”์—ฌ์ž๋Œ€ํ•™๊ต ๋ฐ˜ํšจ๊ฒฝ ๊ต์ˆ˜๋‹˜์˜ <์šด์˜์ฒด์ œ> ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
๊ฒŒ์‹œ๊ธ€์— ํฌํ•จ๋˜๋Š” ์ด๋ฏธ์ง€ ์ž๋ฃŒ ๋˜ํ•œ ํ•ด๋‹น ๊ฐ•์˜์— ํฌํ•จ๋œ ๊ฐ•์˜ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.

I/O์˜ ์ˆ˜ํ–‰

๋ชจ๋“  I/O(์ž…์ถœ๋ ฅ) ๋ช…๋ น์€ ํŠน๊ถŒ ๋ช…๋ น์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ์ง์ ‘ I/O device์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ์–ด๋–ป๊ฒŒ I/O๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ ๊นŒ์š”??์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์Šคํ…œ ์ฝœ(System Call)์„ ํ†ตํ•ด ์šด์˜์ฒด์ œ์—๊ฒŒ I/O ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด trap์„ ์‚ฌ์šฉํ•œ ์ธํ„ฐ๋ŸฝํŠธ(Interrupt)๋ฅผ ๊ฑธ์–ด CPU ์ œ์–ด๊ถŒ์ด ์šด์˜์ฒด์ œ์—๊ฒŒ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, CPU๋Š” ์˜ฌ๋ฐ”๋ฅธ I/O ์š”์ฒญ์ธ์ง€ ํ™•์ธ ํ›„ I/O ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ์ฝœ (System Call)

์‹œ์Šคํ…œ ์ฝœ์€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์šด์˜์ฒด์ œ์˜ ์„œ๋น„์Šค๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ปค๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์‹œ์Šคํ…œ ์ฝœ

์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ I/O์™€ ๊ฐ™์€ ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ, OS ์ปค๋„์˜ I/O์™€ ๊ด€๋ จ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (mode bit์ด 1, ์ฆ‰ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ) ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด OS ์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด interrupt๋ฅผ ๊ฑธ์–ด์„œ OS ์ปค๋„์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ณผ์ •์ด ๋ฐ”๋กœ ์‹œ์Šคํ…œ ์ฝœ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ (Interrupt)

์ธํ„ฐ๋ŸฝํŠธ(Interrupt)๋ž€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์ž…์ถœ๋ ฅ ํ•˜๋“œ์›จ์–ด ๋“ฑ์˜ ์žฅ์น˜์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  ๋ฐœ์ƒ๋œ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋‹ค์‹œ ์‹คํ–‰์ค‘์ธ ์ž‘์—…์œผ๋กœ ๋ณต๊ท€ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ๋Š” ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ์™€ ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ (= Interrupt): ํ•˜๋“œ์›จ์–ด(Timer, Device Controller, DMA Controller ๋“ฑ)๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ ์ธํ„ฐ๋ŸฝํŠธ
  • ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ (= Trap)
    • Exception: ํ”„๋กœ๊ทธ๋žจ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•œ ๊ฒฝ์šฐ
    • System call: ํ”„๋กœ๊ทธ๋žจ์ด ์ปค๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ

์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด, ์ธํ„ฐ๋ŸฝํŠธ ๋‹นํ•œ ์‹œ์ ์˜ ๋ ˆ์ง€์Šคํ„ฐ์™€ Program Counter๋ฅผ ์ €์žฅํ•œ ํ›„ CPU์˜ ์ œ์–ด๋ฅผ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ๋ฃจํ‹ด์— ๋„˜๊น๋‹ˆ๋‹ค.ํ˜„๋Œ€์˜ ์šด์˜์ฒด์ œ๋Š” ์ธํ„ฐ๋ŸฝํŠธ์— ์˜ํ•ด ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋งŒ CPU ์ œ์–ด๊ถŒ์ด OS์—๊ฒŒ ๋„˜์–ด๊ฐ€๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด CPU๋Š” ํ•ญ์ƒ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ ๊ด€๋ จ ์šฉ์–ด

์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ผ๋“ค์ด ์šด์˜์ฒด์ œ ์•ˆ์— ์ปค๋„ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ: ํ•ด๋‹น ์ธํ„ฐ๋ŸฝํŠธ์˜ ์ฒ˜๋ฆฌ ๋ฃจํ‹ด ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ๋ฃจํ‹ด(= Interrupt Service Routine, ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ): ํ•ด๋‹น ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปค๋„ ํ•จ์ˆ˜

๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ๊ณผ ๋น„๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ

๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ (Synchronous I/O)

I/O ์š”์ฒญ ํ›„ ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์—์•ผ ์ œ์–ด๊ฐ€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

 

๊ตฌํ˜„๋ฐฉ๋ฒ• 1: CPU๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด์„œ ๊ธฐ๋‹ค๋ฆผ

  • I/O๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ CPU๋ฅผ ๋‚ญ๋น„์‹œํ‚ด
  • ๋งค์‹œ์  ํ•˜๋‚˜์˜ I/O๋งŒ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Œ

โ†’ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•

 

๊ตฌํ˜„๋ฐฉ๋ฒ• 2: ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„๋™์•ˆ CPU๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šคํ•œํ…Œ ๋„˜๊ฒจ์คŒ

  • I/O๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์—์„œ CPU๋ฅผ ๋นผ์•—์Œ
  • I/O ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ์— ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ๋„ฃ์Œ
  • ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ CPU๋ฅผ ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„
  • I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด device controller๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๊ฑธ์–ด ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆผ

โ†’ CPU, I/O ๋‘˜๋‹ค ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—… ๊ฐ€๋Šฅ

๋น„๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ (Asynchronous I/O)

I/O๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ œ์–ด๊ฐ€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์— ์ฆ‰์‹œ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. (๋‹ค๋ฅธ ์ž‘์—…์„ ์œ„ํ•œ instruction ๊ณง๋ฐ”๋กœ ์‹คํ–‰)

 

๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ vs ๋น„๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ

I/O ์ž‘์—…์€ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„์ด ํ˜๋Ÿฌ์•ผ I/O์ž‘์—…์ด ๋๋‚˜๊ฒŒ ๋˜๊ณ  I/O์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„์ฐฉํ•˜๋Š”๋ฐ(device controller๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๊ฑธ์–ด์„œ ๋๋‚ฌ์Œ์„ ์•Œ๋ฆฌ๊ฒŒ ๋จ), ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ (๋„์ฐฉ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€) ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ ์ž‘์—…์„ ํ•œ๋‹ค๋ฉด ๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ด๊ณ , I/O์ž‘์—… ์š”์ฒญ๋งŒ ํ•ด๋†“๊ณ  ๋ฐ”๋กœ CPU์ œ์–ด๊ถŒ์„ ์–ป์–ด์„œ ๋‹ค๋ฅธ ์ž‘์—…๋“ค์„ ํ•˜๋Š” ๊ฒƒ์€ ๋น„๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

๋ณดํ†ต์˜ ๊ฒฝ์šฐ(read ์ž‘์—…)์—๋Š” I/O์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฐ€์ง€๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐ์‹(sync) ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ, ํ•˜์ง€๋งŒ, ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์—†์ด ๊ทธ ๋‹ค์Œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์ถœ๋ ฅ๊ฒฐ๊ณผ ๊ตณ์ด ๋ฐ”๋กœ ๋ณด์ง€ ์•Š์•„๋„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…๋“ค)๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” I/O ๊ฒฐ๊ณผ๋ฌผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๊ทธ ์ž‘์—…์„ ๋จผ์ € ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋น„๋™๊ธฐ์‹(async) ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์œผ๋กœ I/O์š”์ฒญ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ, ๊ตฌํ˜„๋ฐฉ๋ฒ• 1๊ณผ ๊ฐ™์ด I/O๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ CPU๊ฐ€ ์•„๋ฌด์ผ๋„ ํ•˜์ง€์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฐ๋‹ค๋ฉด CPU, I/O ๋‘˜๋‹ค ๋‚ญ๋น„๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„๋ฐฉ๋ฒ• 2์™€ ๊ฐ™์ด ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

๋™๊ธฐ์‹, ๋น„๋™๊ธฐ์‹ ์ž…์ถœ๋ ฅ ๋ฐฉ์‹ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ I/O์ž‘์—…์˜ ์™„๋ฃŒ๋Š” ์ธํ„ฐ๋ŸฝํŠธ๋กœ ์•Œ๋ ค์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.