๋ง๊ฐ๋กœ๊ทธ

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK09 DAY72 - PintOS Project2 close,write,read ๋ณธ๋ฌธ

Krafton jungle

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK09 DAY72 - PintOS Project2 close,write,read

habbn 2024. 3. 19. 23:16
728x90
๐Ÿ“†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 ์–‘์ˆ˜  -> ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค

728x90