Skip to content

choidabom/KAIST-PintOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

PintOS

Brand new pintos for Operating Systems and Lab (CS330), KAIST, by Youngjin Kwon.

The manual is available at https://casys-kaist.github.io/pintos-kaist/.

SW Jungle Week08 (2022.11.10 ~ 11.16)

PROJECT 1: THREADS

PintOS์—์„œ thread์™€ process์˜ ๊ด€๊ณ„

์‹ค์ œ OS(Operating System)์—์„œ๋Š” ํ•˜๋‚˜์˜ process ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ thread๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ thread๋“ค์€ ๊ฐ™์€ virtual address space๋ฅผ ๊ณต์œ ํ•œ๋‹ค. PintOS์—์„œ๋Š” ๊ตฌํ˜„์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•˜๋‚˜์˜ process์— ํ•˜๋‚˜์˜ thread๋งŒ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋˜์–ด

WIL (Weekly I Learned)

11.10 ๋ชฉ

  • ์ž‘์—…ํ™˜๊ฒฝ ์„ธํŒ… (EC2, Ubuntu18.04) + repo ์ƒ์„ฑ
  • PintOS project Git Book ์ฝ๊ธฐ

11.11 ๊ธˆ

  • KAIST ๊ถŒ์˜์ง„ ๊ต์ˆ˜๋‹˜ OS ์ฒซ ๋ฒˆ์งธ ๊ฐ•์˜

  • ๊ณต๋ถ€๋กœ ๋„๋ง์น˜์ง€ ๋งˆ์„ธ์š”. from ์ฝ”์น˜๋‹˜

11.12 ํ† 

PintOS ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ ํŒŒ์•…

  • /threads/init.c
  • /threads/thread.c
  • /lib/kernel/list.c & /include/lib/kernel/list.h
  • /tests/threads/tests.c
  • /threads/synch.c

11.13 ์ผ

Alarm clock ๊ตฌํ˜„

  • Alarm Clock์ด๋ž€?
    • ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ํ›„์— ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ์ปค๋„ ๋‚ด๋ถ€ ํ•จ์ˆ˜
    • PintOS์—์„œ๋Š” thread๊ฐ€ CPU๋ฅผ ์‚ฌ์šฉํ•  ์‹œ๊ฐ„(ํ• ๋‹น์‹œ๊ฐ„)์€ 4 tick(40ms)์œผ๋กœ ํ•œ์ •๋˜์–ด ์žˆ์Œ
    • 4 tick์ด ์ง€๋‚˜๋ฉด thread๋Š” ready_list์˜ ๋งจ ๋’ค์— ์ถ”๊ฐ€๋จ
  • ๋ฌธ์ œ์ : Pintos์˜ Alarm clock์€ loop ๊ธฐ๋ฐ˜์˜ Busy waiting ๋ฐฉ์‹
    • Busy waiting ๋ฐฉ์‹: time_interrupt๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ready_list๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ thread๋“ค์ด ์‚ฌ์šฉํ•ด์•ผํ•  ํƒ€์ด๋ฐ์ธ์ง€๋ฅผ ์ฒดํฌํ•จ
    • ์ฆ‰, ์ž๊ณ  ์žˆ๋Š” thread๋“ค ์ค‘์— ์•„์ง ์ผ์–ด๋‚  ์‹œ๊ฐ„์ด ์•„๋‹Œ thread๋“ค๋„ running์— ์ƒํƒœ์— ๋„ฃ์–ด CPU๋ฅผ ์“ฐ๋ฉด์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ
  • ๋ชฉํ‘œ: ํ”„๋กœ์„ธ์Šค๋ฅผ ์žฌ์šธ ๋•Œ ์‹œ์Šคํ…œ ์ž์› ๋‚ญ๋น„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ: sleep/wake up์œผ๋กœ ๋ฌธ์ œ์  ๊ฐœ์„ 
    • sleep_list๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ thread๋“ค์„ blocked๋œ ์ƒํƒœ(์ž ์ž๋Š” ์ƒํƒœ)๋กœ ๋„ฃ์–ด์คŒ
    • time_interrupt๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค sleep_list์— ์กด์žฌํ•˜๋Š” thread๋“ค ์ค‘ ๊นจ์›Œ์•ผํ•  tick์ด ๋œ thread๋ฅผ ready_list์— ๋„ฃ๊ณ  ์ƒํƒœ๋ฅผ ready๋กœ ๋ฐ”๊ฟ”์คŒ
    • ์•„์ง ๊นจ์–ด๋‚  ์‹œ๊ฐ„(tick)์ด ๋˜์ง€ ์•Š์€ thread๋“ค์€ CPU๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๋ฌธ์ œ ํ•ด๊ฒฐ

