[week 11] PintOS - 핀토스 어렵다

Woody Jo·2025년 7월 30일

kjungle

목록 보기
19/31

PintOS 3주차 userprog

트러블 슈팅


토요일 저녁 write까지 테스트 케이스 통과한 후
발표까지 4일 충분히 다 하겠는데?

왜 sema_down에서 에러가?

int
process_wait (tid_t child_tid UNUSED) {
	// thread_sleep(500);
	// return -1;

	struct thread *child = get_child_thread(child_tid);
	// 유효하지 않은 tid않다면 -1
	if (child_tid == TID_ERROR) {
		sys_exit(-1);
	}

	// 자식이 종료될 때까지 대기 (자식이 exit에서 wait_sema를 up 할 때까지)
	sema_down(&child->wait_sema);
	// 자식의 종료 상태를 가져옴
	int exit_status = child->exit_status;
	// 부모의 자식 리스트에서 자식 제거 (메모리 누수 방지 및 중복 wait 방지)
	list_remove(&child->child_elem);
	// 자식에게 이제 소멸해도 좋다고 신호를 보냄 (exit에서 대기 중인 자식을 깨움)
	sema_up(&child->exit_sema);
	
	return exit_status;
}

어디가 문제일까
backtrace 결과: sema_down(&child->wait_sema)

도대체 문제가 무엇일까?

read 테스트를 실행할 때 분명 sample.txt 파일이 정상적으로 있음에도 불구하고 sample.txt를 open하지 못했는데,
문제는 read에서 정확하게 구현되지 않아 발생한 것이였다.

그래서 지금 process_wait이 아니라 fork를 구현하는 어디선가 잘못되지 않았을까?

그래서 sys_fork 부터 다시 봐보자

처음 내가 생각한 thread_create 흐름

처음 생각했던 것과 다르게 thread_create
즉시 run 하지 않고 ready_list 들어가 있게된다.
(우선순위에 따라 다르긴 함, 여기서는 PRI_DEFAULT로 생성되기에 바로 run하지 않을 것)

get_child_thread를 호출하여 return 받은 child thread의 fork_sema를 sema_down 시킨다.

그러면 부모 스레드가 waiting_list로 들어가고
자식 스레드가 자식의 해야 할 일(__do_fork)를 열심히 수행하게 된다.


그니까 흐름을 완전히 잘못 이해하고 있었기에 코드도 분명 문제가 있었을 것,
하고 이 흐름대로 다시 고쳐보았다.

흐름을 좀 잡고 process_fork를 수정한 후

tid_t
process_fork (const char *name, struct intr_frame *if_ UNUSED) {
	/* 현재 스레드를 새 스레드로 복제합니다. */
	struct thread *parent = thread_current();
	/* parent에게 if_ 넣기 */
	memcpy(&parent->parent_if, if_, sizeof(struct intr_frame));

	/* 자식 스레드 생성 */
	tid_t child_tid = thread_create (name,
			PRI_DEFAULT, __do_fork, parent);
	
	/*
	현재 부모 스레드는 thread_create를 통해 자식 스레드를 생성한 후
	ready_list에 올려둔 채 계속 진행한다.
	*/
	if (child_tid == TID_ERROR) {
		return TID_ERROR;
	}

	struct thread *child = get_child_thread(child_tid);

	if (child == NULL) {
		return TID_ERROR;
	}

	sema_down(&child->fork_sema);
	return child_tid;
}

다시 테스트
하지만 여전히 같은 에러를 반복한다.

sema_down()에서 문제가 터지는데 sema_down 자체에 문제가 있을 수 있다.
하지만 그럴려면 팀원들도 문제가 발생해야 하는데 나만 그런게
내 코드 어딘가에 문제가 있다.....

테스트 케이스결과
argsPASS
createPASS
openPASS
closePASS
readPASS
writePASS
forkFAIL
execFAIL
waitFAIL
multiFAIL
roxFAIL
badPASS

한 2일 정도 똑같은 문제를 해결하지 못한 채 쳇바퀴를 돌다 보니 무기력해지니...
이번 userprog은 여기서 멈춰야 할 듯하다.

다음을 위해
20000

PintOS 어렵다

profile
developer

0개의 댓글