【深入理解计算机系统(好看到哭)——1计算机系统漫游】

1信息就是位+上下文

比如我们的.C文件就是一个文本文件,因为他由ASCII码构成,其他的都是二进制文件。

.C文件由一系列0/1(bit,位)所组成,8位为一组(1B),称为字节,每个字节根据编码方式表示字符,ASCII编码每个字符由1B组成;但是在GBK里中文由2B组成。

还会有一些控制字符(回车……)来配合打印。

在不同的上下文中,相同的字节序列的意思要结合上下文,比如111在系统B中解析为7,在系统A中可能就解析为“毛泽东选集”。

2程序被其他程序翻译成不同的的格式

hello.C——hello程序。C语言一个高级语言,人可以直接看懂,但是机器看不懂,所以每一句C语句都要经过转化为低级机器语言指令,最后打包成hello这一可执行目标程序(.exe等),这一过程要经历4各程序(预处理——编译——汇编——链接)一起构成编译系统。

预处理:和#打交道  hello.c—hello.i

1头文件插入到当前文本中   2宏定义替换为对应文本   3条件编译(#if  #endif)决定编译哪些代码片段   

4#pragma,向编译器提供特定指令或者信息 《《空降》》:

once: 在文件最开始,保证头文件只编译一次(防止重复包含)

warning(X):X=disable:520屏蔽520警告错误信息(scanf报错问题的一种解决方案);X=once:520仅报告一次520错误消息;X=error:520把520警告作为一个错误

还有很多就不讲了,看《空降》。

就会得到.i结尾的文件

编译:hello.i—hello.s

词法分析,语法分析,语义分析以及优化(中间阶段)

详见《编译原理》 :空降

汇编:hello.s—hello.o   &&  链接  hello.o—hello

将hello.s翻译为机器指令,打包为hello.o这时候就是二进制文件了,这时叫《可重定位目标程序》,还没结束;printf函数在一个单独的printf.o文件中,这时候就需要链接把printf.o合并到hello.o中。这也就是为什么hello.o叫可重定义目标程序。最后打包为可执行文件hello。

这个程序已经打包在系统磁盘;

3硬件组成&hello执行时系统发生了什么

硬件:

总线:一个电子管道,在计算机各个硬件之间传递字节信息(内容包含:数据,地址,控制信息……),总线设计成传送定长的字节块(字) (设计成定长说是提高传输效率和一致性,我不懂),32bit中1字=4B,64bit中1字=8B。基本上很多硬件都有一个总线接口,用来实现硬件间的交互。

I/O:系统内部和外部世界的连接通道(广义讲内存也算,因为也有读取操作,不过是在内部),每个io设备通过一个控制器或适配器和io总线连接,为什么有这俩东西?实现不同设备和计算机系统的兼顾;比如打印机内置一个控制器或者适配器,这样计算机发来的指令经过处理就可以正确来到打印机 。这个过程是双向的,外部设备故障也可以向计算机发送指令。

内存:临时存储设备,用来存放程序和程序处理的数据(程序是一组指令集,指导计算机完成特定任务,数据结构(存储数据的方式)+算法=程序,比如动态规划解决背包,通过数组存储;程序处理的数据就是比如我们这个程序所需要的原始数据);从物理角度看,内存是一组DRAM(动态随机存取存储器  《空降DRAM/SRAM》);从逻辑角度看,内存是0开始的大数组,每个字节有地址 

CPU:解释存储在内存的指令,其核心是一个大小为1字的地址寄存器(PC),任何时刻,PC都指向内存中某条机器语言指令(PC只是CPU中的一个特定寄存器(存储地址),CPU中还有很多寄存器(状态寄存器,通用寄存器……))。程序通电到断电,CPU不断执行PC上的指令,再不断更新PC指向。寄存器文件由很多单个字长的寄存器组成,用于暂存指令和操作数,中间结果,状态信息。

发生了什么:

在一个叫shell的程序中,我们输入./hello,字符会一个个传到寄存器文件,然后到内存;

然后按下回车,shell就知道我们输入完成了,然后shell执行一系列指令,利用DMA技术,数据和代码从磁盘直接到内存,而不经过寄存器;

CPU处理hello程序的main程序中的机器语言指令,我们要输出“hello,world\n”,CPU从内存中读取这些对应字节到寄存器文件,然后把寄存器文件的数据复制到显示设备的寄存器中或者缓冲器(内存,CPU和显示设备在这个过程中会遵守特定的协议(编码方式,传输格式,地址和映射规则),不然hello可能就会翻译为123)。

4cache(SRAM):

cache高速缓存的作用就是尽可能的代替内存,因为在我们计算机系统中,CPU处理指令时,经常要在内存中读取,然后操作,内存空间大,所以读取速度慢,会浪费很多时间。所以引入cache,提前读取我们需要用的数据,或者经常用的数据。一级cache封装在CPU里面,比寄存器文件大,读取速度和寄存器文件差不多;二级cache通过一根总线和CPU连接,空间更大,但是速度下降(仍然比内存强)。

5存储器层次结构

重要思想:上一层是下一层的cache

6操作系统管理硬件

操作系统的主要功能:1防止硬件被失控的应用程序滥用;2向应用程序提供简单一致的机制来控制复杂,而又不同的硬件。操作系统通过几个抽象概念(进程,虚拟内存,文件)实现这两功能;

进程:

多核处理器:多个CPU(每个CPU是一个核)

操作系统对一个正在运行的程序的一种抽象,一个系统上可以有很多进程。

传统系统中一个时刻只能执行一个程序,多核CPU可以执行多个。

并发运行:不管你单核还是多核,一个CPU可以满足多个进程交错执行(看起来好像在同时执行多个进程),这个机制叫上下文切换。

上下文切换:

处理器在不同进程间切换,每个进程都有其独特的执行状态和环境,这包括了PC的值、寄存器文件的内容、内存中的数据等,这些综合起来构成了进程的上下文。操作系统负责管理和更新这些上下文,以确保当进程重新获得 CPU 时间片时,能够从上次中断的地方准确无误地继续执行,就好像进程一直在不间断地运行一样。

线程:

我们一个进程就是系统的一个执行任务,比如我浏览网页,web服务器为我提供服务,这就是一个进程,然后分为多个线程,线程A负责数据传输,线程B异常检测;每个线程运行在进程的上下文中,并且共享同样的代码和全局数据

进程是一堆线程的组合,一个进程是多个线程共同完成。

线程间切换的开销比进程切换小,并且线程共享进程的资源,所以在某些情况下效率更高。

虚拟内存(不详细):

为每个进程提供一个假象:自己独占内存空间;每个进程看到的内存都是一样的,即:虚拟内存空间

文件:

一切皆为文件,所有io设备,键盘,网络……都可以抽象成文件,系统的输入输出都可以通过读写文件完成(比如我们打印hello,实际上是将相应的字符编码(如 ASCII 编码)写入到与屏幕输出相关的“文件”中。这可以被视为一种输出操作,而读取 ASCII 编码来显示字符,确实也是一种输入操作。)

7并发和并行:

我们有两个目的:1让计算机做的更多    2走的更快;合二为一,只要处理器能做更多,就都可以满足。

并发:

一个时间段内,多个任务运行,宏观上看好像在同时运行,实际上,某一时刻只有一个在运行,任务交错切换的很快。

一边浏览网页,一边听音乐(实际上)

并行:

用并发来使系统更快。

在一个时刻,真正意义上的多个任务同时运行。

线程级并发:

超线程技术是在硬件级别上实现线程的快速切换和交织,利用了 CPU 执行指令过程中的空闲部分,从而提高了核心的利用率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值