[TIL] [WEEK9-10] Pintos Project(2) System Call(2)

woo__jยท2024๋…„ 6์›” 4์ผ
1

Pintos Project

๋ชฉ๋ก ๋ณด๊ธฐ
8/14

๐Ÿ“ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ ์‹œ์Šคํ…œ ์ฝœ ๊ตฌํ˜„

๊ตฌํ˜„ ๋ชฉ๋ก: halt, exit, exec, wait, fork

1. halt()

/* power_off() ํ˜ธ์ถœํ•ด Pintos ์ข…๋ฃŒ */
void halt(void)
{
	power_off();
}

2. exit()

/* ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒํ•˜๋Š” ์‹œ์Šคํ…œ ์ฝœ */
void exit(int status)
{
    /* ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ */
    struct thread *t = thread_current();
	/* ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ƒํƒœ ์ €์žฅ */
    t->exit_status = status;
    /* ์ข…๋ฃŒ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ ํ›„ ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ */
	printf("%s: exit(%d)\n", t->name, status);
	thread_exit();
}

3. exec()

/* ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ cmd_line์—์„œ ์ด๋ฆ„์ด ์ฃผ์–ด์ง€๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์Šค๋กœ ๋ณ€๊ฒฝ */
/* ์ด ๋•Œ, ์ฃผ์–ด์ง„ ์ธ์ž ์ „๋‹ฌ -> ์„ฑ๊ณต ์‹œ ๋ฐ˜ํ™˜ x, ์‹คํŒจ ์‹œ exit state -1 ๋ฐ˜ํ™˜ ๋ฐ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ */
/* ์ด ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„์€ ๋ฐ”๊พธ์ง€ ์•Š์Œ & file descriptor๋Š” ํ˜ธ์ถœ ์‹œ ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์žˆ๋‹ค */
int exec(const char *file)
{
	check_address(file);
    
	/* ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋„๋ก copyํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ */
	char *file_name = palloc_get_page(PAL_ZERO); 

	if (file_name == NULL)
	{
		exit(-1);
	}

	/* file์„ file_name์œผ๋กœ ๋ณต์‚ฌ */
	strlcpy(file_name, file, PGSIZE); 

	/* process_exec ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ํŒŒ์ผ ์‹คํ–‰ */
	if (process_exec(file_name) == -1) 
	{
		exit(-1);
	}
}

์œ„ ์„ธ ๊ฐœ ์‹œ์Šคํ…œ ์ฝœ์€ ๋ณธ๋ž˜ ์ƒํƒœ๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, wait()๊ณผ fork() ์‹œ์Šคํ…œ ์ฝœ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„  ํ”„๋กœ์„ธ์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ› ๏ธ ํ”„๋กœ์„ธ์Šค ๊ณ„์ธต ๊ตฌ์กฐ

ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ ๋„์ค‘ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค: ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ์„ธ์Šค
  • ์ž์‹ ํ”„๋กœ์„ธ์Šค: ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค

๋ฌผ๋ก  ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ์ด๋“ค์ด ๋˜ ๋‹ค๋ฅธ ์• ๋“ค์„ ๋‚ณ๋Š” ํ˜•์‹์œผ๋กœ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ ์‹คํ–‰๋œ๋‹ค. (์•ฝ๊ฐ„ ํŠธ๋ฆฌ ๊ตฌ์กฐ)

ํ˜„์žฌ PintOS์—๋Š” ๋ถ€๋ชจ/์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ช…์‹œํ•ด์ฃผ๋Š” ์ •๋ณด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ/์ž์‹์˜ ๊ตฌ๋ถ„์ด ์—†๊ณ ,
๋ถ€๋ชจ๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด๋ฅผ ์•Œ์ง€ ๋ชป ํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘/์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ฆ‰, ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

์ด๋ฅผ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๊ณ , ์„ธ๋งˆํฌ์–ด๋ฅผ ํ™œ์šฉํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์‹œ๊ทธ๋„์„ ์ฃผ๊ณ  ์ข…๋ฃŒํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. (๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋„๋ก)

๐Ÿ‘‰๐Ÿป ํ”„๋กœ์„ธ์Šค ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋ถ€๋ชจ/์ž์‹ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ์ •๋ณด ์ €์žฅํ•˜๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ถ”๊ฐ€
  • ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋ฆฌ์ŠคํŠธ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ถ”๊ฐ€