11.14 ์›”

Priority Scheduling (1) Priority Scheduling ๊ตฌํ˜„

  • Scheduling๋ž€?

    • ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ์ž์›์„ ์–ด๋–ค ์‹œ์ ์— ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ž์›์„ ํ• ๋‹นํ•  ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ
  • ๋ฌธ์ œ์ : thread๋“ค ๊ฐ„์˜ ์šฐ์„ ์ˆœ์œ„ ์—†์ด ready_list์— ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋จ(Round-Robin ๋ฐฉ์‹)

    • Pintos๋Š” Round-Robin ๋ฐฉ์‹ ์ฑ„ํƒ, ํ• ๋‹น๋œ ์‹œ๊ฐ„ 4 tick์ด ์ง€๋‚˜๋ฉด running thread๋Š” ๋‹ค๋ฅธ thread์—๊ฒŒ ์„ ์ ๋‹นํ•จ
    • Pintos๋Š” ์ƒˆ๋กœ์šด thread๋ฅผ ready_list์— ๋„ฃ์„ ๋•Œ ํ•ญ์ƒ ๋งจ ๋’ค์— ๋„ฃ๊ณ , ready_list์—์„œ ๋‹ค์Œ CPU์— ํ• ๋‹นํ•  thread๋ฅผ ์ฐพ์„ ๋•Œ๋Š” ์•ž์—์„œ ๊บผ๋ƒ„
  • ๋ชฉํ‘œ: thread์˜ ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ scheduling ํ•˜๋Š” ๊ฒƒ

  • ๋ฌธ์ œ ํ•ด๊ฒฐ: ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ thread๋ฅผ ready_list์˜ ๋งจ ์•ž์— ์œ„์น˜์‹œํ‚ด

    • thread๋ฅผ ready_list์— ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ์ •๋ ฌ๋˜๋„๋ก ์‚ฝ์ž…

    • ready_list์—์„œ thread๋ฅผ ๋บ„ ๋•Œ ์•ž์—์„œ๋ถ€ํ„ฐ ๋นผ๊ธฐ ๋•Œ๋ฌธ

    • ๋ฌธ์ œ ํ•ด๊ฒฐ์—์„œ์˜ ๋ฌธ์ œ: running thread๊ฐ€ ๊ฐ€์žฅ ๋†’์€ priority๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ๋ชป ํ•จ 1. ์ƒˆ๋กœ์šด thread์˜ priority๊ฐ€ ํ˜„์žฌ runningํ•˜๊ณ  ์žˆ๋Š” thread๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„์งˆ ๋•Œ 2. thread์˜ priority๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ => ready_list์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ thread์™€ running thread๋ฅผ ๋น„๊ตํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ thread๊ฐ€ ์„ ์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

11.15 ํ™”

Priority Scheduling (2) Semaphore, Lock, Condition Variable ๊ตฌํ˜„

  • Semaphore, Lock, Condition Variable์„ ์‚ฌ์šฉํ•˜์—ฌ Priority Scheduling ๊ฐœ์„ 
    • PintOS๋Š” ์—ฌ๋Ÿฌ thread๋“ค์ด Semaphore, Lock, Condition Variable๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆด ๊ฒฝ์šฐ ๋จผ์ € ์˜จ thread๊ฐ€ ๋จผ์ € ์‚ฌ์šฉํ•˜๋Š” FIFO ๋ฐฉ์‹์„ ์‚ฌ์šฉ
    • Sychronization ๋„๊ตฌ๋“ค์„ ๊ธฐ๋‹ค๋ฆด ๋•Œ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ thread๊ฐ€ CPU๋ฅผ ์ ์œ ํ•˜๋„๋ก ๊ตฌํ˜„

11.16 ์ˆ˜

