์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ์๊ณ ๋ฆฌ์ฆ
- ํ์ด์ฌ
- ์๊ณ ๋ฆฌ์ฆ์์ -๋๋น์ฐ์ ํ์2
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- kraftonjungle
- ์ ๋ํฐ
- C
- KRAFTON JUNGLE
- ๋คํธ์ํฌ
- ๋ฐฑ์ค
- ์ค๋ธ์
- ํฌ๋ํํค ์ ๊ธ 4๊ธฐ
- 4๊ธฐ
- ํฌ๋ํํค์ ๊ธ4๊ธฐ
- ๋ค์ต์คํธ๋ผ
- ์ถ์ํด๋์ค์์ธํฐํ์ด์ค
- c#
- TiL
- ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ด๋ฒคํธ ํจ์ ์คํ ์์
- project3
- anonymous page
- ์ ์-์ ํฌ
- pintos
- BFS
- User Stack
- ํฌ๋ํํค์ ๊ธ
- ํํ ์ค
- Unity
- ํฌ๋ํํค ์ ๊ธ
- Today
- Total
๋ง๊ฐ๋ก๊ทธ
ํฌ๋ํํค ์ ๊ธ WEEK10 DAY 81 - PintOS Project3 - Anonymous Page ๋ณธ๋ฌธ
ํฌ๋ํํค ์ ๊ธ WEEK10 DAY 81 - PintOS Project3 - Anonymous Page
habbn 2024. 3. 28. 16:33๐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 ) ํ์ธํด๋ณด๋ ๋ถ๋ฑํธ๋ฅผ ๋ฐ๋๋ก ์ค์ ํด์คฌ์ด์ ๊ทธ๋ฌ๋ค.
๋ถ๋ฑํธ๋ฅผ ๋ค์ ์ค์ ํด์ฃผ๋ ์ถ๋ ฅ๊ฐ์ด ์ ๋๋ก ๋์๋ค.