UNIX 아이노드 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""UNIX 아이노드의 직접·간접 포인터로 담을 수 있는 최대 파일 크기 (Stallings 12.7절, FreeBSD).
블록 B바이트, 포인터 p바이트 -> 블록 하나에 포인터 B/p개."""
def capacity(B, p, direct=12):
n = B // p
return {"direct": direct * B, "single": n * B, "double": n ** 2 * B, "triple": n ** 3 * B}
if __name__ == "__main__":
KB, MB, GB = 2 ** 10, 2 ** 20, 2 ** 30
c = capacity(4 * KB, 8) # 포인터 512개
assert c == {"direct": 48 * KB, "single": 2 * MB, "double": 1 * GB, "triple": 512 * GB}
total = sum(c.values())
print("최대 크기", total / GB, "GB")
assert 512 * GB < total < 514 * GB
# 카드: 블록 1 KB, 포인터 4바이트, 직접 10개 -> 10K + 256K + 64M + 16G
c2 = capacity(1 * KB, 4, direct=10)
assert c2 == {"direct": 10 * KB, "single": 256 * KB, "double": 64 * MB, "triple": 16 * GB}
# 파일의 5,000번째 블록(0부터)은 어디서 찾나 (4KB, 포인터 512개, 직접 12개)
k = 5000
assert 12 + 512 <= k < 12 + 512 + 512 ** 2 # 이중 간접
# 사다리 문제 3: 블록 2 KB, 포인터 4바이트 -> 512개, 10 MB = 5,120블록 -> 이중 간접
n = 2048 // 4
assert n == 512 and 12 + n <= (10 * MB) // (2 * KB) < 12 + n + n ** 2
print("ALL CHECKS PASSED")