网站加速器下载,网站建设环境软件有哪些,网站排名 影响因素,建站公司网站文章目录 进程地址空间进程地址空间结构页表虚拟内存写时拷贝 进程地址空间
进程地址空间难以定义#xff0c;因为它更像是一个中间件。
程序从磁盘中加载到内存#xff0c;程序的执行需要硬件资源#xff0c;所以每个程序启动时会创建至少一条进程#xff0c;进程作为组… 文章目录 进程地址空间进程地址空间结构页表虚拟内存写时拷贝 进程地址空间
进程地址空间难以定义因为它更像是一个中间件。
程序从磁盘中加载到内存程序的执行需要硬件资源所以每个程序启动时会创建至少一条进程进程作为组织资源的数据结构记录了本进程各方面硬件资源的占用情况其中就包括内存的占用情况。每个进程都有一个进程地址空间进程地址空间不是实际的一个物理内存可以理解为进程地址空间里全是指针/地址进程地址空间里的地址通过一个名为页表的结构与实际存储数据的物理内存建立映射关系。 至于为什么这样设计以及上述中一些名词的解释在后文中均有提到 。
进程地址空间结构 栈区stack在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区heap一般由程序员分配释放 若程序员不释放程序结束时可能由OS回收 。分配方式类似于链表。数据段/静态区 存放全局变量、静态数据。程序结束后由系统释放。代码段存放函数体、类成员函数和全局函数 的二进制代码 、 存放常量。
页表 页表的结构 一个键值对形式的表类似于一些数据库那样的KEYVALUE结构的表一遍记录进程地址空间的地址另一边记录与该地址实际对应的物理内存空间。 在上述功能的基础上页表还记录了每个进程地址的访问权限(这里的权限指读/写等权限)通过这些权限属性的记录一方面实现了各种数据的属性另一方保护了物理内存不被非法访问。 页表与进程地址空间都是每个进程独自有一份进程被启动时先创建PCB的实例task_struct, 再生成进程地址空间与页表 (进程地址空间是task_struct结构体的一个成员) 页表和虚拟地址空间都由OS(操作系统管理)所以虚拟地址访问的物理存储的数据是否超出权限由OS结合页表和进程地址空间来判断所以平时写代码时的数组越界会报警数组越界访问本质是一种访问物理内存权限越界的问题会被OS拦截。 页表不只可以将进程地址空间中的地址与物理内存建立映射关系还可以将进程地址空间与磁盘外存中的存储数据建立映射关系 页表和进程地址空间都是由OS创建、管理
虚拟内存
虚拟内存是一种计算机内存管理技术。以上进程地址空间通过页表与内存或外存建立映射关系的结构是Linux虚拟内存的实现 。
虚拟内存技术的优点总结
物理内存/磁盘外存是一个硬件本身是不具有识别功能的。设想如果没有虚拟内存技术访问数组越界部分的数据数据就不会被拦截那么如果发生错误或有人恶意攻击整个主机上的所有程序或进程都可能被非法访问/修改。从进程视角来看它只能看到自己或者说它认为自己占据所有的内存资源所以它可以自由的动态开辟地址连续的空间(这里的地址连续只是在进程看来实际物理空间不一定连续)再将开辟的空间映射到物理内存中。支持了写时拷贝功能扩大可用内存空间虚拟内存可以将磁盘空间作为扩展内存使用从而扩大了可用内存空间。这样即使物理内存不足也可以运行更多的程序。因为页表可以映射外存提高程序运行效虚拟内存可以将不常用的内存数据暂时存储到磁盘上从而释放物理内存空间(这里说的磁盘就是C盘所以C盘太满会卡不过当今内存都很大即使C盘满一点也不会有太大的影响)让更常用的数据可以被加载到内存中提高程序的运行效率。(由于页表的存在在进程视角内存中分配的空间是有序的)有些分配了内存也不会立刻使用虚拟内存的存在就提高了实际内存的使用效率
缺点 物理结构上不是连续的是随机的所以CPU在内存中读取的时候,目标数据附近的数据不一定是下一个目标的数据需要多次重新读取内存中的目标数据操作损害高会导致性能下降。
写时拷贝 写时拷贝Copy-on-write简称COW是一种内存管理技术它允许多个进程共享同一块内存但只有在进程试图修改该内存时才会进行实际的拷贝操作。这种技术可以减少内存的使用量提高系统的性能。
在写时拷贝的实现中当一个进程试图修改共享内存中的某个数据时操作系统会先检查该内存块是否已经被其他进程共享。如果是则操作系统会为该进程分配一块新的内存将原始内存块中需要修改的数据拷贝到新的内存块中然后让该进程修改新的内存块。其他进程仍然共享原始内存块直到它们也试图修改该内存块中的数据。
一些碎碎念
堆是堆栈是栈堆栈是堆。
程序奔溃就是进程退出操作系统结束了进程。
本文以前写过现在重写。