程序员的自我修养(4)

这篇具有很好参考价值的文章主要介绍了程序员的自我修养(4)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

可执行文件的装载与进程

代码经过预编译,编译,汇编,链接过程后生成可执行文件,但可执行文件只有装载到内存程序才可以运行,这节讲可执行文件在linux下的装载过程,以及与进程的关系等等。
1.程序与进程的关系
一个例子,计算机CPU是人,程序菜谱,进程就是炒菜的过程。程序就是预先编译好的指令和数据集合的一个文件,是一个静态的概念。而进程是程序运行时的一个过程。
2.进程虚拟地址空间
程序运行起来后,将会拥有独立的虚拟地址空间,这个地址大小是由CPU位数决定,32位CPU就是0到2的32次方减一。假设32位操作系统我们将有4G的空间,通常以一部分作为操作系统,一部分就留下给进程使用,这些就是可以申请的虚拟地址空间。但是,这些空间由于近代计算机的发展是明显不够的,我们考科一扩展到64位或者使用pae或saw方法。
3.装载的方式
程序执行时所需的指令和数据必须在内存才能够正常运行,最简单的方法是将整个程序直接放入内存,这样程序肯定是能正常运行的,但是肯定会占有大量内存,先现如今,内存还是很昂贵的,明显是不够用。前人就想到了程序运行的时候只要将最常用的数据存放到内存即可,而其它数据放入磁盘,需要的时候在提取至内存。这就提到了两种方法,覆盖装入与页映射。
1.覆盖装入
现在几乎已经淘汰,但是还是值得了解。这种方法主要依靠程序员的在编写的时候将程序分割成若干块,然后使用辅助代码来管理这些模块该何时进入内存,何时被替换。覆盖管理器本身内存很小。
假设有模块A与模块B,之间没有调用关系,互不影响,有一个函数能调用模块A或模块B,那么A与B就共用一片空间,函数调用模块A的时候,模块A之间覆盖这片A与B共同使用的空间,反之一样。当程序一旦很多,这就很需要程序员对各个模块依赖关系组成对应的树状图,从而进行分块和调度策略的分析。
2.页映射
将内存和所有磁盘中的数据与指令按(页)为单位进行划分,以后所有装载和操作的单位就是页,通常一页4K大小,也就是4096字节。我们通常使用先进先出和最少使用算法,当内存使用达到分配的上限,就会最先进入的页会被调出内存,最少使用的页将会调出内存,调入需要的页的数据。
4.进程的建立
进程建立的开始的三件事情,
1.创建一个独立的虚拟地址空间
虚拟空间是由一组页映射函数将虚拟空间的各个页映射至对应的物理空间。那么创建一个虚拟空间并不是创建空间,而是创建映射函数所需要的相应的数据结构,在一些Linux下,创建空间实际上只是分配一个页目录。

2.读取可执行文件头,并且建立虚拟空间与可可执行文件的映射关系
上一步的页映射函数是虚拟空间到物理空间的映射,这一步是虚拟空间与可执行文件的映射关系。我们知道,当程序执行发生页错误时候,物理空间会分配一个物理页,然后将缺少的页面从磁盘读取进入内存,在设置缺少的页面与物理页面的映射关系。那么我们怎么知道这个页在可执行文件那个位置,就需要虚拟空间与可执行文件的映射。

3.将CPU的指令寄存器设置成可执行文件的入口地址,启动运行
就是操作系统执行了一条跳转命令,跳转到了可执行文件的入口,也就是ELF头文件保存的入口地址。

5.操作系统的链接视图与执行视图
执行视图就是将.text,.bss,.data等段分开的视图。链接视图就是将同等属性的段合在一起的视图,例如一代吗段为代表的可读可执行段,以数据段与bss段可读可写的段,以只读数据段为代表的的只读数据段。那么为什么需要这样分配,因为映射到虚拟空间的时候,以页为单位,那么每个段都一个页,会极大的浪费空间,操作系统不管页的内容,只会在乎页的属性,那么我们可以将相同属性的段合在一个页内,就可以极大的节省空间消耗。(这样一个同属性的集合叫做segment)文章来源地址https://www.toymoban.com/news/detail-593102.html

