[TIL/크래프톤 정글] DAY 81

배재준·2025년 5월 29일

크래프톤 정글 - TIL

목록 보기
73/93
post-thumbnail

2025.05.29

TIL(TODAY I LEARN)


  • 오늘한 내용 : PintOS - Project2: UserProgram - System calls
    dup2 구현 완료 및 multi-oom 테스트 오류 해결 - 97 all passed!
  • WEEK 11 : 정글 끝까지(PintOS) - UserProgram

최초 process의 fd 테이블 초기화 추가

  • dup2 구현 전
    • sys_write 에서 fd == 1(stdout)이면 곧바로 putbuf() 로 콘솔 출력하는 특수 처리가 있었음.
    • 그래서 fd_table[1] 이 비어 있어도 stdout 출력이 정상 동작했음.
  • dup2 구현 후
    • sys_write 가 항상 thread_current()->fd_table[fd] 를 통해 파일 구조체를 찾아서 쓰도록 바뀜.
    • 따라서 fd_table[1]console_out 을 넣어 주지 않으면 NULL 참조 때문에 크래시가 발생.
  • dup2 를 구현하면서 stdout/stdin 처리 방식을 fd_table 기반으로 통일했기 때문에, 초기 프로세스에서도 fd_table[0,1] 을 반드시 초기화해 주어야 크래시 없이 동작함.
static void
process_init(void)
{
	struct thread *cur = thread_current();

	cur->fd_table = palloc_get_page(PAL_ZERO);
	if (cur->fd_table == NULL)
		PANIC("process_init: cannot alloc fd_table");

	/* console_in/out 은 이미 thread_init() 시점에 초기화해 두었다고 가정 */
	cur->fd_table[0] = &console_in;
	cur->fd_table[1] = &console_out;
	cur->next_fd = 2;
}

ALL 97 PASSED

내 깃허브 - UserProgram까지 해냈다.


dup2는 어제 사실 구현이 되었는데, 갑자기 multi-oom 테스트가 실패하길래 너무 슬펐다..
oom test는
n == 메모리가 허용하는 만큼
1. fork n 번 -> exit n번 -> 표준 출력을 wirte
2. 다시 fork n번 -> exit n번 -> wirte => 메모리 누수를 체크

나는 메모리 누수가 아닌 wirte에서 문제가 있었던 것.
위에서 서술한 것처럼 dup2 구현 후에는 표준 입출력과 read,wirte를 건드렸다.
thread_create() 에서 뿐 아니라
그래서 최초 프로세스에서도 fd_table을 초기화를 추가해줬다..
원래 안 했었는데 잘 돌아갔던건 운이었나보다..

그래도 해결했으니 행복하다.

4개의 댓글

comment-user-thumbnail
2025년 5월 29일

정진하겠습니다.

1개의 답글
comment-user-thumbnail
2025년 5월 30일

BJJ

1개의 답글