c程序运行原理简介

简介: Linux将虚拟存储器高端的1/4留给内核,剩下3/4全留给用户进程。虚拟存储器上中的程序主要由以下几个重要组成部分:1.进程控制块(process control block,简称PCB)PCB中保存了进程hello的运行时的存储器图像和寄存器信息,它帮助操作系统在内存中找到我们的hello程序,如果没有它,hello只是和其它程序杂乱无章地分布在内存中就乱套了。

Linux将虚拟存储器高端的1/4留给内核,剩下3/4全留给用户进程。虚拟存储器上中的程序主要由以下几个重要组成部分:
1.进程控制块(process control block,简称PCB)
PCB中保存了进程hello的运行时的存储器图像和寄存器信息,它帮助操作系统在内存中找到我们的hello程序,如果没有它,hello只是和其它程序杂乱无章地分布在内存中就乱套了。
2.栈(stack)和堆(heap)
程序中的自动变量都位于栈上,而堆则用来让程序员自己手动分配(malloc)和释放(free)的内存空间,如果程序员忘了释放,则有垃圾收集器gc代劳。除此以外,栈还是程序转移中一个很重要的概念,程序的返回地址通常也保存在栈上。
3.文本段(text segment)和数据段(data segment)
所谓的文本段和数据段对应的就是程序的代码部分和全局变量,把程序的代码和数据分开处理是有好处的,比如我们在windows打开好几个word,这些进程只是数据段不同罢了(它们都拥有相同的代码),因此内存中永远只要有一份word的代码就行了。
4.共享库的映射区域
操作系统通过将共享的对象映射到虚拟存储器的“共享区域”来使得代码能够共享,一方面提高存储器的利用率,一方面可以使得进程能够共享一些数据。
如果某一时刻系统中有20个程序正在运行,而这些程序都需要在屏幕上打印东西,系统就没有必要为每个程序都维护一段printf的代码,只要分别从各自的.bss中取出字符串然后用同一个printf完成输出就行了。同样的道理,当有多个hello在系统中运行时,它们也完全可以共享同一个文本段。这也就是为什么会把进程定义为程序的一个实例的原因。不妨回想一下面向对象中对象的概念,我们在写class的时候定义成员字段不就是在分配数据?而定义方法字段不就是在操作这些数据?在对象被实例化以前,这些定义只不过是一些“白纸黑字”,而只有经过实例化,实例们才在存储器中有了自己的映像。而多个实例之间可以共享“方法”(文本)但是独有“成员”(数据)的特点,也和进程如出一辙。
现在我们可以描述hello在存储器中图像了。hello的代码位于文本段中,字符串“hello,world”在只读段中,printf位于共享库的映射区域,程序在执行时用到了用户栈,用户栈从0xbfffffff开始,向下生长。以上的图景只发生在一瞬间,我们难以追踪,要想看清hello的本来模样,还是得在目标文件上做文章。
———————————————————————————————————————————

转载自http://blog.csdn.net/witsmakemen/article/details/17653231

目录
相关文章
|
9月前
|
机器学习/深度学习 存储 PyTorch
PyTorch内存优化的10种策略总结:在有限资源环境下高效训练模型
在大规模深度学习模型训练中,GPU内存容量常成为瓶颈,特别是在训练大型语言模型和视觉Transformer时。本文系统介绍了多种内存优化策略,包括混合精度训练、低精度训练(如BF16)、梯度检查点、梯度累积、张量分片与分布式训练、
408 14
PyTorch内存优化的10种策略总结:在有限资源环境下高效训练模型
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
309 0
|
10月前
|
存储 弹性计算 数据挖掘
阿里云ECS云服务器经济型e实例和通用算力型u1实例区别对比、适用场景和问题解答FAQ
阿里云ECS云服务器的经济型e实例和通用算力型u1实例是开发者和中小企业常用的两种配置。e实例适合中小型网站、开发测试等轻量级应用,性价比高;u1实例性能更优,适用于中小型企业级应用、数据分析等场景。同等配置下,u1实例在网络带宽、云盘IOPS等方面表现更好,价格也相对较高。选择时,个人用户推荐e实例,中小企业则更适合u1实例
|
11月前
|
vr&ar 图形学 计算机视觉
突破次元壁!新加坡国立发布GenXD:拿捏真实感3D、4D动态场景
新加坡国立大学团队发布GenXD,突破3D和4D场景生成难题。通过利用常见相机和物体运动,提出数据整理管道及大型4D数据集CamVid-30K,开发出能生成逼真3D/4D场景的框架。其多视角-时间模块分离相机与物体运动,支持条件视图生成。尽管存在数据覆盖和复杂场景处理的挑战,GenXD仍显著提升了生成效果,为虚拟现实、游戏开发等领域带来新机遇。论文链接:https://arxiv.org/abs/2411.02319。
228 11
|
9月前
|
人工智能 自然语言处理 搜索推荐
HiFox AI:一站式 AI 应用平台,多模型快速接入,自由选用
HiFox AI 是一站式AI应用平台,整合了30多个主流AI模型,提供文本生成、对话交流、图片生成等多种应用场景。平台内置1000+预构建AI应用,支持无代码搭建个性化应用和复杂工作流,帮助用户高效处理重复任务,显著提升工作效率。无论是普通用户还是技术专家,都能在HiFox AI上找到适合自己的解决方案,实现“人人都能使用AI”的愿景。
ly~
|
人工智能 搜索推荐 自动驾驶
人工智能的应用
人工智能在多个领域广泛应用,包括:医疗领域的疾病诊断、药物研发和医疗机器人;交通领域的自动驾驶和智能交通管理;金融领域的风险评估、金融诈骗检测和投资决策;教育领域的个性化学习和智能辅导;工业领域的质量检测和生产流程优化;家居领域的智能家居系统,如智能音箱和智能灯具等,极大提升了各行业的效率与服务质量。
ly~
892 1
|
安全 Linux 网络安全
Kali渗透测试:自动播放文件攻击
Kali渗透测试:自动播放文件攻击
225 0
|
Rust Shell 开发者
7步开始rust(自定义环境安装与vscode开发环境配置)
本文档详细记录了当改变Rust安装路径至特定目录(如 `/home/local_rust`)时,如何在VSCode环境中正确配置Rust开发环境的过程。主要包括:设置环境变量、使用清华大学镜像安装Rust及更新镜像源、手动部署 `rust-analyzer`、安装标准库源码、安装与配置VSCode插件等七个步骤,确保开发者能够顺利搭建并使用定制化的Rust开发环境。
2068 0
|
Java
DecimalFormat的使用讲解数字格式化和demo(java小数控制,金额返回相关处理)
DecimalFormat的使用讲解数字格式化和demo(java小数控制,金额返回相关处理)
515 0
|
数据采集 JavaScript API
Python爬虫,请求参数加密怎么办
Python爬虫,请求参数加密怎么办
626 0