크래프톤 정글 TIL : 0926

lazyArtisan·2024년 9월 26일
0

정글 TIL

목록 보기
88/147

🖥️ PintOS

🔷 Virtual Memory


load_segment(), lazy_load_segment()

load_segment 설명 주석 보고 흐름 정리

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);	// 파일 오프셋이 페이지 단위로 주어졌는지 확인

	file_seek(file, ofs); // 오프셋에 있는 파일을 찾는다
	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. */
		size_t page_read_bytes = read_bytes < PGSIZE ? read_bytes : PGSIZE;
		// 읽을만큼의 바이트가 페이지 사이즈보다 작으면 페이지 사이즈로 만들어준다.
		size_t page_zero_bytes = PGSIZE - page_read_bytes;
		// 페이지 단위 정렬을 맞춰주기 위해 남는 만큼 0으로 초기화해줄 바이트 크기

		/* 페이지만큼의 메모리를 얻는다 */
		uint8_t *kpage = palloc_get_page(PAL_USER);
		if (kpage == NULL)
			return false;

		/* 페이지를 로드한다. (파일을 읽는다) */
		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);

		/* 프로세스의 주소 공간에 그 페이지를 추가한다. */
		if (!install_page(upage, kpage, writable))
		{
			printf("fail\n");
			palloc_free_page(kpage);
			return false;
		}

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

주석 달기

이전과 이후 어떻게 달라진건가 확인

while문 바깥은 동일 : 그럼 lazy_load_segment에선 빼도 될듯?
page_read_bytes, page_zero_bytes도 동일 : 정보로 넘겨주기만 하면 될듯
read_bytes, zero_bytes 동일 : lazy_load_segment에서 빼기

왼쪽: 이전, 오른쪽: 이후

중복되는 부분 제거했음.
결국 lazy_load_segment가 aux로 넘겨받은 정보와 함께 해야하는 일은

	file_seek(file, ofs); // 오프셋에 있는 파일을 찾는다
	while (read_bytes > 0 || zero_bytes > 0)
	{
		/* 페이지만큼의 메모리를 얻는다 */
		uint8_t *kpage = palloc_get_page(PAL_USER);
		if (kpage == NULL)
			return false;

		/* 페이지를 로드한다. (파일을 읽는다) */
		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);

		/* 프로세스의 주소 공간에 그 페이지를 추가한다. */
		if (!install_page(upage, kpage, writable))
		{
			printf("fail\n");
			palloc_free_page(kpage);
			return false;
		}

	}
	return true;

필요한 인자

  • file
  • ofd
  • read_bytes
  • zero_bytes
  • upage
  • writable

깃북 다시 보니까 대충 이것들 포함하는 구조체 만들면 될듯?



⚔️ 백준


📌 22945 팀 빌딩

N=int(input())
stat=list(map(int,input().split()))
s,e=0,len(stat)-1
res=0
while(s<e):
    team_stat = (e-s-1)*min(stat[s],stat[e])
    res=max(res,team_stat)
    if (stat[s]<=stat[e]): s+=1
    else: e-=1
print(res)

완벽하게 증명할 수 있는 건 아닌데
대충 투포인터로 하면 되지 않을까? 하고 때려맞췄더니
맞았습니다가 떴다.

뭔가 찜찜한 느낌.

📌 3255 WINDOWS

N=int(input())
# 버튼을 가린다면 선행 버튼 정보를 해당 칸에 추가
# 창이 100개 뿐이니까 매번 순회해도 문제 x
# 버튼의 위치 : (왼위세, 우아가)
# 그래프를 만든 후에 탐색하며 삭제

# 어떤 창이 어떤 버튼들을 가리는지에 대한 판별을 한 후에
# 해당 창들에 지금 창의 버튼을 연결해줌
btns=[]
for _ in range(N):
    # (왼위세,왼위가,우아세,우아가)
    lur,luc,rdr,rdc = tuple(map(int,input().split()))
    btns.append((lur,rdc))
    for btn in btns:
        btn_r,btn_c = btn
        if lur <= btn_r <= rdr and luc <= btn_c <= rdc:

내일 마저 하기

0개의 댓글