首页 > 系统相关 >linux:进程地址空间

linux:进程地址空间

时间:2024-06-02 15:56:13浏览次数:27  
标签:映射 空间 地址 内存 linux 进程 页表

   在之前使用C语言中,我们知道使用malloc函数可以开辟一块堆空间,然后这块堆空间如果不用的话是需要释放的,然后一般的变量是放在栈区上面的,还有一些静态区,代码段是存放静态变量和代码的,这些空间可以说是内存,但他又不是真正意义上的物理内存,我们可以做一个实验,我们可以使用fork函数生成一个子进程,然后子进程继承父进程的一个变量,子进程修改这个变量的内容,然后打印这个变量的值和他的地址,结果我们会惊讶的发现,他们显示的地址竟然是一样的,但是变量去不一样,如图:

    由图我们可以推断出,他们用的地址肯定不是相同的地址,因为他们一样的地址中的值却不一样,因此,他们所使用的空间并不是同一块空间,他们使用的地址并不是真正的存放于物理内存芯片上的物理地址,而是虚拟地址,这个地址是软件意义上的地址,而且每一个进程,这个地址是独一份的,与PCB进程控制块相似,他们这个地址的编码的起始和结束都存放于每一个进程的PCB进程控制块中,而这个地址空间的大小是根据真实计算机的内存大小进行映射,形成一个虚拟的地址空间,然后将这个地址空间进行分割,便就有了堆空间和栈空间,对于一般的32位计算机来讲,如果按字节编址,则这个地址空间的大小为4 GB.

  其实这个虚拟的进程地址空间是通过页表来管理的,页表将物理内存与虚拟内存进行一一对应,便形成了一个虚拟的进程地址空间,因为被映射出来的虚表是虚拟的空间地址,因此为了方便可以进行线性编址,因此进程地址空间又被称为线性地址空间,每个进程都有自己独有的进程地址空间与自己独有的映射页表,所以整个物理内存的不同分段可以由多个页表进行映射。
进程地址空间的虚拟化映射有以下几个优点:

1.因为物理内存的访问由页表控制,因此并不会出现进程之间的内存越界访问,比如在C语言中,如对野指针控制针进行越界访问,并不会出现影响别的进程,或者说影直接影响操作系统的情况,页表首先就会阻拦这类似的违规访问,这也变相的维护了系统安全.

2.当一个父进程使用fork创建一个子进程后,父子进程共享部分代码,且子进程将父进程的地址空间与页表复制一份,但他们的页表还是使用的同一块物理地址,当子进程或父进程任意一方改变他们共有的变量时,操作系统会对修改他们共有变量的一方所在的页表与物理地址修改映射关系,在另一块空的物理空间上添加一个修改后的值,来使修改后的子进程不影响父进程原先的值,这样就实现了父子进程的独立性,这样的方法也被叫做写时拷贝.

3.还有最后一个优点就是可以让进程以统一的视角来看待进程对应的代码数据,各个区域方便编译器统一的对各个数据来进行编译,因为当一个进程被编译好放在磁盘中时,编译器会对里面所有的数据进行编址,此时也会有一个地址空间,这个地址空间被叫做逻辑地址空间,当一个可执行程序被加载到内存时,这个逻辑地址空间也会被加在内存中。此时,这个可执行程序的所有数据会有物理地址和逻辑地址两套地址,当CPU从可执行程序的,Main函数开始执行时,此时页表已经构建好了Main函数的虚拟地址与物理地址之间的映射,CPU直接使用main函数的虚拟地址开始执行主函数的指令,当调用到一个函数时,页表会通过这个函数的逻辑地址生成虚拟地址与物理地址的映射关系,然后CPU直接使用这个虚拟地址就可以调用到要使用的这个函数了,从始至终CPU都没有使用到物理内存的真实地址,这样就让编译器编译一个程序时,只需要考虑正在编译这一个程序时的地址空间分布而不需要考虑别的,这更加提高了代码的编译效率

