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;
필요한 인자
깃북 다시 보니까 대충 이것들 포함하는 구조체 만들면 될듯?
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)
완벽하게 증명할 수 있는 건 아닌데
대충 투포인터로 하면 되지 않을까? 하고 때려맞췄더니
맞았습니다가 떴다.
뭔가 찜찜한 느낌.
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:
내일 마저 하기