第一章计算机系统漫游

概述

	计算机系统是由硬件和软件组成的
	一个最基本的c语言程序:
		#include<stdio.h>
				
		int main()
		{
			printf("hello world");
			return 0;
		}

1.信息就是位+上下文

  1. hello程序的生命周期是从一个源程序开始的,即程序员通过编辑器创建并保存的文本文件,文件名是hello.c。源程序实际上就是一个由值0和1组成的位(又称为比特)序列,8个位被组成一组,称为字节。
  2. Hello.c程序是以字节序列的方式储存在文件中的。每个字节都有一个整数值,对应于某些字符。例如,第一个字节的整数值是35,它对应的字符是"#"。每个文本行都是以一个看不见的换行符’\n’来结束的,它对应的整数值为10。像hello.c只由ASCII字符构成的文件称为文本文件,所有的其他文件称为二进制文件
  3. Hello.c的表示方法说明:系统中的所有信息------包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同对象的唯一的方法是我们读到这些这些数据对象时的上下文。

2.程序被其他程序翻译成不同的格式

  1. 为了在系统上能够运行hello.c程序,每条c语句都必须被其他程序转化为低级语言指令,然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制的磁盘文件的形式存放起来。目标程序也成为可执行目标文件。

  2. 从源文件向目标文件的转换是由编译器的驱动程序完成的

  3. 从源文件到目标文件转换需要四个步骤:

    1. 预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的c程序。比如#include<stdio.h>就是告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入到程序文本中,得到另一个c程序,以.i为扩展名
    2. 编译阶段:编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序
    3. 汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.c中。
      链接阶段:printf函数存在于一个名为printf.o单独编译好的文件中,这个文件要合并到hello.o程序中,链接器(ld)负责处理这种合并。结果就得到了hello文件,他是一个可执行的目标文件。
      在这里插入图片描述

3.了解编译系统如何工作是大有益处的

		1. 优化程序性能
		2. 理解链接时出现的错误
		3. 避免安全漏洞

4.处理器读并解释储存在内存中的指令

要在Unix系统上运行可执行文件,应将文件名输入到称为shell的应用程序中。shell是一个命令解释器,它输出一个提示符, 等待输入一个命令行,然后执行这个命令。如果该命令的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件。

  1. 系统的硬件的组成
    1. 总线
      总线,是贯穿整个系统的一组电子管道,它携带信息字并负责在各个部件间信息传递。通常总线被设计成传送定长的字节块,也就是字。
    2. I/O设备
      I/O设备是系统与外部世界的联系通道。每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器和适配器的主要区别是他们的封装方式。控制器是I/O设备本身或者是主板上的芯片组,适配器是一块插在主板上的卡。它们的功能都是在I/O总线和I/O设备之间传递信息
    3. 主存
      主存是一个临时存储设备,用来存放程序和程序要处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有唯一的地址,这些地址是从零开始。一般来说,每条机器指令是由不同的字节数量的字节组成
    4. 处理器
      1. 中央处理单元,是解释或执行存储在主存中的指令引擎。处理器的核心是一个大小为一个字的存储设备,即程序计数器(PC),PC一直指向主存中的某条机器语言指令(即含有该条指令的地址)
      2. 从系统通电开始,处理器一直不断的执行PC所指向的指令,在更新程序计数器,使其指向下一条指令。
      3. 一些简单操作的例子
        1. 加载:从主存中复制一个字节或者一个字到寄存器中,以覆盖原来寄存器中的内容
        2. 存储:从寄存器复制一个字节或一个字到主存的某个位置,以覆盖这个位置上原来的内容
        3. 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算数运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容
        4. 跳转:从指令本身抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值。

在这里插入图片描述
2. 运行hello程序(分为3步)

  1. 初始时,shell程序执行他的指令,等待我们输入一个命令。当我们在键盘上输入"./hello"后,shell程序将字符逐一读入寄存器,并把他们放到内存中
  2. 当敲下回车键时,shell程序就知道我们结束了命令的输入。然后shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存
  3. 当目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序中的main程序中的机器语言指令。这些指令将"hello,world\n"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

5.高速缓存至关重要

  1. 高速缓存存储器(cache memory)存放处理器近期可能会需要的信息

  2. L1和L2高速缓存是用一种叫做静态随机访问存储器(SRAM)的硬件技术实现

  3. 三级高速缓存:L1、L2、L3

  4. 系统可以获得一个很大的存储器,同时访问的速度也很快,原因是利用了高速缓存的局部性原理,即程序具有访问局部区域里的数据和代码的的趋势。

6.存储设备形成层次结构

在这里插入图片描述

7.操作系统管理软硬件

操作系统是应用程序和硬件之间插入的一层软件
操作系统由两个基本功能:
	1. 防止硬件被失控的应用程序滥用
	2. 向应用程序提供简单统一的机制来控制复杂而又通常大不相同的低级硬件设备
