디버깅 마쳤다
드디어 프로젝트2 all-pass다
애먹던 부분은 총 두가지로 하나는 lock 이슈였고
하나는 POSIX방식으로 구현했다는 것이었다
TIL쓰기 개귀찮다
이거 코드 다 정리한거 어떻게 써야하나…
대충 중요 코드만 어떻게 구현했는지 쓰고 튀어야겠다
여긴 기존이랑 동일하다
보통 fork에서 처리해가지고 여긴 뭐 많이 안건드렸다
가장 큰 차이라면 리스트 쓰던거 해시로 바꾼건데 동작은 동일해서 안다루겠다
dup2한 관계가 fork 시에도 유지되어야 한다는 개념이 어렵다
이거 하나 구현하는데에 꽤 고생했다…
첫번째 문제는 fork 해서 자식 프로세스 만들때에 duplicate하면
dup2관계의 핵심인 fd만 다르고 같은 파일 참조가 아닌 파일이 새로 만들어진다는거였다
이를 해결하고자 duplicate 대신 포인터 방향만 바꾸는 식으로 로직을 바꾸었더니
exec-read 등등의 케이스에서 실패했다…
안타깝게도 POSIX방식인 얕은복사 (duplicate 안쓰는 거)
대신 Pintos에서는 깊은복사를 원하기에 발생한 문제다
즉, 말그대로 기존 프로세스 하나더 만드는 느낌으로 되어야 하기에
처음 fork 시에는 duplicate 하고 그 뒤에 또 그거 참조하는 애들이 dup2 관계가 유지되어야 한다는 거다
이를 디버깅하고 찾고 하는데 하루 썼다
게다가 테스트케이스가 널널한 것인지
fork 할때에 기존 dup2 관계 유지대신 duplicate로 새로 만들었음에도 통과되는
이상한 일이 있었고
dup2관계 유지 위해 이 또한 수정했다
간단한 테이블 하나 만들어 duplicate할때마다 기록하고 만약에 테이블에 참조된 파일이 있으면
포인터 위치만 바꾸고 실제 duplicate는 안하는 식으로 구현했고
그 결과 all-pass
게다가 로직도 권장에 맞게 잘 구현되었다