深刻理解计算机系统(1.3)------操做系统的抽象概念

  上一篇博客咱们讲解了存储设备的层次结构,并详细讲解了高速缓存的原理,以及能够利用高速缓存来提升程序性能。若是对Java Web 熟悉的,咱们能够理解高速缓存相似Web 端的缓存机制。那么这一篇博客咱们来引出并谈谈操做系统的抽象概念。java

 

一、操做系统

  首先接着来讨论 hello world 程序的例子。当外壳加载和运行 hello 程序,以及 hello 程序输出本身的消息时,外壳和 hello 程序都没有直接访问键盘、显示器、磁盘或者主存。取而代之的是,它们依靠操做系统提供服务。程序员

  那么什么是操做系统呢?咱们能够把操做系统当作应用程序和硬件之间插入的一层软件,以下图:数据库

  

  如图可知:全部的应用程序对硬件的操做都必须经过操做系统。常见的操做系统好比windows、Unix、Linux等等。编程

  操做系统的两个基本功能:windows

  ①、防止硬件被失控的应用程序滥用。缓存

  ②、向应用程序提供简单一致的机制来控制复杂而又截然不同的低级硬件设备。多线程

  咱们能够经过进程、虚拟存储器和文件这几个抽象概念来实现上面两个功能。并发

  

 

   如上图:文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。下面咱们分别对其进行介绍。函数

 

二、进程

   当咱们去运行 hello 程序的时候,操做系统会给我提供一种假象,就好像系统只有这个程序在运行。处理器看上去就像在不间断的一条接着一条地执行程序中的命令,即该程序的代码和数据是系统存储器中惟一的对象。性能

  这实际上是一种假象,而这种假象是经过进程的概念来实现的。

  进程是操做系统对一个正在运行的程序的一种抽象,在一个系统上能够运行多个进程,而每一个进程都好像在独占的使用硬件。但实际上,他们是并发的在运行,即一个进程的指令和另外一个进程的指令是交错运行的。

  在单CPU系统中,系统在一个时刻只能运行一个进程,多CPU系统中,系统则是可以同时处理多个进程。但不管是单核仍是多核,一个CPU只能并发的执行多个进程,这是经过处理器在进程间切换来实现的。而操做系统实现这种交错机制称为上下文切换。

  上下文:操做系统保持跟踪进程运行所需的全部状态信息,好比PC和寄存器文件的当前值,主存的内容。

  

  好比上面的A进程是外壳进程,B进程是hello进程。起初只有外壳进程在运行,即等待命令行上的输入,当咱们输入相关命令让它运行hello程序时,外壳经过调用一个专门的函数,即系统调用,来执行咱们的请求,系统会将控制权传递给操做系统。操做系统保存外壳程序的上下文,建立一个新的 hello 进程以及上下文,而后将控制权传递给新的 hello 进程。hello 进程终止后,操做系统恢复外壳进程的上下文,并将控制权回传给它,外壳程序将继续等待下一个命令行输入。

  实现进程这种抽象概念须要低级硬件和操做系统软件之间的紧密合做,这个实现原理以及应用程序如何建立和控制它们的进程的呢?做为程序员的角度,这里咱们讲一下,一个进程其实是由多个称为线程的执行单位构成,每一个线程都运行在进程的上下文中,并共享一样的代码和全局数据,多线程比进程高效,多线程更容易共享数据。如何并发编程提升程序效率的要点后面咱们会详细讲解。

  

三、虚拟存储器 

   虚拟存储器是一个抽象概念,它为每一个进程提供了假象,即每一个进程都在独占的使用主存。每一个进程看到的是一致的存储器,称为虚拟地址空间。下图是 Linux 进程的虚拟地址空间(其余Unix 系统设计相似):

  

  在Linux系统中,地址空间最上面的区域是为操做系统中的代码和数据保留的,这对全部进程是一致的。地址空间的底部区域存放用户进程定义的代码和数据。上图的地址从下往上是增大的。

  咱们从最低的地址,逐步向上介绍上面出现的区域名词。

  ①、程序代码和数据:对于全部进程来讲,代码是从同一固定地址开始的,分别为0x08048000(32位)以及0x00400000(64位),紧接着是全局变量相对应的数据位置。

  ②、堆:代码和数据区后紧随的是运行时堆。代码和数据区是在进程一开始运行时就规定了大小,而当调用malloc和free这样的 C 标准库函数 时,堆能够在运行时动态的扩展和收缩。

  ③、共享库:存放像C标准库和数据库这样的代码和数据的区域。

  ④、栈:位于用户虚拟地址空间顶部,编译器用它来实现函数调用,用户栈在程序执行期间能够动态的扩展和收缩。当咱们调用一个函数时,栈会增加;从一个函数返回时,栈会收缩。

  ⑤、内核虚拟存储器:内核老是驻留在内存中,是操做系统的一部分,不容许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。

   关于全部进程代码是从同一固定地址开始的,这里咱们作个验证,咱们在 Linux 64位系统上,在存放hello.c程序的目录下输入以下命令:运行前面写好的 hello.c 程序,并查看地址信息

gcc -Wl,--verbose hello.c

  

 

四、文件

  文件就是字节序列,即由值0和值1组成的序列。全部的I/O设备,包括磁盘、键盘、鼠标、显示器均可以当作是文件。

  文件这个简单而精致的概念向应用程序提供了一个统一的视觉来看待系统中全部的I/O设备。这带来的好处显而易见,好比同一个程序可使用不一样磁盘技术的不一样系统运行。

 

五、计算机系统中抽象的重要性

  抽象的使用是计算机科学中最重要的概念之一。例如,为一组函数规定一个简单的应用程序接口API就是一个很好的编程习惯。程序员无需了解它内部的工做原理即可以使用这些代码。这在Java当中的典型好比类的定义,C语言中的函数原型。

  

 

六、本章总结

  本章主要介绍了抽象概念在计算机系统中的重要性以及操做系统的抽象概念,包括进程、虚拟存储器以及文件。

  那么深刻理解计算机系统第一章计算机系统的漫游将到此结束。若是又不太理解的也不要紧,毕竟前面讲的都是一些概念,后面咱们将会详细讲解。而下一章信息的表示和处理,多是与咱们平常编码最相近的东西,各类数据类型在计算机老是如何存储,它们之间作运算会有什么意想不到的结果等等。若是好好理解了,相信在后面的编码会更加驾轻就熟。

相关文章
相关标签/搜索