Krafton Jungle/5. PintOS

[PintOS 3주차] Day 5-6

munsik22 2025. 5. 26. 11:50

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;

1 of 95 tests failed.


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 childfork_fail 필드를 추가했다.
  • __do_fork()의 마지막 부분에 다음 코드를 추가했다: 리소스 복제 도중 에러가 발생하면 fork_fail이 true로 설정된다.
error:
	if (current->child_info != NULL) {		// ← 추가
		current->child_info->fork_fail = true;	// ← 추가
		sema_up(&current->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