Priority Scheduling (3) Priority donation(Prority inversion problem) ๊ตฌํ˜„

  • ๋ฌธ์ œ์ : ์—ฌ๋Ÿฌ thread๊ฐ€ lock์„ ์š”์ฒญํ•˜๊ณ  ์ ์œ ํ•˜๋Š” ๊ณผ์ •์—์„œ Priority Inversion ๋ฐœ์ƒ
    • priority๊ฐ€ ๋†’์€ thread๊ฐ€ priority๊ฐ€ ๋‚ฎ์€ thread๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ˜„์ƒ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ: Priority donation
    • Multiple donation
      • thread๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ lock ๋ณด์œ  ์‹œ ๊ฐ lock์„ ํš๋“ํ•˜๊ณ ์ž ํ•˜๋Š” thread๋“ค์—๊ฒŒ donation ๋ฐœ์ƒ๊ฐ€๋Šฅ
      • ์˜ˆ์‹œ) thread L์ด lock A์™€ lock B๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ์„ ๋•Œ thread M์ด lock A๋ฅผ ์š”์ฒญ, thread H๊ฐ€ lock B๋ฅผ ์š”์ฒญํ•˜๋Š” ์ƒํ™ฉ
    • Nested donation
      • ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋‹จ๊ณ„์  donation์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ

11.17 ๋ชฉ

Project 1 ๊ฒฐ๊ณผ

  • 10:00 ~ 11:00 ๋ฐœํ‘œ ์ง„ํ–‰

SW Jungle Week09 (2022.11.17 ~ 11.28)

PROJECT 2: USER PROGRAMS

WIL (Weekly I Learned)

11.18 ๊ธˆ

  • Git book ๊ณผ์ œ ์„ค๋ช…์„œ ๊ณต๋ถ€

11.19 ํ† 

Argument Passing ํฐ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ

  • init.c

  • init.c์˜ main ํ•จ์ˆ˜์—์„œ read_command_line()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ช…๋ น์–ด๋ฅผ ์ฝ์–ด์˜จ๋‹ค. -> argv ๋ช…๋ น์–ด๋กœ ๋“ค์–ด์˜ค๋Š” ์ธ์ž์˜ ํ˜•ํƒœ๋Š” ๋ช…๋ น์–ด์™€ ๊ทธ ๋ช…๋ น์–ด์˜ ๋Œ€์ƒ์ด๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์ž๊ฐ€ 1๊ฐœ๋งŒ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ(args-single.ck)๋ผ๋ฉด, argv๋Š” run 'args-single onearg'์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ํ˜ธ์ถœ๋œ ๋ช…๋ น์–ด parse_options๋ฅผ ํ†ตํ•ด option์— ๋”ฐ๋ผ ๋ช…๋ น์–ด๋ฅผ ์ ์ ˆํžˆ parsingํ•œ๋‹ค.

  • ๋ช…๋ น์–ด๋Š” run_action ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค. argv์•ˆ์˜ ๋ช…๋ น์–ด ๋ฌธ์ž์—ด์— ์žˆ๋Š” ๋ช…๋ น์–ด run์€ run_task ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • run_task ํ•จ์ˆ˜์—์„œ task = argv[1]๋กœ ์ •ํ•ด์ง„๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ช…๋ น์–ด๋กœ ๋“ค์–ด์˜ค๋Š” ์ธ์ž์˜ ํ˜•ํƒœ๋Š” ๋ช…๋ น์–ด์™€ ๊ทธ ๋ช…๋ น์–ด์˜ ๋Œ€์ƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…๋ น์–ด์˜ ๋Œ€์ƒ์— ํ•ด๋‹น๋˜๋Š” ์ธ์ž์ธ 'args-single onearg'๊ฐ€ process_create_initd์˜ ์ธ์ž๊ฐ€ ๋œ๋‹ค. ํ•ด๋‹น ์ธ์ž๋Š” ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ์ด๋ฆ„๊ณผ ํ”„๋กœ๊ทธ๋žจ๋“ค์˜ ์ธ์ž๋“ค์ด ๊ฐ™์ด ์œ„์น˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ๋ช…๊ณผ ์ธ์ž๋“ค์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ parsingํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

  • process.c

  • process_create_initd()์˜ ์ธ์ž๋กœ ์ž…๋ ฅ๋ฐ›์€ ๋ช…๋ น์–ด์˜ ๋Œ€์ƒ(task = argv[1])์ด ๋“ค์–ด์˜จ๋‹ค. ํ•ด๋‹น ๋ฌธ์ž์—ด์€ thread_create์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€์„œ ํ•ด๋‹น ์ธ์ž๋ฅผ ์ด๋ฆ„์œผ๋กœ ํ•œ kernel ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑ๋œ ์ดํ›„ running thread๊ฐ€ ๋˜๋Š” ์‹œ์ ์— ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„ ํ•จ์ˆ˜ initd๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • initd() ํ•จ์ˆ˜๋Š” process_exec()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • process_exec() ํ•จ์ˆ˜๋Š” load()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • loadํ•จ์ˆ˜์—์„œ ์ž…๋ ฅ๋ฐ›์€ ์ธ์ž๋ฅผ parsingํ•˜๊ณ  ํ•ด๋‹น ์ปค๋„ ์Šค๋ ˆ๋“œ์˜ ์ธํ„ฐ๋ŸฝํŠธ ํ”„๋ ˆ์ž„์— ์ธ์ž์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ดํ›„ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค.(if->rip) ์ด๋•Œ filesys_open์— ์ „๋‹ฌ๋˜๋Š” file_name์€ ์ž…๋ ฅ๋ฐ›์€ ์ธ์ž๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ parsingํ•  ๋•Œ ๋“ฑ์žฅํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์ด๋‹ค.๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ์ธ์ž๊ฐ€ ๋œ๋‹ค.

  • ํŒŒ์‹ฑํ•œ ๋ฌธ์ž์—ด์„ ์Šคํƒ์— ์Œ“๋Š”๋‹ค. ์Šคํƒ์€ ์ฃผ์†Œ๊ฐ€ ๊ฐ์†Œํ•˜๋ฉด์„œ ํ™•์žฅํ•œ๋‹ค.(์œ„->์•„๋ž˜). ์ธ์ž -> 8๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ๊ณต๋ฐฑ ๊ณต๊ฐ„ -> ํŒŒ์‹ฑํ•œ ์ธ์ž์˜ ์Šคํƒ ์ฃผ์†Œ -> ๊ฐ€์งœ ๋ฐ˜ํ™˜ ์ฃผ์†Œ ์ˆœ์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

