cache memory를 어떻게 flush하죠? // cacheflush() 라는 리눅스 내장함수를 아시는분?
글쓴이: ukyoukyo / 작성시간: 월, 2009/10/12 - 10:33오전
페도라 9에서 C로 프로그램짜다가,
# free
해서 나타나는 buffer와 cached 용량을 줄이는 방법을 찾고 있는데요...
#man cacheflush
하니까 data cache를 flush한다는 내용이 있었습니다.
NAME cacheflush - flush contents of instruction and/or data cache SYNOPSIS #include <asm/cachectl.h> int cacheflush(char *addr, int nbytes, int cache);
제 시스템에는 asm/cachectl.h 파일이 없습니다.
그러니까 manpage만 있고, 실제 소스는 없는 경우입니다.
CONFORMING TO This Linux-specific system call is only available on MIPS based systems. It should not be used in programs intended to be portable.
MIPS 기반 장비에서만 설치되는것 같은데,
일반 시스템에 적용하려면 어떤 방법이 필요한가요?
아!
echo 3 > /proc/sys/vm/drop_caches
이렇게 실행해도 cache size가 엄청나게 줄어버리더군요...
궁극적으로 알고 싶은것은,
API를 써서 cache 영역을 비우는 함수를 짜고 싶습니다...
고수분들의 조언을 부탁드립니다.
Forums:
...
그 cache가 그 cache가 아닙니다. 전혀 다른 cache입니다.
"MIPS CPU에 달린 cache를 flush하는 명령"을 x86(..이겠죠?) CPU에 들고 와서 어쩌실라구요?
어, 그런가요?
그렇다면, user space memory의 cache를 지우는 API는 어떤게 있나요...
------------------ System programmer...^^
------------------ System programmer...^^
x86 에는 cache를
x86 에는 cache를 다루기 위한 instruction 이 없을 겁니다.
write buffer 를 위한 instruction 만 찾아낸 기억이 있습니다.
OTL
echo 3 >
echo 3 > /proc/sys/vm/drop_caches
jick 님이 이미
jick 님이 이미 언급하셨듯
"그 cache가 그 cache가 아닙니다. 전혀 다른 cache입니다."
OTL
아 끝 부분을 안
아 끝 부분을 안 읽었네요. free에서 나오는 cache는 그 cache가 맞고, 그거 줄이는 방법은 /proc/sys/vm/drop_caches에 쓰는 방법밖엔 없습니다. CPU cache는 x86에선 PREFETCH, CLFLUSH, INVD 인스트럭션들로 건드릴 수 있긴 한데, 시퓨가 알아서 하니까 대게는 건드릴 이윤 없고, 말씀하셨듯 전혀 다른 캐시구요.
으음... 근데 왜 cached/buffered를 줄이려고 하시나요?
아 저기.. 이
아 저기.. 이 자리에서 할 얘기는 아닌 것 같습니다만... 그래도 ... 찾기가 어려워서요...
x86 L1 cache 중 instruction cache 만 invalidate 하는 instruction 을 알고계시면 좀 가르쳐주세요.
질문하신 분은 pagecache 가 아니라 CPU cache 를 말하는 것 같습니다. 이것 말입니다.
OTL
fs cache 질문하신 것
fs cache 질문하신 것 같은걸요?
질문하신 분: "free 해서 나타나는 buffer와 cached 용량을 줄이는 방법을 찾고 있는데요..."
음... icache flush 인스트럭션은 없는데, self-modifying code 때문에 그러시는거면 코드 바꾼 후 한 번 점프하거나 serializing instruction 한 번 불러주면 된다고 메뉴얼에서 그러네요.
그렇군요. cacheflush()
그렇군요. cacheflush() 언급하셔서 그쪽에 시야가 집중됐었습니다.
사실은 icache linesize 에 맞추고 못 맞추는게 얼마나 차이가 나는 지 알아보기 위해 고민했던 적이 있는데,
x86 에선 테스트 단계 진입 전에 강제로 flush/invalidate 하는 방법을 못 찾았습니다.
OTL
아... 테스팅
아... 테스팅 목적이군요. 저도 전혀 모르겠습니다. WBINVD하고 의미 없는 코드 덩어리를 밟은 다음 CPUID하고 들어가면 되려나요?
API를 찾습니다만...
echo 3 > /proc/sys/vm/drop_caches
를 수행하는 함수 같은건 없나요?
/proc/sys/vm/drop_caches의 내용을 파일 포인터로 잡아서
내용을 3으로 변경하려고 하니 안되더군요. 항상 크기가 '0'인 특수한(?) 파일이어서요.
------------------ System programmer...^^
------------------ System programmer...^^
sysctl() 사용하세요. {
sysctl() 사용하세요.
{ CTL_VM, VM_DROP_PAGECACHE } 으로 접근하시면 됩니다.
OTL
bushi님, 감사합니다.
bushi님 감사합니다.
한번 해보고 안되면 다시 여쭙겠습니다.
로또 사시길...^^
------------------ System programmer...^^
------------------ System programmer...^^
Linux 2.6.16 부터 있는데, Linux 2.4.x에서는 어떻게하는지요?
bushi님.
알려주신 VM_DROP_PAGECACHE는 Linux 2.6.16부터 adding되었는데,
Linux 2.4.x에서는 어떠한 방법으로 접근할 수 있는지요?
그리고 2.6에서의 예제 사이트 좀 추천을...^^
------------------ System programmer...^^
------------------ System programmer...^^
인텔 프로세서
인텔 프로세서 매뉴얼은 아래 사이트에서 볼 수 있습니다.
http://www.intel.com/products/processor/manuals/index.htm
명령어셋은 아래 문서를 다운받으시면 됩니다.
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference, A-M
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, N-Z
그리고 예전에 위 매뉴얼 본 바로는 x86 명령어 중에 캐쉬 비우는 명령 있습니다. 찾아볼 시간이 안되니 알아서 찾아보세요.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
댓글 달기