Linux 进程地址空间

文章目录

  • 进程地址空间
  • 进程地址空间结构
  • 页表
  • 虚拟内存
  • 写时拷贝

进程地址空间

进程地址空间难以定义,因为它更像是一个中间件。

程序从磁盘中加载到内存,程序的执行需要硬件资源,所以每个程序启动时会创建至少一条进程,进程作为组织资源的数据结构,记录了本进程各方面硬件资源的占用情况,其中就包括内存的占用情况。每个进程都有一个进程地址空间,进程地址空间不是实际的一个物理内存可以理解为进程地址空间里全是指针/地址,进程地址空间里的地址通过一个名为页表的结构与实际存储数据的物理内存建立映射关系。 至于为什么这样设计,以及上述中一些名词的解释在后文中均有提到 。
在这里插入图片描述

进程地址空间结构

在这里插入图片描述

  1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
  3. 数据段/静态区 :存放全局变量静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体、类成员函数和全局函数 的二进制代码 、 存放常量。

页表

  1. 页表的结构: 一个键值对形式的表,类似于一些数据库那样的KEY=VALUE结构的表,一遍记录进程地址空间的地址,另一边记录与该地址实际对应的物理内存空间。

  2. 在上述功能的基础上,页表还记录了每个进程地址的访问权限(这里的权限指读/写等权限),通过这些权限属性的记录,一方面实现了各种数据的属性,另一方保护了物理内存不被非法访问。

  3. 页表与进程地址空间都是每个进程独自有一份,进程被启动时,先创建PCB的实例task_struct, 再生成进程地址空间与页表 (进程地址空间是task_struct结构体的一个成员)

  4. 页表和虚拟地址空间都由OS(操作系统管理),所以虚拟地址访问的物理存储的数据是否超出权限由OS结合页表和进程地址空间来判断,所以平时写代码时的数组越界会报警,数组越界访问本质是一种访问物理内存权限越界的问题,会被OS拦截。

  5. 页表不只可以将进程地址空间中的地址与物理内存建立映射关系,还可以将进程地址空间与磁盘(外存)中的存储数据建立映射关系

  6. 页表和进程地址空间都是由OS创建、管理

虚拟内存

虚拟内存是一种计算机内存管理技术。以上进程地址空间通过页表与内存或外存建立映射关系的结构,是Linux虚拟内存的实现 。

虚拟内存技术的优点总结:

  1. 物理内存/磁盘外存是一个硬件,本身是不具有识别功能的。设想,如果没有虚拟内存技术,访问数组越界部分的数据数据就不会被拦截,那么如果发生错误或有人恶意攻击,整个主机上的所有程序或进程都可能被非法访问/修改。
  2. 从进程视角来看,它只能看到自己,或者说它认为自己占据所有的内存资源,所以它可以自由的动态开辟地址连续的空间(这里的地址连续只是在进程看来,实际物理空间不一定连续),再将开辟的空间映射到物理内存中。
  3. 支持了写时拷贝功能
  4. 扩大可用内存空间:虚拟内存可以将磁盘空间作为扩展内存使用,从而扩大了可用内存空间。这样,即使物理内存不足,也可以运行更多的程序。(因为页表可以映射外存)
  5. 提高程序运行效:虚拟内存可以将不常用的内存数据暂时存储到磁盘上,从而释放物理内存空间(这里说的磁盘就是C盘,所以C盘太满会卡,不过当今内存都很大,即使C盘满一点也不会有太大的影响),让更常用的数据可以被加载到内存中,提高程序的运行效率。(由于页表的存在,在进程视角,内存中分配的空间是有序的)(有些分配了内存也不会立刻使用,虚拟内存的存在就提高了实际内存的使用效率)

缺点:
物理结构上不是连续的,是随机的,所以CPU在内存中读取的时候,目标数据附近的数据不一定是下一个目标的数据,需要多次重新读取内存中的目标数据,操作损害高,会导致性能下降。

写时拷贝

在这里插入图片描述

写时拷贝(Copy-on-write,简称COW)是一种内存管理技术,它允许多个进程共享同一块内存,但只有在进程试图修改该内存时才会进行实际的拷贝操作。这种技术可以减少内存的使用量,提高系统的性能。

