🌌[Pintos] 1. THREADS

μ΄κ°•μš±Β·2022λ…„ 11μ›” 17일
2

🌌 Pintos

λͺ©λ‘ 보기
1/6
post-thumbnail
post-custom-banner

과제λ₯Ό μ™„μ„±ν•˜λŠ” 것이 많이 λ²…μ°¨μ§€λ§Œ, κ΅¬ν˜„ν•˜λ©΄μ„œ μ•Œκ²Œλœ 점을 μ‘°κΈˆμ”©μ΄λΌλ„ 남겨보렀고 ν•œλ‹€.

메인 μŠ€λ ˆλ“œμ™€ idle μŠ€λ ˆλ“œ

pintos의 λΆ€νŒ… μ‹œ, 기본적으둜 메인 μŠ€λ ˆλ“œμ™€ idle μŠ€λ ˆλ“œκ°€ μƒμ„±λœλ‹€.

  • 메인 μŠ€λ ˆλ“œλŠ” init.c에 μžˆλŠ” main()ν•¨μˆ˜κ°€ μŠ€λ ˆλ“œ 루틴이 λœλ‹€.

    • Pintos ꡬ동을 μœ„ν•œ 기본적인 μ΄ˆκΈ°ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€.
    • run_actions() ν•¨μˆ˜λ₯Ό 톡해 인자둜 λ„˜κ²¨λ°›μ€ ν…ŒμŠ€νŠΈ 이름과 μΌμΉ˜ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•œλ‹€.
  • idle μŠ€λ ˆλ“œλŠ” thread.c에 μžˆλŠ” idle()ν•¨μˆ˜κ°€ μŠ€λ ˆλ“œ 루틴이 λœλ‹€.

    • 일단 μžμ‹ μ„ ν•œ 번 block()μ‹œν‚€λ©΄μ„œ μŠ€μΌ€μ€„ 될 수 μžˆλŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ cpuλ₯Ό μ–‘λ³΄ν•œλ‹€.
    • ready_listκ°€ λΉ„μ–΄μžˆλŠ” 경우, 자기 μžμ‹ μ΄ λ‹€μ‹œ μŠ€μΌ€μ€„ 된 후에 μΈν„°λŸ½νŠΈλ₯Ό κΈ°λ‹€λ¦°λ‹€.
    • cpuκ°€ λΉ„μ–΄μžˆλŠ” 상황을 μ²΄ν¬ν•˜λŠ”, 톡계λ₯Ό μœ„ν•œ μŠ€λ ˆλ“œλΌκ³  이해할 수 μžˆλ‹€.

idle μŠ€λ ˆλ“œμ˜ 생성 κ³Όμ •

  1. 메인 μŠ€λ ˆλ“œλŠ” idle_startedλΌλŠ” μ„Έλ§ˆν¬μ–΄λ₯Ό μƒμ„±ν•˜κ³ , 0으둜 μ΄ˆκΈ°ν™” ν•œλ‹€.

  2. 메인 μŠ€λ ˆλ“œλŠ” thread_create() ν•¨μˆ˜λ₯Ό 톡해 idle μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•œλ‹€. idle의 μŠ€λ ˆλ“œ λ£¨ν‹΄μœΌλ‘œ idle() ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜κ³ , λ£¨ν‹΄μ˜ 인자둜 1μ—μ„œ λ§Œλ“  idle_started μ„Έλ§ˆν¬μ–΄λ₯Ό μ „λ‹¬ν•œλ‹€. thread_create() λ‚΄μ˜ unblock()이 있기 λ•Œλ¬Έμ—, idle μŠ€λ ˆλ“œλŠ” ready_list에 μΆ”κ°€λœλ‹€.

  3. λ©”μΈμŠ€λ ˆλ“œ μžμ‹ μ€, idle_started μ„Έλ§ˆν¬μ–΄μ— λŒ€ν•΄ down 을 μ‹œλ„ν•˜λ©΄μ„œ block() λœλ‹€.