文件是对I/O设备的抽象,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示
1. 进程
  1. 进程是操作系统对一个正在运行的程序的一种抽象。并发运行,则是指一个进程的指令和另一个进程指令是交错执行的。
  2. 无论是在单核还是在多核系统中,一个CPU看上去是在并发的执行多个进程,这是通过处理器在进程间的切换来实现的。操作系统实现这种交错执行的机制称为上下文切换
  3. 操作系统保持跟踪进程运行所需的所有状态信息。这种状态,也就是上下文,包括许多信息,比如PC和寄存器文件的当前值,以及主存的内容。
  4. 当操作系统决定要把控制权从当前进程转移到某个进程的时候,就会进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新的进程。
  5. 从一个进程到另一个进程的转换是由操作系统的内核(kernel)来管理的,内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时,他就执行一条特殊的系统调用指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。内核是系统管理全部进程所用代码和数据结构的集合。
2. 线程
  1. 一个进程实际上是由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据
3.虚拟内存
  1. 虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。地址空间最上面的区域是保留给操纵系统中的代码和数据的。地址空间的底部区域存放用户进程定义的代码和数据。
    在这里插入图片描述
  2. 虚拟地址的每一个区的简单介绍
    1. 程序代码和数据。对所有的进程来说,代码是从同一固定的地址开始的,紧接着的是和C全局变量相对应的数据位置。代码和数据区是直接按照可执行目标文件的内容初始化的。
    2. 堆。代码和数据区后紧接着的是运行时堆。当调用malloc和free这样的C标准库函数时,堆可以在运行时动态地扩展和收缩
    3. 共享库。大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样的共享库的代码和数据的区域
    4. 栈。位于用户虚拟地址空间顶部的是用户栈,编译器用他来实现函数调用。用户栈也可以在程序执行的期间动态的扩展和收缩
    5. 内核虚拟内存。地址空间顶部的区域是为内核保留的。不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。相反,它们必须调用内核来执行这些操作
4.文件
  1. 文件就是字节序列

8.系统之间利用网络进行通信

  1. 从一个单独的系统来看,网络可视为一个I/O设备
    在这里插入图片描述
  2. 利用telnet通过网络远程运行hello
    在talnet客户端键入“hello”字符串并敲下回车键后,客户端软件就会将这个字符串发送到telnet的服务器。telnet服务器从网络上接收到这个字符串后,会把它传给远端的shell程序。然后,远端shell运行hello程序,并将输出行返回给telnet服务器。最后,telnet服务器通过网络把输出串转发给telnet客户端,客户端就将输出串输出到本地终端
    在这里插入图片描述

9.重要主题

  1. Amdahl定律
    当对系统的某个部分进行加速的时候,其对系统整体的性能的影响取决于该部分的重要性和加速程序。

    若系统执行某个应用程序需要的时间为Told。假设系统某部分所需执行时间与该时间的比例为a,而该部分性能提升比例为k。即该部分初始所需时间为a*Told,现在所需时间为(a*Told)/k。
    
    因此,总的执行时间为
    
    				Tnew = (1 - a)* Told + (a * Told)/ k = Told[(1 - a)+ a / k]
    因此加速比为
    
    	                S = Told / Tnew.    S = 1 / ((1 - a) + a / k)
    
  2. 并发和并行
    并发指一个同时具有多个活动的系统
    并行指用并发来使一个系统运行的更快

    1. 线程级并发
      1. 单处理器系统(一个处理器)
      2. 多处理器系统(多处理器)
        在这里插入图片描述
      3. 超线程,也称为同时多线程,是一项允许一个CPU执行多个控制流的技术
      4. 多处理器的使用可以从两方面提高系统的性能
        1. 它减少了在执行多个任务时模拟并发的需要
        2. 它可以使应用程序运行的更快
    2. 指令级并行
      1. 流水线:将执行一条指令所需要的活动划分成不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤
      2. 超标量处理器:处理器可以达到比一个周期一条指令更快的执行速率
    3. 单指令、多数据并行
      1. 单指令、多数据:允许一条指令产生多个可以并行执行的操作
  3. 计算机系统中抽象的重要性

    1. 计算机系统中的一个重大主题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性
    2. 计算机系统的抽象
      1. 文件是对I/O设备的抽象
      2. 虚拟内存是对程序存储器的抽象
      3. 进程是对一个正在运行的程序的抽象
      4. 虚拟机是对整个计算机的抽象,包括操作系统、处理器和程序
        在这里插入图片描述

上述就是作者的关于第一章的笔记,希望读者指正,共同深刻的理解计算机

发布了38 篇原创文章 · 获赞 49 · 访问量 6955

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/103776818