Linux 进程的地址空间

news2024/11/25 6:05:31

一、进程

进程:是一个正在运行的程序

PCB : 即是进程控制块,是进程存在的唯一标志。用来描述进程的属性信息,如进程的pid。

在这里插入图片描述
每一个进程都是通过fork复制而来的。

在执行fork之后,先将PCB复制一份给子进程,复制之前先申请一个pid,将复制给子进程的PCB中的pid修改为申请成功的pid;然后把当前的进程复制一份给子进程。父子进程并发运行。

二、进程的地址空间

以32位为例:

在32位的计算机系统中进程的地址空间是4G,如下图所示:

在这里插入图片描述

通常定义一个空指针时int *p = NULL;,这个指针p指向的空就是指向的上图中的0x0000 0000

地址空间除了内核使用的1G,剩下的3G实际上能用的内存空间是小于3G的。

虽然一个进程的地址空间为4G,但是实际上在执行一个程序的时候并不会把4G的内存空间用完,其中代码段和数据段使用几个页面就足够了,而一个页面的内存是4K,所以执行一个程序实际上用到的内存比4G小很多,所以并不是16G的计算机只能运行4个进程。这个4G是规定一个进程最大占用4G的内存空间,也就是一个进程理论上拥有4G地址空间的权限,一般情况下不会用完。

在地址空间中,代码段是从0x0804 8000开始,是一个固定值:

在这里插入图片描述

内核和用户使用空间的分界线的上限为0xc000 0000,下限为0xbfff ffff

在这里插入图片描述

1.定义在栈上的变量

由于栈是从上往下增长,所以在栈上定义的局部变量的地址就离0xbfff ffff非常接近。在栈上定义的变量每次运行的地址是不一样的,每次运行程序栈在分配的时候故意让局部变量的地址不一样,以确保程序的安全性。

2.在堆上申请动态内存

(1)malloc申请的内存空间当程序结束后会被系统自动回收

在Linux中,用malloc申请一块1G的内存空间,不用free释放也可以,不会发生内存泄漏,因为进程终止之后,所申请的内存空间就会被回收,但是当进程运行的时间长时,也是需要用free来释放的。在C语言中,malloc分配一段内存空间之后必须用free释放掉这块内存空间,不然会发生内存泄露。但是,我们一般在使用malloc之后是需要通过free释放空间的。

(2)malloc能申请多大的内存空间

32位系统内存空间的理论值小于3G,参考地址空间,如上图。

①当物理内存剩余的内存空间大于要申请的内存空间的时候是可以申请成功的。

比如现在物理内存剩余的内存空间为1.8G,要用malloc申请1G的内存空间是可以申请成功的。

②当前物理内存剩余的空间加虚拟内存剩余的空间能否满足申请要求。

当malloc申请内存2G内存空间,当物理内存剩余的空间加虚拟内存剩余的空间大于2G,就可以申请成功。如果分配在虚拟内存的空间不去使用,那么它就一直在虚拟内存,不会被调用回物理内存。如果物理内存的剩余空间加上虚拟内存的剩余空间不能满足申请内存空间的要求,那就申请失败,这里的满足还要考虑自身的特性,自身最多只能申请接近3G。如果没有虚拟内容就会申请失败。

③当前物理内存剩余的空间加虚拟内存剩余的空间比所申请的空间大,但是申请失败。

当malloc申请3G的内存空间,虽然物理内存和虚拟内存加起来超过了3G,但是不会申请成功,因为用户可以使用的内存空间为3G,除去代码段、数据段之后留给堆区的内存空间是不够3G的。用户最多只能申请接近3G

④malloc 与 fork,父进程堆区申请的空间复制后,子进程也会有一份,也需要释放吗?

父子进程对申请的堆空间都没有操作,代码如下:

在这里插入图片描述

父进程在堆区申请了5个字节大小为int型的内存,通过fork复制之后,产生一个子进程,并在父进程和子进程结束前都执行了free。

编译以上代码,并运行,编译运行并没有出错:

在这里插入图片描述

