中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux進程的內存管理舉例分析

發布時間:2021-11-23 14:40:05 來源:億速云 閱讀:160 作者:iii 欄目:大數據

這篇文章主要介紹“Linux進程的內存管理舉例分析”,在日常操作中,相信很多人在Linux進程的內存管理舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Linux進程的內存管理舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

幾個關鍵的數據結構

一個進程的虛擬地址空間主要由兩個數據結來描述,一個是 mm_struct,一個是 vm_area_structs。

  • mm_struct結構描述了一個進程的整個虛擬地址空間,vm_area_truct描述了虛擬地址空間的一個區間(簡稱虛擬區)。下圖就是我們所說的由task_struct到mm_struct,進程的地址空間的分布。

Linux進程的內存管理舉例分析

每一個進程都會有自己獨立的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;
}
 
  • 分配的每個虛擬內存區域都由一個vm_area_struct 數據結構來管理,包括虛擬內存的起始和結束地址,以及內存的訪問權限等,通常命名為vma;vm_area_struct 數據結構的定義如下:

Linux進程的內存管理舉例分析

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
};
   

小實驗

  • insmod test.ko pid_mem=3253 顯示各個vma區域

Linux進程的內存管理舉例分析

  • cat /proc/3253/maps 顯示各個vma區域     Linux進程的內存管理舉例分析

看下兩種方式的對比:Linux進程的內存管理舉例分析

到此,關于“Linux進程的內存管理舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武鸣县| 延安市| 舞阳县| 内丘县| 塔河县| 犍为县| 桐城市| 育儿| 天峻县| 海淀区| 习水县| 梁山县| 天津市| 台山市| 托克托县| 小金县| 兴化市| 上思县| 太保市| 昌图县| 永新县| 荔波县| 旺苍县| 稻城县| 凤庆县| 邛崃市| 乐山市| 贵溪市| 阿拉善左旗| 新平| 徐闻县| 大埔县| 抚松县| 江华| 浏阳市| 阜宁县| 富宁县| 营口市| 会理县| 翁牛特旗| 沾益县|