공유 메모리 개체를 사용하여 ftruncate가 메모리를 사용하지 않는 이유는 무엇입니까?

공유 메모리 개체를 사용하여 ftruncate가 메모리를 사용하지 않는 이유는 무엇입니까?

나는 공유 메모리 개체를 생성하고 이를 사용하여 ftruncate시스템의 리소스 제한에 관계없이 겉으로 보기에 어떤 크기라도 제공할 수 있다는 것을 발견했습니다. 아래 코드는 크기를 262TB로 설정하고 stat()해당 크기를 보고합니다. 그러나 262TB는 내가 /dev/shm설치한 것보다 크며 내 시스템에는 262TB의 메모리나 스왑을 사용할 수 없습니다. OOM 오류가 발생할 것으로 예상했지만 시스템 메모리 사용량에는 큰 변화가 없었습니다.

여기서 무슨 일이 일어나고 있는 걸까요? ftruncate시스템 리소스 제한을 초과하는 크기가 성공하는 이유는 무엇 입니까? ftruncate공유 메모리 개체(또는 더 일반적으로는 tmpfs) 사이에 특별한 상호 작용이 있다고 가정합니다 .

import os
import _posixshmem
try:
    fd = _posixshmem.shm_open("test", os.O_CREAT | os.O_EXCL | os.O_RDWR, mode=0o600)
    os.ftruncate(fd, 52428800 * 5000000)
    print(os.stat(fd))
finally:
    _posixshmem.shm_unlink("test")
os.stat_result(st_mode=33152, st_ino=244, st_dev=24, st_nlink=1, st_uid=1000, st_gid=100, st_size=262144000000000, st_atime=1693167355, st_mtime=1693167355, st_ctime=1693167355)

답변1

시스템 ftruncate호출이 변경되었습니다.길이파일 크기가 아니라 파일 크기입니다. ls -s전후의 파일에 대해 ftruncate를 사용 하면 실제 크기가 변경되지 않은 것을 볼 수 있습니다.

당신이 하는 일은 구멍이 있는 파일을 만드는 것 뿐입니다. 홀은 블록(또는 이 경우 메모리 페이지)이 할당되지 않은 할당되지 않은 공간입니다. 이 상태의 파일 또는 공유 메모리 세그먼트를 사용하면 홀에서 읽을 수 있지만(모두 0을 얻을 수 있음) 쓰기 전까지 페이지는 실제로 할당되지 않습니다.

물론, 이 모든 페이지에 쓰려고 하면 시스템 메모리가 부족해 충돌이 발생할 수 있습니다.

답변2

해당 메모리에 무언가가 기록될 때까지 물리적 메모리가 필요하지 않습니다. 따라서 귀하의 행동이 통계에 나타날 필요는 없습니다.

더 정확하게 말하면 모든 페이지를 아직 사용되지 않은 것으로 표시하려면 약간의 메모리가 필요할 수 있지만 1. 이는 통계에 표시되지 않을 수 있습니다. 2. 대신 마지막 페이지의 페이지 수가 기록되는 경우(페이지의 페이지 수) ), 이 상황 파일을 피할 수 있습니다.) 당신이 사용한 것은 ... 음, 0입니다.

이 동작에 의존하는 것은 그리 편리하지 않습니다.

관련 정보