深入理解计算机系统---0

信息就是位加上下文

hello.c

#include <stdio.h>

int main()

{

  printf("hello,world\n");

  return 0;

}

hello.c程序的生命周期是从源程序(源文件,我们用编辑器编写的文件)

源程序实际是一个由值为0或1组成的位序列,每八个位成一组叫字节(bit)每个字节表示程序中的某些文本字符

ASCLL码表示字符的方式:用一个单字节大小的整数值来表示字符

 
hello.c程序是以字节序列的方式储存在文件中的,每一个整数字节都对应一个字符,可以看出每个文本行其实都是以\n结束的他们对应的整数值为10(只是隐藏了)。
hello.c程序只有ASCLL字符构成,这种文件称文本文件,所有其他文件称为二进制文件。
基本思想:计算机中所有文件都是由字节(bit)组成的,区分它们的唯一方法为当我们读到这些数据时的上下文
c语言是贝尔实验室与1969-1973创建的
每一条c语言都必须被其他程序转化为一系列低级机器语言指令,然后将这些指令打包成一个可执行文件(exe),并以一个二进制磁盘的方式存放起来
gcc -o hello hello.c
这条指令会完成以下操作:读取hello.c文件,并翻译为一个可执行文件hello
翻译由四个阶段完成,执行这四个阶段的程序(预处理器,编译器,汇编器,链接器)一起构成了编译系统
预处理阶段:根据#号,修改源程序,hello.c中第一行告诉预处理器读取系统头文件stdio.h的内容,并且将其直接插入程序文本中,结果是得到另一个c程序,通常是以.i作为文件扩展名
编译阶段:编译器将hello.i文件翻译成文本文件hello.s,它包含一个汇编语言程序,该程序包含函数main的定义-----------------------------------------------------
 
定义中2-7行每条语句都以一种文本格式描述了一条低级机器语言指令
汇编阶段:汇编器将hello.s翻译成机器语言指令,将这些指令打包为可重定位目标程序的格式,并将其保存为hello.o,他是一个二进制文件,它包含17个字节是函数main的指令编码
连接阶段:hello中的调用printf,其实是标准c库中的一个函数,它存在于一个名为printf.o的单独的预编译好的目标文件中,这个文件以某种方式合并到hello.o程序中,链接器的作用就是负责处理这种合并,合并的结果就是得到一个hello文件,一个可执行文件(exe),它可以加载到内存中,并且由系统执行。
shell是一个命令行解释器,如果命令行第一个单词不是一个内置的shell命令,那么他会假设这是一个可执行文件的名字,他就会将该程序加载并运行。
典型系统硬件组织
 
 总线:贯穿整个系统的一组电子管道就是中线,作用为传递各个部件的信息,通常总线会设计成可以传送固定字长的字节快,也就是字,现在我们大多用的是64位系统,那么他的总线传递的字长就是8个字节,32位系统传递的是4个字节。
I/O设备:是系统与外部世界(也就是我们)的联系通道,每个I/O设备都是用一个控制器或适配器与I/O总线相连,而适配器与控制器之间的区别为他们的封装方式,适配器是插在主板插槽的卡,控制器是I/O设备本身或系统的主印制电路板  
主存:临时储存设备,在执行程序时,用来存放程序或程序处理的数据,从物理上来说,主存是一组动态随机存取储器芯片组成的,从逻辑上来说,储存器是一个线性字节数组,每个字节都有自己唯一的地址,这个地址是从零开始的,一般来说组成程序每条指令都是有不同数量的字节组成的
处理器:中央处理单元简称处理器,是解释和执行主存中指令的引擎,处理器的核心是一个大小为一个子的储存设备(寄存器),作为程序计数器(pc)在任何时刻,pc都指向主存中某条机器语言指令
hello程序运行机理
初始时shell执行他的指令,等待下一条指令,./hello.c后shell会将字符逐一读入寄存器,把它放入内存中,当我们敲完回车后,shell就知道我们输入完成了,shell执行一系列指令来加载可执行文件hello,这些指令会将文件中的代码和数据从磁盘复制到主存,数据包括最终被输出的hello,world\n
高速缓存至关重要:它可以大幅提高程序运行性能
在处理器与主存之间加一个高速缓存是一个很普遍的观念

 从上至下设备速度越来越慢,容量越来越大,每字节越来越便宜

当我们hello程序时shell并没有直接访问我们键盘,他们依靠操作系统提供服务  

操作系统有两大基本作用:1.防止硬件被失控的应用程序滥用2.向应用程序提供简单一致的机制来控制硬件设备
进程:进程是操作系统对一个正在运行的一种抽象  

 一个进程是由多个线程组成的

虚拟内存是一个抽象概念,他为进程提供了一个假象,那就是每个进程都独占内存,每个进程看到的内存都是一致的,称为虚拟地址空间

文件就是字节序列

并发是同时具有多个活动的系统

并行是利用并发来使系统运行更快

线程级并发:多核,超线程

指令级并行

单指令,多数据并行

  

  
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/fire-works/p/12654812.html