一直以来想要了解一下计算机,自己又作死说要先打基础.当然不可否认的是,CSAPP是一本很好看的书
但是,一点都不好看.
*那现在还能怎么办呢 ? 啃吧 ! *
首先约定本书的环境 :
1.Linux操作系统
2.X86_64架构
3.C语言描述为主 , 会用到一些C++/Java例子
从下面的一个简单的程序入手,来讲述整个计算机中的系统流程
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
return 0;
}
这是任何C语言的初学者,都会接触到的例子,现在已经是任何一门编程语言都会用到的例子了.
编译系统
从程序到可执行程序,所经历的过程是我们必须了解的
它经历了下面这几个过程:
1.预处理阶段
预处理器(cpp),根据”#”字符,将指定的 < * . h > 文件替换到此处,同时消去注释之类,生成一个 . i 文件
2.编译阶段
编译器(ccl),将文本文件hello.i翻译成为hello.s , 为一个汇编程序 , 代码如下:
main:
subq $8, %rsp
movl $.LCO, %edi
call puts
movl $0, %eax
addq $8, %rsp
ret
汇编语言可以理解为任何高级语言与底层之间的通用语言接口
3.汇编阶段
汇编器(as)将hello.s,翻译成为机器语言,并将其打包成为可重定位目标程序,名为hello.o
用文本编辑器打开,即为乱码
4.链接阶段
此阶段链接器(ld)将所有的编译好的.o文件, 与我们的hello.o进行链接, 生成目标程序
硬件组成
计算机是软硬结合的,所以了解硬件也是很有必要的
1.总线
总线是一组电子管道, 携带信息字节,并且在各个部件之间进行传递.设定为携带固定的字节数
2.I/O设备
input/output设备也是十分必要的.是计算机和外接连接的通道.
每个I/O设备都通过,控制器/适配器与I/O总线进行连接.
控制器: I/O设备本身或系统的主板上的芯片组
适配器: 插在主板槽上的一块卡
区别: 在于封装的方式不同
3.主存
临时的一个存储设备.
物理上,靠一堆DRAM实现,即各种各样的随机存储器组成,内存,显存, . . . .
逻辑上,计算机将这一系列的RAM抽象成为,内存地址空间(详见 < 汇编语言(一) > )
对每个字节,进行地址编码,使其可以进行访问使用.
4.处理器
中央处理器,其中也包含了许多组件.,寄存器,程序计数器,地址加法器等
常见的操作:
- 加载
- 存储
- 操作
- 跳转
高速缓存
高速缓存的技术,是十分重要的.
随着计算机发展,存储读取的问题很严峻,有木桶效应可知: 计算机数据处理运行的速度取决于最慢的部分
计算机中的组件,存储容量更小,更快,每字节造价越高,越贵.
存储容量更大,更慢,每字节造价越小,越便宜.
因此,计算机的存储器采取层次结构
L0: 寄存器
L1: L1高速缓存 (SRAM)
L2: L2高速缓存 (SRAM)
L3: L3高速缓存 (SRAM)
L4: 主存 (DRAM)
L5: 本地二级存储 (本地磁盘)
L6: 远程二级存储 (分布式文件系统,Web服务器)
存储器层次结构主要思想是,从上到下,上一层都是下一层的高速缓存,加速了程序/计算机的速度
操作系统的抽象
操作系统,算是计算机应用程序与底层硬件之间的中间件,通过操作系统提供的服务
使用户可以更好地调用硬件,同时提供了统一的接口进行操作
那么,操作系统在实现功能的时候,进行了下面的抽象:
I/O设备 –> 文件 ** 主存 + I/O设备 –> 虚拟内存** ** 主存 + I/O设备 + 处理器 –> 进程**
这三个基本抽象概念十分重要!
由于这三中抽象概念是以后的学习重点,现在就不多赘述了.
简单阐述一个概念: 信息
所谓信息是什么? 只是位的信息了吗?
并不是,之前在汇编语言的学习时,就清楚的了解到,位中的数据在不同的地方含义是不同的
可以是代码,数据,或者指令
所以,位中的信息,需要结合上下文来理解!
即: 信息 = 位 + 上下文
系统之间的网络通信
网络编程,之前也稍微了解过.
网络,从一方面上来讲,其实也是一个I/O设备
网络只是扩展了计算机的I/O范围
重要主题
这里介绍三个重要的内容
1.Amdahl定律
在计算机科学里,进行计算机性能分析,依靠的是Amdahl定律 :
Amdahl定律清晰的说明了:要提高一个系统的性能,必须要提供大部分的性能才可以.
2.并发与并行
计算机中,很重要得两类编程: 并发编程 与 网络编程
计算机的发展中,有两个需求:
-
计算的更多
-
计算的更快
并发与并行就是为了处理计算的更快的需求的
并发(concurrency) : 置一个系统上同时有多个程序
并行(parallelism) : 表示通过并行来加速计算机的速度
主要有以下三个层次的概念:
1.线程级并发
2.指令级并行
3.单指令,多数据并行
3.抽象
抽象的概念是在计算机学习中,必不可少的.
Pangda曾经说过: 递归,抽象,数学归纳法.是很重要得三个东西
我认为抽象,是能够将实际的例子进行归类为模板/类型.简单的讲,就是能够归类问题,找出解决问题的方法
前面,也介绍了文件,虚拟内存,进程这三个抽象的概念,那么,现在再加上一个:
虚拟机 = 操作系统 + 处理器 + 主存 + I/O设备
编程相关
因为第一章是全局概括,所以在编程的学习上并没有多少.
December 31, 2017 4:21 PM