λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ–₯ 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μž‘μ—…μ˜ μ™„λ£ŒλŠ” μΈν„°λŸ½νŠΈλ‘œ μ•Œλ €μ£Όκ²Œ λ©λ‹ˆλ‹€.