zoukankan      html  css  js  c++  java
  • 深入理解计算机系统(2)--计算机系统漫游

    这一节的内容有些枯燥,很多内容都是文字描述。但是对于后续的学习是有帮助的,一些概念提前有个简单的了解多少会有些帮助。

    这一节的学习内容都是一些概念和知识的简要介绍,没有过多地深入,旨在为后续学习做个铺垫。

    高速缓存

    上文最后部分提到,计算机内部运行程序时,用到了很多复制的操作,此处为链接。从程序员的角度来说,这些复制操作就是开销,占用了程序运行的一部分时间。因此,系统设计者的一个主要目标就是减少这些复制操作所用的时间。

    根据机械原理,容量大的设备要比容量小的设备运行速度慢。磁盘可能比主存大1000倍,但就处理器而言,对主存存取数据的时间开销要比对磁盘小1000万倍。主存和寄存器之间也有类似的结论。于是人们想出一种方法:在处理器和一个又大又慢的设备(例如主存)之间插入一个更小更快的存储设备(主要是高速缓存)。实际上,每个计算机系统中的存储设备都被组织成了一个存储器层次结构。如下图所示


    在这个结构中,从上到下,设备容量越来越大,运行速度越来越慢,同时造价也越来越便宜。
    存储器层次结构的主要思想是上一层的存储器作为下一层存储器的高速缓存。上图中顶层的寄存器是L1的高速缓存,L1是L2的高速缓存,以此类推。
    从这个角度讲,程序员可以利用对整个存储器层次结构的理解来提高程序的性能。

    操作系统管理硬件

    计算机系统的分层视图如下所示


    可见,是操作系统进行对硬件的管理,并与应用程序进行交互。

    以hello程序为例,当shell加载和运行hello world程序,以及由该程序输出消息时,shell和hello程序都没有直接访问键盘、内存和磁盘、显示器。它们只是使用了操作系统提供的服务。操作系统是应用程序和硬件的“中间人”,负责管理硬件,并给应用程序提供接口,所有应用程序对硬件的操作尝试都要经过操作系统。
    操作系统有两个基本功能:

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

    向应用程序提供简单一致的机制来控制复杂的低级硬件设备。

    操作系统通过几个抽象的基本概念(进程、虚拟存储器和文件)来实现以上两个基本功能。如下图所示,


    图中,文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程是对处理器、主存和I/O设备的抽象表示。(再高一级就是虚拟机,把操作系统也进行了抽象表示)

    下面分别介绍这几个基本概念。

    进程

    像hello这样的程序在现代操作系统上运行时,操作系统会提供一种假象,即好像操作系统上只有这个程序在运行,只有这个程序在使用处理器、主存和I/O设备。这种假象是通过进程的概念来实现的。
    进程是操作系统对正在运行的程序的一种抽象。一个系统上可以同时运行多个进程,每个进程好像独占的使用硬件。所谓并发,是说一个进程的指令和另一个进程的指令交错执行。操作系统实现这种交错执行的机制称为上下文切换。
    操作系统跟踪进程运行所需的所有状态信息(也就是上下文),任何一个时刻,处理器只能运行一个进程。当操作系统决定要把控制权从当前进程转移到一个新进程时,就要进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权转交给新进程,新进程就从上次停止的地方开始执行。以hello程序为例,并发的过程如下所示


    图中有两个并发的进程:shell(进程A)和hello程序(进程B)。起初只有shell程序在运行,等待命令输入;当我们让它运行hello程序时,shell通过调用一个专门的函数(系统调用)来执行我们的请求;系统调用将控制权交给操作系统,操作系统保存shell进程的上下文,创建hello进程及其上下文,然后将控制权转交给hello进程;hello进程终止后,操作系统回复shell进程的上下文,把控制权转交给它,然后shell进程继续等待下一条命令输入。

    线程

    在现代操作系统中,一个进程可以由多个称为线程的执行单元组成。每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。后续会详细讨论。

    虚拟存储器

    虚拟存储器为每个进程提供了一个假象,好像每个进程在独占的使用内存。每个进程看到的是一致的存储器,称为 虚拟地址空间。如图所示为Linux进程的虚拟地址空间,


    图中地址从下往上是增大的。这里先简单了解一下每个区(从下往上)。

    程序代码和数据:对于所有的进程来说,代码是从同一固定地址开始,紧接着的是和C全局变量对应的数据位置。代码和数据区是直接按照可执行目标文件的可执行内容进行初始化的,这里 也就是hello程序。
              堆          :代码和数据区后紧随着运行时堆。代码和数据区是在进程一开始运行时就固定了大小,而堆可以在运行时动态地扩展和收缩。
           共享库      :大约在地址空间的中间位置放置像C标准库和数学库等共享库的代码和数据。
               栈         :位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现系统调用。与堆一样,运行时栈的大小可动态地扩展收缩。
    内核虚拟存储器:内核总是驻留在内存中,是操作系统的一部分。

    文件

    文件就是字节序列。每个I/O设备都可以视为文件。

    系统之间的网络通信

    从单个系统来看,网络就相当于一个I/O设备。如下图所示


    系统从主存复制一些字节到网络适配器,数据流经过网络到达另一台机器。相似地,系统也可以读取其他机器的数据,复制到自己的主存上去。
    以hello程序为例,利用telnet通过网络远程运行hello程序的过程,如下图所示


    以上就是本次的学习总结,后面的记录将会更加深入的学习每一部分。


    为API生,为框架死,为debug奋斗一辈子,吃符号亏,上大小写的当,最后死在需求上。
  • 相关阅读:
    Time Zone 【模拟时区转换】(HDU暑假2018多校第一场)
    HDU 1281 棋盘游戏 【二分图最大匹配】
    Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】
    Codeforces Round #527 (Div. 3) D2. Great Vova Wall (Version 2) 【思维】
    Codeforces Round #527 (Div. 3) D1. Great Vova Wall (Version 1) 【思维】
    Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】
    Avito Cool Challenge 2018 E. Missing Numbers 【枚举】
    Avito Cool Challenge 2018 C. Colorful Bricks 【排列组合】
    005 如何分析问题框架
    004 如何定义和澄清问题
  • 原文地址:https://www.cnblogs.com/hitfredrick/p/6403018.html
Copyright © 2011-2022 走看看