/* Project(2) */
struct intr_frame parent_if; /* ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ธํ„ฐ๋ŸฝํŠธ ํ”„๋ ˆ์ž„ */
struct list child_list;		 /* ์ž์‹ ๋ฆฌ์ŠคํŠธ */
struct list_elem child_elem;
struct file *running_f; /* ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ผ */

int exit_status; /* ์ข…๋ฃŒ ์ƒํƒœ */

struct semaphore exit_sema; /* ์ž์‹ ํ”„๋กœ์„ธ์Šค exit ๋Œ€๊ธฐ ์„ธ๋งˆํฌ์–ด */
struct semaphore wait_sema; /* ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๋Œ€๊ธฐ ์„ธ๋งˆํฌ์–ด */
struct semaphore fork_sema; /* ์ž์‹์˜ load ์™„๋ฃŒ ๋Œ€๊ธฐ ์„ธ๋งˆํฌ์–ด */
  • ๊ฐ์ข… ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ถ”๊ฐ€/์ดˆ๊ธฐํ™”
/* thread.c/init_thread() */
list_init(&t->child_list);
t->exit_status = 0;
/* thread.c/thread_create() */
sema_init(&t->exit_sema, 0);
sema_init(&t->load_sema, 0);
sema_init(&t->wait_sema, 0);
sema_init(&t->fork_sema, 0);

list_push_back(&thread_current()->child_list, &t->child_elem);
  • ์ž์‹ ํ”„๋กœ์„ธ์Šค ๊ฒ€์ƒ‰ ํ•จ์ˆ˜ ๊ตฌํ˜„
/* Project(2) Process hierarchy */
struct thread *get_child_process(int pid)
{
	/* ์ž์‹ ๋ฆฌ์ŠคํŠธ์— ์ ‘๊ทผํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฒ€์ƒ‰ */
	/* ํ•ด๋‹น pid๊ฐ€ ์กด์žฌํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฐ˜ํ™˜ */
	/* ๋ฆฌ์ŠคํŠธ์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด NULL ๋ฆฌํ„ด */
	struct thread *t = thread_current();
	struct list_elem *e = list_begin(&t->child_list);

	for (e; e != list_end(&t->child_list); e = list_next(e))
	{
		struct thread *t = list_entry(e, struct thread, child_elem);
		if (t->tid == pid)
			return t;
	}
	return NULL;
}

์ด์ œ wait()๊ณผ fork() ์‹œ์Šคํ…œ ์ฝœ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

4. wait()

int wait(pid_t pid)
{
	return process_wait(pid);
}

์‹œ์Šคํ…œ ์ฝœ ์ž์ฒด๋Š” ๋ณ„ ๊ฒŒ ์—†๋‹ค. process_wait()๋งŒ์„ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ๋Ÿผ process_wait()์„ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ณด์ž.

์œ„์—์„œ ๋งํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ธธ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์ƒ๊ฐํ•˜๊ณ  process_wait()์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค.

/* ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ์ข…๋ฃŒ ์ƒํƒœ ๋ฐ˜ํ™˜ */
int process_wait(tid_t child_tid UNUSED)
{
	/* ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋ฐ›์•„์˜ค๊ธฐ */
	struct thread *child = get_child_process(child_tid);

	if (child == NULL)
	{
		return -1;
	}

	/* ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ = ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ sema_up */
	sema_down(&child->wait_sema);
	/* ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฉด ์ž์‹ ๋ฆฌ์ŠคํŠธ์—์„œ ํ•ด๋‹น ์ž์‹ ์‚ญ์ œ */
	list_remove(&child->child_elem);
	/* ์ž์‹์˜ ๋Œ€๊ธฐ ์ƒํƒœ ์ดํƒˆ */
	sema_up(&child->exit_sema);

	return child->exit_status;
}

๊ทธ๋Ÿฐ๋ฐ wait() ๊ตฌํ˜„์„ ์œ„ํ•ด ์ƒ๊ฐํ•˜๋‹ค ๋ณด๋ฉด, process_exit()๊ณผ ์—ฐ๊ด€์ด ์žˆ์„ ๊ฑฐ๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿผ process_exit()์—๋„ ๊ด€๋ จ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์ฃผ์ž.