๊ณผ์ • ์ค‘ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„๊ณผ ์•Œ๊ฒŒ ๋œ ์ 

  1. userprog/process.c์˜ tid_t process_create_initd (const char *file_name)
  • Q. tid๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” thread_create ํ•จ์ˆ˜์—์„œ ์ธ์ž๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ์–ธ์ œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ธ๊ฐ€?
    • thread_create(file_name, PRI_DEFAULT, initd, fn_copy)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ์ƒˆ๋กœ์šด kernel ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด kernel ์Šค๋ ˆ๋“œ๋Š” initd() ํ•จ์ˆ˜๋ฅผ thread routine์œผ๋กœ ๊ฐ€์ง€๋Š” ์Šค๋ ˆ๋“œ๋กœ, ์ƒ์„ฑ ํ›„ ready list์— ๋“ค์–ด๊ฐ„ ๋’ค, running thread๊ฐ€ ๋˜๋Š” ์‹œ์ ์— initd()๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

11.20 ์ผ

Argument Passing

  • ๋ชฉํ‘œ: ์ž…๋ ฅ๋ฐ›์€ ์ธ์ž๋ฅผ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์‹ฑํ•˜๊ธฐ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ: strok_rํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์‹ฑํ•จ.
  1. ํŒŒ์‹ฑํ•œ ์ธ์ž์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์—ด์€ ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„์ด ๋œ๋‹ค. => process_name
  2. ํŒŒ์‹ฑํ•œ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์Šคํƒ์— ์Œ“๋Š”๋‹ค. (์Šคํƒ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋ฉด์„œ)
  3. ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ณ  8byte word-align์„ ๋งž์ถฐ์ฃผ๊ธฐ ์œ„ํ•ด ๋‚จ์€ ๊ณต๊ฐ„์— null์„ ๋„ฃ์–ด์ค€๋‹ค.
  4. 2๋‹จ๊ณ„์—์„œ ๋„ฃ์€ ๋ฌธ์ž์—ด๋“ค์ด ์œ„์น˜ํ•œ ์Šคํƒ ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
  5. ๊ฐ€์งœ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ดํ›„ return ๋œ ์ดํ›„ pc๊ฐ€ ์ฝ์„ ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ฃผ์†Œ๋ฅผ return address๋กœ ๋„ฃ๋Š”๋‹ค.

๋‹ค๋งŒ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น return address๋กœ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์Šคํƒ ํ”„๋ ˆ์ž„๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์งœ ๋ฐ˜ํ™˜์ฃผ์†Œ๋ฅผ ๋„ฃ๋Š”๋‹ค.

  • Argument Passing์€ load()(in userprog/process.c)๋‚ด์—์„œ ๊ตฌํ˜„ํ•œ๋‹ค.

11.21 ์›”

System Calls

  • thread.h ๋‚ด์˜ struct fild_fd ์„ ์–ธ๊ณผ struct thread ๋‚ด ๋ฉค๋ฒ„ ์ถ”๊ฐ€
