malloc 동안 커널에서 무슨 일이 일어나나요?
인터뷰 중에 이런 질문을 받았어요.사용자가 4바이트의 메모리를 할당하기 위해 malloc(4)를 호출했을 때 운영체제(Linux)는 어떻게 응답합니까?이 시스템 호출에 응답하는 서브시스템은 무엇입니까?
malloc()는 메모리 관리 서브시스템에 의해 처리된다고 말했습니다.malloc() 실장은 사용 가능한 메모리(물리 메모리)의 리스트를 조사하여 프리 리스트라고 부르고 4바이트 이상의 적절한 청크를 찾습니다.이러한 청크가 발견되면 빈 목록에서 삭제되고 사용된 목록에 추가됩니다.그런 다음 해당 물리적 메모리가 프로세스 힙 vma 구조에 매핑됩니다.그는 이 대답에 그다지 만족하지 않는 것 같았다.버디 시스템은 어떻게 여기에 적합합니까?어떤 도움이라도 주시면 감사하겠습니다.
사용자 공간 응용 프로그램이 호출할 때malloc()
, 그 콜은 커널에 실장되어 있지 않습니다.대신 라이브러리 콜(실장된 glibc 등)입니다.
요약하자면,malloc
glibc에서의 실장 또는 메모리 취득 중 하나brk()
/sbrk()
시스템 콜 또는 익명 메모리mmap()
이것에 의해, glibc는 (가상 메모리주소에 관한) 큰 연속 메모리 청크를 얻을 수 있게 됩니다.이것에 의해, Glibc는malloc
더 작은 덩어리로 슬라이스 및 다이스를 구현하여 애플리케이션에 배포합니다.
여기 작은 게 있어요malloc
많은 링크와 함께 아이디어를 얻을 수 있는 구현입니다.
물리 메모리는 아직 아무것도 신경 쓰지 않습니다.프로세스 데이터 세그먼트가 변경되었을 때 커널 가상 메모리시스템에 의해 처리됩니다.brk()
/sbrk()
또는mmap()
(메모리에 대한 읽기 또는 쓰기를 통해) 및 메모리가 참조되는 경우.
요약:
malloc()
는 관리 대상 메모리를 검색하여 할당 요건을 충족하는 미사용 메모리가 있는지 확인합니다.- 그게 안 되면
malloc()
프로세스 데이터 세그먼트의 확장을 시도합니다(을 통해).sbrk()
/brk()
또는 경우에 따라서는mmap()
).sbrk()
커널에 도달합니다. - 그
brk()
/sbrk()
커널 내의 콜은 이 콜의 일부 오프셋을 조정합니다.struct mm_struct
프로세스 데이터 세그먼트가 커집니다.처음에 데이터 세그먼트를 확장하면 추가 가상 주소에 매핑되는 물리적 메모리는 없습니다. - 않은 터치되었을 때('읽기/와 '읽기/쓰기'를 합니다(', '읽기/쓰기').
malloc
실장) 장애 핸들러가 기동해, 커널에 트랩 다운 해, 커널이 매핑 해제 메모리에 물리 메모리를 할당합니다.
malloc
는 물리 메모리를 직접 처리하지 않습니다.페이지화된 가상 메모리를 다루고 있습니다.다만, 모든 아키텍처에 해당하는지는 잘 모르겠습니다.
프로그램이 메모리를 할당하려고 할 때 빈 목록에 요청된 크기 이상의 청크가 없으면 새 페이지 전체가 할당됩니다.페이지 크기는 아키텍처에 따라 달라집니다(x86의 경우 4096바이트).수 입니다.따라서 할당은 커널만이 수행할 수 있습니다.따라서malloc
콜이 시스템콜의 원인이 될 수 있습니다.되어 프리리스트에 됩니다.malloc
는 구현에 따라 빈 목록을 조작합니다(예를 들어 glibc 체크).
언급URL : https://stackoverflow.com/questions/5716100/what-happens-in-the-kernel-during-malloc
'programing' 카테고리의 다른 글
크로스 플랫폼 소켓 (0) | 2022.08.23 |
---|---|
Vuetify 텍스트 필드에서 레이블의 위첨자를 지정하는 방법 (0) | 2022.08.23 |
vue.js의 v-model에서 3진 연산자를 올바르게 적용하는 방법 (0) | 2022.08.23 |
Spring @ (0) | 2022.08.23 |
UInt8과 uint8_t의 차이점은 무엇입니까? (0) | 2022.08.23 |