나는 공유 메모리 개체를 생성하고 이를 사용하여 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입니다.
이 동작에 의존하는 것은 그리 편리하지 않습니다.