标签:映射,空间,地址,内存,linux,进程,页表
From: https://www.cnblogs.com/qjwxlj/p/18227208

相关文章

  • linux:环境变量
    说到环境变量,相信这个词不是第一次听到了,在WINDOWS中可能在安装JAVA的过程中也会遇到有配置系统环境变量的相关操作我们知道在一个操作系统中存在着大量的数据信息,但是我们可以在命令行中输入一条命令,能准确的从计算机中的某个位置找到,并且执行对应命令的进程,计算机的命令行为什么......
  • 【Linux】System V 共享内存
    一、共享内存1.1共享内存的原理:       两个进程,操作系统在内存空间中创建一个共享内存。在之前学习库的时候,有一个共享库的概念。我们可以按照其概念来了解共享内存的概念:将共享内存映射到页表中,和进程的地址空间建立联系。我们可以将共享内存的虚拟地址交给用户。两......
  • linux:进程状态
    往往计算机的cpu只有一个,一个cpu有多个核心,一个cpu在同一时间只能被一个进程占用,又因为计算机的cpu数量总是少于进程数的,因此cpu是通过时钟轮片的方式处理每个进程的任务, 这些进程并不是凌乱的放在操作系统中的,他们是被一个数据结构有组织,有规律的管理起来的,所以一个进......
  • Nginx 实战-04-nginx 不同的地址访问不同的服务
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对nginx原理感兴趣,可以阅读:从零......
  • Linux目录的基本结构(RHEL8系统基本使用之文件操作)
    1.Linux的目录树结构2.各目录的功能介绍3.理解文件路径表示方法Who?——>当前登录的用户Where?——>路径我要在哪儿创建文件?我要删除什么地方的什么文件?我所要查看的文件在哪里?What?——>操作命令How?——>理清思路,找到方法,做就对了绝对路径1.一定是以"/"(根)开......
  • SSH远程连接Linux服务器
    1.1SSH(SecureShell)是一种网络协议,用于加密方式远程登录到服务器。以下是通过SSH连接Linux服务器的基本步骤:安装SSH客户端:Windows10及以上版本自带了OpenSSH客户端安装SSH服务端:在服务器端安装OpenSSH,需要在服务器终端进行。#安装sshsudoaptinstallopenssh-server......
  • 在Linux中,如何进行集群管理?
    在Linux中,进行集群管理涉及到多个步骤和考虑因素。以下是一个详细的指南,帮助你理解并执行Linux集群管理:一、理解集群管理的基本概念集群定义:集群是一组相互独立的、通过高速网络互联的计算机,它们构成一个组并以单一系统的模式加以管理。集群技术可以在较低成本下提供高性能、可......
  • 在Linux中,如何进行系统性能瓶颈分析?
    在Linux中进行系统性能瓶颈分析是一个系统性的过程,涉及多个方面。以下是一个详细的步骤说明,用于分析和诊断Linux系统性能瓶颈:1.确定性能指标CPU利用率:检查CPU是否成为瓶颈。可以使用top、htop等工具查看CPU的使用情况,包括用户态、内核态和空闲态的占比。内存使用:检查内存是否......
  • 在Linux中,如何进行系统故障恢复?
    在Linux系统中进行故障恢复是一个涉及诊断问题、制定恢复计划并执行恢复步骤的过程。以下是一些基本步骤和策略,帮助您应对不同类型的系统故障:1.初步诊断与隔离识别症状:首先,观察并记录故障的具体表现,比如系统无法启动、服务异常、性能下降等。查看系统日志:使用dmesg命令查看内......
  • 在Linux中,如何进行高可用性配置?
    在Linux环境中实现高可用性(HighAvailability,HA)通常涉及多个层面的策略和技术,以确保系统、服务或应用在面对硬件故障、软件错误或维护操作时能够持续运行。以下是构建Linux高可用性环境的一些关键步骤和组件:1.理解高可用性概念目标:最小化停机时间,提高系统或服务的可用性。......