struct file_fd
{
	int fd;					          /* fd: ํŒŒ์ผ ์‹๋ณ„์ž */
	struct file *file;		    /* file */
	struct list_elem fd_elem; /* list ๊ตฌ์กฐ์ฒด์˜ ๊ตฌ์„ฑ์› */
};
  • ํŒŒ์ผ์„ openํ•˜๊ฒŒ ๋˜๋ฉด file์„ openํ•˜๊ณ  ์ด์— ๋Œ€์‘ํ•˜๋Š” fd๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ mappingํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ
  • ์ด๋ฅผ ์œ„ํ•ด file๊ณผ fd๋ฅผ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” file_fd ๊ตฌ์กฐ์ฒด๋ฅผ
  • open ํ• ๋•Œ๋Š” ์ƒˆ๋กœ์šด file_fd ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  file์„ ์—ด๊ณ  fd๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ ์ €์žฅํ•จ.
  • close ํ• ๋•Œ๋Š” close ํ•˜๋ ค๋Š” fd์— ๋Œ€์‘ํ•˜๋Š” file์„ ๋‹ซ๊ณ  fd๋ฅผ NULL๋กœ ๋ณ€๊ฒฝํ•จ.
struct thread
{
	....
	struct list fd_list;		/* file_fd ๊ตฌ์กฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” Doubley Linked List */
	int fd_count;			/* fd๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ count*/
	int exit_status
	struct semaphore fork_sema;   	/* ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ fork๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ์„ธ๋งˆํฌ์–ด */
	struct semaphore wait_sema;
	struct semaphore exit_sema;

	struct list child_list;		/* ์ž์‹ ์Šค๋ ˆ๋“œ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ฆฌ์ŠคํŠธ */
	struct list_elem child_elem;  	/* ์ž์‹ ๋ฆฌ์ŠคํŠธ element */
	struct file *now_file;        	/* ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜  */
	....
};
  • open ๋œ ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ fd๋ฅผ ์ €์žฅํ•˜๋Š” fd_list๋ผ๋Š” list๋ฅผ ์„ ์–ธํ•จ.
  • fd_elem์€ fd_list๋ผ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— list_elem(fd_elem)์œผ๋กœ ์‚ฝ์ž…๋˜์–ด ์ €์žฅ๋จ.
  • fd_count๋Š” file์„ ์—ด ๋•Œ๋งˆ๋‹ค ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜์ด๋‹ค. ํŒŒ์ผ์„ openํ•  ๋•Œ๋งˆ๋‹ค fd_count๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์ฆ๊ฐ€๋œ fd_count๋ฅผ fd๋กœ ํ• ๋‹นํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— open๋  ๋•Œ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด fd๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

11.22 ํ™”

System Calls

  • ๋ชฉํ‘œ: ์ด 14๊ฐœ์˜ ๊ตฌํ˜„ํ•ด์•ผํ•  syscall

  • ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ system call

    • halt(), wait(), fork(), exit(), exec()
  • ํŒŒ์ผ ๊ด€๋ จ system call

    • open(), filesize(), close(), read(), write(), seek(), tell(), create(), remove()
  • create()์™€ remove()๋ฅผ ์ œ์™ธํ•œ ํŒŒ์ผ ๊ด€๋ จ system call๋“ค์€ file descriptor๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, file descriptor๋ฅผ ์ด์šฉํ•ด์„œ file์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • kernel์€ file descriptor์™€ ์‹ค์ œ file ๊ตฌ์กฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ด๋ฅผ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ fd table์ด๋‹ค.

System Calls - halt(), exit()

  • halt(): pintos๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ์‹œ์Šคํ…œ ์ฝœ
    • power_off()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ pintos๋ฅผ ์ข…๋ฃŒ์‹œ์ผฐ๋‹ค.
  • exit(): ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ์‹œ์Šคํ…œ ์ฝœ
    • ์Šค๋ ˆ๋“œ ๊ตฌ์กฐ์ฒด ์•ˆ์— exit_status ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ธ์ž๋กœ ๋ฐ›์€ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

Process Termination Message

  • exit() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์–ด๋–ค ์ด์œ ๋“ค๋กœ ์œ ์ € ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„๊ณผ exit code๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ง€์ •๋œ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
    • printf("%s: exit(%d)\n", ....);

11.23 ์ˆ˜

