操作系统读书报告_读书报告 | 程序员的自我修养200110900109

程序员的自我修养

读书报告 

200110900109 计算机类1班 顾嘉铖

在看完这一本《程序员的自我修养》这本书后,我有了深深的感触,它让我深刻了解到了c语言的强大功能,让我了解了系统软件的运行机制与原理。

      在读这一本书之前,我就对这本书有着一定的了解,了解到在度这本书之前,一定要有这些问题,带着这些问题去看这本书,才会有更好的理解。

书中前三节基本阐述清楚了可行性文件、进程虚拟地址空间与物理地址空间三者之间的关系。程序要被运行,其代码与数据应被装载进入内存方可被执行。因此操作系统首先应建立可执行文件与虚拟地址空间之间的映射关系,即操作系统应该清晰代码与数据被放在了虚拟地址空间中的何处,此所谓可执行程序与虚拟地址空间之间的映射关系。而操作系统中同时运行多个程序,为使他们之间运行不互相干扰,因此不能让进程直接访问物理内存,而是由操作系统代为管理物理资源。正由于虚拟地址空间与物理地址的不等同,虚拟地址空间与物理地址空间同样存在某种映射关系,这两者这间的关系涉及操作系统的内存管理。

      而其中的6.4小节让我印象深刻,6.4小节的主要内容就是阐述如何建立可执行文件与进程虚拟地址空间之间的关系,凭我们最简单的想法,由于可执行文件已经被组织成了一个个不同的段,因此可执行文件可以以段为单位直接与虚拟地址空间建立一一对应的关系,但由于虚拟地址空间是按照页进行管理,因此直接建立映射关系,会造成大量的内碎片。如果换个调度思考问题,操作系统装载可执行文件其实不需要关心可执行文件的内容,仅了解段的权限即可,即保证程序在运行过程中不被错误访问即可。基于以上想法,可采用的方法是将相同权限的“段(section)”合并为一,进而组织成为“节(segment)”。借用书中的一句话:“从链接的角度看,ELF文件是按'Section'存储的,从装载的角度看,ELF文件是按'Segment'划分的”。换句话说elf的文件内容就在那里不多、不少。在此还应理清一个概念就是虚拟内存区域(VMA,Virtual Memory Area),所谓VMA就是指可执行文件与进程虚拟地址空间的映射关系,上述映射关系作为一个数据结构保存在操作系统中。操作系统就是在此基础上,将权限相同的节映射进入一个VMA中。即“节”的组织是静态的,是存在于硬盘中的,而VMA的组织的动态的,是存在于内存中的。在操作系统中VMA除了被用来映射可执行文件中的各个“Segment”外,操作系统通过使用VMA来对进程的地址空间进行管理。进程在执行过程中还需要堆、栈空间,事实上堆栈空间在进程的虚拟空间中的表现也是以VMA的形式存在的,很多情况下,一个进程中的栈和堆分别对应一个VMA。在linux下,可通过命令cat /proc/PID/maps 查看进程的虚拟空间分布。其中PID指进程ID,可通过命令./elf &命令查看,其中elf为可执行文件名。

      6.4前三小节让我了解到了可执行文件与进程虚拟地址空间之间的关系。但仅靠上述映射关系还不够,因为虚拟地址空间是按照页进行管理的,而可执行文件仍然是按照节进行管理的,因此就需要把一个个不同的“节”装入内存“页”中。还是从最简单的想法出发,直接以节为单位,映射进入虚拟地址空间中的“页”。但虚拟地址空间是以页作为管理单元,因此直接映射的方法肯定会造成内碎片问题,虚拟地址空间中的内碎片映射到物理地址空间就造成了资源的浪费。因此为解决上述问题,有些UNIX系统采用了一个很取巧的方法,就是让那些各个段接壤部分共享一个物理页面,然后将该物理页面在虚拟地址空间中映射两次。上述方法的采用虽然造成了虚拟地址空间的浪费,但将可执行文件看作是一个整体,以“页”为单位对其进行划分。但在虚拟地址空间向物理地址空间进行映射时,由于减少了内碎片,因此就减少了对物理内存的浪费。

      这仅仅是其中的一个小节,就让我学到了不少知识,对了计算机操作系统有了更加深刻的理解。这也正体现了这是一本不可多得的好书,是作为一个程序员必须要读的书。

     而后半册则是关于作者自学设计的经历以及如何教导孩子学习编程,对于我这种初学者也是不可多得的经验。

     其中作者讲述了一个故事:一个普通人每天都很努力,而另一个天才却整天不务正业,过了一段时间,天才终于醒悟并开始努力,不久便超越了普通人,普通人很羡慕他,但他回过头才发现,他也已经成为了大部分人眼中的佼佼者。

     程序员往往会被称为天才,那只是因为在你看不到的时候人家花了更多时间工作或者学习而已,当你也坚持这么做时,你也会变得和他们一样优秀。而通往这条路往往都是漫长并且痛苦的,许多程序员在刚开始的时候都是那个故事中的普通人,可能不会像天才那么幸运,但是只要你在这条路上一直走下去,不断努力,你也会成为别人眼中的佼佼者。

     因此,在后半册的阅读当中,我对自己的人生规划也更加明确。