➑️ λ©”μΈμŠ€λ ˆλ“œκ°€ block λ˜λ©΄μ„œ ready_list에 있던 idle μŠ€λ ˆλ“œκ°€ μŠ€μΌ€μ€„ λ˜λ©΄μ„œ 그의 μŠ€λ ˆλ“œ 루틴인 idle() ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€.

  1. idle μŠ€λ ˆλ“œλŠ” μžμ‹ μ„ idle_thread μ „μ—­λ³€μˆ˜μ— λ“±λ‘ν•œλ‹€.

  2. idle_started μ„Έλ§ˆν¬μ–΄λ₯Ό up ν•΄μ£Όλ©΄μ„œ, 3μ—μ„œ block()된 main μŠ€λ ˆλ“œλ₯Ό unblock()μ‹œμΌœμ€€λ‹€. 이둜 인해 메인 μŠ€λ ˆλ“œλŠ” ready_list에 λ“€μ–΄κ°€κ²Œ λœλ‹€.

  3. idle μŠ€λ ˆλ“œλŠ” μžμ‹ μ„ block()μ‹œν‚€κ³ , ready_list에 있던 메인 μŠ€λ ˆλ“œκ°€ μŠ€μΌ€μ€„ λ˜λ©΄μ„œ λ‹€μ‹œ μ‹€ν–‰λœλ‹€. 메인 μŠ€λ ˆλ“œλŠ” μžμ‹ μ΄ μ§„ν–‰ν•˜λ˜ μ΄ˆκΈ°ν™”λ“€μ„ λ‹€μ‹œ μž¬κ°œν•œλ‹€. 즉, 이 이후에 λ©”μΈμŠ€λ ˆλ“œλŠ”, λ©”μΈμŠ€λ ˆλ“œ μžμ‹ μ΄ μƒμ„±ν•˜λŠ” μŠ€λ ˆλ“œλ“€κ³Ό ν•¨κ»˜ cpuλ₯Ό μ–‘λ³΄ν•˜κ³  λΊμœΌλ©΄μ„œ ready_list와 cpu 사이λ₯Ό 였갈 것이닀.

➑️ μ£Όλͺ©ν•  점은 ,이후 idle μŠ€λ ˆλ“œμ— λŒ€ν•œ unblock()이 λͺ…μ‹œμ μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점이닀. idle μŠ€λ ˆλ“œκ°€ 4 ticks (time_slice) 이상 cpuμœ„μ— 올라온 μƒνƒœκ°€ λ˜μ–΄ thread_yield()κ°€ μ‹€ν–‰λ˜λ”λΌλ„, thread_yield() λŠ” idle μŠ€λ ˆλ“œλ₯Ό ready_list에 μ˜¬λ €μ£Όμ§€ μ•ŠλŠ”λ‹€(쑰건문으둜 κ΅¬ν˜„λ˜μ–΄ 있음). λ‹€λ§Œ μ–΄λ–€ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λ˜ 와쀑에 μ–΄λ–€ μ΄μœ λ‘œλ“  schedule()이 μ‹€ν–‰λ˜μ—ˆμ„ λ•Œ, ready_listκ°€ λΉ„μ–΄μžˆλ‹€λ©΄, κ·Έμ œμ„œμ•Ό idle μŠ€λ ˆλ“œκ°€ cpu에 μ˜¬λΌκ°€κ²Œ λœλ‹€.

external interrupt

μ΄λ ‡κ²Œ 계속 idle μŠ€λ ˆλ“œμ— 관심을 κ°€μ‘Œλ˜ μ΄μœ λŠ”, alarm-clock κ΅¬ν˜„ μ‹œ threadλ“€μ˜ busy waitλ₯Ό sleep으둜 κ°œμ„ ν•΄μ•Ό ν–ˆκ³ , κ°œμ„ μ΄ λ˜μ—ˆλŠ”μ§€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ idle_ticksκ°€ μ‚¬μš©λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄μ—ˆλ‹€. idle_ticksλŠ” ready_list에 더 이상 ready μƒνƒœμΈ μŠ€λ ˆλ“œκ°€ μ—†μ–΄ μŠ€μΌ€μ€„λ  λ‹€μŒ μŠ€λ ˆλ“œκ°€ μ—†λŠ” μƒνƒœ, 즉 cpuκ°€ λΉ„μ–΄μžˆκ²Œ λ˜λŠ” μƒνƒœλ₯Ό μ²΄ν¬ν•˜κΈ° μœ„ν•œ λ³€μˆ˜μ΄λ‹€. cpuκ°€ λΉ„μ–΄μžˆλ˜ tick만큼 ν•΄λ‹Ή 값이 μ¦κ°€ν•˜λŠ”λ°, λ°”λ‘œ 이 μ§€μ μ—μ„œ idle μŠ€λ ˆλ“œκ°€ interruptλ₯Ό λ°œμƒμ‹œν‚€λŠ” 것이 μ•„λ‹Œκ°€ ν•˜λŠ” 착각을 ν•˜κ²Œ λ˜μ–΄ λ§Žμ€ ν˜Όλž€μ΄ μžˆμ—ˆλ‹€. κ·Έλž˜μ„œ interrupt에 λŒ€ν•΄ μ’€ 더 μ‚΄νŽ΄λ³Ό ν•„μš”κ°€ μžˆμ—ˆλ‹€.

