친구 운영체제로 인한 캐시 오염의 영향을 응용 프로그램의 성능에 대해 연구하고 싶습니다.
작은 맞춤 벤치 마크 프로그램을 작성했습니다.시스템 콜을 사용한 캐시 오염
1. malloc an array of size = l1 data cache-size
2. repeat ... sweep this array from start to end (hit-rate = 1.0)
3. *** perform a system call that thrashes l1 data cache ***
4. sweep the array once again (expected hit-rate = ~0.7 ---> 1.0)
알고리즘의 2 단계는 전체 배열을 반복적으로 읽습니다. 다행히도 배열은 캐시에 머물러 있기 때문에 1의 적중률이 발생합니다.
시스템 호출을 수행 한 후에 다시 캐시를 읽으려고합니다. 하지만 OS가 사용자에게 속한 일부 캐시 라인을 제거했다고 가정합니다.
이 프로그램은 시스템 호출을 사용하여 l1 데이터 캐시에서 많은 사용자 데이터 행을 제거합니다. 나는 이것을 어떻게 얻을 수 있을까 ??
시스템 호출이 파일 관련이거나 스트림 관련이어야한다고 가정합니다.
완벽한 ... 나는 열린, 쓰기 및 닫기 시스템 호출을 사용했습니다. 각 반복 후 파일에 32 k 배열을 쓰려고합니다. 하지만 그 효과는 놀랍습니다 ... l1 데이터 캐시는 l1 명령 캐시보다 효과가 적습니다. 어떤 아이디어? 나는 전화 당 명령어 수, 호출 당로드 수 등을 설명하는 정확한 통계를 다시 게시 할 것이다. 어쨌든 포스트를 고려해 주셔서 감사합니다. –
내 즉각적인 추측은 실제로 커다란 커널 데이터가 실제로 다루어지고 있지 않다는 것입니다. 단지 사용자 버퍼에서 쓰는 것), 따라서 작은 d- 캐시 영향. 나는 많은 커널 데이터 구조를 조작하는 시스템 호출을 찾으려고 노력할 것이다 --- (아마도 copy-on-write 효과를 알고있을지라도)'fork()'와 같은 것일 것이다. – kch
fwrite는 일반적으로 사용자 버퍼에서 다음과 같이 작성해야한다. 커널 버퍼가 비어 있으면 디스크에 기록합니다. 나의 이해는 여기에서 정확한가? 커널이 사용자 버퍼에서 디스크로 직접 DMA를 수행합니까? 나는 그렇지 않다고 생각한다. –