CSAPP学习心得(一)程序在计算机系统的漫游之旅

程序的执行过程

信息的存储

从最简单的程序hello world开始,当完成代码的编写后,这个程序就以字节序列的方式存储起来,每一个符号空格换行都由对应的数字唯一代表并且称之为ASCII码。同理,所有的资源信息都是使用这种字节或者更小的单位比特来存储,但是面临的问题是,如何识别这些比特时信息、资源还是程序呢?计算机采用的方法时识别上下文(context concatenate-text)的信息,区分比特表示的对象。

程序的翻译

程序完成后,就需要完成从人可以理解到机器可以理解的过程,因此完成程序hello.c后,使用编译器驱动程序将程序转化为可以执行的二进制文件,过程为

1、预编译
以C语言为例,将需要导入的头文件内容合并到程序文本中,形成hello.i
2、编译
将修改后的文件转化为汇编语言(一种机器语言指令),得到hello.s
3、汇编
将得到的转化为汇编文本的程序打包为可重定位目标程序(relocatable object program),得到hello.o
4、链接
将程序中所调用的库函数的预编译的文件合并到我们的程序中,因此我们可以顺利调用这些函数,最终得到可执行文件

处理器读取程序

完成程序的翻译之后,就要运行程序,在linux中我们使用shell,一种命令行解释器,等待用户输入命令,然后执行这个命令,在图形化的界面则可能是鼠标的点击和选择,操作系统将之转化为命令输入到命令行中。

操作系统完成的具体操作

在shell加载运行程序中,都由操作系统去访问I/O设备,操作系统看成时程序和硬件之间的一层软件,操作系统作为一个软件,防止硬件被失控软件滥用,其次提供简单一致的接口控制硬件,方便程序调用。
操作系统主要使用进程、虚拟内存和文件这些抽象概念来实行功能。文件是对所有I/O设备的抽象概括,虚拟内存是对内存和硬盘I/O设备的抽象,进程是对处理器、内存和I/O设备的抽象。
进程:操作系统对一个正在运行的程序的抽象,一个系统可以运行多个进程,每个进程又彷佛独占地运行,当前的处理器都是并发运行,一个进程和另一个进程的指令交错执行,就像你在看视频的同时看网页,你可以两件事情同时进行,但对处理器来说一个时间点就执行一个进程的命令,也就是视频播放或者网页,处理器能这么做就是因为他的运行频率很高,达到几GHz,因此可以在多个任务中来回切换,但人类却感受不到这种切换。但每一次切换都需要保存现场的环境即上下文(context concatenate-text),再进行切换,不然如何返回呢?返回时就在保存的环境中上一次停止的位置开始。
线程:每一个进程可以由多个称为线程的执行单元组成,每一个线程都运行在进程的上下文中,并共享同样的代码和全局数据,举例就是所谓的多线程,一些功能比较费时间,如需要下载资料才可以执行,但是我们可以通过多线程,开一个线程完成下载,原线程继续执行,这样就不需要等待下载完成后再开始。
虚拟内存:为每一个进程提供一个独占内存的假象,逻辑上,每个进程都看到一个虚拟的地址空间,都是由0开始,由大量精确定义的区构成,如程序代码和数据、堆、共享库、栈、内核虚拟内存等,但是物理上他们并不是用的同一片空间,而是分隔开不同的空间
CSAPP学习心得(一)程序在计算机系统的漫游之旅_第1张图片
文件:就是字节序列,就是将所有设备都当作文件处理,进一步的进行相关的操作。

程序运行的过程

当命令行开始输入以后,shell执行命令,将命令传入到CPU中的寄存器,再存入到内存中,当我们结束输入,shell就开始执行指令加载可执行文件,将可执行文件的代码和数据复制到内存,处理器执行其中的main的机器语言指令,将要输出的字符串从内存再复制到寄存器文件,再从寄存器复制到显示设备

总线:可以比喻为告诉字节的高速公路,所有的信息的传输都通过总线传输到不同的模块(出口)
I/O设备:告诉公路的一个出口,主要面向用户,如鼠标、键盘、显示器和硬盘
主存(内存):临时的存储设备,主要用来放置程序和需要的数据,逻辑上来说是一个线性数组,每个数组由唯一的地址作为索引
CPU:中央处理单元,执行指令的引擎,核心是程序计数器(大小为一字的寄存器)用于指向处理器要执行的命令,其次还包括算术逻辑单元(ALU)

优化

高速缓存

从上面的运行过程看,可以看到大量的时间浪费在信息的搬运上,根据一些机械原理,大的存储设备运行得漫,高速得设备造价高,因此在处理器和内存之间,增加几层得存储器,称为高速缓存存储器(cache memory)作为暂时存储得区域,大小介于寄存器和内存之间,存储一些常用的命令,使得不需要全部命令重新从内存中读取,其次根据研究,只有20%的命令和数据较为常用,因此这样的设计提高了运行速度。

Amdahl定律

主要思想:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。若系统执行某应用时间为Told,假设系统某部分时间所需执行时间占总时间的比例为α,而该部分性能提升为k,则新执行时间为
在这里插入图片描述

可以得到计算比为
在这里插入图片描述
在这里插入图片描述

并发运行

主要是为了快,并发(concurrency)是一个通用概念,是一个同时具有多个活动的系统,并行(parallelism)是用并发来使一个系统运行得更快

  • 进程并发
    主要通过一台计算机在它正在执行的进程间快速切换实现的。现代主要由多核多线程实现
  • 线程并发
    一个CPU执行多个控制流的技术,在一个时间周期中执行一个线程
  • 指令级并行
    处理器可以同时执行多条指令,使用的是流水线的方式,将执行指令分割为不同的步骤,每个阶段执行一个步骤,阶段可以并行的操作,处理不同指令的不同部分。

如果觉得帮到你点个赞吧!!!!

你可能感兴趣的:(CSAPP)