所以,我们可以知道,父进程在堆区申请的内存空间复制一份给子进程之后,子进程并不共享父进程的内存空间,父子进程在堆区都会有一份内存空间。因为如果这段内存空间是共享的,那么父进程对这段内存空间free一次,子进程再对这段内存空间free一次,对同一个内存空间free两次,编译运行会出现错误。而此时编译运行并没有出错,所以父子进程堆空间不共享(这里指的是每个进程的堆空间),哪怕父子进程对申请的堆空间都没有操作。

现在父子进程对申请的堆空间进行操作,代码如下:

在这里插入图片描述
上述代码,让子进程中的arr[0]等于10,让父进程中的arr[1]等于100。

编译并运行以上代码,结果如下:

在这里插入图片描述

结果分析:输出的结果中,第一行是父进程输出的结果,第二行是子进程输出的结果,可以看出父子进程对堆空间里的值进行修改,父进程对堆空间的值进行修改并没有导致对应子进程堆空间的值被修改,子进程对堆空间的值进行修改也没有导致对应父进程堆空间的值被修改。更加可以说明,父子进程是不共享堆上的内存空间的。子进程也需要释放从父进程复制过来的堆上的内存空间。

malloc申请的空间是对每个进程的物理地址而言的,只有当用到申请的空间,才会映射到底层真时物理地址。

【注意】

同一个程序在每次运行的时候,代码的逻辑地址不会变,物理地址会变,但是物理地址我们看不到,我们能看到的打印出来的地址都是逻辑地址。

如果一个函数没有被主函数调用也会给该函数分配内存空间。

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

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

相关文章

SpringBoot代理访问本地静态资源400 404

SpringBoot代理访问静态资源400 404 背景:pdf文件上传到linux服务器上,使用SpringBoot代理访问问题:访问过程中可能会出现400、404问题 前提:保证有文件,并且文件路径正确 SpringBoot如何配置静态资源代理&#xff0…

SpringCloudAlibaba 2021.0.5.0 集成Nacos2.2.0 集群配置中心使用记录

Nacos2.2.0集群配置中心使用记录,踩过太多坑 Nacos2.2.0集群搭建参考 1. Nacos配置中心使用 官方文档: https://github.com/alibaba/springcloudalibaba/wiki/Nacosconfig 1.1 准备配置 新建配置 config:name: coisini server:port: 9420DataId:每个项…

Jmeter-压测时接口按照顺序执行-临界部分控制器

文章目录 临界部分控制器存在问题 临界部分控制器 在进行压力测试时,需要按照顺序进行压测,比如按照接口1、接口2、接口3、接口4 进行执行 查询结果是很混乱的,如果请求次数少,可能会按照顺序执行,但是随着次数增加&a…

【Visual Studio Code】--- Win11 安装 VS Code 超详细

Win11 安装 VS Code 超详细 概述一、下载 Vscode二、安装 Vscode 概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载 Vscode Vscode官网 二、…

如何用DDX指标捕捉买卖力量的变化?

DDX指标(Demand-Delivery Index,需求交付指数)是一个用于测量市场供需关系和情绪变化的量化工具。通过分析每日的买入单数、卖出单数以及持仓人数,投资者可以利用DDX指标捕捉市场买卖力量的变化,从而做出更明智的投资决…

vscode|pycharm + docker + python

1,docker run的时候要加上port docker run -it --gpusall -p 2222:22 -v /挂载目录/:/docker 目录1/ -v /挂载目录/:/docker 目录2/ --namexxx image:v2 /bin/bash 2,docker 内部要安装ssh 2.1方法命令: apt-get update apt-get install…

第三章 图论 No.13拓扑排序

文章目录 裸题:1191. 家谱树差分约束拓扑排序:1192. 奖金集合拓扑序:164. 可达性统计差分约束拓扑序:456. 车站分级 拓扑序和DAG有向无环图联系在一起,通常用于最短/长路的线性求解 裸题:1191. 家谱树 119…

使用PDF文件入侵任何操作系统

