잃어버린 malloc()

15 hours ago 3

초기 Unix에는 선형 할당, 명시적 메모리 영역, 할당 위치 되돌리기 등 오늘날 아레나 방식과 닮은 메모리 관리 기법이 이미 존재했음 V4 커널의 malloc()과 mfree() 는 자원 맵을 인자로 받아 주기억장치와 디스크 스왑 공간을 같은 코드로 관리했으며, 해제할 때도 크기를 전달했음 V7과 V8에는 타입 기반 할당 매크로가 있었고, V8의 일부 매크로는 할당한 메모리를 기본적으로 0으로 초기화했지만 이런 방식이 모든 프로그램으로 확산되지는 않았음 C++의 new는 Simula에서 유래했으며, 할당과 초기화가 간편해지면서 동적 할당이 늘어 실제 프로그램에서 malloc()이 실행 시간의 50% 이상을 차지하는 병목도 발생했음 명시적 영역 인터페이스가 사라진 이유는 확정하기 어렵지만, 단순한 객체 수명과 하드웨어 제약 등이 가능한 이유이며, 초기 Unix에는 수동 메모리 관리를 줄이려는 가비지 컬렉션 API도 있었음 V4에서 시작하는 메모리 관리 탐사 초기 Unix 소스는 현대의 거대한 코드베이스에 비해 접근하기 쉬웠으며, 메모리 할당과 관리 방식의 변화를 직접 살펴볼 수 있음 Unix V4는 1973년 11월 출시됐고, 이때는 커널 대부분도 C로 작성돼 있었음 C는 전년도에 출시된 V2에 처음 등장했지만 당시에는 널리 사용되지 않았음 오늘날 POSIX 환경에서 접하는 Unix의 여러 요소가 V4에도 이미 있었음 완전히 소실된 것으로 여겨졌던 V4 테이프는 2025년 창고 정리 중 발견됨 컴파일러의 선형 할당 V4의 C 컴파일 과정은 하나의 거대한 프로그램이 아니라 여러 도구를 연결해 목적 파일을 만드는 구조였음 /usr/c/c20.c의 alloc()은 초기 최적화 도구로 보이는 코드에서 사용하는 선형 할당기임 요청 크기를 2바이트 경계에 맞추고, 공간이 부족하면 sbrk(2000)으로 힙을 확장함 확장 실패 시 오류를 출력하고 즉시 종료하므로 호출부마다 NULL을 검사하지 않음 sbrk()으로 영역을 확장해도 기존 포인터가 무효화되지 않음 할당한 데이터는 프로그램 종료까지 사용하므로 개별 해제를 하지 않음 현대의 아레나처럼 영역에 명시적인 이름을 붙이지는 않았지만, 영역 안에서 할당 위치를 전진시키는 기본 구조는 같음 자원 맵을 받던 malloc()과 mfree() V4의 Dennis 디렉터리에 있는 malloc.c는 malloc(mp, size)와 mfree(mp, size, aa) 를 구현함 두 함수...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