void process_exit(void)
{
	struct thread *curr = thread_current();

	/* ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ fdt์˜ ๋ชจ๋“  ๊ฐ’์„ 0์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ, ์ฆ‰ ๋ชจ๋“  ์—ด๋ฆฐ ํŒŒ์ผ ๋‹ซ๊ธฐ */
	for (int i = 0; i < FDTCOUNT_LIMIT; i++)
	{
		close(i);
	}

	/* fd table ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ */
	palloc_free_multiple(curr->fdt, FDT_PAGES);

	/* ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ผ ๋‹ซ๊ธฐ */
	file_close(curr->running_f);
	process_cleanup();

	/* ์ž์‹ ์ข…๋ฃŒ๋ฅผ ๋Œ€๊ธฐํ•˜๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€๊ธฐ ์ƒํƒœ์—์„œ ์ดํƒˆ๋˜๋„๋ก */
	sema_up(&curr->wait_sema);
	/* ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹์„ ๋ฆฌ์ŠคํŠธ์—์„œ ์ง€์šธ ์ˆ˜ ์žˆ๋„๋ก ๋Œ€๊ธฐ */
	sema_down(&curr->exit_sema);
}

sema๊ฐ€ ๋งŽ์ด ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ, ๋‡Œํ”ผ์…œ์ด๊ธด ํ•˜์ง€๋งŒ ์ •๋ฆฌ๋ฅผ ํ•˜์ž๋ฉด

  • process_wait
    ๋ถ€๋ชจ๊ฐ€ ์ž์‹์ด ์ข…๋ฃŒ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด sema_down(wait_sema)๋กœ ์ž ์— ๋“ฌ
  • process_exit
    ์ž์‹์˜ ์ˆ˜ํ–‰์ด ๋๋‚˜๋ฉด process_exit์—์„œ ๋ถ€๋ชจ์—๊ฒŒ sema_up(wait_sema)๋กœ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ ค ๋ถ€๋ชจ์˜ ๋Œ€๊ธฐ ์ƒํƒœ๋ฅผ ํ’€๊ณ , ๋ถ€๋ชจ๊ฐ€ ๋‚˜๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ๋„๋ก sema_down(exit_sema)๋กœ ๊ธฐ๋‹ค๋ฆผ
  • process_wait
    ๋ถ€๋ชจ๋Š” ์ž์‹์ด ์ข…๋ฃŒ๋˜์—ˆ์œผ๋‹ˆ ๋Œ€๊ธฐ์—์„œ ํ’€๋ ค, ํ•ด๋‹น ์ž์‹์„ ์ž์‹ ๋ฆฌ์ŠคํŠธ์—์„œ ์ง€์šฐ๊ณ , ์ง€์šฐ๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ž์‹์—๊ฒŒ sema_up(exit_sema)๋กœ ๋Œ€๊ธฐ ์ƒํƒœ๋ฅผ ํ’€์–ด์คŒ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด wait() ๊ตฌํ˜„๋„ ๋์ด ๋‚œ๋‹ค.
๋งˆ์ง€๋ง‰ fork()๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

5. fork()

/* ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ณต์ œ๋ณธ์ธ ์ƒˆ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ */
pid_t fork(const char *thread_name, struct intr_frame *f)
{
	check_address(thread_name);
	return process_fork(thread_name, f);
}

fork๋„ ์‹œ์Šคํ…œ ์ฝœ ์ž์ฒด๋Š” ๋ณ„ ๊ฒŒ ์—†๋‹ค.
์ธ์ž๊ฐ€ ํฌ์ธํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•œ ํ›„ process_fork()์„ ํ˜ธ์ถœํ•œ๋‹ค.
/ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œํ•ด ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ /

tid_t process_fork(const char *name, struct intr_frame *if_ UNUSED)
{
	struct thread *t = thread_current();
	memcpy(&t->parent_if, if_, sizeof(struct intr_frame));

	/* ์ธ์ž๋กœ ๋ฐ›์€ name์œผ๋กœ ๋œ ์ƒˆ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ */
	tid_t pid = thread_create(name, PRI_DEFAULT, __do_fork, t);

	if (pid == TID_ERROR)
	{
		return TID_ERROR;
	}

	/* ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ž์‹ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐฉ๊ธˆ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค ๊ฐ€์ ธ์˜ค๊ธฐ */
	struct thread *child = get_child_process(pid);
	/* ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ __do_fork๋ฅผ ๋Œ€๊ธฐ */
	/* __do_fork์—์„œ ๋ณต์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด sema_up์„ ํ•ด์คŒ์œผ๋กœ์จ ๋Œ€๊ธฐ ์ดํƒˆ๋˜๋ฉฐ ์ข…๋ฃŒ */
	sema_down(&child->fork_sema);

	return pid;
}

