본문 바로가기
정글

늦게 써보는 Pintos 3주차 VM(가상메모리) 회고

by 진득한진드기 2023. 9. 25.

Introduce

- 1주 차에서는 스케줄링, 2주 차에서는 시스템 콜에 대해서 알아가고 구현해봤다면 3주차는 (Virtual Memory) 가상 메모리에 관한 주차이다.

- 2주차까지는 system call을 이용해 어떠한 파일을 읽어오고 쓰는 명령들을 컨트롤 해봤다면 3주 차는 컴퓨터에 혁명인 가상메모리를 다루는 주차이다.

- 가상 메모리란 실제 메모리 크기와 상관없이 메모리를 이용할 수 있도록 가상의 메모리 주소를 사용하는 방법을 의미한다.

 

글을 쓰는 이 시점에서 얼마 전에 면접에서 가상 메모리를 왜 사용하고 사용했을 때 어떠한 장점이 있을지 질문을 받은 적이 있는데, 

단지 메모리 중 사용 가능한 물리 메모리들을 추상화 해놓은 것이라고 명확하게 말하지 못했던 게 아쉬움이 남는데, 갑자기 받은 질문이라 명료하게 대답하지 못했던 것 같다.

 

1. 가상 메모리는 물리적 공간의 제한을 극복하기 위해 사용하는 기술로, 메인 메모리 크기보다 더 크게 메모리를 사용이 가능하고,

2. 연속적인 물리주소를 비연속적 메모리 주소로 변화시켜 준다.

 

2번으로서 얻는 장점은 메모리의 관리를 수월하게 하고 물리메모리를 직접 건드리지 않게 하여 보안으로서의 장점을 가질 수도 있을 것 같다.

 

 

이번주는 ......?

내가 느낀 이번 주차는 지옥과 같았다.......

 

2주차가 제일 바쁘고 보람찰 줄 알았지만 사실상 3주 차가 제일 힘들었던 것 같다.

 

처음 SPT 관련 함수들을 구현하고 어떻게 구성할 것인지 왜 그렇게 돌아가는지 부터 팀원들과 상의해서 Hash Table을 사용해 VM을 구성

하기로 하고 page의 가상 주소를 키값으로 spt에 접근하여 연결리스트로 가상 메모리를 생성하여 사용했다.

 

spt 관련되서 기능을 만드는 것까지는 괜찮았는데 문제는 가상 메모리를 물리적 한계를 넘기 위한 기능을 구현하는 

swap-in, swap-out에 들어서면서 부터 인것 같다.

 

코드량이 너무 방대해서 조금만 만져도 전에 잘되던 기능에 문제가 생긴다.

 

오류가 나오지도 않아서 일일이하 추측해야한다......

 

우리 팀이 판단한 문제는 swap-in, swap-out에서 할 때 생기는 희생자 정할 때 였다.

 

함수가 실행되어서 자원이 공유되어야 한다고 생각하여 전역 변수로 사용했는데 희생자 페이지를 구할 때 연산이 변화가 생겨서 우리의 예상과 다른 연산 결과가 나오는 것이었다.

 

 

그래서 어떻게 해결했는데?

 

희생자를 판단해 주는 변수를 지역변수로 선언해 주고 우리가 정한 페이지 교체 알고리즘인 Clock 알고리즘을 사용해

 

물리 메모리 테이블에 access 된 메모리를 체크하고 또 그 체크에 대한 빈도수를 count 해준다.

 

그 빈도수에 맞춰 페이지를 교체해 주는 방식으로 희생자를 정하여 구현하였더니 해결되었다.

 

진짜 해결하고 팀원들과 새벽에 비명 지르고 난리도 아니었다ㅋㅋㅋㅋㅋㅋ....

 

과제 제출 기한 2일 남았을 때는 과제 통과 test case가 3개가 통과가 안돼서 문제가 많았지만, 그냥 처음부터 코드를 깔끔하게 다시 구현하자는 의견이 나와서 처음부터 천천히 불필요한 부분이나 메모리 누수가 날 만한 곳을 체크하면서 코드를 짰더니 다행히 통과할 수 있었다.

 

처음부터 다시 구현할 때

처음 부터 구현하겠다고 마음을 먹었으면 지금 가상 메모리가 돌아가는 동작방식을 큰 맥락으로 보고 구현해야 좀 더 깔끔하게 정리된 코드를 짤 수 있을 것이다.

 

팀원들과 전체적인 흐름도를 내가 작성한 함수가 어디에 영향을 끼치는지 최대한 생각해보는 것이 좋다.

 

우리 조가 판단한 VM가 돌아가는 동작 방식이다.

 

가상 메모리에 원하는 물리 메모리값이 존재하지 않아 Page fault가 일어나 그 후에 우리가 처리 해야할 동작들과 함수들이다.

 

이러한 방식으로 막막했던 부분도 해결하고 개념을 다시 잡을 수 있었다.

 

이렇게 시간을 투자하여 advanced까지 도전할 시간적 여유가 생겨 마지막 기한 까지 밤을 새면서 all pass를 받았다.

 

정말 많이 힘들었지만 재밌었고, 팀워크에 중요성도 많이 얻어가는 것 같다. 서로 의견도 많이 나누고 논리적 오점 등을 찾으면서 대화하는 법을 하니 한 발짝 더 성장 했다는 느낌이 들어서 좋았다.

VM 올페스

후기

많은 분이 Pintos를 하다가 많이 꺾이셔서 의욕이 많이 없어진 주이기도 했지만, 다른 팀들을 알려주면서도 다시 풀어가는 과정을 상기시킬 수 있어서 가장 재밌는 주가 아니었나 싶다.

'정글' 카테고리의 다른 글

Pintos(2주차) system call 후기 회고  (0) 2023.06.12
Pintos Thread (WIL) 깊게 생각해볼 Keyword  (0) 2023.06.02
(Pintos 1주차) Priority scheduling  (0) 2023.05.31
Pintos(1일차 후기) 쓰레드  (0) 2023.05.28
WIL(7주차) Proxy 구현  (0) 2023.05.25