System Calls - filesize(), seek(), tell()

  • filesize(): fd๋กœ ์—ด๋ ค์žˆ๋Š” ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ ์ฝœ
    • ์—ด๋ ค์ ธ ์žˆ๋Š” file์„ ๊ด€๋ฆฌํ•˜๋Š” fd_list๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐพ์œผ๋ ค๋Š” fd์™€ mapping๋œ file์„ ์ฐพ๋Š”๋‹ค.
    • file์˜ ํฌ๊ธฐ๋ฅผ byte๋‹จ์œ„๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ file_length()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • seek() : fd๋กœ ์—ด๋ ค์žˆ๋Š” ํŒŒ์ผ์˜ (์ฝ๊ณ  ์“ธ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š”) ํฌ์ธํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ ์ฝœ
    • ์—ด๋ ค์ ธ ์žˆ๋Š” file์„ ๊ด€๋ฆฌํ•˜๋Š” fd_list๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐพ์œผ๋ ค๋Š” fd์™€ mapping๋œ file์„ ์ฐพ๋Š”๋‹ค.
    • file์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„ position์œผ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ ์ฃผ๋Š” ํ•จ์ˆ˜ file_seek()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • tell() : fd์—์„œ ์ฝํžˆ๊ฑฐ๋‚˜ ์จ์งˆ ๋‹ค์Œ ๋ฐ”์ดํŠธ์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜
    • ์—ด๋ ค์ ธ ์žˆ๋Š” file์„ ๊ด€๋ฆฌํ•˜๋Š” fd_list๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฐพ์œผ๋ ค๋Š” fd์™€ mapping๋œ file์„ ์ฐพ๋Š”๋‹ค.
    • file์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜ file_tell()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ~~ filesize(), seek(), tell()์€ ์‹œ์Šคํ…œ ์ฝœ์ด ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” test case ๋ถ€์ œ๋กœ test๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ์ฝœ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ๋จ์„ ํ™•์ธํ•˜์˜€๋‹ค.~~

11.24 ๋ชฉ

System Calls - create(), remove()

  • create() : ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ

    • check_addressํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ์œ ์ € ์˜์—ญ์— ์กด์žฌํ•˜๋Š”์ง€, ํŽ˜์ด์ง€๊ฐ€ ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
    • ํŒŒ์ผ๋ช… ์ธ์ž file์ด NULL์ผ ๊ฒฝ์šฐ exit(-1)์„ ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.
    • file์„ ์ด๋ฆ„์œผ๋กœ ํ•˜๊ณ  initial_size์ธ์ž๋ฅผ ํฌ๊ธฐ๋กœ ํ•œ file์„ ์ƒ์„ฑํ•˜๊ณ , ์„ฑ๊ณต์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ filesys_create()๋ฅผ ํ˜ธ์ถœ ํ•œ๋‹ค.
    • ํŒŒ์ผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉด true๋ฅผ ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • remove(): ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ

    • check_addressํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ํฌs์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ์œ ์ € ์˜์—ญ์— ์กด์žฌํ•˜๋Š”์ง€, ํŽ˜์ด์ง€๊ฐ€ ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
    • file์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  ์„ฑ๊ณต์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ filesys_remove()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

11.25 ๊ธˆ

System Calls - read()

  • read() : fd๋ฅผ ํ†ตํ•ด ์—ด๋ฆฐ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์‹œ์Šคํ…œ ์ฝœ.
    • fd๊ฐ€ 0์ผ ๋•Œ๋Š” ํ‚ค๋ณด๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ๋ฒ„ํผ์— ์ €์žฅํ•˜๊ณ  ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜. -> input_getc() ํ™œ์šฉ
    • fd๊ฐ€ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ 1์ผ ๊ฒฝ์šฐ์—๋Š” read์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ fd์ด๋ฏ€๋กœ exit(-1)
    • ํŒŒ์ผ์— ๋™์‹œ ์ ‘๊ทผ์ด ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด lock ๊ตฌ์กฐ์ฒด filesys_lock์„ ์„ ์–ธํ•˜์—ฌ ํ™œ์šฉ.
    • ์ฝ์€ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ byte๋‹จ์œ„๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜, file_read() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ.

11.26 ํ† 