到了这里,关于程序员的自我修养(4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 〖程序员的自我修养 - 认知剖析篇⑤〗- 选择前端还是后端?

    人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏, 购买任意白宝书体系化专栏可加入 易编程社区, 早鸟价订阅模式除外 。 福利:加入社区的小伙伴们,除了可以获取博主

    2024年02月14日
    浏览(45)
  • 〖程序员的自我修养 - 认知剖析篇②〗- 学习编程之前你需要知道这些

    人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏, 购买任意白宝书体系化专栏可加入 易编程社区, 早鸟价订阅模式除外 。 福利:加入社区的小伙伴们,除了可以获取博主

    2024年02月12日
    浏览(45)
  • 〖程序员的自我修养 - 精炼面试篇⑨〗- 技术面试不用怕,也是有套路可利用的

    人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏, 购买任意白宝书体系化专栏可加入 易编程社区, 早鸟价订阅模式除外 。 福利:加入社区的小伙伴们,除了可以获取博主

    2024年02月15日
    浏览(67)
  • 〖程序员的自我修养 - 认知剖析篇④〗- 关于前端方向与后端方向的一些个人见解

    人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏, 购买任意白宝书体系化专栏可加入 易编程社区, 早鸟价订阅模式除外 。 福利:加入社区的小伙伴们,除了可以获取博主

    2024年02月14日
    浏览(56)
  • 测试/开发程序员有8大好处,自我实现和自我超越......

    测试/开发程序员有8大好处 很早前网络就关于程序员种种不好的标签,比如“不修边幅,生活邋遢“,“无趣呆板,不浪漫“,“加班多“,“不疼爱女朋友“,“情商低”等,通通都是瞎扯,除了加班多,其他跟程序员行一点关系都没有。 当测试/开发程序员好处多多 1、相

    2024年02月03日
    浏览(82)
  • 【C++程序员的自我修炼】拷贝构造函数

    心存希冀 追光而遇目有繁星 沐光而行 目录 拷贝构造函数概念 拷贝构造的特征 无穷递归的解释 浅拷贝 总结:  深拷贝 拷贝构造函数典型调用场景 总结  契子 ✨ 在生活中总有很多琐事,不做不行做了又怕麻烦,有时候想要是有个和自己一模一样的人就好了 可以帮我上早读

    2024年04月14日
    浏览(46)
  • 《程序员的底层思维》读书笔记

    维克多弗兰克《活出生命的意义》 我不止一次发现,当我觉得一个地方的命名有些别扭的时候,往往就意味着要么这个地方我没思考清楚,要么是我抽象错了。 提取重复代码只是重构工作的第一步,对重复代码进行概念抽象,寻找有意义的命名才是我们工作的重点。 任何软

    2024年02月05日
    浏览(42)
  • 程序员怎么玩转Linux

    Linux下可以使用Python编写爬虫程序,常用的爬虫框架有Scrapy和BeautifulSoup。 Scrapy是一个基于Python的开源网络爬虫框架,可以快速高效地从网站上获取数据。它提供了强大的数据提取和处理功能,支持异步网络请求和分布式爬取等特性。 BeautifulSoup是一个Python库,可以从HTML或XM

    2024年02月07日
    浏览(55)
  • 【Linux】程序员的基本素养学习

    本文记录自己的学习生涯,学一点记一点,做好准备随时能够提桶。 注意: 该文内容为知识点的总结:参考《程序员的自我修养–链接、装载与库》一书,感谢作者,如有侵权,联系我删除,非常谢谢。 程序所需要的内存空间大小的虚拟空间映射到某个物理地址空间。 问题

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包