2011-03-21 5 views
5

Mac OS X의 경우 vm_allocate()을 사용하면 제거 가능한 메모리 영역을 만들 수 있습니다. 이 영역은 메모리 압력이 감지 될 때 커널에 의해 언제든지 (잠긴 상태가 아닌) 재 확보 될 수 있습니다. 데이터 캐싱 등에 유용합니다.Linux의 제거 가능한 메모리 영역

Linux (커널 2.6)에서도 비슷한 메커니즘이 있는지 궁금합니다. Google 검색을 통해 안드로이드에 대한 공유 메모리 할당 문제를 해결할 수있는 정보를 얻을 수 있었지만 vanilla Linux에서 실제로이 작업을 수행하는 API에 대해서는 언급하지 않았습니다. mmap, shmat 등의 설명서 페이지를 검토 한 결과 제거 가능한 영역을 설정하는 플래그가 표시되지 않습니다. Linux에서이 기능을 사용할 수 있습니까? 안드로이드에이 기능에 대한

노트 현재 위치 :

MemoryFile Reference

MemoryFile Sample

감사합니다!

+0

포맷 수정 용 XNU http://fxr.watson.org/fxr/source/osfmk/vm/vm_object.c?v=xnu-1228;im=bigexcerpts#L5265 – osgx

+0

감사에서 코드 비트 @osgx. XNU 코드는 실제로 OS X에서 볼 수 있습니다. –

+0

안드로이드 토론에 대한 링크를 추가 할 수 있습니까? – osgx

답변

2

2.6.39-rc1에는 이와 유사한 시스템이 있습니다. "초월 메모리"라고합니다 :

