CSAPP 숙제 문제를 하며 11.9 문제에서 기존에 사용한 mmap 대신 malloc을 사용하여 정적 컨텐츠를 처리하라고 되어있었다. mmap과 malloc을 사용하는 기준과 일반적으로 어떤 것이 많이 쓰이는지 궁금해졌다.
Tiny를 수정해서 정적 컨텐츠를 처리할 때 요청한 파일을 mmap과 rio_readn 대신에 malloc, rio)readn, rio_writen을 사용해서 연결 식별자에게 복사하도록 하시오.
| 방식 | 설명 | 복사 횟수 |
|---|---|---|
malloc + read + write | 파일을 힙에 복사 후 클라이언트에 전송 | 2회 복사 |
mmap + write | 파일을 메모리에 직접 매핑 후 전송 | 1회 복사 |
sendfile() | 커널이 파일에서 소켓으로 직접 전송 | 0회 복사 (zero-copy) |
malloc(size)은 힙(heap)에 메모리를 할당read() 시스템 콜을 통해 파일 내용을 복사 메모리 흐름:
mmap()은 파일을 가상 메모리 주소 공간에 직접 매핑read() 없이도 메모리에 바로 접근 가능write() 시 커널이 직접 페이지 캐시에서 전송메모리 흐름:
[디스크] → [커널 공간 (페이지 캐시)] → [소켓]
접근 시점에만 로딩됨 (page fault 기반 lazy load)
mmap보다도 빠름| 서버 | 사용 방식 |
|---|---|
| Nginx | sendfile() (sendfile on) |
| Apache 2.4 이후 | sendfile() 또는 mmap 설정 가능 |
nginx.conf

apache2.conf
명시적으로 지정 해야 함
| 상황 | 추천 방식 | 이유 |
|---|---|---|
| 파일이 작음 (<128KB) | malloc | 간단하고 빠름 |
| 파일이 큼 (>=128KB) | mmap | 복사 줄고 커널 캐시 이용 |
| 최고 성능 필요 | sendfile() | 완전한 zero-copy |
※ 기준이 128인 이유
MMAP_THRESHOLD (기본값 128KB)를 넘으면 내부적으로 mmap 사용malloc도 내부적으로 mmap을 사용작은 파일에서는 malloc이 더 효율적