[t:/]$ 지식_

userfaultfd

2018/04/23

최신 커널에 등장한 기능. 4.11 부터인가 제대로 동작하는데, anonymous mmap에만 적용할 수 있고, 아직 파일 백 mmap에는 못 붙인다.

man 페이지에 나온 예제로 테스트해보니 코드는 복잡해 보여도 쉽게 구현할 수 있다.

mmap으로 정의한 주소 구간에다가 사용자 정의 페이지 폴트 핸들러를 붙일 수 있다. 이러면 mmap으로 정의한 주소 구간을 최초 접근시 COW에 의해서 페이지 폴트가 발생하고 그 핸들링을 사용자 정의 핸들러에서 처리할 수 있다. 나는 간단하게 파일을 읽어서 메모리 복사하도록 해봤다. 혹시나 mmap보다 빠르지는 않나 해봤는데 그렇게는 안 된다 하하하하...

한 번에 많이 복사하면 어떨까? 파일 백 mmap은 통상 4킬로 단위로 폴트가 발생한다. 최근에 실험해보니 커널이 약간의 예측을 통해 32킬로 까지도 프리폴트를 별다른 옵션없이 발생시키는 것 같다. 여튼 한 번에 수백 킬로씩 쭉쭉 뽑아다 복사를 시켰더니 /proc 에서 모니터링 한 결과 폴트가 줄어든다. 다만, 메이저 폴트가 늘어나던가 하는 조삼모사로 동작한다. (실험 결과 까먹음.. 정확한 것은 확인 필요)

이걸 어디다 쓸 수 있을까.. 고민 중이다. gpgpu를 아직 안 해봤는데 gpgpu 메모리 복사용이나 새로운 nvram 용 인터페이스를 만들 수 있을 것 같다. 버퍼처리한다고 귀찮은 일을 포인터 연산으로 바꾸면 꽤 편리할 것이다.









[t:/] is not "technology - root". dawnsea, rss