07 | 软件运行机制及内存管理
07 | 软件运行机制及内存管理
讲述:丁伟
时长14:35大小13.40M
计算机运行全过程
实模式下的内存管理
保护模式下的内存管理
架构思维上我们学到什么?
结语
赞 50
提建议
精选留言(102)
- coder2019-05-08我觉得许大大的这个专栏写的挺好的。从计算机底层的角度去思考和总结架构的观点,让人觉得眼前一亮。 btw,看到评论区有人问cache的事情,补充一下自己的看法。 cache一般对programmer和软件来说确实是透明的,但是它也有缺点,比如说占用了大量的芯片面积[50%左右,因为要维护tag RAM和一致性],它也导致程序的行为难以分析。所以在实时的嵌入式场景和目前流行的AI专用加速器中都不采用Cache,目前大量采用的是scratchpad memory,它是一种对程序员可见的片上存储,需要programmer自己显式地来管理,e.g. GPU的shared memory,TPU的local buffer等展开
作者回复: 👍,挺好的补充
43 - 黄海峰2019-05-07这个专栏应该叫“计算机导论”而不是叫“架构”。。。
作者回复: 不是的,这个是架构课。你看计算机基础只占了一章,而且我们是从架构角度来讲计算机基础,很多细节都被抽象掉了。
共 5 条评论28 - 川杰2019-05-08老师您好,有两个问题希望解答:1、淘汰的内存页数据保存在哪里?是保存在外置存储设备中吗?2、CPU加载对应程序的代码段到内存中,那么CPU是如何知道这个对应程序的代码段在什么位置的呢?
作者回复: 1、是的,保存在外置存储中。对于unix系的系统往往是swap分区;windows则是一个隐藏属性的.swp文件。 2、代码段在哪里,是操作系统约定的,因为负责加载的人是操作系统,它设计的程序文件的数据格式。
25 - 晓凉2019-05-12从“缺页中断”看架构设计的开闭原则,CPU是硬件,生产出来就不能修改,本身是封闭的,设计上要考虑的是扩展的开放性,缺页中断解决了开放性问题。软件的设计,因为源代码是对程序员开放的,可随便修改,封闭性不能物理上保证,所以需要同时考虑封闭性和开放性。服务化隔离不同的代码模块,一定程度上实现了类似物理上的封闭性。
作者回复: 挺好的分析
21 - 云学2019-05-13看前几篇还没共鸣,直到这篇才体会到了这种宏观视角解读的好处,精述每个模块的输入输出以及核心功能,怎么串联到一起,如果从头再来该怎么设计,真正构建出整个计算机知识脉络,看完这些再看其他专栏就如降维打击。18
- 刘冲2019-06-27分离变化点和不变点,把不变点做成回调,预留了变化,这种思路其实就是架构的核心,如何区分和管理变与不变
作者回复: 👍
共 2 条评论14 - keshawn2019-05-08表面上是在讲技术,实际上是在分析需求
作者回复: 😊
12 - 19002019-05-07这里说的“虚拟内存”是内存还是磁盘啊?感觉应该还是内存。
作者回复: 内存和磁盘的配合
12 - zhangtnty2019-05-08许老师, 您的文章很棒。有一点小小的建意, 能否您亲自录音频, 现在的音频老师录得也很好, 但总觉得少了点计算机、软件、架构的一丝丝底蕴(个人浅见)。有时音频对于读者也是很重要的,辛苦老师考虑一下。
作者回复: 录音频我不太擅长,我给音频老师反馈一下您的意见。
共 2 条评论11 - 涵2019-05-07请问老师内存管理作为操作系统的一个重要且基本的功能,其本身就是一段程序需要在启动时加载在内存中并且永远不被交换到外置存储对吗?那么这段程序在保护机制下是如果一直停留在物理内存中的呢?是写入特定的内存页,永远不会被交换出去,还是由于内存管理功能总是被所以程序调用,由于访问频繁因此永远不会被换出去?另外,操作系统是如何管理内存和寄存器之间的数据交换呢?有点儿想象不出来这个接口。比命令将内存地址1中存放的数据放入2号寄存器,将寄存器3中存储的数据输出至内存地址4,这是一个怎样的过程呢?谢谢。展开
作者回复: 1、内存管理模块负责内存页的淘汰规则,它当然不会自己把自己淘汰掉。 2、内存和磁盘的数据交换吧?我们这里核心交代思想,要了解细节可以学习一下一些操作系统课程。我后面在第一章的总结与回顾中也会介绍一些参考资料。
8 - 涵2019-05-08第二个问题是关于内存和寄存器(RAM和CPU)的数据交换。确实是如老师所说,有再学一学操作系统的冲动。学着老师的架构课感觉到本科时的课程设计是很好的,可惜当时见识太浅,每门课只是孤立的在学习,为了完成作业拿个好分数而学习,从未整体的去思考课程设计背后计算机的完整架构,真的是很有意思的事情。
作者回复: 确实,整体去看信息科技世界,里面有太多精彩。非常值得从头再学一遍。加油💪
7 - 逆流的鱼2019-05-07如果都是保护模式,比如Java进程,启动指定了堆或者内存大小为4G,那其实内存实际没有分配吗?linux服务器可用内存没有减少4G?运行实际占不到4G?!
作者回复: 这种疑问,可以实际动手测试试试,验证你的推理对不对
7 - 胖胖虎2019-10-10老师,我有个问题。内核空间是单进程的,那是否意味着每个用户进程的内核部分都是完全一样的?内核线程的地址空间是怎样管理的。谢谢!
作者回复: 内核空间很难定义是不是单进程。这里面核心是什么是进程,它的本质是什么。多个用户进程共享了相同内核,指的是共享了相同的逻辑地址和物理的数据。内核代码执行,分为两种:一种是内核程序自己运行起来的时候,它有自己的main程序,常规意义上的内核进程指的是它。另一种是用户程序调用某个内核功能,也就是发生了syscall中断请求,这时会发生提权,进程数据可见范围包含了内核空间,仅此而已。从内核代码角度,这时有多个执行体在执行相同的代码,需要考虑互斥。
6 - bachelor2019-07-24保护模式真是一个很有意思的想法,“争取让每个软件都认为自己独自占有整个cpu资源”,就像平行宇宙理论一样,彼此互不干扰,但又真实存在,不一样的是,前者是真实存在的。6
- 乘风2019-05-17架构思维上学到了什么? CPU虚拟空间设计思想:将外置系统做高度抽象,外置系统实现了虚拟空间的约定,CPU在运行时与虚拟空间进行数据交换,虚拟空间与外置系统进行交互,从而完成CPU的资源调度、管理功能。 封装了变化点,外置存储结构的不确定性,建立统一规范,双方按照规范完成整个协作流程。展开
作者回复: 👍
共 2 条评论7 - 苟范儿2019-05-07从硬件架构到其上的操作系统。但是不得不佩服前人在这些层面给出的架构,BIOS 引导、OS、Shell 等系统级方案,仔细想象,每天都在用,各类软件的开发都在这些架构之上很好的运行。
作者回复: 值得细细体会,感悟
6 - Enthusiasm2019-05-07老师可以多加一些:按照历史发展的时间顺序来讲技术间因果关系,以便于构建完整的知识体系架构,而细节上可以用给出参考链接或书籍的方式来让我们自己去索骥。比如这一章,由于之前了解过汇编语言,我知道8086CPU一开始是不支持保护模式的,后来386之后才开始支持。明显CPU和操作系统是经历了一段磨合,不是一上来就采用了这种保护模式,CPU也不是一上来就支持保护模式,而操作系统厂商也不是一开始就想到要多任务(比如DOS),很想知道当中发展中经历了哪些尝试和妥协。还希望老师把知识体系描述的更完整一些,比如操作系统除了DOS,Windows,同时期的还有Unix,MacOS,关于这一章,很想知道这几条技术线是如何并行发展的,他们一定有相互竞争和借鉴的feature,很想听一听。原则上希望可以通过技术发展的逻辑,理清知识体系和脉络。不然的话,这片知识在我们脑中,依然是一座孤岛,觉着可能没用就当做垃圾给回收了。希望听到更多技术、思想历程,可以多用一些搜索引擎可以搜索到的“概念”减少篇幅,而把详细描述用在那些“搜索引擎难以搜索到的”知识来增加干货。展开
作者回复: dos面临的个人市场刚开始资源太匮乏了,所以没有做多任务是很正常的决策
共 2 条评论6 - Young2019-05-26Cache都是SRAM,速度快但是集成度低,不适合集成容量特别大。其中1st level 和last level cache对性能影响最大,通过Instruction Read miss(I1mr,ILmr),Data read miss(D1mr,DLmr),L1的miss会有10个cpu cycle的惩罚期,LL的miss会有200个cpu cycle的惩罚。所以,虽说cache不可编程,但是为了降低惩罚,也就是提高命中率,反过来是要求你的代码具有效率,数据结构的合理性。比如基于cache加载内存数据的locality(局部性原理),当你循环遍历一个二维数组时,先行后列的性能远远高于先列后行,原因是前者的命中率远远高于后者。展开
作者回复: 挺好的补充
共 3 条评论5 - 易林林2019-05-08真的是很好的架构课程,这这里我们可以了解计算机的发展历史,解析计算机的基础原理,理清软件架构的原始脉络,一步步构建出属于自己的软件架构知识体系,并不会只知其然而不知其所以然,这样构建的软件架构才会更加坚实牢靠。5
- WadeYu2019-05-07现在的主流操作系统都是运行在保护模式下吧
作者回复: 是的,实模式是个历史产物
6