乱侃《深入理解计算机系统》——计算机系统漫游Day3

目录

0.0、状态不好

1.5、高速缓存至关重要

1.6、存储设备形成层次结构

1.7、操作系统管理硬件

1.7.3、虚拟内存

1.7.1、进程

1.7.2、线程

1.7.4、文件

1.8、系统之间通过网络通信


0.0、状态不好

昨晚失眠,今天可能没什么激情,但是还是要坚持呀~~

1.5、高速缓存至关重要

为什么需要高速缓存?因为快。

为什不只用高速缓存?因为贵。

高速缓存如何提高读写速度?利用局部性原理,将可能经常访问的数据保存到高速缓存中,访问某数据时优先查找高速缓存,高速缓存中没有该数据才向其他存储器查找。比如循环操作,就可以很好的利用这一特性,超多次从高速缓存中访问数据,以节省大量的访问时间。

如上图所示,虽然书上说高速缓存的具体知识需要在第6章才讲解,但是我们现在看图可以简单猜测一下,它的基本原理,应该是,CPU需要访问A数据时先到高速缓存中查找,高速缓存中已有该数据,则访问该数据,如果改写了该数据则同时改写主存储器中的该数据。而需要访问B数据时,在高速缓存中无法找到该数据,则到主存储器中查找,访问该数据并将该数据复制到高数缓存中。(个人想象,请勿参考,具体情况,第6章见)

1.6、存储设备形成层次结构

没什么好说的,就是为了省钱。不过可以看出由下至上,缓存的数据也来也少。也就是说上层存储器只会缓存下层存储器的部分数据。所以到底要缓存哪部分数据,是我们在存储层次结构中,重点研究的对象。(这同样也是第6章的内容)

1.7、操作系统管理硬件

操作系统大家都很熟悉,但是操作系统存在的最重要的价值,也许有很多人会误解。我们了解的最多的操作系统莫过于Windows,而其图形界面为用户提供了极其友好的交互体验。但是友好的交互只是类似Windows、Android这类图形界面的操作系统提供的价值。而操作系统最本质的价值有:、

*防止硬件被失控的应用程序滥用;

*向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。

如下图

属于是“一人种树,众人施肥”。在操作系统的基础上,堆砌屎山代码,可不是“施肥”吗?

皮一下(~ ̄▽ ̄)~

虽说我们使用计算机时,会用到不同厂商,不同型号的硬件设备,但是在操作系统上完全感觉不到他们除性能以外的差异,这时应为操作系统对硬件进行了抽象,将诸如:处理器、主存、I/O设备;抽象为了:进程、虚拟内存、文件,如下图。

所谓的抽象,就是将复杂的细节隐藏起来,只体现其需要的关键特征和行为,比如文件:我们创建、删除、修改文件,或多或少都会改变数据在硬盘中的起始位置和结束位置,但是数据在硬盘中的位置是我们不关心的,所以这个特征和行为就被操作系统接管了,我们看到的就只有,文件名、文件大小、文件格式等等。

1.7.3、虚拟内存

左思右想还是决定吧虚拟内存的内容提前说说,这样可以更直观的理解进程的设计思路。

上图为本人对虚拟内存的理解所画,如有错误,请务必指出。

虚拟内存并不是一段连续的物理内存,而是抽象出来的每个进程都可以相同的方式操作内存的一种设计。当然,具体实现还很复杂,这里就不多说了。(其实我也不是很了解😛)我们将这样的一个进程所使用的虚拟内存叫做虚拟地址空间

然而而,在不同的操作系统中,虚拟地址空间中的功能域划分也不尽相同。上图为Linux系统进程的虚拟地址空间的原理图。在虚拟地址空间中,所有进程的代码都是从同一固定地址开始。在图中地址是从下往上增大的。现在我们从下往上看看所有区域的大致功能:

*只读的代码和数据:这里分为俩个部分,代码、只读数据。所以这片区与是只读的,也就是说,系统监测到有操作要改写这部分的数据,是不被允许的。

*读/写数据:该部分则存放的是可读写数据,包括全局变量等。以上这两部分都是按照可执行文件的内容初始化的,所以其占用空间大小在进程一开始运行时就被指定了,且是固定的。

