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

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK10 DAY 81 - PintOS Project3 - Anonymous Page ๋ณธ๋ฌธ

Krafton jungle

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ WEEK10 DAY 81 - PintOS Project3 - Anonymous Page

habbn 2024. 3. 28. 16:33
728x90
๐Ÿ“†2024.03.28

1.  Anonymous Page ๊ตฌํ˜„ ์ค‘
2. ๋ฐฑ์ค€
3. ํ‹ฐํƒ€์ž„

 

spt_find_page ์ˆ˜์ •

 

Management Memory ๊ตฌํ˜„ํ–ˆ๋˜ ๋ถ€๋ถ„ ์ฐฌ์ฐฌํžˆ ๊นƒ๋ถ์ด๋ž‘ ๋‹ค์‹œ ์ฝ์–ด๋ณด๋‹ค๊ฐ€ ์–ด์ œ ๊ตฌํ˜„ํ•œ spt_find_page ๋ถ€๋ถ„์„ ์ž˜๋ชป ๊ตฌํ˜„ํ•œ ์ ์„ ์ฐพ์•„์„œ ์ˆ˜์ •ํ•˜์˜€๋‹ค. (์‚ฌ์‹ค ์•„์ง ๋งž๋Š”์ง€ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†์Œ)

 

๊ธฐ์กด์—๋Š” struct page *page = NULL;

๊ทธ๋Œ€๋กœ ์„ค์ •ํ•ด๋’€๋Š”๋ฐ ์ด ์ƒํƒœ๋กœ ํ•˜๋ฉด ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ va์˜ ์ธ์ž๋กœ ๋ฐ›์€ va๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ malloc()์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด๋ฅผ ํ• ๋‹นํ•ด์„œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๊ณ , free(page) ๋˜ํ•œ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ์•˜์„ ๋•Œ์—๋„ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฑด์ง€๋Š” ์ •ํ™•ํ•˜๊ฒŒ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.(๊ธด๊ฐ€๋ฏผ๊ฐ€.. gpt๊ฐ€ ๋งž๋Š”์ง€...)

 

์ˆ˜์ • ์ฝ”๋“œ

struct page *
spt_find_page (struct supplemental_page_table *spt UNUSED, void *va UNUSED) {
	struct page *page = malloc(sizeof(struct page));
	struct hash_elem *e;
	if(page == NULL){
		return NULL;
	}

	page->va = pg_round_down(va);
	e = hash_find(&spt->hash_table, &page->hash_elem);
	
	if(e != NULL){
		struct page *found_page =  hash_entry(e, struct page, hash_elem);
		free(page);
		return found_page;
	}
	else{
		free(page);
		return NULL;
	}
}

 

Anonymous Page

Anonymous Page๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์€  vm_alloc_page_with_initializer์ด๋‹ค.

 

์ด ํ•จ์ˆ˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋‹ด๊ฒจ์žˆ์ง€ ์•Š์€ ํŽ˜์ด์ง€๋ฅผ ํ•˜๋‚˜ ์ƒˆ๋กญ๊ฒŒ ํ• ๋‹นํ•œ ๋’ค, ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  spt์— ๋„ฃ์–ด์ค€๋‹ค.

bool
vm_alloc_page_with_initializer (enum vm_type type, void *upage, bool writable,
		vm_initializer *init, void *aux) {

	ASSERT (VM_TYPE(type) != VM_UNINIT)

	struct supplemental_page_table *spt = &thread_current ()->spt;

	/* Check wheter the upage is already occupied or not. */
	/* 'upage'๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.*/
	if (spt_find_page (spt, upage) == NULL) {
		/* TODO: Create the page, fetch the initialier according to the VM type,
		 * TODO: and then create "uninit" page struct by calling uninit_new. You
		 * TODO: should modify the field after calling the uninit_new. */
		/* ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ณ  VM ์œ ํ˜•์— ๋”ฐ๋ผ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๊ฐ€์ ธ์™€์„œ
		 * uninit_new๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ "uninit" ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
		 * uninit_new๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์— ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. */

		struct page *page = malloc(sizeof(struct page));
		if(page == NULL){
			return NULL;
		}

		page_initializer new_initializer = NULL;
		switch(VM_TYPE(type)){
			case VM_ANON:
				new_initializer = anon_initializer;
				break;
			case VM_FILE:
				new_initializer = file_backed_initializer;
				break;
		}
		if(new_initializer == NULL){
			free(page);
			return false;
		}

		uninit_new(page, upage, init, type, aux, new_initializer);

		/* TODO: Insert the page into the spt. */
		/* ํ• ์ผ: ํŽ˜์ด์ง€๋ฅผ spt์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. */
		return spt_insert_page(spt, page);
	}
err:
	return false;
}

 

 

