深入理解计算机系统(1.3)---金字塔形的存储设备、操作系统的抽象概念

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer3.html

上一章LZ给各位展示了一下hello程序的简单执行过程,可以看出在这一过程当中,系统在数据的传输上花费了大量的时间。硬件开发商为了减少这种数据传输的时间成本,采用一种高速缓存的技术去减少这种时间成本。

高速缓存被置放于处理器当中,与处理器中的寄存器文件直接进行数据交换,这样大大减少了数据传输的时间成本,使得程序的运行速度可以得到数倍的提升。而作为一个程序猿,如果可以适当的利用高速缓存去存放一些程序运行过程中可能会经常使用的数据,可以将程序的运行速度提高数倍甚至数个数量级。

由此就可见高速缓存的重要性,下图展示了硬件分布中,高速缓存的位置。

存储设备的金字塔

当今的计算机系统当中,基本上全部都置入了各种各样的存储设备,这些存储设备呈明显的层次结构,它们的特点是容量越大,速度越慢。因此如果按照容量和速度将它们以图示的方式呈现的话,则看起来就像是一个金字塔,如下所示。

不过这个图是英文版的,LZ稍微解释下,有些特别明显的LZ就不解释了,如果有哪位猿友实在不明白,可以到LZ的群里提问。

左边的意思是更小更快更贵的存储设备,包括寄存器以及L1-L3的高速缓存,以及更大更慢更便宜的存储设备,包括主存、本地磁盘以及远程存储设备。通常意义下,我们将上一层的存储设备作为当前存储设备的高速缓存,比如L1的高速缓存是寄存器,L2的高速缓存是L1,以此类推。

操作系统是硬件的manager

操作系统是帮我们操控硬件的软件,它就像是应用程序与硬件的中间者,在两者之间扮演一个协调、管理的角色。它们的关系如下图。

操作系统提供了几个我们熟悉的概念去表示硬件设备,比如进程、虚拟存储器、文件。它们表示的硬件设备如下图所示。

可以看出文件是对I/O设备的抽象描述,而虚拟存储器是对主存和I/O设备的统称,最后,一个进程在此基础上又加入了处理器。

进程

进程是操作系统对一个正在运行的程序的抽象。操作系统会记录每一个进程的状态,这些状态就称作进程的上下文。这些状态主要包括了PC,寄存器以及主存的当前内容。当操作系统在进程间切换的时候,也会切换相应的上下文,从而保证进程恢复到之前的状态。

在进程当中,又被计算机界的大神们引入了线程的概念,这些线程可以共享进程级的代码与数据,这种共享一般比进程间的共享更加高效。

虚拟存储器

虚拟存储器是一种抽象描述,从物理上讲,它包含了I/O设备以及主存。在逻辑上讲,虚拟存储器被描述为虚拟地址空间。下图为进程的虚拟地址空间表示。

这里的地址自下向上依次增大,可以看出,图中标注了起始地址,分别为0x08048000(32位)以及0x00400000(64位),然后向上分别是只读代码和数据、读写数据、运行时堆、共享库的内存映射区间、用户栈以及内核虚拟内存区域

看完这个图,LZ有一个疑问,就是这两个32位和64位的起始地址是从何而来,于是小小的简单探索了一下。

LZ在32位的linux系统上做了个测试,我们随便写一个C程序,然后使用GCC加上参数-Wl,--verbose去编译这个文件,于是我们便可以在链接器脚本里看到这些内容。如下图所示。

在里面我们可以看到0x08048000这个内存地址,__executable_start表面看来的意思是可执行的起始位置。具体这个数字的来由LZ没有找到,我们可以先存着这个疑问,或许在书中后面的内容会解答这个疑问。(小提示:有些东西一时搞不明白,不要沉迷于此,会得不偿失)

从这个地址向上则分了大致五个存储区域。

程序代码和数据:这些内容的起始地址就是0x08048000,首先是代码,然后是一些全局变量。

:是运行时可以动态扩展的一部分内存区域,它可以由malloc和free这样的标准库函数操作。

共享库:用于存放共享库的代码和数据。

:在用户虚拟地址空间的顶部是栈,这部分区域与函数的执行有密切的关系。

内核虚拟存储区域:内核是操作系统的一部分,就LZ粗浅的理解,内核也可以看做是一个进程,它在计算机运行期间总是在运行着,因此这部分内存区域对用户程序是不可见的,通俗的说就是不能用。

文件

文件是I/O设备逻辑上的概念,它其实就是字节序列,也就是1和0组成的一些信息。因此所有的I/O设备,包括磁盘、键盘、鼠标、显示器都可以看成是文件。

网络

前面说了,所有的I/O设备其实都是文件这一抽象概念的具体表现,那么网络其实也是文件的一种,因为说到底,它也可以被看做是一系列的字节序列。网络适配器的作用就是给计算机输入一堆被传送过来的字节序列,这里面可能包括图片、文字,甚至可能是代码等等。

文章小结

本文主要介绍存储设备的层次以及操作系统中的三个抽象概念,下一章是并发与并行的简单介绍,也是计算机简介的最后一章。

时间: 2024-07-28 13:34:31

深入理解计算机系统(1.3)---金字塔形的存储设备、操作系统的抽象概念的相关文章

金字塔形的存储设备,操作系统的抽象概念

