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/.
PintOS์์ thread์ process์ ๊ด๊ณ
์ค์ OS(Operating System)์์๋ ํ๋์ process ์์ ์ฌ๋ฌ ๊ฐ์ thread๊ฐ ์กด์ฌํ ์ ์๋ค. ์ฌ๋ฌ ๊ฐ์ thread๋ค์ ๊ฐ์ virtual address space๋ฅผ ๊ณต์ ํ๋ค. PintOS์์๋ ๊ตฌํ์ ๋จ์ํํ๊ธฐ ์ํด์ ํ๋์ process์ ํ๋์ thread๋ง ์๋๋ก ๊ตฌ์ฑ๋์ด
- ์์ ํ๊ฒฝ ์ธํ (EC2, Ubuntu18.04) + repo ์์ฑ
- PintOS project Git Book ์ฝ๊ธฐ
๊ณต๋ถ๋ก ๋๋ง์น์ง ๋ง์ธ์. from ์ฝ์น๋
/threads/init.c
/threads/thread.c
/lib/kernel/list.c & /include/lib/kernel/list.h
/tests/threads/tests.c
/threads/synch.c
- 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๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋๊ธฐํ ์ ์๊ธฐ์ ๋ฌธ์ ํด๊ฒฐ
-
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๊ฐ ์ ์ ํ ์ ์๊ฒ ํด์ค
-
- Semaphore, Lock, Condition Variable์ ์ฌ์ฉํ์ฌ Priority Scheduling ๊ฐ์
- PintOS๋ ์ฌ๋ฌ thread๋ค์ด Semaphore, Lock, Condition Variable๋ฅผ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆด ๊ฒฝ์ฐ ๋จผ์ ์จ thread๊ฐ ๋จผ์ ์ฌ์ฉํ๋ FIFO ๋ฐฉ์์ ์ฌ์ฉ
- Sychronization ๋๊ตฌ๋ค์ ๊ธฐ๋ค๋ฆด ๋, ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ thread๊ฐ CPU๋ฅผ ์ ์ ํ๋๋ก ๊ตฌํ
- ๋ฌธ์ ์ : ์ฌ๋ฌ 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์ด ์ผ์ด๋๋ ์ํฉ
- Multiple donation
- 10:00 ~ 11:00 ๋ฐํ ์งํ
- Git book ๊ณผ์ ์ค๋ช ์ ๊ณต๋ถ
-
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๋ฐ์ดํธ ์ ๋ ฌ์ ๋ง์ถ๊ธฐ ์ํ ๊ณต๋ฐฑ ๊ณต๊ฐ -> ํ์ฑํ ์ธ์์ ์คํ ์ฃผ์ -> ๊ฐ์ง ๋ฐํ ์ฃผ์ ์์ผ๋ก ์ ์ฅํ๋ค.
๊ณผ์ ์ค ํท๊ฐ๋ ธ๋ ๋ถ๋ถ๊ณผ ์๊ฒ ๋ ์
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()
๋ฅผ ์คํํ๋ค.
- ๋ชฉํ: ์ ๋ ฅ๋ฐ์ ์ธ์๋ฅผ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ํ์ฑํ๊ธฐ
- ๋ฌธ์ ํด๊ฒฐ: strok_rํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ํ์ฑํจ.
- ํ์ฑํ ์ธ์์ ์ฒซ ๋ฒ์งธ ๋ฌธ์์ด์ ํ๋ก๊ทธ๋จ ์ด๋ฆ์ด ๋๋ค. => process_name
- ํ์ฑํ ๋ชจ๋ ๋ฌธ์์ด์ ์คํ์ ์๋๋ค. (์คํ์ ์ฃผ์๋ฅผ ๊ฐ์์ํค๋ฉด์)
- ๋ฌธ์์ด์ ์ ์ฅํ๊ณ 8byte word-align์ ๋ง์ถฐ์ฃผ๊ธฐ ์ํด ๋จ์ ๊ณต๊ฐ์ null์ ๋ฃ์ด์ค๋ค.
- 2๋จ๊ณ์์ ๋ฃ์ ๋ฌธ์์ด๋ค์ด ์์นํ ์คํ ์ฃผ์๋ฅผ ๋ฃ์ด์ค๋ค.
- ๊ฐ์ง ๋ฐํ ์ฃผ์๋ฅผ ๋ฃ์ด์ค๋ค. ํจ์๊ฐ ํธ์ถ๋ ์ดํ return ๋ ์ดํ pc๊ฐ ์ฝ์ ์ธ์คํธ๋ญ์ ์ฃผ์๋ฅผ return address๋ก ๋ฃ๋๋ค.
๋ค๋ง ํด๋น ํจ์๋ ๋ฐํ๋์ง ์๊ธฐ ๋๋ฌธ์ ํด๋น return address๋ก ์ด๋ํ์ง ์๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ์คํ ํ๋ ์๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ธฐ ์ํด์ ๊ฐ์ง ๋ฐํ์ฃผ์๋ฅผ ๋ฃ๋๋ค.
- Argument Passing์
load()
(in userprog/process.c)๋ด์์ ๊ตฌํํ๋ค.
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๋ฅผ ํ ๋นํ ์ ์๊ฒ ํ๋ค.
-
๋ชฉํ: ์ด 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์ด๋ค.
halt()
: pintos๋ฅผ ์ข ๋ฃ์ํค๋ ์์คํ ์ฝpower_off()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ pintos๋ฅผ ์ข ๋ฃ์์ผฐ๋ค.
exit()
: ํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ์ํค๋ ์์คํ ์ฝ- ์ค๋ ๋ ๊ตฌ์กฐ์ฒด ์์ exit_status ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ์ธํ์ฌ ์ธ์๋ก ๋ฐ์ ์ข ๋ฃ ์ํ๋ฅผ ๊ฐฑ์ ํ๋ค.
exit()
ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ค๋ฅธ ์ด๋ค ์ด์ ๋ค๋ก ์ ์ ํ๋ก์ธ์ค ์ข ๋ฃ ์ ํ๋ก์ธ์ค ์ด๋ฆ๊ณผ exit code๋ฅผ ์๋์ ๊ฐ์ด ์ง์ ๋ ํ์์ผ๋ก ์ถ๋ ฅํ๋ค.printf("%s: exit(%d)\n", ....);
filesize()
: fd๋ก ์ด๋ ค์๋ ํ์ผ ์ฌ์ด์ฆ๋ฅผ ๋ฆฌํดํด์ฃผ๋ ์์คํ ์ฝ- ์ด๋ ค์ ธ ์๋ file์ ๊ด๋ฆฌํ๋
fd_list
๋ฅผ ์ํํ๋ฉด์ ์ฐพ์ผ๋ ค๋ fd์ mapping๋ file์ ์ฐพ๋๋ค. - file์ ํฌ๊ธฐ๋ฅผ byte๋จ์๋ก ๋ฐํํ๋ ํจ์
file_length()
๋ฅผ ํธ์ถํ๋ค.
- ์ด๋ ค์ ธ ์๋ file์ ๊ด๋ฆฌํ๋
seek()
: fd๋ก ์ด๋ ค์๋ ํ์ผ์ (์ฝ๊ณ ์ธ ์์น๋ฅผ ์๋ ค์ฃผ๋) ํฌ์ธํฐ์ ์์น๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ์์คํ ์ฝ- ์ด๋ ค์ ธ ์๋ file์ ๊ด๋ฆฌํ๋
fd_list
๋ฅผ ์ํํ๋ฉด์ ์ฐพ์ผ๋ ค๋ fd์ mapping๋ file์ ์ฐพ๋๋ค. - file์ ํ์ฌ ์์น๋ฅผ ์ธ์๋ก ๋ค์ด๊ฐ position์ผ๋ก ๋ณ๊ฒฝ์์ผ ์ฃผ๋ ํจ์
file_seek()
๋ฅผ ํธ์ถํ๋ค.
- ์ด๋ ค์ ธ ์๋ file์ ๊ด๋ฆฌํ๋
tell()
: fd์์ ์ฝํ๊ฑฐ๋ ์จ์ง ๋ค์ ๋ฐ์ดํธ์ ์์น๋ฅผ ๋ฐํ- ์ด๋ ค์ ธ ์๋ file์ ๊ด๋ฆฌํ๋
fd_list
๋ฅผ ์ํํ๋ฉด์ ์ฐพ์ผ๋ ค๋ fd์ mapping๋ file์ ์ฐพ๋๋ค. - file์ ํ์ฌ ์์น๋ฅผ ์๋ ค์ฃผ๋ ํจ์
file_tell()
๋ฅผ ํธ์ถํ๋ค.
- ์ด๋ ค์ ธ ์๋ file์ ๊ด๋ฆฌํ๋
- ~~
filesize()
,seek()
,tell()
์ ์์คํ ์ฝ์ด ์ ๋์ํ๋์ง ํ์ธํ ์ ์๋ test case ๋ถ์ ๋ก test๋ฅผ ๋๋ฆด ์ ์๋ ์์คํ ์ฝ์์ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ํธ์ถ๋จ์ ํ์ธํ์๋ค.~~
-
create()
: ํ์ผ์ ์์ฑํ๋ ์์คํ ์ฝ- check_addressํจ์๋ฅผ ์ ์ธํ์ฌ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ์ฃผ์๊ฐ ์ ์ ์์ญ์ ์กด์ฌํ๋์ง, ํ์ด์ง๊ฐ ํ ๋น๋์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
- ํ์ผ๋ช ์ธ์ file์ด NULL์ผ ๊ฒฝ์ฐ exit(-1)์ ์คํํ๋๋ก ํ๋ค.
- file์ ์ด๋ฆ์ผ๋ก ํ๊ณ initial_size์ธ์๋ฅผ ํฌ๊ธฐ๋ก ํ file์ ์์ฑํ๊ณ , ์ฑ๊ณต์ฌ๋ถ๋ฅผ ๋ฐํํ๋ ํจ์
filesys_create()
๋ฅผ ํธ์ถ ํ๋ค. - ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋๋ฉด true๋ฅผ ์๋๋ฉด false๋ฅผ ๋ฐํํ๋ค.
-
remove()
: ํ์ผ์ ์ญ์ ํ๋ ์์คํ ์ฝ- check_addressํจ์๋ฅผ ์ ์ธํ์ฌ ํฌs์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ์ฃผ์๊ฐ ์ ์ ์์ญ์ ์กด์ฌํ๋์ง, ํ์ด์ง๊ฐ ํ ๋น๋์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
- file์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ํ์ผ์ ์ญ์ ํ๊ณ ์ฑ๊ณต์ฌ๋ถ๋ฅผ ๋ฐํํ๋ ํจ์
filesys_remove()
๋ฅผ ํธ์ถํ๋ค.
read()
: fd๋ฅผ ํตํด ์ด๋ฆฐ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์คํ ์ฝ.- fd๊ฐ 0์ผ ๋๋ ํค๋ณด๋์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ฒํผ์ ์ ์ฅํ๊ณ ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ฐํ. -> input_getc() ํ์ฉ
- fd๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ๋น์ด ์๊ฑฐ๋ 1์ผ ๊ฒฝ์ฐ์๋ read์์ ์ ํจํ์ง ์์ fd์ด๋ฏ๋ก exit(-1)
- ํ์ผ์ ๋์ ์ ๊ทผ์ด ์ด๋ค์ง ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด lock ๊ตฌ์กฐ์ฒด filesys_lock์ ์ ์ธํ์ฌ ํ์ฉ.
- ์ฝ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ byte๋จ์๋ก ๋ฐํํ๋ ํจ์,
file_read()
ํจ์๋ฅผ ํธ์ถํจ.
write()
: fd๋ฅผ ํตํด ์ด๋ฆฐ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ์์คํ ์ฝ.- fd๊ฐ 1์ด๋ผ๋ ์๋ฏธ๋ ํ์ค ์ถ๋ ฅ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ๋ฌธ์์ด์ ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๋ putbuf() ํจ์ ํ์ฉ (putbuf ํจ์๋ buffer์ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ size๋งํผ ํ๋ฉด์ ์ถ๋ ฅํ๋ ํจ์)
- fd๊ฐ 0๋ณด๋ค ์๊ฑฐ๋ ๋น์ด ์๋ ๊ฒฝ์ฐ์๋ write์์ ์ ํจํ์ง ์์ fd์ด๋ฏ๋ก exit(-1)
- ํ์ผ์ ๋์ ์ ๊ทผ์ด ์ด๋ค์ง ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด lock ๊ตฌ์กฐ์ฒด filesys_lock์ ์ ์ธํ์ฌ ํ์ฉ.
- fd๊ฐ 1์ด ์๋ ๊ฒฝ์ฐ ๋ฒํผ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํฌ๊ธฐ๋งํผ ํ์ผ์ ๊ธฐ๋กํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ byte ๋จ์๋ก ๋ฐํํ๋ ํจ์,
file_write()
ํจ์๋ฅผ ํธ์ถํจ.
- ๋ฌธ์ : ์คํ ์ค์ธ ํ์ผ์ ์ฐ๊ธฐ ์์ ์ ์ํํ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ ์ป์ ์ ์๋ค.
- ๋ชฉํ: ์คํ ์ค์ธ ํ์ผ์ ์ฐ๊ธฐ ์์ ์ ์ํํ์ง ์๋๋ก ํ๋ ๊ฒ
- ๋ฌธ์ ํด๊ฒฐ: ํจ์ ํ์ฉ
file_deny_write()
: ํ์ผ์ open ํ ๋, ์คํ ํ์ผ์ ๋ํด ์ฐ๊ธฐ๋ฅผ ๋ฐฉ์งํ๋ค. ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ์ loadํ ํ์ ์์ ํ๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ํตํด, file synchronization Issue๋ฅผ ํด๊ฒฐํ ์ ์๋ค.file_allow_write()
: ํ์ผ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ํ๋ฝํ๋ ํจ์์ด๋ค.file_close()
ํจ์ ํธ์ถ ์ ํด๋น ํจ์๊ฐ ํธ์ถ๋๋ค.
-
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
์ ์ธ์๋ก ์ ๋ฌํ์๋ค.
- syscal-entry.S๋ฅผ ๋ณด๋ฉด 9ํ์
__do_fork
ํจ์ ๋ด๋ถ์์pml4_for_each()
ํจ์๋ฅผ ํตํด ์ธ์๋กduplicate_pte()
ํจ์๋ฅผ ์คํํ์ฌ ์คํ๋ถ๋ชจ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ์ฌ ์๋ก ์์ฑํ ์์์ ํ์ด์ง์ ๋ฃ์ด์ค๋ค.- ๋ํ ๋ถ๋ชจ ํ๋ก์ธ์ค์
fd_list
์ ์์๋ค๊ณผfd_count
๋ฅผ ๋ณต์ฌํ์ฌ์ค๋ค. - ์ธ๋งํฌ์ด
fork_sema
๋ฅผ ํ์ฉํด์ ์์ ํ๋ก์ธ์ค์ ๋ํ ๋ณต์ฌ๊ฐ ์๋ฃ๋ ๋๊น์งprocess_fork
ํจ์๊ฐ ๋๋์ง ์๋๋ก ํ์๋ค.
- ์์ ์ค๋ ๋์ ๋ฐํ ๊ฐ์ 0์ด๊ณ ์์ ์ค๋ ๋๊ฐ ์์ฑ์ด ์คํจํ ๋
TID_ERROR
๋ฅผ ๋ฐํํ๋๋ก ํ๋ค.
wait()
: ์์ ํ๋ก์ธ์ค๊ฐ ์ํ๋๊ณ ์ข ๋ฃ๋ ๋๊น์ง ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ๋ ์์คํ ์ฝ- process_wait() ํจ์๋ฅผ ํธ์ถํ๋ค.
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๋ฅผ ํด์ค์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๊ธฐ์ง ์๋๋ก ํ๋ค.
write()
์read()
๋ฅผ ํ ๋ ์ ๋ ฅ๋ฐ๋ ์ธ์ buff๊ฐ ์ฌ๋ฐ๋ฅธ address ์ธ์ง ์ฒดํฌํ์ง ์์๋ ๋ฌธ์
- buffer => ๊ธฐ๋กํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฒํผ์ ์ฃผ์ ๊ฐ์ด ์ ์ ๊ฐ์ ๊ณต๊ฐ๋ ์๋๊ฑฐ๋, ํ์ด์ง๊ฐ ํ ๋น๋์ด์์ง ์๊ฑฐ๋, ์ฃผ์๊ฐ NULL์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒดํฌํด์ค๋ค.
process_wait()
์process_exit()
sema_down๊ณผ sema_up์ ์์ํ์
- 11:00 ~ 12:00 ๋ฐํ ์งํ