上一篇博客咱们讲解了存储设备的层次结构,并具体讲解了高速缓存的原理,以及能够运用高速缓存来进步程序功用。假如对Java Web 了解的,咱们能够了解高速缓存相似Web 端的缓存机制。那么这一篇博客咱们来引出并谈谈操作体系的笼统概念。

1、操作体系

  首先接着来讨论 hello world 程序的比方。当外壳加载和运转 hello 程序,以及 hello 程序输出自己的消息时,外壳和 hello 程序都没有直接访问键盘、显示器、磁盘或者主存。取而代之的是,它们依靠操作体系供给服务。

  那么什么是操作体系呢?咱们能够把操作体系看成应用程序和硬件之间插入的一层软件,如下图:

深入理解计算机系统(1.3)------操作系统的抽象概念
  如图可知:一切的应用程序对硬件的操作都必须经过操作体系。常见的操作体系比方windows、Unix、Linux等等。

  操作体系的两个基本功用:

  ①、避免硬件被失控的应用程序乱用。

  ②、向应用程序供给简单共同的机制来控制复杂而又大相径庭的初级硬件设备。

  咱们能够经过进程、虚拟存储器和文件这几个笼统概念来完成上面两个功用。

深入理解计算机系统(1.3)------操作系统的抽象概念
  如上图:文件是对I/O设备的笼统表明,虚拟存储器是对主存和磁盘I/O设备的笼统表明,进程则是对处理器、主存和I/O设备的笼统表明。下面咱们分别对其进行介绍。

2、进程

  当咱们去运转 hello 程序的时候,操作体系会给我供给一种假象,就好像体系只要这个程序在运转。处理器看上去就像在不间断的一条接着一条地履行程序中的指令,即该程序的代码和数据是体系存储器中唯一的目标。

  这其实是一种假象,而这种假象是经过进程的概念来完成的。

  进程是操作体系对一个正在运转的程序的一种笼统,在一个体系上能够运转多个进程,而每个进程都好像在独占的运用硬件。但实际上,他们是并发的在运转,即一个进程的指令和另一个进程的指令是交织运转的。

  在单CPU体系中,体系在一个时刻只能运转一个进程,多CPU体系中,体系则是能够一起处理多个进程。但无论是单核还是多核,一个CPU只能并发的履行多个进程,这是经过处理器在进程间切换来完成的。而操作体系完成这种交织机制称为上下文切换。

  上下文:操作体系保持跟踪进程运转所需的一切状况信息,比方PC和寄存器文件的当时值,主存的内容。

深入理解计算机系统(1.3)------操作系统的抽象概念
  比方上面的A进程是外壳进程,B进程是hello进程。起初只要外壳进程在运转,即等待指令行上的输入,当咱们输入相关指令让它运转hello程序时,外壳经过调用一个专门的函数,即体系调用,来履行咱们的恳求,体系会将控制权传递给操作体系。操作体系保存外壳程序的上下文,创建一个新的 hello 进程以及上下文,然后将控制权传递给新的 hello 进程。hello 进程终止后,操作体系恢复外壳进程的上下文,并将控制权回传给它,外壳程序将继续等待下一个指令行输入。

  完成进程这种笼统概念需求初级硬件和操作体系软件之间的严密协作,这个完成原理以及应用程序怎么创建和控制它们的进程的呢?作为程序员的视点,这儿咱们讲一下,一个进程实际上是由多个称为线程的履行单位构成,每个线程都运转在进程的上下文中,并同享同样的代码和大局数据,多线程比进程高效,多线程更简单同享数据。怎么并发编程进步程序功率的关键后面咱们会具体讲解。

3、虚拟存储器

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

深入理解计算机系统(1.3)------操作系统的抽象概念
  在Linux体系中,地址空间最上面的区域是为操作体系中的代码和数据保留的,这对一切进程是共同的。地址空间的底部区域寄存用户进程界说的代码和数据。上图的地址从下往上是增大的。

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

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

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

  ③、同享库:寄存像C规范库和数据库这样的代码和数据的区域。

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

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

  关于一切进程代码是从同一固定地址开端的,这儿咱们做个验证,咱们在 Linux 64位体系上,在寄存hello.c程序的目录下输入如下指令:运转前面写好的 hello.c 程序,并检查地址信息

gcc -Wl,–verbose hello.c

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

4、文件

  文件便是字节序列,即由值0和值1组成的序列。一切的I/O设备,包含磁盘、键盘、鼠标、显示器都能够看成是文件。

  文件这个简单而精美的概念向应用程序供给了一个一致的视觉来看待体系中一切的I/O设备。这带来的优点清楚明了,比方同一个程序能够运用不同磁盘技能的不同体系运转。

5、计算机体系中笼统的重要性

  笼统的运用是计算机科学中最重要的概念之一。例如,为一组函数规定一个简单的应用程序接口API便是一个很好的编程习惯。程序员无需了解它内部的工作原理便能够运用这些代码。这在Java傍边的典型比方类的界说,C语言中的函数原型。

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

6、本章总结

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

  那么深入了解计算机体系第一章计算机体系的周游将到此结束。假如又不太了解的也没关系,毕竟前面讲的都是一些概念,后面咱们将会具体讲解。而下一章信息的表明和处理,可能是与咱们日常编码最附近的东西,各种数据类型在计算机总是怎么存储,它们之间做运算会有什么意想不到的成果等等。假如好好了解了,信任在后面的编码会愈加得心应手。