系统在数据的创书上花费了大量的时间.硬件开发商(主要是那个做存储介质的人)为了减少这种数据传输的时间成本,此阿勇了以中高速缓存的技术去减少这种时间成本. 高速缓存被置放于处理器中,与处理器中寄存器文件直接进行数据交换,这样大大较少了数据传输的时间成本,使得程序的运行速度可以得到数倍的提升.作为一个搞电脑的,入股可以适当的利用高速缓存去存放一些程序运行过程中常用的数据,可以将程序的运行速度提高数倍甚至数个数量级. 你回想一下在网页中,你第一个打开一个网页,可能很慢,但是当你打开第二次的时候,可能快

深入理解计算机系统(1.2)------存储设备

上一章我们讲解了hello world 程序在计算机系统中是如何运行的. hello 程序的机器指令最初是存放在磁盘上的,当程序加载时,他们被复制到主存:当处理器运行程序的时候,指令又从主存复制到处理器.相似的,数据串"Hello World" 初始时在磁盘上,然后复制到主存,最后从主存上复制到显示设备. 从程序员的角度来看,上面的复制就是开销,减缓了程序的真正工作.因此如何将这些复制操作尽快完成则是系统设计者的一个主要目标. 1.从磁盘加载可执行文件到主存 2.将输出字符串从内存写到

深入理解计算机系统之旅(一)计算机系统漫游

1.计算机系统是什么? 我们直观的可以看到的计算机系统就是一台电脑,包括主机.显示器.键盘鼠标,然后显示器上会显示不同界面,用鼠标点击,键盘输入界面就会相应操作. 2.深入一点,他们是如何工作的? 计算机系统是由硬件和系统软件组成,它们共同工作来运行应用程序. 3.再深入一点,硬件是什么?系统软件是什么?应用程序是什么? 硬件是组成计算机系统的基础,大家耳熟能详的就是CPU.内存.硬盘.主板等. 系统软件是运行在硬件之上的一层控制软件,就是我们经常听到的Windows XP.WIN7.Linux

深入理解计算机系统 1.4 处理器读取和解释存储在内存中的指令

到如今,我们的hello.c源程序已经已经被编译系统翻译为可运行对象文件了,这个可运行对象文件叫做hello,被存储在磁盘上.为了在Unix系统上运行可运行文件,我们在一个叫做shell的应用程序中输入它的名字: unix> ./hello hello, world unix> shell程序是一个命令行解释器,它打印出一条提示,等着你输入一条命令行.然后运行命令.如果输入的命令行的第一个单词没有匹配到内建的shell命令.那么shell如果这个单词是一个可运行文件的名字.这个文件应该被载入进

深入理解计算机系统,第一章:漫游

计算机系统漫游 1.1 信息就是位+上下文 先看一个简单的Hello World C程序. 1 #include <stdio.h> 2 3 void main() 4 { 5 printf("Hello World!\n"); 6 } 这个程序的源文件是文本格式,以字节序列的方式存储在文件中,由一种叫ASCII码的方式编码.除了文本文件之外的其它文件都是二进制文件. 由HelloWorld程序的存储方式可以猜测,信息,包括磁盘文件.内存中运行的程序.内存中储存的用户数据以

《深入理解计算机系统(原书第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础.主要更新如下: 基于x86-64,大量地重写代码,首次介绍对处理浮点数据的程序的机器级支持. 处理器体系结构修改为支持64位字和操作的设计. 引入更多的功能单元和更复杂的控制逻辑,使基于程序数据流表示的程序性能模型预测更加可靠. 扩充关于用GOT和PLT创建与位置无关代码的讨论,描述了更加强大的链接技术(比如库打桩). 增加了对信号处理程序

《深入理解计算机系统》第六周学习笔记

第四章 处理器体系结构 (一)知识点总结 一.Y86指令集体系结构 1.Y86处理器状态类似于IA32,有8个程序寄存器: %eax.%ecx.%edx.%ebx.%esi.%edi.%esp.%ebp.处理器的每个程序寄存器存储一个字.%esp被入栈.出栈.调用和返回指令作为栈指针. 2.3个一位的条件吗:ZF.SF.OF,它们保存最近的算术或逻辑指令所造成影响的有关信息.程序计数器PC存放当前正在执行指令的地址. 3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态 4.Y8

深入理解计算机系统(4.2)---硬件的魅力

引言 这个系列已经很久没更新了,记得上一篇博文已经是三月份了,实在是抱歉.最近业余时间没有以前充裕了,因此更新一篇博文已经变成了一种奢侈.记得以前刚开始写的时候,最多的时候LZ一天写过3篇博文,现在想想,往事如梦. 好了,好不容易写一次,就不多说废话了,本文主要介绍一下硬件以及HCL语言的内容. 从疑问开始 首先,在介绍本文的内容之前,我们先来思考一个看似简单,却实际比较“高深”的问题.众所周知,计算机归根结底是在和0.1打交道,那么到底0和1是如何被计算机记住的呢? 怎么样,这个问题是不是有点

深入理解计算机系统(3)

深入理解计算机系统(3) 本文我们主要讲关于数据的的表示方式:原码,反码和补码. 本文在写作过程中,参考了园中的这篇文章<原码,反码,补码详解>,特此声明. 一原码 计算机中是使用二进制来表示数据的,对于C语言这样的强类型语言,每一个数值类型,都有其范围,例如一个int类型,在32位机器上,其表示的范围如下: 最小值 最大值 有符号整数 -2147483648 217483647 无符号整数 0 4294967295 而如果我们定义了一个int类型,给其的赋值,超出了这个范围,则会出现问题.一