提示:我们8月28号开学,所以我得快点更新了,不能拖了😥 文章目录 前言一、打开终端总结 前言 PDF文件被广泛应用于共享信息,电子邮件,网站或文档或存储系统的真实链接 它可以用于恶意软件的载体。 不要问我什么意思&am…

Spring学习笔记(思维导图)

目录 基本概念 Spring优点: Spring缺点: AOP 实现原理: Jdk动态代理: CGlib: 静态代理: JDK动态代理和CGlib的对比: 配置方式: 基本概念: 事务管理 基本概念 事务控制 事…

Bingchat和ChatGPT主要区别

Bing Chat由chatgpt GPT-4技术提供支持,这是流行的ChatGPT的最新语言模型。Bing Chat通过更具交互性和上下文联动的响应来优化搜索引擎。它允许用户提出问题并获得更人性化、精确化或创造力的答案。用户还可以在答案末尾查看的参考来源。该工具可以充当个人研究、计…

每天一个知识点——L2R

面试的时候,虽然做过医疗文献搜索,也应用过L2R的相关模型,但涉及到其中的一些技术细节,都会成为我拿不下offer永远的痛。也尝试过去理解去背下一些知识点,终究没有力透纸背,随着时间又开始变得模糊&#xf…

Mysql使用数据类型为datetime导致无法返回规定格式解决

Mysql使用数据类型为datetime,在java中使用Date获取到返回的实际是一个秒数。 1.可以通过注解JsonFormat 直接转换成对应格式 pattern:格式 timezone:时区 2.手动转换,封装方法 /** * 时间转yyyy-MM-dd HH:mm:ss * * return */ …

【产品人卫朋】硬件产品经理:产品成功的四个要素

目录 要素一:快速行动 要素二:衡量产品增长力 了解你的目标用户 衡量用户参与度 要素三:避免浪费金钱 要素四:组建一支能打的团队 硬件产品的成功离不开四个核心要素,分别是: (1&#xf…

消防二维码管理系统搭建教程

针对消防管理中普遍存在的消防设施巡查、维修、报修等需求,可以在草料二维码上搭建消防管理二维码系统,为每个消防设施生成一张独立的二维码,实现微信扫码进行巡检、维修、隐患上报等功能。 系统搭建流程 消防管理二维码系统由一个个二维码…

无涯教程-Perl - setservent函数

描述 在第一次调用getservent之前,应先调用此函数。 STAYOPEN参数是可选的,在大多数系统上未使用。当getservent()检索服务数据库中下一行的信息时,然后setervent设置(或重置)枚举到主机条目集的开头。 语法 以下是此函数的简单语法- setservent STAYOPEN返回值 此函数不返…

安防视频监控汇聚平台EasyCVR视频监控综合管理平台接入Ehome告警,公网快照不显示的问题解决步骤

智能视频监控汇聚平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,视频监控管理平台…

Compute shader SV 理解图

本图转子:【Computeshader】个人总结_蒋伟博的博客-CSDN博客

Spring解决循环依赖问题

一、什么是循环依赖? 例如,就是A对象依赖了B对象,B对象依赖了A对象。(下面的代码属于属性的循环依赖,也就是初始化阶段的循环依赖,区别与底下构造器的循环依赖) // A依赖了Bclass A{public B b;…

什么是CNN(卷积神经网络)

什么是卷积神经网络 卷积神经网络(Convolutional Neural Network),在一个个填充着数字的正方形小格子,它们被称为卷积核。 原始图片经过输入层后,会变为灰度或是RGB数值填充的矩阵 将卷积核与图片矩阵对齐,对应格子中的数字相乘后…

Dev-C++

文章目录 介绍使用教程常用快捷键文件部分格式部分行操作跳转部分显示部分运行部分调试部分 调试流程 扩展增加编译选项开启优化显示最多警告信息生成调试信息 编译小 trick开大栈定义宏代码格式化 美化字体主题 介绍 Dev-C 是一套用于开发 C/C 程序的自由的集成开发环境&…