热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

进程如何管理和分配虚拟地址空间的?

分治思想内核通过mm_struct来描述一个进程的虚拟地址空间,按照不同的属性和功能对虚拟内存进行划分,划分为一个个VMA代码段.text数据段.databsslib库的代码段li

分治思想


内核通过mm_struct来描述一个进程的虚拟地址空间,按照不同的属性和功能对虚拟内存进行划分,划分为一个个VMA



  • 代码段.text

  • 数据段.data

  • bss

  • lib库的代码段

  • lib库的数据段

  • lib库的bss

  • 任何内存映射文件(有名mmap建立)

  • 任何共享内存段(匿名mmap建立)

  • 进程栈stack

  • 进程堆heap

    image

image

image

在linux系统上通过cat /proc/pid/maps命令查看虚拟内存结构:

image

每一列的含义分别为

image

实际的结构:



mm_struct

398 struct mm_struct {
399 struct vm_area_struct * mmap; /* list of VMAs */ //虚拟地址空间结构体,双向链表包含红黑树节点访问到不能访问的区域。
400 struct rb_root mm_rb; //红黑树的根节点
401 struct vm_area_struct * mmap_cache; /* last find_vma result */ //mmap的高速缓冲器,指的是mmap最后指向的一个虚拟地址区间
402 #ifdef CONFIG_MMU
403 unsigned long (*get_unmapped_area) (struct file *filp,
404 unsigned long addr, unsigned long len,
405 unsigned long pgoff, unsigned long flags);
406 void (*unmap_area) (struct mm_struct *mm, unsigned long addr);
407 #endif
408 unsigned long mmap_base; /* base of mmap area */ //mmap区域的基地址
409 unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */ //自底向上的配置
410 unsigned long task_size; /* size of task vm space */ //进程的虚拟地址空间大小
411 unsigned long cached_hole_size; /* if non-zero, the largest hole below free_area_cache */ //缓冲器的最大的大小
412 unsigned long free_area_cache; /* first hole of size cached_hole_size or larger */ //不受约束的空间大小
413 unsigned long highest_vm_end; /* highest vma end address */ //虚拟地址空间最大结尾地址
414 pgd_t * pgd; //页表的全局目录
415 atomic_t mm_users; /* How many users with user space? */ //有多少用户
416 atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */ //有多少用户引用mm_struct
417 atomic_long_t nr_ptes; /* Page table pages */ //页表
418 int map_count; /* number of VMAs */ //虚拟地址空间的个数
419
420 spinlock_t page_table_lock; /* Protects page tables and some counters */ //保护页表和用户
421 struct rw_semaphore mmap_sem; //读写信号
422
423 struct list_head mmlist; /* List of maybe swapped mm's. These are globally strung
424 * together off init_mm.mmlist, and are protected
425 * by mmlist_lock
426 */
427
428
429 unsigned long hiwater_rss; /* High-watermark of RSS usage */ //标志
430 unsigned long hiwater_vm; /* High-water virtual memory usage */
431
432 unsigned long total_vm; /* Total pages mapped */
433 unsigned long locked_vm; /* Pages that have PG_mlocked set */
434 unsigned long pinned_vm; /* Refcount permanently increased */
435 unsigned long shared_vm; /* Shared pages (files) */
436 unsigned long exec_vm; /* VM_EXEC & ~VM_WRITE */
437 unsigned long stack_vm; /* VM_GROWSUP/DOWN */
438 unsigned long def_flags;
439 unsigned long start_code, end_code, start_data, end_data; //开始代码段,结束代码。开始数据,结束数据
440 unsigned long start_brk, brk, start_stack; //堆的开始和结束。
441 unsigned long arg_start, arg_end, env_start, env_end; //参数的起始和结束,环境变量的起始和终点
442
443 unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */
...
};



vma

281 struct vm_area_struct {
282 /* The first cache line has the info for VMA tree walking. */ //第一个高速缓存行包含VMA树便利的信息
283
284 unsigned long vm_start; /* Our start address within vm_mm. */ //虚拟地址空间vm_mm起始地址
285 unsigned long vm_end; /* The first byte after our end address
286 within vm_mm. */ //在vm_mm中结束地址的第一个字节
287
288 /* linked list of VM areas per task, sorted by address */
289 struct vm_area_struct *vm_next, *vm_prev; //双向链表连接以便于遍历
290
E>291 struct rb_node vm_rb; //红黑树节点
292
293 /*
294 * Largest free memory gap in bytes to the left of this VMA. //VMA左边最大的可用内存缺口
295 * Either between this VMA and vma->vm_prev, or between one of the
296 * VMAs below us in the VMA rbtree and its ->vm_prev. This helps //要么在当前的VMA和vma的前一个,要么是在VMA红黑树和它的前 一个中的VMAs之间
297 * get_unmapped_area find a free area of the right size. //这样有助于get_unmapped_area找到合适的空闲区域
298 */
299 unsigned long rb_subtree_gap; //红黑树子树的缺口
300
301 /* Second cache line starts here. */
302
302
303 struct mm_struct *vm_mm; /* The address space we belong to. */ //进程拥有的地址空间
E>304 pgprot_t vm_page_prot; /* Access permissions of this VMA. */ //此VMA访问权限
305 unsigned long vm_flags; /* Flags, see mm.h. */ //标志
306
307 /*
308 * For areas with an address space and backing store,
309 * linkage into the address_space->i_mmap interval tree, or
310 * linkage of vma in the address_space->i_mmap_nonlinear list. //作为地址空间和后备存储区域,链接到间隔树或者链接到非线性链 表里的vma
311 */
312 union {
313 struct {
314 struct rb_node rb;
315 unsigned long rb_subtree_last;
316 } linear; //线性
317 struct list_head nonlinear; //链表非线性
318 } shared;
319
320 /*
321 * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
322 * list, after a COW of one of the file pages. A MAP_SHARED vma
323 * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack
324 * or brk vma (with NULL file) can only be in an anon_vma list. //MAP_SHARED只能 在i_mmap树。匿名的对象,栈或者堆只能存在链表 里
325 */
326 struct list_head anon_vma_chain; /* Serialized by mmap_sem &
327 * page_table_lock */
328 struct anon_vma *anon_vma; /* Serialized by page_table_lock */
329
330 /* Function pointers to deal with this struct. */
331 const struct vm_operations_struct *vm_ops; //虚拟内存
332
333 /* Information about our backing store: */
334 unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
335 units, *not* PAGE_CACHE_SIZE */
336 struct file * vm_file; /* File we map to (can be NULL). */ //指向的文件
337 void * vm_private_data; /* was vm_pte (shared mem) */
...
};

image

进程与线程



推荐阅读
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
平凡特产小店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有