在写时拷贝的实现中,当一个进程试图修改共享内存中的某个数据时,操作系统会先检查该内存块是否已经被其他进程共享。如果是,则操作系统会为该进程分配一块新的内存,将原始内存块中需要修改的数据拷贝到新的内存块中,然后让该进程修改新的内存块。其他进程仍然共享原始内存块,直到它们也试图修改该内存块中的数据。

一些碎碎念:

堆是堆,栈是栈,堆栈是堆。

程序奔溃就是进程退出,操作系统结束了进程。

本文以前写过,现在重写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/253263.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpaceSight、Echo 联合升级,打造更懂场景的 AI 「超级门店」

当各领域都在谈论「增长」,门店业务的增长又该从哪里开始着手…… 在日常运营中,「高效」和「细致」是否无法同时实现?「任务下达」和「任务执行」之间有多大偏差? 在客户洞察上,如何用「过去」的数据预测「未来」&…

11-30 SpringBoot2

热部署 开发过程中,修改代码,不需要重启,自动更新 项目上线,一定要关闭 SpringBoot热部署的实现?? ideal默认阻止class类更新 2.需要手动构建项目,可以使用快捷键激活此功能ctrl F9 / build project 自动构建项目 允许程序运行…

【Proteus】绘制简单的电路图

参考书籍:微机原理与接口技术——基于8086和Proteus仿真(第3版)(作者:顾晖等),p111 1.放置元件 以8086为例: 确保处于元件模式,点击对应的按钮: 在元件库中…

Spring Boot 项目的创建、配置文件、日志

文章目录 Spring Boot 优点创建 Spring Boot 项目创建项目认识目录网页创建(了解) 约定大于配置Spring Boot 配置文件配置文件格式读取配置项properties 配置文件yml 配置文件基本语法进阶语法配置对象配置集合yml 设置不同环境的配置文件 Spring Boot 日…

http和https的区别有哪些

目录 HTTP(HyperText Transfer Protocol) HTTPS(HyperText Transfer Protocol Secure) 区别与优势 应用场景 未来趋势 当我们浏览互联网时,我们经常听到两个常用的协议:HTTP(HyperText Tra…

MySQL Server 层和引擎层是如何交互的

Server 层、引擎层、BufferPool、磁盘间的关系 大体来说, MySQL可以分为Server层和存储引擎层两部分。 1)Server 层:Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所…

springboot 整合 Spring Security+JWT 实现token 认证和校验

1.大概是这个样子 JWT 是什么? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明…

【3DMAX教程插件】3dMax涡轮样条线动画插件安装使用方法教程

3dMax涡轮样条线动画插件是一个3dMax脚本,用于以惊人的速度创建多个样条线包裹动画(也称为路径变形动画)。 制作生长的样条线、动画电缆、电线、绳索、缎带、光迹、移动的触手、树枝、蠕虫等。 【主要功能特点】 -只需单击几下即可创建、编…

一网打尽损失函数和正则化的关系,在损失函数中加入正则化有什么用,如何加入,这里为大家用通俗易懂的例子进行详细解释!(系列1)

文章目录 一、BP神经网络预测中,常见的损失函数是均方误差损失函数MSE二、L2正则化的公式如下:三、 结合MSE和L2正则化的总损失函数公式如下:总结 一、BP神经网络预测中,常见的损失函数是均方误差损失函数MSE 在BP神经网络预测中…

大话数据结构-查找-平衡二叉树

注:本文同步发布于稀土掘金。 6 平衡二叉树(AVL树) 在进行二叉排序树的构造时,我们可能会因为根结点的选择,构造出不同的二叉树,如下所示,对于同一个数组,可以因根结点的不同&#…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok,在上篇文章中我们讲了在Spring cloud中使用Zuul网关,这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话,本篇博客就是配置子模块,或者说是微服务,然后将微服务正式启动之前…

安全测试工具,自动发现网站所有URL!

作为一个安全测试人员来说,首先要拿到网站所有url,然后根据拿到的url进行渗透测试进行漏洞挖掘。本文给大家介绍的是如何拿到一个网站所有的url。 深度爬取层级控制 现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很…