System Calls - write()

  • write() : fd๋ฅผ ํ†ตํ•ด ์—ด๋ฆฐ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ.
    • fd๊ฐ€ 1์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ํ‘œ์ค€ ์ถœ๋ ฅ์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ž์—ด์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ฃผ๋Š” putbuf() ํ•จ์ˆ˜ ํ™œ์šฉ (putbuf ํ•จ์ˆ˜๋Š” buffer์— ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ size๋งŒํผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜)
    • fd๊ฐ€ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” write์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ fd์ด๋ฏ€๋กœ exit(-1)
    • ํŒŒ์ผ์— ๋™์‹œ ์ ‘๊ทผ์ด ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด lock ๊ตฌ์กฐ์ฒด filesys_lock์„ ์„ ์–ธํ•˜์—ฌ ํ™œ์šฉ.
    • fd๊ฐ€ 1์ด ์•„๋‹ ๊ฒฝ์šฐ ๋ฒ„ํผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๊ธฐ๋งŒํผ ํŒŒ์ผ์— ๊ธฐ๋กํ•œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ byte ๋‹จ์œ„๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜, file_write() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ.

Deny Write on Executables

  • ๋ฌธ์ œ: ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ผ์— ์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชฉํ‘œ: ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ผ์— ์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ: ํ•จ์ˆ˜ ํ™œ์šฉ
    • file_deny_write(): ํŒŒ์ผ์„ open ํ•  ๋•Œ, ์‹คํ–‰ ํŒŒ์ผ์— ๋Œ€ํ•ด ์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ํŒŒ์ผ์„ loadํ•œ ํ›„์— ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, file synchronization Issue๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • file_allow_write(): ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ๋ฝํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. file_close() ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

11.27 ์ผ

System Calls - exec(), fork()

  • exec() : ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ์ด๋ฆ„์„ ๊ฐ–๋Š” ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ.

    • ์ƒˆ๋กœ์šด file์„ palloc_get_page๋ฅผ ํ†ตํ•ด ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
    • ์ธ์ž๋กœ ์ฃผ์–ด์ง„ file_name ๋ฌธ์ž์—ด์„ strlcpy๋ฅผ ํ†ตํ•ด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ file ๋ฌธ์ž์—ด์— ๋ณต์‚ฌํ•œ๋‹ค.
    • file์„ ์‹คํ–‰ํ•œ๋‹ค. -> process_exec() ํ˜ธ์ถœํ•œ๋‹ค.
    • process_exec()์˜ ๋ฐ˜ํ™˜๊ฐ’์ด -1์ด๋ฉด ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • fork() : ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ณต์ œ๋ณธ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ

    • ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ tid๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•จ. ์œ ํšจํ•œ tid๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ 0์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ.
    • process_fork()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ถ€๋ชจ์˜ ๋ฐ์ดํ„ฐ์™€ ์œ ์ €๋ ˆ๋ฒจ์˜ ์ธํ„ฐ๋ŸฝํŠธ ํ”„๋ ˆ์ž„์„ ๋ณต์‚ฌํ•œ ์ž์‹ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.
      • thread_create๋ฅผ ํ†ตํ•ด ์ž์‹ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ž์‹ ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑ๋œ ๋’ค ready_list์— ๋“ค์–ด๊ฐ€ running thread๊ฐ€ ๋  ๋•Œ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„ ํ•จ์ˆ˜ do_fork๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
      • do_fork()๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ํ˜ธ์ถœ๋  ๋‹น์‹œ ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ์ž‘์—…ํ•˜๋˜ context ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์ฆ‰ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด๋•Œ ์ฃผ์˜ํ•  ์ ์€ ๋ณต์‚ฌํ•  ๊ฒƒ์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ userland context์ด๋‹ค.
        • syscal-entry.S๋ฅผ ๋ณด๋ฉด 9ํ–‰์˜movq %rsp, %rbx๋ฅผ ํ†ตํ•ด rbx์— ์œ ์ €์Šคํƒํฌ์ธํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, 10-12ํ–‰์˜ movabs $tss, %r12 -> movq (%r12), %r12 -> movq 4(%r12), %rsp๋ฅผ ํ†ตํ•ด rsp์—๋Š” ์ปค๋„ ์Šคํƒ ํฌ์ธํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
        • ๋”ฐ๋ผ์„œ intf_frame tf->rsp์—๋Š” ์ปค๋„์Šคํƒ์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๊ณ  syscall_handler์˜ ์ธ์ž intr_fram f๊ฐ€ ์œ ์ €์Šคํƒ์˜ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์ธ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
        • ์ด๋ฅผ ์œ„ํ•ด ๊ตฌ์กฐ์ฒด fork_data๋ฅผ ์„ ์–ธํ•˜์˜€๋‹ค. fork_data ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ thread *parent์™€ intr_frame *user_level_f๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ์Šค๋ ˆ๋“œ์™€ ์œ ์ €๋ ˆ๋ฒจ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ €์žฅํ•œ ํ›„ ํ•ด๋‹น ๊ตฌ์กฐ์ฒด๋ฅผ __do_fork์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์˜€๋‹ค.
      • __do_forkํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ pml4_for_each()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ธ์ž๋กœ duplicate_pte()ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹คํ–‰๋ถ€๋ชจ์˜ ์œ ์ € ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์ž์‹์˜ ํŽ˜์ด์ง€์— ๋„ฃ์–ด์ค€๋‹ค.
      • ๋˜ํ•œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ fd_list์˜ ์š”์†Œ๋“ค๊ณผ fd_count๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ์ค€๋‹ค.
      • ์„ธ๋งˆํฌ์–ด fork_sema๋ฅผ ํ™œ์šฉํ•ด์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๋ณต์‚ฌ๊ฐ€ ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ process_forkํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์ง€ ์•Š๋„๋ก ํ•˜์˜€๋‹ค.
    • ์ž์‹ ์Šค๋ ˆ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ 0์ด๊ณ  ์ž์‹ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ์ด ์‹คํŒจํ•  ๋•Œ TID_ERROR๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.

