进程地址空间

内核除了管理本身的内存外,还要管理进程的地址空间--系统中用户空间进程看到的内存。Linux操作系统采用虚拟地址方式,所有进程采用虚拟方式访问内存。即使一个单独的进程,拥有的地址空间远远大于系统物理内存。进程的地址空间由每个线性地址区域组成。每个进程都有唯一的地址空间,互不干涉。两个不同的进程在各自的地址空间存放数据。当然,进程之间可以共享数据,我们称之为线程。内存地址是一个给定的值,他在地址空间范围之内。进程只能访问有效范围的地址。

内存描述符:内核使用内存描述符结构体表示进程的地址空间,该结构描述了和进程地址空间有关的全部信息。内存描述符由mm_struct结构体表示,定义在文件<linux/sched.h>。mm_users域记录使用当前地址空间的进程数目。

mmap和mm_rb两个数据结构描述的对象是相同的:地址空间内所有内存。但是mmap是以链表的方式存放,mm_rb是以红黑树的形式存放。红黑树是一种二叉树,其时间复杂度为O(logn)。内核会选一种一种数据结构存放数据。mmap结构体作为链表结构体简单,便于查找,删除,遍历数据。而mm_rb结构体作为红黑树适合搜索指定元素。

分配内存描述符:mm_域存放着该进程使用的内存描述符。每个进程都有唯一的mm_struct结构体,即唯一的进程地址空间。当父进程和子进程共享地址空间时,我们称这样的进程为线程。是否共享内存空间,是判断进程和linux线程的唯一区别。对linux内核来讲,并不区分进程线程,线程对系统来讲仅仅是内存地址空间资源共享的进程而已。

销毁内存描述符:当进程退出时,调用exit_mm()函数。

mm_struct结构体和内核线程:内核线程没有内存地址空间,也没有内存描述符,所以线程相对的进程没有mm域,即mm域为空。其实这也是内核线程的真实意义,没有上下文用户。即便没有了内存地址空间,没有内存描述符,但内核线程访问内核时还是需要一些数据的,如页表。当一个内核线程被调度时,内核发现他的mm域为空,则自动保存前一个进程的地址空间。如果需要,进程便会使用前一个进程的页表。

内存区域:内存区域由VM_area_struct结构体描述,定义在<linux/mm.h>文件中。内存区域在内核中也经常被称为虚拟地址区域或者VMA。每个内存描述符都对应一个内存描述空间,vm_start对应内存空间的起始,vm_end对应内存空间的尾,(属于内存区间外),vm_start-end_end 就是内存空间的大小。

VMA标志:是一种位标志,包含在vm_flag域内,标志了内存区域的所包含的页面行为和信息。VM_READ,VM_WRITE,VM_EXEC标志了页面的读,写,可执行。

内存区域的树形结构和链表结构:通过内存描述符中的mmap和mm_rb域之一访问内存,其实他们包含相同的vm_area_struct结构体,只是组织方式不同。

mmap使用链表连接所有内存对象。vm_area_struct结构体通过vm_next连入链表。mmap域指向第一个内存区域,链中最后一个结构体VM指向空。

mm_rb使用红黑树连接所有的内存对象。红黑树的所有节点都尊崇:左边节点值小于右边节点值;每个节点都被分配为红色或者黑色。分配的规则:根节点为红色,红节点的子节点为黑色。并且树中的任何一条节点到叶子节点的路径包含相同数目的黑节点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值