rox-child 테스트 해결하기
open()에 추가했던 코드를 다시 삭제했다 😅
lock_acquire(&filesys_lock);
struct file *file = filesys_open(filename);
lock_release(&filesys_lock);
if (file == NULL) return -1; // Return -1 if file is not opened
// file_deny_write(file);
// thread_current()->running_file = file;
exit()에 다음 코드를 추가했다.
void exit(int status) {
struct thread *curr = thread_current();
curr->exit_status = status;
printf("%s: exit(%d)\n", curr->name, status);
if (curr->running_file) file_allow_write(curr->running_file); // ← 추가
thread_exit();
}
process_exit()에 다음 코드를 추가했다.
for (int fd = 2; fd < 64; fd++) {
if (curr->fdt[fd] != NULL) {
file_close(curr->fdt[fd]);
curr->fdt[fd] = NULL;
}
}
file_close(curr->running_file); // ← 추가
load()에 다음 코드를 삭제했다:file_close()를 호출하면 자동으로 deny_write가 해제되어 버린다.
done:
// file_close (file);
return success;

multi-oom 해결하기

child 프로세스가 충돌되거나 하면 -1을 리턴해야 하는데 그러지 못했다.
process_fork()에 다음 코드를 추가했다.
sema_down(&child->c_sema);
if (child->exit_status == TID_ERROR) { // ← 추가
sema_up(&child->c_sema); // ← 추가
return TID_ERROR; // ← 추가
} // ← 추가
return tid;
}
__do_fork()의 마지막 부분을 다음과 같이 수정했다: 에러로 종료한 프로세스의exit_status는 -1이 된다.
error:
// thread_exit ();
exit(-1); // ← 추가
}

이번에는 fork가 234회 실행되어야 하는데 233회밖에 되지 않았다. fork 횟수가 1 모자란 이유는 메모리 및 리소스 해제가 제대로 이뤄지지 않았기 때문이라고 한다.
위에서 process_fork()에 새로 추가한 코드를 보자. 여기서는 fork 실패 여부를 child가 exit_status == -1인지 아닌지로 판단했었다. 하지만 테스트에서는 fork가 일단 성공했고, child가 곧바로 exit(-1)을 하더라도 fork 자체는 성공으로 간주한다.
💡fork()자체의 성공/실패 여부는__do_fork()의 리소스 복제 성공 여부로 판단해야 한다.exit_status == -1은 자식이 유저 프로세스를 실행하다가 오류로 종료했을 수도 있기 때문에 fork 실패로 보면 안 된다.
struct child에fork_fail필드를 추가했다.__do_fork()의 마지막 부분에 다음 코드를 추가했다: 리소스 복제 도중 에러가 발생하면fork_fail이 true로 설정된다.
error:
if (current->child_info != NULL) { // ← 추가
current->child_info->fork_fail = true; // ← 추가
sema_up(¤t->child_info->c_sema); // ← 추가
} // ← 추가
exit(-1);
}
process_fork()의 마지막 부분을 다음처럼 수정한다.
sema_down(&child->c_sema);
if (child->fork_fail)
return TID_ERROR;
return tid;
}


최종 결과 및 코드

GitHub - qkrwns1478/pintos-kaist
Contribute to qkrwns1478/pintos-kaist development by creating an account on GitHub.
github.com
'Krafton Jungle > 5. PintOS' 카테고리의 다른 글
| [PintOS 4주차] Day 2 (4) | 2025.05.30 |
|---|---|
| [PintOS 4주차] Day 0-1 (0) | 2025.05.28 |
| [PintOS 3주차] Day 4 (0) | 2025.05.25 |
| [PintOS 3주차] Day 3 (0) | 2025.05.24 |
| [PintOS 3주차] Day 1-2 (2) | 2025.05.23 |