jun-wiki

View My GitHub Profile

Posts (Latest 10 updated) :
Read all
Contents:
  1. dup2
  2. fork

디버깅 마쳤다

드디어 프로젝트2 all-pass다

애먹던 부분은 총 두가지로 하나는 lock 이슈였고

하나는 POSIX방식으로 구현했다는 것이었다

TIL쓰기 개귀찮다

이거 코드 다 정리한거 어떻게 써야하나…

대충 중요 코드만 어떻게 구현했는지 쓰고 튀어야겠다

dup2

여긴 기존이랑 동일하다

보통 fork에서 처리해가지고 여긴 뭐 많이 안건드렸다

가장 큰 차이라면 리스트 쓰던거 해시로 바꾼건데 동작은 동일해서 안다루겠다


fork

dup2한 관계가 fork 시에도 유지되어야 한다는 개념이 어렵다

이거 하나 구현하는데에 꽤 고생했다…

첫번째 문제는 fork 해서 자식 프로세스 만들때에 duplicate하면

dup2관계의 핵심인 fd만 다르고 같은 파일 참조가 아닌 파일이 새로 만들어진다는거였다

이를 해결하고자 duplicate 대신 포인터 방향만 바꾸는 식으로 로직을 바꾸었더니

exec-read 등등의 케이스에서 실패했다…

안타깝게도 POSIX방식인 얕은복사 (duplicate 안쓰는 거)

대신 Pintos에서는 깊은복사를 원하기에 발생한 문제다

즉, 말그대로 기존 프로세스 하나더 만드는 느낌으로 되어야 하기에

처음 fork 시에는 duplicate 하고 그 뒤에 또 그거 참조하는 애들이 dup2 관계가 유지되어야 한다는 거다

이를 디버깅하고 찾고 하는데 하루 썼다

게다가 테스트케이스가 널널한 것인지

fork 할때에 기존 dup2 관계 유지대신 duplicate로 새로 만들었음에도 통과되는

이상한 일이 있었고

dup2관계 유지 위해 이 또한 수정했다

간단한 테이블 하나 만들어 duplicate할때마다 기록하고 만약에 테이블에 참조된 파일이 있으면

포인터 위치만 바꾸고 실제 duplicate는 안하는 식으로 구현했고

그 결과 all-pass

게다가 로직도 권장에 맞게 잘 구현되었다