CSAPP学习笔记 - 计算机的概览

前言

这是CSAPP集体专栏的开篇。

这本书应该不须要我过多介绍了,看这本书集体依赖了视频和书本对照学习,学习的进度很慢也比拟苦楚,不晓得多久能够更一期,做这个系列也算是激励本人加油学习。

集体感想

文科生看到这书头痛到爆炸,很多公式压根看不懂,只能重复看去背了(天知道为什么大学会跑去选个计算机的业余)。

CSAPP介绍

依照集体学习的讲述人说的话就是:这本书讲述的并不深刻,然而能够通知你理解计算机的所有重点内容

概述:

  1. 理解一个HelloWorld在计算机的底层经验了什么事件
  2. 一个计算机蕴含了那些根本内容。
  3. 一个Hello world的C程序在计算机系统的运行程序是怎么的。
  4. 操作系统和IO设施,操作系统的执行周期。

一个Hello world 程序的生命周期

首先,咱们从根底动手,看看一个Helloworld 程序在计算机的底层经验了哪些事件?

  • 预处理:将头文件退出到程序当中造成文件援用,并且生成hello.i 文件
  • 编译:把预处理的hello.i文件通过程序代码语言的优化和细节解决,通过编译之后,造成计算机翻译生成编译后文件 hello.s 文件
  • 汇编:将编译解决的文件通过机器码指令翻译为机器能辨认的汇编指令,生产 hello.o文件
  • 链接:须要将多个文件内容进行合并,比方把hello.o文件和机器汇编printf.o 件合并,生成最终须要的hello 程序

为什么要了解编译系统是如何工作的,咱们用工具调试不香么?

  1. 优化程序性能
  2. 了解链接这一步骤的异样(全局和局部变量是什么)
  3. 防止安全漏洞(理解堆栈原理和缓冲器的谬误)

    看这本书还能够帮忙咱们理解上面的内容

  • Switch 为什么有时候要替换为if/else?
  • 函数调用开销有多大?
  • for和while那个更快?

CPU的逻辑构造:

PC(程序计数器):存储着下一条寄存器指令的地址,大小为一个4字节的存储区域,实际上为一个指针。(32位4个字节,64位为8个字节)(program count)

程序计数器注意事项:

  • 计算机中提供要从存储器中取出的下一个指令地址的寄存器
  • PC每次自增都是固定的字长
  • PC自增是PC+取出指令的长度
  • 一个字节占8位,一个字占16位
  • 两个指令的地位不肯定相邻

寄存器:通常为用于程序计算的一小块高速缓存,寄存器的容量比拟小。长期存放数据的空间

ALU:负责将寄存器传递的值进行计算操作。

总线:贯通整个计算机系统的外围设施,负责将数据到各个硬件进行固定的字节数据传输。

内存:负责将处理器的内容进行计算或者解决

输入输出设施:输入输出设施示意计算机系统和外部设备的接入操作

一个Hello world 程序在计算机系统的运行程序

上面这个图是不便本人了解画的,画的很丑,能够去网上找很多画的难看,画的难看的集体不太能了解(HHH)

下面这个图的运行程序如下:

  1. 首先,咱们的程序从硬盘读入,通过硬盘的IO控制器通过DMA的模式间接进入到主内存。(<font color='red'>红线</font>)
摘自百科:“DMA,全称为:Direct Memory Access,间接存储器拜访,是所有古代电脑的重要特色,它容许不同速度的硬件安装来沟通,而不须要依赖于 CPU 的大量中断负载。”
  1. 接着程序通过主内存和IO连接器进入到寄存器中进行计算的操作,这时候有可能会应用ALU,只不过图中没有画进去。
  2. 寄存器计算实现之后,输入到显示控制器,显示咱们程序的计算结果。(<font color='orange'>橙线</font>)

当然这个图也相当的简略,然而能总体概括一个程序的生命流程。

从下面的步骤能够看到,一个程序的根本步骤就是一个输出到输入的过程,这个过程称为一个环。

操作系统是如何形象IO设施,内存和处理器的?

在上面的图例所示当中,咱们来看下咱们通常了解的文件,内存和处理器这三个外围组成部分在操作系统中是如何形象的:

  • 每一个文件就是对于IO设施的形象
  • 虚拟内存是对内存和IO设施的形象
  • 过程:则是对处理器,虚拟内存和IO设施的形象

什么是操作系统?它和应用程序以及硬件的关系?

操作系统其实就是应用程序和硬件之间的一座桥梁,负责形象硬件层负责的操作逻辑,同时对于应用程序提供爱护。

操作系统将整个硬件划分为 IO设施,虚拟内存和过程这三个十分重要的形象。

操作系统中一个过程的执行周期:

  1. 当零碎过程运行的时候,shell过程通过零碎调用的模式,构建一个Hello过程。
  2. 此时shell保留以后过程的上下文,同时进入Hello过程,也产生一份新的hello上下文
  3. 将控制权交给Hello过程,此时shell进行期待状态
  4. hello过程执行结束,返回后果给shell过程。shell过程回到零碎过程期待下一个命令。

这里有一个思考题:shell的实现机制是如何实现了,如何实现相似shell期待的程序?

Linux:所有皆是文件如何了解?

上文提到了一个程序其实就是一次输出/输入的过程。

文件是对IO设施的形象,也是过程以及虚拟内存的根底单元和构造组成,所以所有皆文件意味着内存中操作的所有数据都能够看做一个io的输出和输入,输出数据,输入构造,这也意味着文件作为操作系统的根底单元的重要位置。

网络设备是如何通过网络运行一个Hello world程序?

  1. 用户应用键盘输入一个执行hello程序的命令
  2. 客户端发送一个执行“hello”的指令到近程服务器的的shell
  3. 近程服务器的shell收到指令, 执行hello程序
  4. 近程服务器执行HELLO程序
  5. 近程服务器HELLO程序的返回后果回送到客户端

零碎减速:阿姆达定律

外围:假如程序划分为两局部:不可并行局部和可并行局部。

解释:

假如一个磁盘中的程序加载到内存中,扫描目录并且进行创立文件。扫描目录和创立文件列表的局部不能并行化,但解决文件能够并行。

那么依据下面的阐明,咱们能够定义上面的变量:

  • T = 串行执行的总工夫
  • B = 不能够并行的总工夫
  • T- B = 并行局部的总工夫

从公式来看,T-B这部分工夫是真正能够并行并且通过进步CPU或者线程性能的优化工夫。当多个CPU和线程执行并行局部的时候计算公式为:

T(N) = B + (T - B) / N(N为处理器或者CPU数量)

这里咱们不须要记住简单的公式,咱们只须要晓得这个阿姆达定理理解到,要优化一个程序的性能,性能的晋升远不如咱们设想中的那么多,软硬件以及设施IO,内存等每一项都有可能影响程序的性能,同时单项性能优化成果可能并不显著,在进行优化的时候也须要依据理论状况多方位的思考。

更多的参考资料

英文原版网站: http://tutorials.jenkov.com/j...

中文介绍:http://ifeve.com/amdahls-law/

另外,阿姆达定律提供了上面的优化形式细节:

  • 线程级并发(超线程技术)
  • 指令集并行(流水线技术)
  • 单指令多数据并行
  • 超线程技术

总结:

以上是CSAPP第一章节的内容重点,其实大部分内容是跟着视频解说边学边做的笔记,集体对于这种理工的货色切实是很难凑合。

最初第一章节的内容非常简略和根底,然而到了后续难度就逐步上来了。

写在最初

系列开篇,感激各位观看,如果感觉有所帮忙求点赞反对一下!