*堆:说到堆,一定会想到堆栈溢出,说到溢出就会想到增加,所以堆的空间是会随着程序的运行而被占用和释放的。如:C标准库的malloc函数会占用堆空间,当malloc函数申请一段内存,而段内存大于所有内存空隙时就有可能发生堆溢出。而free函数会释放堆空间,当释放的空间不是最顶部的内存时,就会产生空隙,这些空隙就被称为内存碎片。当然有向Java、Python这类面向对象的语言本身带有垃圾回收机制,程序员无需关心堆内诸如上述问题。

*共享库:包含:C标准库数学库等共享库的代码和数据,这是一个映射区域,所以所有的进程的该区域都会指向物理内存的相同位置。书上说这部分概念非常难懂,我在这也不再做过多猜测了。

*栈:堆的好基友,唯二在运行时占用和释放内存的区域,这两个区域都是运行时行为较难预测的区域,所以最容发生运行时错误。栈会在调用函数时占用空间,函数返回时释放空间,所以递归过深,至栈空间用尽会导致栈溢出。栈无需垃圾回收机制,因为它永远是先进后出的,不会产生任何空隙。

*内核虚拟内存:也就是操作系统的程序运行的区域,具体如何运行也没说,这个恐怕得看具体某个操作系统的资料了。只知道应用程序是禁止读写这个区域的,而且在上下文切换时会用到这部分中的内容。

书中原话”基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。“不是很李姐,以后再李姐吧。

1.7.1、进程

现在就比较好理解进程了吧~所谓进程,就是操作系统为一个程序虚拟出来的运行空间,操作系统可以虚拟出很多个这样的运行空间。而并发就是操作系统在不同的时间段运行不同的进程,只要这个时间段够短,短到人体察觉不出来,就能产生所有进程都在同时运行的效果。而多核CPU可以做到同一时间运行多个进程,但是只要进程数大于核心数,操作系统依然要让CPU在不同的时间段运行不同的进程,这种CPU在进程间交替执行的机制就是传说中的上下文切换。当然也少不了再上下文切换之前,系统保存该进程的当前所有状态信息,用于下次执行这个进程时恢复到离开时的状态,这种状态就是上下文。如下图

1.7.2、线程

线程的内容在本节中没有过度的讲解,并表示会在第12章中详细讲解。简单来说线程的价值体现在并行处理需求,线程是进程的执行单元,当进程内部需要并行处理时,就可以使用多线程技术。这样,即实现了并发,又保证了数据共享。虽然进程也可以并发,但是其上下文切换的开销,和数据共享的开销远超于线程。比如:在电脑上登入两个QQ时,由于这俩个QQ的数据并不共享,所以设计为两个线程。而同一个QQ进程中的消息处理、文件传输、界面更新等,都要用到本QQ号的数据,所以设计为多线程。所以进程和线程应根据需求不同而灵活运用。

1.7.4、文件

文件就是字节序列,每个I/O设备都可以看成文件。也就是说,操作系统一视同仁,将磁盘、显示器、键盘、网络等,I/O总线上的设备统一当作文件来处理。目前还不是很理解,但是第10章会讲。说到文件,就不得不说说在两个进程间数据传递。比如说,我用画图进程中画了一张图片,我想在我的游戏引擎中使用这张图片,就需要在画图进程中,把这张图片保存为这俩个进程都认可的格式的文件,如:png、jpg等。再将这个图片文件导入游戏引擎。这样就利用文件实现了不同进程间的数据传递啦~~

1.8、系统之间通过网络通信

如下图,对一个单独的系统来说,网络可视为一个I/O设备。只不过系统向网络适配器写数据时,数据流会经过网络达到另一台机器。系统也可以读取从其他机器发送来的数据,并把数据复制到主存。最常见的莫过于微信聊天啦,无论时文字、语音、视频聊天,都是将自己系统中的相应字节序列写入到网络适配器,并读取网络中其他系统发送过来的数据。至于在网络中数据如何分发,这又是一个庞大的知识群,还是只能说,有缘再见咯~~

今天就到这里吧,今天最喜欢的部分是虚拟内存和进程,是真的刷新了我对它两的认识。所以每天进步一点点,我负责勤奋,薪酬的事情交给老天,所谓的逍遥自在莫过于此吧~嘻嘻嘻嘻~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值