1、适时建立个人权威

     当你开始抱怨自己的职业生涯毫无起色时,不妨想想你是否已经习惯了听命于人,而缺少自己的观点和主观,久而久之便成为了别人眼中的平庸之人。你应该在适当的时机表现自己,让别人看到你的不同之处。

2、遵循最佳实践

       无论新兴技术如何发展,技术的本质是不变的,你应该去理解那些软件领域最本质的东西,比如最佳实践,那些最佳实践是无数优秀程序员通过大量实践总结出来的,通过理解它们,能够让你站在前人的肩膀之上,从而对软件开发本身有更深入的理解和认识。

3、保持好奇心并乐于探索新的事物

      优秀的程序员往往不会满足于对手头工作的认识和理解,他们会去理解更深入的东西,也乐于探索那些看似于工作无关的技术,通过对其他事物的学习,也能对你目前的工作有所帮助。

4、抛开代码与人沟通

不要忽视与人的沟通,当你的能力不断提升,被赋予更多职责时,你更需要与人沟通来管理好自己的团队,所以尝试离开你的电脑桌去与人沟通,这会给你的工作和生活带来积极的变化。

5、要为优秀的人工作

当你发现你所处的环境和周围的人已经无法让你获得提升时,那么你应该去选择一个更好的环境,尽可能与那些优秀的人一起工作。

6、生活、睡眠、旅行

我们时常听到关于程序员因疲劳过度而猝死的新闻,这从侧面说明程序员不懂得生活。每个程序员都应该明白,工作、技术、写代码这些并不是你存在的意义,而生活才是,你需要懂得生活,并且学会生活。

其实严格细分的话,这部分内容应该是系统软件工程师熟悉掌握的内容。作为一个普通的应用软件开发工程师,他们只需要做好上层的软件开发工作就好了,这些底层的东西,因为工作中涉及的不多,是可以不需要操心的。但是如果对自己有更高的要求,想让自己成为一个有修养的工程师,那么了解并熟悉这部分内容就有很必要了。正如开头序言提到的,这部分内容算是编程的“易筋经”,是内功,你学会了它,你的代码就会更有威力。

突破程序员的几种方法:

透过技术发现问题的本质:

思考问题出现的原因,采用真正能解决问题的手段,而不是一味使用技术解决。

像专家一样给出意见:

沟通需求时,去理解用户所提出需求背后的真正原因,并像专家一样给出最优方案。

杂学并从中获得不同的视角:

要做到以上两点其实并不简单,这不仅需要你具备极强的技术功底,更需要你对问题所涉及的相关领域有足够的认识。你必须通过大量地学习编程之外的各种知识来完善自己的知识体系,并从中获得不同的视角。

找回创造力:

不可否认的是,目前的开发工作需要我们的创造力的情况并不多了,但我们仍需要创造力。关于如果找回创造力,有很多方法,关键在于你是否愿意坚持那样去做,比如:每天阅读、记录下那些转瞬即逝的想法。

0cd4894ef59b0f5187eb2bc2c514cacb.gif

2020.12

8f7ca2e6dfb2612091d45eee94c6193c.png 4dff93ea932bb69b2ecc5dd9097ac685.png

计算机科学导论

文案 | 顾嘉铖

编辑 | 蔡安琪

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值