Linux 进程地址空间

news2025/1/22 19:39:57

文章目录

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

进程地址空间

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

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

进程地址空间结构

在这里插入图片描述

  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.coloradmin.cn/o/1290042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[NAND Flash 2.3] 闪存芯片国产进程

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 目录 前言1 闪存介质1.1 NOR 闪存国产技术发展1.2 NAND 闪存国产技术 2 闪存国产厂商与产品2.1 NOR FLASH 国产厂商与产品2.2 NAND FA…

http和https的区别有哪些

目录 HTTP&#xff08;HyperText Transfer Protocol&#xff09; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09; 区别与优势 应用场景 未来趋势 当我们浏览互联网时&#xff0c;我们经常听到两个常用的协议&#xff1a;HTTP&#xff08;HyperText Tra…

AI有多恐怖?

恐怖片大行其道之季到了。世界各地的人们纷纷观看恐怖片&#xff0c;前往鬼屋等进行自我吓唬式娱乐。受控的“妖魔鬼怪”可能很有趣&#xff0c;但无法控制的事情可能真的很恐怖。例如&#xff0c;对某些人而言&#xff0c;未来的不确定性可能是场噩梦。对其他人而言&#xff0…

Linux文件部分知识

目录 认识inode 如何理解创建一个空文件&#xff1f; 如何理解对文件写入信息&#xff1f; 如何理解删除一个文件&#xff1f; 为什么拷贝文件的时候很慢&#xff0c;而删除文件的时候很快&#xff1f; 如何理解目录 ​编辑 文件的三个时间 ​编辑 Access&#xff1a; …

InnoDB的数据存储结构

一 数据库的存储结构&#xff1a;页 索引结构提供了高效的检索方式&#xff0c;不过索引信息和数据记录都是保存在文件上的&#xff0c;确切的说是存储在页结构中。另一方面&#xff0c;索引是在引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入。…

前端编码中快速填充内容--乱数假文

写前端页面的时候&#xff0c;如果要快速插入图片&#xff0c;可以使用 https://picsum.photos/ 详见笔者这篇博文&#xff1a; 工具网站&#xff1a;随机生成图片的网站-CSDN博客 可是&#xff0c;如果要快速填充文字内容该怎么做呢&#xff1f; 以前&#xff0c;我们都是…

c# OpenCV安装(一)

一 通过NuGet 安装四个拓展包 OpenCvSharp4、OpenCvSharp4.Extensions、OpenCvSharp4.runtime.win、OpenCvSharp4.WpfExtensions C#使用OpenCV的一些代码 需要加头文件 using OpenCvSharp; //为了使用opencv using Point OpenCvSharp.Point; //为了确定我们使用的poin…

一对一聊天

1.创建包 .服务界面 package yiduiy;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.uti…

IOday4作业

使用两个子进程完成两个文件的拷贝&#xff0c;子进程1拷贝前一半内容&#xff0c;子进程2拷贝后一半内容&#xff0c;父进程用于回收两个子进程的资源 #include<myhead.h>int main(int argc, const char *argv[]) {int pid-1;int fd -1;int fa -1;int fb -1;//求出文…

ahk系列-windows超级运行框-表达式计算(4)—len计算字符串长度

1、环境准备 windows 7&#xff0c;8&#xff0c;10&#xff0c;11操作系统ahk 2.x_64位 2、使用方式 len 用于计算字符串长度&#xff0c;同时也可以计算 “ 剪切板 ” 数据长度 输入winR打开windows运行框 在运行框中输入&#xff1a;len 你好呀&#xff01;&#xff0…

书-用数组存储高于60低于70的人单独存起来

#include<stdio.h> # define N 10 //书-用数组存储高于60低于70的人单独存起来 int main(){float s[N]{68.2,62.3,63.4,34.5,45.6,56.7,67.8,78.9,89.0,100};int i;float diyu[100];int j0;for(i0;i<N;i){if(s[i]>60 && s[i]<70)diyu[j]s[i];//这里的范…

近期复习三

目录 nginx.conf文件介绍 一.文件共享功能 1.清空html目录下文件并新建你要共享的文件 2.修改nginx.conf文件&#xff0c;开启autoindex功能 3.测试 二.状态模块 1.修改nginx.conf文件 2.测试 &#xff08;1&#xff09;使用刚才定义的IP/nginx_status进行访问 &#…

c++新经典模板与泛型编程:const修饰符的移除与增加

const修饰符的移除 让你来写移除const修饰符&#xff0c;你会怎么样来写&#xff1f; &#x1f602;&#x1f602;trait类模板&#xff0c;如下 #include <iostream>// 泛化版本 template<typename T> struct RemoveConst {using type T; };// 特化版本 template…

学完就能涨薪5k的接口自动化测试框架pytest-多线程、多进程执行用例

有些项目的测试用例较多&#xff0c;测试用例时需要分布式执行&#xff0c;缩短运行时间。 pytest框架中提供可用于分布式执行测试用例的插件&#xff1a;pytest-parallel、pytest-xdist&#xff0c;接下来我们来学习这两个插件的使用方法。 pytest-parallel pytest-paralle…

绘制6层及以上PCB板,需要明白PCB板的结构和叠层

PCB主要由PP半固化片和core芯板压合而成&#xff0c;其中core芯板两面都有铜箔&#xff0c;是PCB板的导电介质&#xff1b;PP半固化片是绝缘材料&#xff0c;用于芯板的粘合。 在PP半固化片被层压后&#xff0c;其环氧树脂被挤压开来&#xff0c;将core芯板粘合在一起。 PCB的叠…

[NAND Flash 2.1] NAND Flash 闪存改变了现代生活

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​ 1989年NAND闪存面世了&#xff0c;它曾经且正在改变了我们的日常生活。 NAND 闪存发明之所以伟大&#xff0c;是因为&#xff0c…

抖音短视频账号矩阵系统开发新规则

一、抖音官方平台开发新规&#xff1a; 1.代发布管理应用api接口无法在做新的应用申请 仅针对企事业单位开放&#xff0c;目前要想开发新的抖音矩阵系统&#xff0c;就需要在原有的技术算法上进行新一步的调整。 能力介绍 网站应用开发者可以申请开通【代替用户发布内容到抖…

[NAND Flash 2.2] NAND闪存及控制器的市场趋势 [2023]

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 一、NAND闪存市场分析 据欧洲知名半导体分析机构Yole发布的报告显示&#xff0c;2020年起&#xff0c;NAND闪存市场发展趋势保持稳定…

Web漏洞分析-SQL注入XXE注入(下)

随着互联网的不断普及和Web应用的广泛应用&#xff0c;网络安全问题愈发引起广泛关注。在网络安全领域中&#xff0c;SQL注入和XXE注入是两个备受关注的话题&#xff0c;也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞&#xff0c;带您探寻背后的原…

@业务部门的,奉劝一句,赶紧掌握BI报表

趁着企业还在转型数字化&#xff0c;赶紧把BI报表掌握起来&#xff0c;以后BI大数据分析将是一个常用的企业级数据分析方向。掌握BI报表后&#xff0c;分析数据再也不用求人了。想分析什么数据&#xff0c;直接在BI平台上点击取数就是了&#xff0c;想怎么分析就怎么分析&#…