์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- c#
- BFS
- ์ ๋ํฐ
- ์ค๋ธ์
- ๋ฐฑ์ค
- ํฌ๋ํํค ์ ๊ธ 4๊ธฐ
- ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ด๋ฒคํธ ํจ์ ์คํ ์์
- ์ ์-์ ํฌ
- ํ์ด์ฌ
- User Stack
- ์๊ณ ๋ฆฌ์ฆ์์ -๋๋น์ฐ์ ํ์2
- ์๊ณ ๋ฆฌ์ฆ
- C
- ๋ค์ต์คํธ๋ผ
- KRAFTON JUNGLE
- 4๊ธฐ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๋คํธ์ํฌ
- ์ถ์ํด๋์ค์์ธํฐํ์ด์ค
- ํฌ๋ํํค ์ ๊ธ
- ํฌ๋ํํค์ ๊ธ
- project3
- pintos
- anonymous page
- TiL
- ํฌ๋ํํค์ ๊ธ4๊ธฐ
- kraftonjungle
- Unity
- ํํ ์ค
- Today
- Total
๋ง๊ฐ๋ก๊ทธ
ํฌ๋ํํค ์ ๊ธ WEEK09 DAY72 - PintOS Project2 close,write,read ๋ณธ๋ฌธ
ํฌ๋ํํค ์ ๊ธ WEEK09 DAY72 - PintOS Project2 close,write,read
habbn 2024. 3. 19. 23:16๐2024.03.19
1. ํด์ฆ
2. PintOS - SystemCall close, write, read() ํจ์ ๊ตฌํ
3. fork()..
์ค๋ ํด์ฆ ๋ณด๊ธฐ ์ ๊น์ง ํค์๋ ๊ณต๋ถ๋ง ํ๋๋ฐ ์ ์ ํด์ฆ์๋ ํค์๋ ๋ถ๋ถ์ด ๋์ค์ง ์์๋ค.. ํ๋ ๋์๋...
๊ทธ๋ฆฌ๊ณ ๊ตฟ๋ ธํธ์๋ค๊ฐ ํด์ฆ ํธ๋๋ฐ ์๋ชปํด์ ๊ตฟ๋ ธํธ๋ฅผ ์ญ์ ํด๋ฒ๋ ค์ ๊ทธ๋์ ์ ๋ฆฌํ๋ ๋ฐ์ดํฐ๋ค์ด ๋ค ์ญ์ ๋์๋ค..
๊ทธ๋์ ์ด์ฌํ ํ๊ธฐํ๊ณ ๊ฐ์ ๋ค์ผ๋ฉด์ ์ ๋ฆฌํ ppt.. ์ฝ์ดํ์.. ๋ฑ๋ฑ ๋ค ์ฌ๋ผ์ก๋ค๋ ๊ฑฐ์ ๋ฉํ์ด ๊นจ์ ธ์ ํด์ฆ๋ ์ ๋ณด์ง ๋ชปํ๋ค. ์๋ก์ด ๋ง์์ผ๋ก ๋ค์ ์์ํ์..๋ผ๋ ๋ง์์ผ๋ก ๋ค์ ๋ถ์ง๋ฐํ ์ฑ์๋๊ฐ์ผ์ง๐ฅฒ๐ฅฒ
๋ค๋ค ์์ดํด๋ผ์ฐ๋ ์ ๋ฐ์ดํธํ์ธ์....
๊ทธ๋ฆฌ๊ณ ์ด์ open ํ๋๋ฐ์ ๋ชปํ๋ค๋ ๊ฑฐ์ ์ถฉ๊ฒฉ ๋จน์ด์ ์ค๋ ๋ถ์ง๋ฐํ ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ณ ๊ทธ๋์ close, write, read ๋ฅผ ๋๋ผ ์ ์์๋ค๋ ์ฌ์ค์ ๊ธฐ์๋ค! ๋ค๋ฅธ ํ๋ค์ ๋นํด ์๋๊ฐ ๋๋ฆฌ์ง๋ง ๋๋ฆฌ๋๋ผ๋ ์ด์ฌํ ๋ฐ๋ผ๊ฐ๋ค๋ ํฌ์ธํธ๊ฐ ์ค์ํ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ์ง๊ธ์ fork ๋ถ๋ถ์์ ๋ค๊ฐ์ด ์ ๋ฅผ ์ฐ๊ณ ์๋ค ! ํํณ!
๐Systemcall - close(), write(), read()
1. close()
- ์ด๋ฆฐ ํ์ผ์ ๋ซ๋๋ค.
- ์คํ์ ๋ง์น๊ฑฐ๋ ์ข ๋ฃ๋๋ ํ๋ก์ธ์ค๋ ์๋ฌต์ ์ผ๋ก ์ด ํจ์๋ฅผ ํธ์ถํ์ฌ ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ๋ซ๋๋ค.
์ด๋ฆฐ ํ์ผ์ ๋ซ์ผ๋ ค๋ฉด ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ํด๋น ํ์ผ์ด ์๋์ง ํ์ธ ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ ์ด๋ธ์์ ์ ๊ฑฐํ๊ณ ํด๋น ํ์ผ์ file_close() ํ์ฌ ๋ซ์์ฃผ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค.
void close (int fd)
{
struct file_descrpitor *curr_fd = find_file_descriptor(fd);
//ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ ํจ์ ์ข
๋ฃ
if(curr_fd == NULL) return NULL;
//ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ์์ ํด๋น ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ๊ฑฐํ๋ค.
list_remove(&curr_fd->fd_elem);
//ํ์ผ ๋ซ๋๋ค.
file_close(curr_fd->file);
//ํ์ผ๋์คํฌ๋ฆฝํฐ ํด์
free(curr_fd);
}
๊ทธ๋ฆฌ๊ณ ๊ผญ ํค๋ํ์ผ์ ์ถ๊ฐํด์ผํ๋ค!!!! (ํค๋ํ์ผ ์ถ๊ฐ ์ํด์ ๊ณ์ ์๋ฌ๋จ)
#include "filesys/file.h"
#include "filesys/filesys.h"
1-2 . find_file_descriptor
ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ชฉ๋ก์์ ์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ(fd)๋ฅผ ๊ฐ์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฐพ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ค๋ค.
ํ์ฌ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ฒํธ์ ์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๋ฅผ ๋น๊ตํ์ฌ ์ผ์นํ๋์ง ํ์ธํ๊ณ ์ผ์นํ๋ค๋ฉด ํด๋น ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ๋ชป ์ฐพ์๋ค๋ฉด NULL์ ๋ฐํํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํ๋ค.
struct file_descrpitor *find_file_descriptor(int fd)
{
struct list *fd_list = &thread_current()->fd_list;
if(list_empty(fd_list)) return NULL;
struct file_descrpitor *file_descriptor;
struct list_elem *cur_fd_elem = list_begin(fd_list);
while(cur_fd_elem != list_end(&fd_list))
{
file_descriptor = list_entry(cur_fd_elem, struct file_descrpitor, fd_elem);
if(file_descriptor->fd_num == fd)
{
return file_descriptor;
}
file_descriptor = list_next(cur_fd_elem);
}
return NULL;
}
๐ฅฒ ํค๋งธ๋ ์
close ๋ถ๋ถ์์ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ธ์๋ค.
์๋ํ๋ฉด ์ฒ์์ find_file_descriptor() ํจ์ ์์ ์ฝ๋๋ค์ close ์์์ ์์ฑํด์ฃผ๋ฉด์ ๋ง์ฝ ํ์ฌ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๊ฐ ์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ์ธ์ง ํ์ธํ๋ ์กฐ๊ฑด๋ฌธ ์์์ ์ญ์ ํ๊ณ , ํ์ผ ๋ซ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌํ์ ํ๋๋ฐ ์๊พธ ์๋์์๋ค.. ์๊พธ ์ ์ ํ๋ก๊ทธ๋จ์ด ๋๋์ง ์๋ ์๋ฌ๊ฐ ์๊ฒผ๋๋ฐ ๊ทธ ์ด์ ๊ฐ break๋ฌธ์ ์์ ์ด์ค์...์๋ค..
๊ทธ๋ฆฌ๊ณ open์ ํ๋ฉด์ ํ์ฌ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋์ ํ ๋น์ ํด์คฌ๋๋ฐ close ๋ถ๋ถ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์ ํ๋ ๋ถ๋ถ์ ์์ ์ด๋จ์๋ค. ๋ฐฅ ๋จน์ผ๋ฌ ๊ฐ๊ธฐ์ ์ ํ์ฅ์ค ๊ฐ๋ค์์ ์๊ฐ ๋จ!!
์ง๋ฉด์ ์ด๊ฒ ๋ง๋? ๋ผ๋ฉฐ ์ค์ค๋ก๋ฅผ ์์ฌํ๋๋ฐ pass๋ฅผ ๋ณด๋ ์์ผ๋ก ์์ฌํ์ง ์์์ผ๊ฒ ๋ค!
2. read
- fd๋ก๋ถํฐ ์ด๋ฆฐ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ฝ๊ณ ๋ฒํผ์ ๋ด๋๋ค. ์ค์ ๋ก ์ฝ์ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ฉฐ ์คํจ์ -1์ ๋ฐํํ๋ค.
- fd๊ฐ 0์ด๋ฉด input_getc() ๋ฅผ ์ด์ฉํด์ ํค๋ณด๋ ์ ๋ ฅ์ ์ฝ์ด์จ๋ค.
์ฃผ์ด์ง ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ์ ์ผ์นํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฐพ์ ๊ทธ ํ์ผ์ ์ฝ์ด๋ค์ด๋ฉด๋๋ค.
int read (int fd, void *buffer, unsigned length)
{
int byte = 0;
if(fd == 0)
{
byte = input_getc();
}
else
{
check_buffer(buffer);
struct file_descrpitor *curr_fd = find_file_descriptor(fd);
if(curr_fd == NULL) return NULL;
byte = file_read(curr_fd->file, buffer, length);
}
return byte;
}
์ฒ์์ check_address()๋ฅผ ์ฌ์ฉํด์ ์ ํจํ ์ฃผ์๊ฐ์ธ์ง๋ฅผ ํ์ธํ๋๋ฐ ์๊ฐํด๋ณด๋๊น ํ์ผ์ ์ฃผ์๊ฐ์ ๋ณด๋๊ฒ ์๋๋ผ ๋ฒํผ๊ฐ ์ ํจํ ์ฃผ์๊ฐ์ ๊ฐ์ก๋์ง๋ฅผ ํ์ธํด์ผ ๋์๋..? ํด์ check_buffer() ํจ์ ์์ฑํด์ ๋ฃ์ด์ฃผ์๋ค!
๊ทธ๋ฆฌ๊ณ ํ์ผ์ ์ฝ๊ธฐ ์ํด์๋ ํ์ผ์ ์ฌ์ด์ฆ๋ฅผ ์์์ผํ๋ค. ๊ทธ๋์ filesize() ํจ์๋ฅผ ๊ตฌํํด์ผ ํ์ผ์ ์ฝ์ ์ ์๋ค.
2-2. filesize
์ด๋ ค์๋ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๋ฐํํ๋ค.(byte ๋จ์๋ก)
int filesize (int fd)
{
struct file_descrpitor *curr_fd = find_file_descriptor(fd);
int byte = 0;
byte = file_length(curr_fd->file);
return byte;
}
3. write
fd๊ฐ 1(ํ์ค ์ถ๋ ฅ)์ด๋ฉด ์ฝ์์ ์ถ๋ ฅ์ ํด์คฌ๋ค๋ฉด ์ด์ ๋์ด๋ฆฐ ํ์ผ fd๋ก ๋ฒํผ์ ๋ด๊ธด size๋งํผ ์ถ๋ ฅํด์ผ ๋๋ค.
read์ ์๋นํ ์ ์ฌํด์ file_write() ํจ์๋ก ์์ ํด์ฃผ๋ฉด ๋๋ค.
int write (int fd, const void *buffer, unsigned length)
{
int byte = 0;
if(fd == 1)
{
putbuf(buffer, length);
byte = length;
}else
{
check_buffer(buffer);
struct file_descrpitor *curr_fd = find_file_descriptor(fd);
if(curr_fd == NULL) return NULL;
byte = file_write(curr_fd->file, buffer, length);
}
return byte;
}
์ค๋์ close, read, write ๊น์ง ํต๊ณผ!
fork, exec ๊ฐ๋
fork() ์์คํ ํธ์ถ์ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ fork()๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค๋ฅผ ์๋ก์ด ๊ณต๊ฐ์ผ๋ก ์ ๋ถ ๋ณต์ฌํ๊ฒ ๋๊ณ , ์๋ ํ๋ก์ธ์ค๋ ์๋ ํ๋ก์ธ์ค๋๋ก ์์ ์ ์คํํ๊ณ fork()๋ฅผ ์ด์ฉํด์ ์์ฑ๋ ํ๋ก์ธ์ค๋ ๊ทธ ๋๋ฆ๋๋ก fork() ์์คํ ์ฝ์ด ์ํ๋ ๋ผ์ธ์ ๋ค์ ๋ผ์ธ๋ถํฐ ์คํ์ด ๋๋ค. (์๋ก ์์ฑ๋ ํ๋ก์ธ์ค๋ ์๋์ ํ๋ก์ธ์ค์ ๋๊ฐ์ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.)
๋ฐ๋ฉด, exec()๋ fork() ์ฒ๋ผ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ์๊ณ , exec()๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค๊ฐ ์๋ exec()์ ์ํด ํธ์ถ๋ ํ๋ก์ธ์ค๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒ ๋๋ค.
fork()๋ ํ๋ก์ธ์ค๊ฐ ํ๋ ๋ ์๊ธฐ๋ ๊ฒ์ด๋ค. (PID๊ฐ ์์ ํ ๋ค๋ฅธ ๋ ํ๋์ ํ๋ก์ธ์ค๊ฐ ์๊ธฐ๋ ๊ฒ)
๋ฐ๋ฉด, exec() ๋ ์์ฑ๋๋ ์๋ก์ด ํ๋ก์ธ์ค๋ ์๊ณ , exec()๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค์ PID๊ฐ ๊ทธ๋๋ก ์๋ก์ด ํ๋ก์ธ์ค์ ์ ์ฉ์ด ๋๋ฉฐ, exec()๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค๋ ์๋ก์ด ํ๋ก์ธ์ค์ ์ํด ๋ฎ์ด ์ฐ์ฌ์ง๊ฒ ๋๋ค.
PID ์์ -> ์คํ x
PID 0 -> ์์ ํ๋ก์ธ์ค
PID ์์ -> ๋ถ๋ชจ ํ๋ก์ธ์ค