일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- NDK
- Android
- slab
- allocator
- 카프카
- Apache
- strex
- multiqueue
- slub
- blk-mq
- page
- vm_area_struct
- Linux
- Kernel
- mm_struct
- commit
- spinlock
- vmalloc
- Network
- fastpath
- memory
- buddy_system
- BLOCK
- lruvec
- kmalloc
- proc
- devicedriver
- pmap
- kafka
- slowpath
- Today
- Total
목록memory (10)
Art of Pr0gr4m
이번 포스트에서는 메모리 학습의 마무리로 메모리 뷰어 모듈 제작 실습을 진행한다. /proc//maps 을 읽으면 다음과 같이 프로세스의 메모리 매핑 정보를 볼 수 있다. 필드별로 할당 주소, 권한(모드), offset, 디바이스 ID, inode, 매핑 대상 or 타입을 보여준다. 이와 유사하게 인자로 전달받은 pid (인자가 없다면 1번 프로세스)의 메모리 사이즈 및 매핑 정보를 출력하는 예제를 작성한다. 1. 프로세스 메모리 뷰어 예제 소스 #include #include #include #include #include #include #include #include #ifndef find_task_by_pid #define find_task_by_pid(nr)pid_task(find_vpid(nr..
리눅스 커널은 메모리 부족시 reclaim에 LRU(Least Recently Used) 정책을 사용한다. 1. Basis 커널은 리스트를 이용하여 LRU를 구현한다. 커널 2.4엔 하나의 리스트를, 커널 2.6.28 이전엔 active_list와 inactive_list를, 그 이후엔 5개의 리스트를 사용했다. 또한, 커널 4.7까지는 리스트를 구조체 zone에서 관리했는데, 4.8부터는 구조체 pglist_data에서 관리한다. 5개의 리스트는 다음과 같다. pglist_data->__lruvec.lists[LRU_INACTIVE_ANON] pglist_data->__lruvec.lists[LRU_ACTIVE_ANON] pglist_data->__lruvec.lists[LRU_INACTIVE_FILE..
리눅스 시스템 프로그래밍 경험이 있다면 메모리 매핑은 꽤 익숙할 것이다. (만약 익숙치 않다면 꼭 다시 공부를 하기 바란다. 굉장히 중요하다.) 이번 포스트에선 커널이 메모리 매핑을 제공하기 위한 인터페이스를 살펴보고 예제를 작성해본다. 1. mmap interface mmap 오퍼레이션을 저장하기 위한 구조체는 다음과 같다. /* * These are the virtual MM functions - opening of an area, closing and * unmapping it (needed to keep files on disk up-to-date etc), pointer * to the functions called when a no-page or a wp-page exception occurs..
1. Slub Page 할당 저번 포스트의 Slow-path Slub Object 할당에서 new_slab_objects에서 buddy system으로부터 새로운 free object를 할당받는다고 하였다. new_slab_objects의 내부에서는 new_slab -> allocate_slab 함수를 호출하여 새로운 slab page를 할당받는다. static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) { struct page *page; struct kmem_cache_order_objects oo = s->oo; gfp_t alloc_gfp; void *start, *p, *next; int idx; bool sh..