11.28 ์›”

KAIST ๊ถŒ์˜์ง„ ๊ต์ˆ˜๋‹˜ OS ๋‘ ๋ฒˆ์งธ ๊ฐ•์˜

System Calls - wait()

  • wait() : ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ
    • process_wait() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๊ณ ๋‚œ๊ณผ ์—ญ๊ฒฝ์˜ ๊ณผ์ •์ด ๋ฐœ์ƒํ–ˆ๋˜ ๋‹ค์ˆ˜์˜ ์ด์œ 

  1. process_exit()์—์„œ open๋˜์–ด์žˆ๋Š” ํŒŒ์ผ์„ close ํ•˜์ง€ ์•Š์•˜๋˜ ๋ฌธ์ œ
	struct list *exit_list = &curr->fd_list;
	struct list_elem *start = list_begin(exit_list);
	while (!list_empty(exit_list))
	{
		struct file_fd *exit_fd = list_entry(start, struct file_fd, fd_elem);
		file_close(exit_fd->file);
		start = list_remove(&exit_fd->fd_elem);
		free(exit_fd);
	}
  • process_exit() ์ฆ‰, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ด์•ผํ•  ์‹œ์ ์—์„œ ์—ด๋ฆฐ ๋ชจ๋“  ํŒŒ์ผ์„ close ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. fd_list์— ์žˆ๋Š” ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ fd_list(exit_list)๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ while๋ฌธ์„ ๋Œ๋ฉด์„œ ์—ด๋ฆฐ ํŒŒ์ผ๋“ค์„ close ํ•ด์ฃผ๊ณ , fd_elem์„ list์—์„œ ์ง€์›€์œผ๋กœ์จ ํ•ด๋‹น ํŒŒ์ผ์ด fd_list์—์„œ ์‚ญ์ œํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
  • fork์™€ open์„ ํ•  ๋•Œ file_fd ์„ ์–ธ์„ ์œ„ํ•ด malloc์„ ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— exitํ•  ๋•Œ free๋ฅผ ํ•ด์คŒ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  1. write()์™€ read()๋ฅผ ํ•  ๋•Œ ์ž…๋ ฅ๋ฐ›๋Š” ์ธ์ž buff๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ address ์ธ์ง€ ์ฒดํฌํ•˜์ง€ ์•Š์•˜๋˜ ๋ฌธ์ œ
  • buffer => ๊ธฐ๋กํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ๋ฒ„ํผ์˜ ์ฃผ์†Œ ๊ฐ’์ด ์œ ์ € ๊ฐ€์ƒ ๊ณต๊ฐ„๋„ ์•„๋‹ˆ๊ฑฐ๋‚˜, ํŽ˜์ด์ง€๊ฐ€ ํ• ๋‹น๋˜์–ด์žˆ์ง€ ์•Š๊ฑฐ๋‚˜, ์ฃผ์†Œ๊ฐ€ NULL์ธ ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•ด์ค€๋‹ค.
  1. process_wait()์™€ process_exit() sema_down๊ณผ sema_up์˜ ์ˆœ์„œํŒŒ์•…

11.29 ํ™”

Project 2 ๊ฒฐ๊ณผ

  • 11:00 ~ 12:00 ๋ฐœํ‘œ ์ง„ํ–‰

About

SWJungle WEEK08: THREADS, WEEK09: USER PROGRAMS

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published