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

1、操作系统

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

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

  

  如图可知:所有的应用程序对硬件的操作都必须通过操作系统。常见的操作系统比如windows、Unix、Linux等等。

  操作系统的两个基本功能:

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

  ②、向应用程序提供简单一致的机制来控制复杂而又大相径庭的低级硬件设备。

  我们可以通过进程、虚拟存储器和文件这几个抽象概念来实现上面两个功能。

  

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

2、进程

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

  这其实是一种假象,而这种假象是通过进程的概念来实现的。

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

  在单CPU系统中,系统在一个时刻只能运行一个进程,多CPU系统中,系统则是能够同时处理多个进程。但无论是单核还是多核,一个CPU只能并发的执行多个进程,这是通过处理器在进程间切换来实现的。而操作系统实现这种交错机制称为上下文切换。

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

  

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

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

  

3、虚拟存储器

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

  

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

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

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

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

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

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

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

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

1
gcc -Wl,--verbose hello.c

  

4、文件

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

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

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

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

  

6、本章总结

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

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

转载于:https://www.cnblogs.com/ghjbk/p/7602877.html

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

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

    本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer3.html 上一章LZ给各位展示了一下hello程序的简单执行过程,可以看出在这一过程当中,系 ...

  2. 计算机设备抽象,计算机系统原理(三) 金字塔形的存储设备、操作系统的抽象概念...

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

  3. 计算系统和计算机系统是同一个概念嘛,计算机操作系统的基本概念

    计算机操作系统的基本概念 5.操作系统操作 *双重模式操作*: 为了确保操作系统地正常执行,必须区分操作系统代码和用户定义代码的执行.许多操作系统所采取的方法是提供硬件支持以允许区分各种执行模式. 至 ...

  4. 【❌❌深入浅出,九浅一深⭕⭕】《深入理解计算机系统》CSAPP

    <计算机系统基础>30' 一.处理器的时序电路 1.CPU中的时序电路 答: CPU中的时序电路:通过RS触发器控制CPU的时序. 2.单周期处理器的设计 答: CPU在处理指令时,一般需 ...

  5. 贯穿计算机系统所有方面的重要概念,终于有人讲明白了

    导读:我们在此强调几个贯穿计算机系统所有方面的重要概念.我们会在本文多处讨论这些概念的重要性. 作者:Randal E. Bryant,David R. O'Hallaron 来源:华章计算机(hzb ...

  6. 《深入理解计算机系统》CSAPP

    <计算机系统基础>30' 一.处理器的时序电路 1.CPU中的时序电路 答: CPU中的时序电路:通过RS触发器控制CPU的时序. 2.单周期处理器的设计 答: CPU在处理指令时,一般需 ...

  7. 深入理解计算机系统1——计算机系统漫游

    计算机系统漫游 计算机系统=硬件+系统软件构成的. 它们共同工作来运行应用程序.系统的具体实现方式随时间变化,但是系统的内在概念却没有改变. 深入了解计算机系统的组件如何影响程序的正确性和性能. == ...

  8. 【送两本】计算机领域神书《深入理解计算机系统》

    作者:Randal E. Bryant,David R. O'Hallaron 来源:华章计算机(hzbook_jsj) 文末送两本<深入理解计算机系统>第三版,包邮. <深入理解计 ...

  9. 如何阅读《深入理解计算机系统》

    作者:Randal E. Bryant,David R. O'Hallaron 来源:华章计算机(hzbook_jsj) <深入理解计算机系统>(简称CS:APP)的主要读者是计算机科学家 ...

  10. 深入理解计算机系统(CSAPP)读书笔记 第一章

    第1章 计算机系统漫游 1.1 信息就是位+上下文 系统中所有的信息--包括磁盘文件.内存中的程序.内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的.区分不同数据对象的唯一方法是我们读到 ...

最新文章

  1. Vue - class与style绑定
  2. 如何处理 Windows Phone 8 动态砖变成黑白砖
  3. linux命令wget多个参数,wget 命令参数使用方法
  4. 速查mysql数据大小
  5. 浅说深度学习(4):增强学习
  6. Optional 是个好东西,你会用么?| 原力计划
  7. DataTable.ImportRow()与DataTable.Rows.Add()的区别
  8. Linux 信号(signal)
  9. 基于简单的路径压缩的并查集算法
  10. 《Linux运维实战:免费md5解密工具》
  11. 机器学习基础-特征工程简析
  12. 奇妙的定律、理论、原则、效应、...(Amazing Laws,Theories,Principles,Effects,...)
  13. Scene Graph Generation by Iterative Message Passing
  14. R数据挖掘 第五篇:分类(kNN)
  15. 解释下ArrayList集合为啥允许值为null
  16. matplotlib plot pie
  17. office办公软件之ppt视频录制
  18. CRX文件转.O文件(.d文件转换成.o文件)
  19. JAVA + 百度地图API 应用
  20. 查看文章影响因子的插件_你的pubmed又不能显示影响因子了,因为 ……

热门文章

  1. 七、K8s volume相关操作
  2. 如何获取系统Home(Launcher)应用判断用户是否处于home界面
  3. Android 用户可以直接在搜索页面上安装 app 了
  4. 算法基础练习--最大公约数和最小公倍数
  5. [HTML5和Flash视频播放器]Video.js 学习笔记(一 ) HLS库:videojs-contrib-hls
  6. JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题
  7. 9--Rails数据交互1
  8. Log4J 日志的异步类解读(lAsyncAppender)
  9. e class connect.php,帝国CMS6.6程序剖析——e/class/connect.php
  10. c语言数组字节偏移,C语言数组中的地址偏移问题