PintOS 3주차 userprog


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


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를 구현하는 어디선가 잘못되지 않았을까?
처음 내가 생각한 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 자체에 문제가 있을 수 있다.
하지만 그럴려면 팀원들도 문제가 발생해야 하는데 나만 그런게
내 코드 어딘가에 문제가 있다.....


| 테스트 케이스 | 결과 |
|---|---|
| args | |
| create | |
| open | |
| close | |
| read | |
| write | |
| fork | FAIL |
| exec | FAIL |
| wait | FAIL |
| multi | FAIL |
| rox | FAIL |
| bad |
한 2일 정도 똑같은 문제를 해결하지 못한 채 쳇바퀴를 돌다 보니 무기력해지니...
이번 userprog은 여기서 멈춰야 할 듯하다.
다음을 위해
20000
PintOS 어렵다ㅗ