๋งจ ์ฒ˜์Œ์— ๊ตณ์ด ์‹คํ–‰ ์ค‘์ธ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ contexts๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ด์œ ๋Š” if ์ •๋ณด๋ฅผ ์ง์ ‘ ๋„˜๊ธธ ์‹œ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† ์‹คํ–‰ํ•˜๋ฉฐ ๊ฐ’์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋•Œ๋ฌธ์— ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ parent_if์— if๊ฐ’์„ ๋ณต์‚ฌํ•œ ํ›„, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ __do_fork์˜ ์ธ์ž๋กœ ๋‹ด์•„์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์‹œ์Šคํ…œ ์ฝœ์˜ ๊ตฌํ˜„์ด ๋๋‚ฌ๋‹ค. ๋‚˜๋Š” ์ด 95๊ฐœ์˜ Test-case ์ค‘ 94๊ฐœ๋ฅผ pass ํ–ˆ๋Š”๋ฐ, ๋งˆ์ง€๋ง‰๊นŒ์ง€ multi-oom์„ ํ†ต๊ณผํ•˜์ง€ ๋ชป ํ–ˆ๋‹ค. ํ•ด๋‹น ์ผ€์ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ.. ๋„์ €ํžˆ ์–ด๋Š ๋ถ€๋ถ„์ธ ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž˜ ํ•ด์•ผ๊ฒ ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค ๊ทธ๋ƒฅ ์•ˆ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ๋“  ํ†ต๊ณผํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ง‰๊ณ ๋ผ๋กœ ์ณ๋‚ด๋Š๋žด... ์‚ฌ์‹ค ๊ธฐ์–ต์ด ์ž˜ ์•ˆ ๋‚˜์ง€๋งŒ, ๊ธฐ์–ต๋‚˜๋Š” ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋ช‡ ๊ฐœ ์ž‘์„ฑํ•˜๊ณ  ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ๋‹ค.

[ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…]

  • fork๊ฐ€ ์•ˆ ๋๋˜ ๋ฌธ์ œ
    : duplicate_pte์—์„œ ์ฒซ ๋ฒˆ์งธ ์กฐ๊ฑด๋ฌธ parent_page๊ฐ€ kernel_page์ธ ๊ฒฝ์šฐ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๋ผ๊ณ  ๋˜์–ด ์žˆ์–ด์„œ false์ธ ์ค„ ์•Œ์•˜๋Š”๋ฐ, true๋กœ ํ•ด์ค˜์•ผ ํ–ˆ์Œ
  • rox ๊ด€๋ จ TC๋“ค์ด ํ†ต๊ณผ๋˜์ง€ ์•Š์•˜๋˜ ๋ฌธ์ œ
    : process_exit์—์„œ running file์„ file_close ํ•ด์•ผ ํ•จ & load์˜ done์—์„œ file_close(file)๋ฅผ ์ง€์›Œ์•ผ ํ•จ
    -> ์ฆ‰, load์—์„œ ์‹คํ–‰ํ•˜๊ณ  done์—์„œ ํŒŒ์ผ ๋‹ซ์•„๋ฒ„๋ฆฌ๊ณ  ์žˆ์—ˆ์—ˆ์Œ
  • ๋ช‡ ๊ฐœ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋˜์ง€ ์•Š์•˜๋˜ ๊ฑด
    : wait_sema๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์•˜์–ด์„œ
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ์™€ lock&sema ๊ด€๋ฆฌ ์ž˜ ํ•˜๊ธฐ ์ค‘์š” -> multi-oom test-case๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ด€๋ฆฌ ์š”๊ตฌ

์ด๊ฑด ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์€ ์•„๋‹Œ๋ฐ, ๋””๋ฒ„๊น…์„ ์ •๋ง ์ž˜ ํ™œ์šฉํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋Š๊ผˆ๋‹ค.
๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ์ž๊พธ ๋””๋ฒ„๊น…์„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
printf()๋“  ๋ญ๋“  ๋””๋ฒ„๊น…์„ ํ•˜๋‹ค๋ณด๋ฉด ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ํ˜๋Ÿฌ๊ฐ€๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์„ ๋•Œ๋‚˜ TC๊ฐ€ fail์ด ๋–ด์„ ๋•Œ ๋ฟ๋งŒ ์•„๋‹ˆ๋”๋ผ๋„ ํ•จ์ˆ˜ ํ๋ฆ„์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š” ์ง€ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ์—๋„ ํฐ ์ž‘์šฉ์„ ํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด