zxdsb666. 发表于 2021-8-2 08:04

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

# 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** 程序

![](https://gitee.com/lazyTimes/imageReposity/raw/master/img/20210801202428.png)

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

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)

![](https://gitee.com/lazyTimes/imageReposity/raw/master/img/20210801210302.png)

​      上面这个图的运转顺序如下:

1. 首先,我们的程序从硬盘读入,通过硬盘的IO控制器通过DMA的形式直接进入到主内存。(<font color='red'>**红线**</font>)

> 摘自百科:“**DMA**,全称为:Direct Memory Access,直接存储器访问,是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。”

2. 接着程序通过主内存和IO连接器进入到寄存器中进行计算的操作,这时候有可能会使用ALU,只不过图中没有画出来。
3. 寄存器计算完成之后,输出到显示控制器,显示我们程序的计算结果。(<font color='orange'>**橙线**</font>)

​      当然这个图也相当的简单,但是能总体概括一个程序的生命流程。

​      从上面的步骤可以看到,一个程序的基本步骤就是一个输入到输出的过程,这个过程称为一个环。



# 操作系统是如何抽象IO设备,内存和处理器的?

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

![](https://gitee.com/lazyTimes/imageReposity/raw/master/img/20210801211525.png)

- 每一个文件就是对于IO设备的抽象
- 虚拟内存是对内存和IO设备的抽象
- 进程:则是对处理器,虚拟内存和IO设备的抽象

> **什么是操作系统?它和应用程序以及硬件的关系?**
>
> ​      操作系统其实就是应用程序和硬件之间的一座桥梁,负责抽象硬件层负责的操作逻辑,同时对于应用程序提供保护。
>
> ​      操作系统将整个硬件划分为 IO设备,虚拟内存和进程这三个非常重要的抽象。

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

1. 当系统进程运行的时候,**shell**进程通过系统调用的形式,构建一个**Hello**进程。
2. 此时**shell**保存当前进程的上下文,同时进入**Hello**进程,也产生一份新的hello**上下文**。
3. 将控制权交给**Hello**进程,此时**shell**进行等待状态
4. **hello**进程执行完毕,返回结果给**shell**进程。**shell**进程回到系统进程等待下一个命令。

![](https://gitee.com/lazyTimes/imageReposity/raw/master/img/20210801211622.png)

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

## Linux:一切皆是文件如何理解?

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

​      文件是对IO设备的抽象,也是进程以及虚拟内存的基础单元和结构组成,所以一切皆文件意味着内存中操作的所有数据都可以看做一个io的输入和输出,输入数据,输出结构,这也意味着文件作为操作系统的基础单元的重要地位。

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

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

![](https://gitee.com/lazyTimes/imageReposity/raw/master/img/20210801211833.png)



# 系统加速:**阿姆达定律**

**核心:假设程序划分为两部分:不可并行部分和可并行部分。**

解释:

​      假设一个磁盘中的程序加载到内存中,扫描目录并且进行创建文件。扫描目录和创建文件列表的部分不能并行化,但处理文件可以并行。

那么根据上面的说明,我们可以定义下面的变量:

- **T =** **串行执行的总时间**
- **B =** **不可以并行的总时间**
- **T- B =** **并行部分的总时间**

​      从公式来看,**T-B**这部分时间是真正可以并行并且通过提高CPU或者线程性能的优化时间。当多个CPU和线程执行并行部分的时候计算公式为:

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

​      这里我们不需要记住复杂的公式,我们只需要知道这个阿姆达定理了解到,要优化一个程序的性能,性能的提升远不如我们想象中的那么多,软硬件以及设备IO,内存等每一项都有可能影响程序的性能,同时单项性能优化效果可能并不显著,在进行优化的时候也需要根据实际情况多方位的考虑。

更多的参考资料

> 英文原版网站: http://tutorials.jenkov.com/java-concurrency/amdahls-law.html
>
> 中文介绍:http://ifeve.com/amdahls-law/

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

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





# 总结:

​      以上是CSAPP第一章节的内容重点,其实大部分内容是跟着视频讲解边学边做的笔记,个人对于这种理工的东西实在是很难对付。

​      最后第一章节的内容十分简单和基础,但是到了后续难度就逐渐上来了。



# 写在最后

​      系列开篇,感谢各位观看,如果觉得有所帮助求点赞支持一下!

xinyu010 发表于 2021-8-12 14:45

zxdsb666. 发表于 2021-8-2 14:01
专业和你读文还是理没影响把,至少我读书的时候是这样
我读书时计算机要理科才能选,现在的话计算机要高考选物理才能选

zxdsb666. 发表于 2021-8-2 14:01

xinyu010 发表于 2021-8-2 12:09
文科也能选计算机吗

专业和你读文还是理没影响把,至少我读书的时候是这样

zj1977lsz 发表于 2021-8-2 08:10

讲得很详细,感谢!

fengrui99 发表于 2021-8-2 08:24

讲得很详细,感谢!

fdtemp 发表于 2021-8-2 08:30

学习了,不断学习不懂的知识最重要

wwaaffll 发表于 2021-8-2 08:31

总结的很好,学到了

xiaobutterfly 发表于 2021-8-2 08:31

哇,非常的优秀哦

偶尔平凡 发表于 2021-8-2 08:47

hanxiao666 发表于 2021-8-2 09:17

这也太优秀了吧?还缺女朋友吗?我要扑进你的怀里

zxdsb666. 发表于 2021-8-2 09:37

hanxiao666 发表于 2021-8-2 09:17
这也太优秀了吧?还缺女朋友吗?我要扑进你的怀里

????No gay

xinyu010 发表于 2021-8-2 12:09

文科也能选计算机吗
页: [1] 2
查看完整版本: CSAPP学习笔记 - 计算机的概览