计算机系统漫游
1.1 信息就是位+上下文
位就是0和1,8位组成一个字节。常见的字符编码ASCII就是单字节编码,每一个字节对应一个整数值。
而信息就是上下文的内容加位来组成的,什么意思呢? 就是同样的一个字节序列,在上下文的影响下,可能代表整数,浮点数,字符串等。这让人联想到android app中的 上下文也就是 context ,也是基于这种底层的原理而存在?
1.2 程序被其他程序翻译成不同的格式
我们知道有汇编,c,java python等语言来编写程序,但是最终都会翻译成机器能够处理的字节码,也就是0.1.。那么高级语言到字节码一般经历那几个过程呢?
以C语言为例:
hello.c文件 经过预处理器预处理变为了 hello.i(读取头文件内容加到源文件里面);
hello.i在经过编译器变成了hello.s(变成了汇编语言);
.s->.o在经过汇编器将其变成了一个可重定位文件(后章节会详细介绍);
程序中用到的标准C库进行最后经过链接器链接为 可执行文件:
1. 3了解编译系统的好处
1.3.1 优化程序性能,如果你知道了if-else ,switch case ,while 在经过汇编后经过重定向成机器码的时候,就知道什么时候用那种方法更快
指针还有数组那种更快?循环求和的结果放到一个本地变量中比直接用引用传递过来的参数更快。为什么简单的重新排列一下算数表达式的括号就可以让程序运行得更快?(后面有一个迭代值的概念,迭代值需要最短路径,耗时最短)
链接时候的地址分配问题
内存泄露,指针问题
1. 4 系统硬件组成
总线 :传送定长字节块,一般以字为单位,字中的字节数叫字长,字长根据机器的位数来决32位 4字节 64位 8字节,这个也跟指针所占字节数相关。
I/O设备:键盘鼠标各种外设。每个I/O设备都通过一个控制器或者适配器和I/O总线相连。控制器一般指的是I/0设备本身,适配器一般是主板插槽的卡,其主要就是让I/0设备和I/O总线通信。
主存:线性字节数组,每个字节都有一个地址,存放程序和程序处理的数据
处理器:CPU ,核心是PC 程序计数器,一个字,PC指向主存中某条指令,CPU就处理这条指令。
执行指令的步骤: 处理器从PC指向的内存处读取指令,解释其中的位,然后执行这个指令的操作,然后更新PC,PC->NEXT.
主存,寄存器文件,算数逻辑单元,
总结下来就是 加载,存储,执行,跳转。
1.4
以hello程序为例:说一下程序运行的数据的传递过程。
我们在shell程序中输入./hello, shell程序会将字符读入到寄存器,在把它放到内存中,当我们敲击回车时候,shell就会加载hello可执行文件,从磁盘复制到主存,执行hello的过程就是从已经存在主存中的hello机器语言指令复制到寄存器文件,将执行结果从寄存器文件中复制到显示设备,最终显示在显示屏幕中。这个过程还不算很详细,后面章节会详细描述,执行文件的地址是如何确定的? 磁盘是怎么到主存的?
1.5 高速缓存
可以看到上面是磁盘到主存,我们都知道磁盘比较大,主存相对较小,而执行文件基本都要
从磁盘拷贝到主存,这个主存的结构被分为了几级,最上面是CPU的寄存器,然后高速缓存1,2,3,主存,....磁盘,后面章节理解主存的页命中 如果编写更符合页名字的程序那么性能就会更高。
1.6存储设备形成的层次结构
应用程序
操作系统
处理器 主存 I/O设备
补充小章节##
进程:正在运行程序的一种抽象(网上八股文,资源分配的最小单位,线程是资源调度的最小单位)进程都是看起来独立的用一整套计算机,有一套完整的虚拟地址。用户态,内核态
线程:进程的执行单元,可以有多个,多线程比多线程更容易共享数据。
虚拟内存: 虚拟内存是一个抽象的概念,他为每一个进程提供了一个假象,即每个进程都在独占使用内存,这个设计非常好,你可以联想到封装(其实看多了,基本各个概念都是某一类事物的封装,那么将组成一个事物的最小组成理解清楚,那么也能够很快的理解被封装事物的特性):
一个进程最低的地址分配规律由低到高:
程序代码和数据 hello执行文件内容
堆 malloc
共享库 C标准库自己的库
栈 函数调用
内核虚拟内存 内核态的地址范围,不允许应用直接访问。
1、7 文件
linux有个概念叫 一切皆文件。
文件就是字节序列,每个i/o设备 都可以看作是一个文件,系统中的所有输入输出都是通过使用一小组称为系统函数调用读写文件来实现的。
1.8系统之间的网络通信
系统之间的网络通信就是互联网,其实就 是加了一个网络适配器,和外面的网络适配器进行数据的交互。网络适配器看系统来看也就是一个文件,我们主机和这个文件进行数据的读取写入。
1.9 Amdahl定律
a 耗时 多少 B耗时多少,总耗时x, a经过优化节省了多少时间y
计算一个加速比 s = (x-y)/x
1.9.2 并发和并行
并发是指一个系统可以同时进行多个活动可以理解多个进程。
并行,我们处理器下面的硬件底层设计可以一个时钟周期可以同时处理多个指令集(代码最终翻译的机器码的指令)
1.9.3 抽象的重要性
文件是对I/O设备的抽象
虚拟内存是对程序存储器的抽象
进程是对程序的抽象
虚拟机是对整个计算机系统的抽象(包括操作系统,处理器和程序)
这一章节其实是描述了计算机系统的关键的组成部分,让我们打开一个基础的门,最起码的需要知道一个程序从预编译到变成的可执行文件的基本过程,以及执行文件的整个数据传递过程。写的不算很细,但是基本重点都概括上了,后续看情况打磨补充。