일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 카프카
- devicedriver
- memory
- pmap
- proc
- commit
- Android
- mm_struct
- slowpath
- multiqueue
- buddy_system
- strex
- fastpath
- blk-mq
- slub
- vm_area_struct
- allocator
- kafka
- Apache
- page
- Kernel
- BLOCK
- NDK
- vmalloc
- slab
- Linux
- spinlock
- kmalloc
- Network
- lruvec
- Today
- Total
목록Kernel (29)
Art of Pr0gr4m
이번 포스트에서는 리눅스 커널의 메모리 할당 정책 중 버디 시스템에 대해 알아본다. 1. Basic Concept 이 전 NUMA와 Memory Zone 포스트에서 NUMA 노드마다 Zone들이 있고, Zone에는 free_area 배열이 있는 것을 보았다. Buddy System은 이 free_area를 이용하여 Zone 별로 구현한다. Buddy System은 메모리를 페이지 단위의 2의 승수로 나눠서 메모리 할당과 반환을 수행한다. free_area[0]은 전체 메모리를 4K(1 페이지)로 나눈 목록을 관리한다. free_area[1]은 마찬가지로 8K(2 페이지)로 나눈 목록을 관리하며, 마지막 원소인 free_area[MAX_ORDER - 1]은 4K * 2^(MAX_ORDER - 1)의 사이즈..
NUMA는 Non-Uniform Memory Access의 약자로, 멀티 프로세서 시스템에서 메모리에 접근하는 시간이 메모리와 프로세서간의 상대적 위치에 따라 달라지는 메모리 설계 방법이다. CPU의 속도가 메모리 접근 시간에 비해 월등히 빠르기 때문에, 자연스레 data starvation 현상이 나타난다. NUMA는 시스템 상의 모든 CPU가 같은 메모리에 접근하는 대신, 각 CPU별로 접근할 수 있는 메모리 영역을 나누어 자신이 이용할 수 있는 메모리 공간에 대해서 다른 CPU의 메모리 접근에 관계없이 빠르게 접근하여 이를 개선한다. NUMA의 concept에 대한 더 자세한 내용은 다음 링크들을 참고하고, 이번 포스트에서는 리눅스에서 NUMA를 어떻게 구현하고 있는지 알아본다. https://ko..
이번 포스트에서는 커널의 memory allocator 에 대해 알아본다. 1. Page Allocator 다음은 page allocator를 이용하여 페이지 단위로 메모리를 할당하는 API들이다. static inline void *page_address(const struct page *page); static inline void set_page_address(struct page *page, void *address); static inline struct page * alloc_pages(gfp_t gfp_mask, unsigned int order); #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0) unsigned long __get_free_p..
이번 포스트에서는 메모리 할당 정책의 기반이 되는 메모리 존에 대해서 알아본다. 1. Memory Zone 리눅스 커널은 물리 메모리의 주소 영역을 나눠 Zone으로 관리한다. Zone 타입은 다음과 같다. enum zone_type { /* * ZONE_DMA and ZONE_DMA32 are used when there are peripherals not able * to DMA to all of the addressable memory (ZONE_NORMAL). * On architectures where this area covers the whole 32 bit address * space ZONE_DMA32 is used. ZONE_DMA is left for the ones with smal..