: Transcendent Memory and Friends, TmemNotVirt-Linuxcon2011-Final.pdf이 oss.oracle에서
  • API 사양 (또한 일부 유사한 용어를 나열)

    업데이트 : 위키피디아의 짧은 글자도 있습니다. https://en.wikipedia.org/wiki/Transcendent_memory

    컴퓨팅에서 탁월한 메모리 (일명 "tmem")는 Dan Magenheimer가 탐구 한 개념입니다. 초월 메모리는 알 수없고 동적으로 변하는 메모리 클래스이며 커널에 의해 간접적으로 만 주소 지정이 가능하며 영구적으로 또는 "일시적"으로 구성 될 수 있습니다 (즉, 잠시 동안 나타납니다. 경고). 동 기적으로 액세스 할 수있을만큼 충분히 빠름.

    초월적인 메모리는 몇 가지 흥미로운 특징을 가진 일종의 RAM 디스크로 생각할 수 있습니다. 아무리 큰지는 아무도 모릅니다. 디스크에 쓰는 것이 성공하지 못할 수 있습니다. 잠재적으로 디스크에 기록 된 데이터가 다시 읽히기 전에 사라질 수 있습니다. 첫 번째 홍조에서는 상대적으로 쓸데없는 종류의 장치처럼 보일 수 있지만 초월적인 메모리가 몇 가지 상황에서 성능을 향상시킬 수 있기를 기대합니다.

    Linux 커널 2.6.39에 도입되었습니다. [1] [2] Oracle Corporation의 Dan Magenheimer에 의한 구현. Xen 4.0은 하이퍼 바이저에서 tmem을 지원합니다.

  • +0

    작동하는 것처럼 보입니다. 2.6.39가 안정 될 때까지 기다려야합니다. :) –

    +0

    인용 해 주셔서 감사합니다. 왜 지구에서 기사가 Wikipedia에서 삭제되었는지 궁금합니다. "기사가 크게 복사됩니다. 다양한 출처가 없어 주목할만한 것입니다." 오히려 모호한 이유가 있습니다. –

    0

    Linux에서는 사용자 인터페이스에 대해 비슷한 인터페이스를 사용할 수 없습니다.

    제거 가능한 메모리는 Mach 마이크로 커널에 Apple에 의해 통합되어 있습니다. 그리고 그들은이 기술을 특허 http://www.faqs.org/patents/app/20090024809 (미국 특허 7831784)으로 보호합니다.

    디스크 캐시 (페이지 캐시)와 비슷한 커널이 사용됩니다. FS에 의해 지원되는 페이지를 캐시합니다. 더 많은 메모리가 필요할 경우 삭제할 수 있습니다 (더티가 아닌 경우). 즉시 메모리 영역에 주어진 http://www.westnet.com/~gsmith/content/linux-pdflush.htm

    는 또한, MADV_DONTNEED 플래그 madvise()이 (http://linux.die.net/man/2/madvise) 그러나 이것은 (퍼지) 자유 의지에 이것에 대해 더 많은입니다.

    +1

    필자는'madvise()'를 시험해보기 위해 간단한 테스트 프로그램을 작성했고 여러분이 언급 한 것과 같은 결과를 보았습니다. pdflush는 커널에 있고 사용자 공간에서 사용할 수없는 것 같습니다. 후속 질문을 추가하는 것이 적절한 지 확신 할 수 없지만'vm_allocate()'와 같이 캐싱 설정을 구현하려는 경우 무엇을 권하고 싶습니까? 그 트릭은 시스템 메모리 부담하에 영향을받는 영역을 버리는 것입니다. 물론 사용자 공간에있는 것은 할당하는 동안이 아니라 커널이 할당하려고 시도한 후에 만 ​​알릴 수 있습니다. –

    +0

    메모리에 저장하는 것을 허용하지만 물리적 장치의 데이터를 페이지 캐시에만 백업 (저장)하지 않는 특별한 가상 파일 시스템을 작성 (또는 검색) 할 수 있습니다. – osgx

    +0

    그와 같은 파일 시스템은 위에서 언급 한 디스크 캐시와 마찬가지로 커널에 있어야합니다. 그렇지 않습니다. 이 응용 프로그램 (userland app)의 경우 사용자 정의 파일 시스템은 약간 과장되었습니다. 그래도 도움과 아이디어를 가져 주셔서 감사합니다! –

    1

    저는 리눅스에서 그런 기능에 대해 들어 본 적이 없습니다.

    Linux에서는 언제든지 메모리를 스왑 아웃 할 수 있습니다. 파일 기반 메모리 맵인 경우 디스크에 쓸 수 있고 스와핑 대신에 해제 될 수 있습니다.

    당신이 얻을 수있는 가장 가까운 방법은 주기적으로 현재 메모리 사용량을 확인하고 캐시를 직접 해제하거나 신호 또는 파일 핸들을 보내주는 메모리 부족 알림 기능으로 패치 된 Linux 커널을 사용하는 것입니다 메모리 압력이 높을 때 발생하는 이벤트입니다.

    자원 통지기에 대한 제안이 기본 커널에 채택되지 않았다고해서 패치 된 커널이라고 말합니다. Here was one attempt.

    추적 이벤트가있는 최신 커널을 사용하면 메모리 부족 추적을 추적하여 그렇게 할 수 있습니다. 그것은 특히 다른 리눅스 커널 버전으로 이식 할 수는 없습니다.

    1

    링크 고마워요! 최대 ashmem_pin_region 코드를 발굴합니다.커널 부분 /kernel/msm.git›mm›ashmem.c 여기 http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-host.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=2&ct=rc&l=86

    그리고입니다 : http://cs736-android.pbworks.com/w/page/5834465/ASHMEMhttp://elinux.org/Android_Kernel_Features 그것을 : http://www.google.com/codesearch/p?hl=en#KMCRKdMbI4g/mm/ashmem.c&q=ASHMEM_PIN&exact_package=git://android.git.kernel.org/kernel/msm.git&sa=N&cd=1&ct=rc&l=463

    ASHMEM는 구글 확장 될 것으로 보인다 그것은 장치 http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-dev.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=1&ct=rc&l=76

    및 호스트 무 조작에 ioctl (ioctl(fd, ASHMEM_PIN, &pin);)입니다 메인 라인에 없습니다.

    2009 년 11 월 28 일 토요일 오후 9시 58 분에 Greg "KH"의 편지를 설명하고 처음 로거에서 푸시하려고했습니다. "Re : [Patch 0/2 ] 스테이징/안드로이드 픽스 "). 또한 구글 여름의 코드 프로젝트 제안서가 있습니다 : http://elinux.org/Mainline_Android_kernel_functionality (이 페이지는 구글의 안드로이드 패치와 리눅스에 대한 유용한 링크와 그렉 KH의 좋은 프레젠테이션을 가지고 있습니다.)

    +1

    그건 내가 두려워했던 것인데, 구글이 거기에 넣었 기 때문에 그 기능이 안드로이드에 존재했다. 그 정보를 찾아 주셔서 감사합니다! –

    +1

    ashmem-like 기능 : POSIX_FADV_VOLATILE http://lwn.net/Articles/468896/ (2011) – osgx

    +0

    그게 바로 내가 원하는 것입니다. 안타깝게도 3.13 버전에서는 메인 라인 커널에 포함되어 있지 않습니다. –

    관련 문제