lazy_loading์„ ์œ„ํ•œ ์ค‘์š”ํ•œ ํ•จ์ˆ˜๋“ค์ด๋‹ค.

static bool
load_segment (struct file *file, off_t ofs, uint8_t *upage,
		uint32_t read_bytes, uint32_t zero_bytes, bool writable) {
	ASSERT ((read_bytes + zero_bytes) % PGSIZE == 0);
	ASSERT (pg_ofs (upage) == 0);
	ASSERT (ofs % PGSIZE == 0);

	while (read_bytes > 0 || zero_bytes > 0) {
		/* Do calculate how to fill this page.
		 * We will read PAGE_READ_BYTES bytes from FILE
		 * and zero the final PAGE_ZERO_BYTES bytes. */
		/* ์ด ํŽ˜์ด์ง€๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ„์‚ฐํ•˜์„ธ์š”.
		   FILE์—์„œ PAGE_READ_BYTES ๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ 
		   ์ตœ์ข… PAGE_ZERO_BYTES ๋ฐ”์ดํŠธ๋ฅผ 0์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. */
		size_t page_read_bytes = read_bytes < PGSIZE ? read_bytes : PGSIZE;
		size_t page_zero_bytes = PGSIZE - page_read_bytes;

		/* TODO: Set up aux to pass information to the lazy_load_segment. */
		/* lazy_load_segment์— ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก aux๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.*/
		void *aux = NULL;
		aux = (file, page_read_bytes, page_zero_bytes);
		if (!vm_alloc_page_with_initializer (VM_ANON, upage,
					writable, lazy_load_segment, aux))
			return false;

		/* Advance. */
		read_bytes -= page_read_bytes;
		zero_bytes -= page_zero_bytes;
		upage += PGSIZE;
	}
	return true;
}

 

์—ฌ๊ธฐ์„œ lazy_load_segment์— ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  aux๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ,

์ด aux์—๋Š” (file, page_read_bytes, page_zero_bytes)๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํˆฌํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ lazy_load_segment์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

static bool
lazy_load_segment (struct page *page, void *aux) {
	/* TODO: Load the segment from the file */
	/* TODO: This called when the first page fault occurs on address VA. */
	/* TODO: VA is available when calling this function. */
	/* 1. ํŒŒ์ผ์—์„œ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
	   2. ์ฃผ์†Œ VA์—์„œ ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. 
	   3. ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ VA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.*/

	struct file * file = ((void **)aux)[0];
	size_t page_read_bytes = ((size_t **)aux)[1];
	size_t page_zero_bytes = ((size_t **)aux)[2];

	/* Get a page of memory. */
	uint8_t *kpage = palloc_get_page (PAL_USER);
	if (kpage == NULL)
		return false;

	/* Load this page. */
	if (file_read (file, kpage, page_read_bytes) != (int) page_read_bytes) {
		palloc_free_page (kpage);
		return false;
	}
	memset (kpage + page_read_bytes, 0, page_zero_bytes);

	return true;
}

 

 

๋ฐฑ์ค€ 7568 ๋ฉ์น˜

 

import sys
input = sys.stdin.readline

N = int(input())
people = []
rank = [1] * N
for _ in range(N):
    x,y = map(int,input().split())
    people.append((x,y))
    
for i in range(N):
    for j in range(N):
        if i == j:
            continue
        if people[i][0] < people[j][0] and people[i][1] < people[j][1]:
            rank[i] +=1

for r in rank:
    print(r, end=" ")

 

์ถœ๋ ฅ๊ฐ’์ด 1์œ„์™€ 5์œ„์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ ๋‚˜์™€์„œ (2 2 5 2 1 ) ํ™•์ธํ•ด๋ณด๋‹ˆ ๋ถ€๋“ฑํ˜ธ๋ฅผ ๋ฐ˜๋Œ€๋กœ ์„ค์ •ํ•ด์คฌ์–ด์„œ ๊ทธ๋žฌ๋‹ค.

๋ถ€๋“ฑํ˜ธ๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•ด์ฃผ๋‹ˆ ์ถœ๋ ฅ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋‚˜์™”๋‹ค.

728x90