zoukankan      html  css  js  c++  java
  • 计算机系统第一章

    # 第一章计算机系统漫游##1.1 信息就是位+上下文

    ## 1.2程序被其他程序翻译成不同格式
     
    编译系统
    - 预处理阶段
    - 编译阶段
    - 会变阶段
    - 链接阶段
    ## 1.3了解编译系统如何工作是有大益处的
    1.优化程序性能 
    2.理解链接时出现的错误  
    3.避免安全漏洞 
    ## 1.4处理器读并解释储存在内存中的指令   
    >_1.4.1系统的硬件组成_  
    >>1. 总线:贯穿整个系统的时一组电子管道称作总线负责携带信息在各个部件之间传递。通常总线被设计成传送定长的字节块,也就是字。
    >>2. I/O设备:是系统与外部世界的联系通道。系统包括四个I/O设备:作为用户输入的鼠标键盘,作为用户输出的显示器,以及用于长期存储数和程序的键盘驱动器。I/O设备通过一个 _控制器_ 或 _适配器_ 与I/O总线项链。 
    >>3. 主存
    主存是一个临时存储设备。在处理器执行程序时,用来存放程序和程序处理的数据。物理上,主存是由一组 _动态随机存取存储器_ 芯片组成的。逻辑上存储器时一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从令开始的。
    >> 4. 处理器
    中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向竹村中的某条机器语言指令(即含有该指令的地址)。
    围绕 *主存* 、 *寄存器文件(register file)* 和 *算术/逻辑单元(ALU)* 进行。寄存器文件是一个小的存储设备,有一些单个字长的寄存器组,每个寄存器都有唯一的名字。ALU计算新的数据和地址。下面是一些简单操作的例子,CPU在指令的 要求下可能会执行这些操作:
    >>> - 加载:从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容
    >>> - 存储:从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容
    >>> - 跳转:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖PC中原来的内容。   

    > _1.4.2 运行hello程序_
        初始时,shell程序运行它的指令,等待我们输入一个指令。当我们在键盘上输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它放到内存中。当我们在键盘上敲回车键时,shell程序就知道我们已经结束了命令的输入。然后shell执行一系列指令来加载可执行的hello文件,直接指令将hello目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“hello world ”。 
        利用直接存储器村(DMA)技术,数据可以直接从磁盘到达主存。
        一旦目标文件(hello)中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。   
    ## 1.5 高速缓存至关重要
       运行hello程序时系统会花费大量时间把信息从一个地方挪到另一个地方。根据机械原理,较大的存储设备要比较小的存储设备运行得慢,而快速设备的造假远高于同类的低速设备。比如说:一个典型系统上的磁盘驱动可以比主存大1000倍,但对于处理器而言,从磁盘驱动器上读取一个字的时间开销比从主存中读取的开销大1000万倍。
    ## 1.6存储设备形成层次结构
        Page 10 图1-9
        存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。
    ## 1.7操作系统管理硬件
        操作系统的两个基本功能:(1) 防止硬件被失控的应用程序滥用 (2)向应用成需提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。
    >  _1.7.1 进程_ 进程是操作系统对一个正在运行的程序的一种抽象。在一个系统中可以同时运行多个进程,而每个进程的指令是交错执行的。在大多数系统中,需要要运行的进程是多于可以运行他们的CPU个数的。传统系统在一个时刻只能执行一个程序,而先进的 _多核_ 处理器同时能够执行多个进程。无论多核单核,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间你切换来实现的。实现这种交错执行的机制成为上下文切换。 **踪进程运行的所有状态信息,称为上下文。**
    hello示例中有shell和hello两个进程。  begin(只有shell执行等待命令行上输入)当运行hello程序是,shell通过调用一个系统调用,来执行我们的请求。系统调用会将控制权传递给操作系统。操作系统保存shell的上下文,船舰一个新的hello进程及其上下文,然后将控制权传给新的hello进程,hello进程终止后,操作系统恢复shell进程的上下文,并将控制权传回给它。
    图1-12 : 从一个进程到另一个进程的转换时由操作系统 *内核(kenel)* 管理的。内核时操作系统代码常驻主存的部分。当应用程序需要哦操作系统的某些曹祖时,eg:读写文件,它就执行一条特殊的系统调用指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。  !!! 内核不是一个独立的进程,他是系统管理全部进程所用代码和数据结构的集合。  

    >_1.7.2 线程_ : 尽管通常认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为 *线程* 的执行单元组成。每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

    >_1.7.3 虚拟内存_ :虚拟内存是一个抽象化的概念,它为每个进程提供了一个假象,即每个进程都在独占的使用主存。每个进程看到偶的内存都是一致的,成为虚拟地址空间。虚拟地址空间中,**地址时从下往上增大的**,且每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。
    从低向上介绍区:
      - 程序代码和数据。对所有进程来说,代码是从同一固定地址 开始,紧着这的是和C全局变量相对应的数据位置。代码和数据区是直接按照可执行目标文件内容初始化的。
      - 堆。 代码和数据区后纪念接着的是运行时堆。代码和数据区在进程一开始时就会被制定了大小,与此不同,当掉偶用像malloc和free这样的C标准库函数时,堆可以在运行时动态的扩展和收缩。
      - 共享库。 大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样的共享库的代码和数据的区域。共享库的概念非常强打,也相当难懂。
      - 栈。 位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态的扩展和收缩。特别的,每次我们调用一个函数时,栈就会增长;从一个函数返回时,站就会收缩。
      - 内核虚拟内存。 地址空技安顶部的区域时为内核保留的。不允许应用程序读写这个区域的内容或者直接调用内核定义的函数。相反,他们必须调用内核来执行这些操作。
    > _1.7.4 文件_ :文件就是**字节序列**,仅此而已。每个I/O设备,包括磁盘、键盘、显示器、甚至网络,都可以看成是文件。系统中的所有输入都是通过使用一小组称为UnixI/O的系统函数调用读写文件来实现的。
     
        ==================================================================================







  • 相关阅读:
    05:背景设置
    04:文本 + 字体
    03:CSS三大特性
    02:Emmet 语法 + Ps切图
    01:基本概念 + 引入CSS
    input禁止输入的方法
    十进制转换成任意进制(栈的应用)
    假定一个解并判断是否可行(二分搜索应用)
    关于二分查找和二分搜索
    统计单词
  • 原文地址:https://www.cnblogs.com/oBYBo/p/10515544.html
Copyright © 2011-2022 走看看