您好,登錄后才能下訂單哦!
這篇文章主要介紹“Linux進程的內存管理舉例分析”,在日常操作中,相信很多人在Linux進程的內存管理舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux進程的內存管理舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
一個進程的虛擬地址空間主要由兩個數據結來描述,一個是 mm_struct,一個是 vm_area_structs。
每一個進程都會有自己獨立的mm_struct,這樣每一個進程都會有自己獨立的地址空間,這樣才能互不干擾。當進程之間的地址空間被共享的時候,我們可以理解為這個時候是多個進程使用一份地址空間,這就是線程。
struct mm_struct
{
struct vm_area_struct *mmap; //指向虛擬區間(VMA)鏈表
struct rb_root mm_rb; //指向red_black樹
struct vm_area_struct *mmap_cache; //找到最近的虛擬區間
unsigned long(*get_unmapped_area)(struct file *filp,unsigned long addr,unsigned long len,unsigned long pgoof,unsigned long flags);
void (*unmap_area)(struct mm_struct *mm,unsigned long addr);
unsigned long mmap_base;
unsigned long task_size; //擁有該結構體的進程的虛擬地址空間的大小
unsigned long cached_hole_size;
unsigned long free_area_cache;
pgd_t *pgd; //指向頁全局目錄
atomic_t mm_users; //用戶空間中有多少用戶
atomic_t mm_count; //對"struct mm_struct"有多少引用
int map_count; //虛擬區間的個數
struct rw_semaphore mmap_sem;
spinlock_t page_table_lock; //保護任務頁表和mm->rss
struct list_head mmlist; //所有活動mm的鏈表
mm_counter_t _file_rss;
mm_counter_t _anon_rss;
unsigned long hiwter_rss;
unsigned long hiwater_vm;
unsigned long total_vm,locked_vm,shared_vm,exec_vm;
usingned long stack_vm,reserved_vm,def_flags,nr_ptes;
unsingned long start_code,end_code,start_data,end_data; //代碼段的開始start_code ,結束end_code,數據段的開始start_data,結束end_data
unsigned long start_brk,brk,start_stack; //start_brk和brk記錄有關堆的信息,start_brk是用戶虛擬地址空間初始化,brk是當前堆的結束地址,start_stack是棧的起始地址
unsigned long arg_start,arg_end,env_start,env_end; //參數段的開始arg_start,結束arg_end,環境段的開始env_start,結束env_end
unsigned long saved_auxv[AT_VECTOR_SIZE];
struct linux_binfmt *binfmt;
cpumask_t cpu_vm_mask;
mm_counter_t context;
unsigned int faultstamp;
unsigned int token_priority;
unsigned int last_interval;
unsigned long flags;
struct core_state *core_state;
}
struct vm_area_struct {
/* The first cache line has the info for VMA tree walking.
第一個緩存行具有VMA樹移動的信息*/
unsigned long vm_start; /* Our start address within vm_mm. */
unsigned long vm_end; /* The first byte after our end address within vm_mm. */
/* linked list of VM areas per task, sorted by address
每個任務的VM區域的鏈接列表,按地址排序*/
struct vm_area_struct *vm_next, *vm_prev;
struct rb_node vm_rb;
/*
此VMA左側最大的可用內存間隙(以字節為單位)。
在此VMA和vma-> vm_prev之間,
或者在VMA rbtree中我們下面的一個VMA與其->vm_prev之間。
這有助于get_unmapped_area找到合適大小的空閑區域。
*/
unsigned long rb_subtree_gap;
/* Second cache line starts here.
第二個緩存行從這里開始*/
struct mm_struct *vm_mm; /* 我們所屬的address space*/
pgprot_t vm_page_prot; /* 此VMA的訪問權限 */
unsigned long vm_flags; /* Flags, see mm.h. */
/*
對于具有地址空間(address apace)和后備存儲(backing store)的區域,
鏈接到address_space->i_mmap間隔樹,或者鏈接到address_space-> i_mmap_nonlinear列表中的vma。
*/
union {
struct {
struct rb_node rb;
unsigned long rb_subtree_last;
} linear;
struct list_head nonlinear;
} shared;
/*
在其中一個文件頁面的COW之后,文件的MAP_PRIVATE vma可以在i_mmap樹和anon_vma列表中。
MAP_SHARED vma只能位于i_mmap樹中。
匿名MAP_PRIVATE,堆棧或brk vma(帶有NULL文件)只能位于anon_vma列表中。
*/
struct list_head anon_vma_chain; /* Serialized by mmap_sem & * page_table_lock
由mmap_sem和* page_table_lock序列化*/
struct anon_vma *anon_vma; /* Serialized by page_table_lock 由page_table_lock序列化*/
/* 用于處理此結構體的函數指針 */
const struct vm_operations_struct *vm_ops;
/* 后備存儲(backing store)的信息: */
unsigned long vm_pgoff; /* 以PAGE_SIZE為單位的偏移量(在vm_file中),*不是* PAGE_CACHE_SIZE*/
struct file * vm_file; /* 我們映射到文件(可以為NULL)*/
void * vm_private_data; /* 是vm_pte(共享內存) */
#ifndef CONFIG_MMU
struct vm_region *vm_region; /* NOMMU映射區域 */
#endif
#ifdef CONFIG_NUMA
struct mempolicy *vm_policy; /* 針對VMA的NUMA政策 */
#endif
};
看下兩種方式的對比:
到此,關于“Linux進程的內存管理舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。