이번 ν”„λ‘œμ νŠΈμ—μ„œ 계속 λ°œμƒν–ˆλ˜ timer interruptλŠ” external interrupt의 일쒅이닀.
external interruptλŠ” cpu μ™ΈλΆ€μ˜ μž₯μΉ˜μ—μ„œ λ°œμƒμ‹œν‚€λŠ” interrupt이닀. μ΄λŠ” 곧, external interruptλŠ” μŠ€λ ˆλ“œκ°€ λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ”λ‹€λŠ” 말과 κ°™λ‹€.

λ‹€λ§Œ, external interruptκ°€ λ°œμƒν–ˆμ„ λ•Œ 방금 μ „κΉŒμ§€ cpuμœ„μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆμ—ˆλ˜ μŠ€λ ˆλ“œκ°€ μ‘΄μž¬ν•  뿐이닀.idle_ticksκ°€ 증가 ν•  수 μžˆμ—ˆλ˜ μ΄μœ κ°€ λ°”λ‘œ 여기에 μžˆλ‹€. timer interruptλ₯Ό μ²˜λ¦¬ν•˜λŠ” timer_interrupt() λΌλŠ” μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬λŠ” thread_tick() ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ”λ°, κ·Έ ν•¨μˆ˜λŠ” ν˜„μž¬ cpuμœ„μ— μ˜¬λΌκ°€ μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό 확인해 ν•΄λ‹Ή μŠ€λ ˆλ“œμ™€ μƒμ‘ν•˜λŠ” μ „μ—­λ³€μˆ˜ (idle_ticks or kernel_ticks)λ₯Ό 1 μ¦κ°€μ‹œμΌœ μ€€λ‹€. 이λ₯Ό 톡해 μš°λ¦¬λŠ” idle_ticks의 값을 μ¦κ°€μ‹œν‚€κ³  ν…ŒμŠ€νŠΈ μ’…λ£Œ ν›„ 확인할 수 μžˆμ—ˆλ˜ 것이닀.

schedule

λͺ…μ‹œμ μΈ 생성 호좜(thread_create())을 μ‰½κ²Œ κ΄€μ°°ν•  수 μžˆλŠ” 여타 μŠ€λ ˆλ“œλ“€κ³Ό 달리, pintos λΆ€νŒ… μ‹œ 기본적으둜 μƒμ„±λ˜μ–΄ κ°„κ³Όν•˜κΈ° μ‰¬μš΄ μŠ€λ ˆλ“œ(메인 μŠ€λ ˆλ“œ, idleμŠ€λ ˆλ“œ)듀이 어디에 μ €μž₯되고 μ–΄λ–»κ²Œ κ΄€λ¦¬λ˜λŠ”μ§€λ₯Ό μ•Œμ•„ λ³Ό 수 μžˆλŠ” κΈ°νšŒμ˜€λ‹€.

κ²°κ΅­ 이 λͺ¨λ“  μ΄μ•ΌκΈ°μ˜ 결둠은, μŠ€λ ˆλ“œλŠ” 큐에 μ €μž₯λ˜λ“ , μ „μ—­ λ³€μˆ˜μ— λ“±λ‘λ˜λ“  κΈ°μ–΅λ˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 점이닀. 어쨋든 μŠ€λ ˆλ“œλ“€μ΄ μ–΄λ”˜κ°€μ— κΈ°μ–΅λ˜κ³  μžˆμ–΄μ•Ό, ν˜„μž¬ μ‹œμŠ€ν…œμ— μ±„νƒλœ schedule 방법을 μ μš©ν•˜μ—¬ μŠ€λ ˆλ“œλ“€μ„ 관리할 수 μžˆλŠ” 것이닀.

μ›Œλ‚™ κ΅¬ν˜„μ΄ μ΄‰λ°•ν•˜λ‹€λ³΄λ‹ˆ, μ•žμœΌλ‘œλŠ” 쀑간쀑간 짧은 λ©”λͺ¨ ν˜•μ‹μœΌλ‘œ μ•Œκ²Œλœ λ‚΄μš©μ„ 적어 λ³Ό μ˜ˆμ •μ΄λ‹€.

profile
I think I think too much.
post-custom-banner

0개의 λŒ“κΈ€