本文是看完《程序是如何跑起来的》相关章节后写的笔记,主要讲磁盘,内存,CPU和之间相互关系。
1程序的执行过程
程序执行的过程:程序员编写代码,代码编译成可执行的EXE文件,内存中生成EXE文件的副本,CPU对副本解释并执行。
程序从磁盘进入到内存再进入到CPU中解释执行。
也就是最终CPU解释并执行编译后的程序内容,CPU将程序内容分为两个部分对待,数据和指令。
2 CPU
2.1 CPU组成及组成部分简介
CPU由四个部分构成,寄存器,控制器,运算器和时钟。
寄存器用来暂存指令和数据。
控制器负责将内存的中的指令和数据读入寄存器。
运算器负责运算寄存器中的数据。
时钟用来计时。
2.2 CPU处理顺序
根据时钟信号,控制器从内存中读取数据和指令,通过对指令的解释和执行,运算器对数据进行运算,控制器根据结果控制计算机,控制主要包括内存和磁盘的输入输出,键盘和鼠标的输入,显示器和打印机的输出等。
四个部分中,对程序员来说最重要的是寄存器,因为寄存器在程序中以对象的形式存在。
2.1.1寄存器
寄存器大致分为八类:
累加寄存器:存储执行运算的数据和运算后的数据。
标志寄存器:存储运算处理后的CPU的状态。
程序计数器:存储下一条指令所在的内存地址。
基址寄存器:存储内存起始地址。
变址寄存器:存储机制寄存器的相对地址。
通用寄存器:存储任意数据。
指令寄存器:存储指令,CPU内部使用,程序员无法通过程序对这个寄存器进行读写操作。
栈寄存器:存储栈区域的起始地址。
基址寄存器,变址寄存器和通用寄存器一般多个,其他一般只有一个。
一般程序运行
条件分支运行
标志寄存器的作用:当比较a和b的大小时,用a-b,结果正负零存放到标志寄存器中。
函数调用时会调用call指令,在执行0132对应的0260函数之前,会先将0154的地址存放到栈的主存内。函数执行完后调用return,return将存放到主存的地址放到程序计数器中,这样就继续执行下一条指令了。
跳转实际就是将地址存放到程序计数器中。
Call:存放下一条指令地址到栈的主存,将函数的入口地址存放到程序计数器。
Return:读取存放的地址,继续执行原函数。
2.3机器语言的指令的主要类型:
数据转送指令:寄存器和内存,内存和内存,寄存器和外围设备的读写操作。
运算指令:用累加寄存器执行算术运算,逻辑运算,比较运算和位移运算。
跳转指令:实现条件分支,循环和强制跳转。
Call/return指令:函数的调用/返回调用前的下一条指令。
2内存
2.1内存简介
内存和磁盘都是计算机存储数据的部分。
内存是电流驱动的,磁盘是磁效应驱动的,内存读取比磁盘稍快。
内存在断电后数据不再存在,磁盘在断电后数据仍可以保存。
2.2内存组成
内存的功能主要由引脚实现,引脚分为电源,地址信号,数据信号,控制信号。
下图是内存的示意图
VCC和GND是电源信号正负极。RD和WR的read读取和write输入信号。A0-A9是Address地址信号。D0-D7是Data信号。
由于信号只有0或1两种情况,通过排列组合,地址信号共可以表示1024个地址,数据信号则是8位数据,表示一次性可以读写8位数据(1字节)。
地址是存放数据的地方,每次读写向一个地方读写一字节数据,所以至多内存中只能存放1024个地址*1字节=1024字节的数据。就是1KB。
一个这么大的内存单位看做一个内存IC,实际应用中,一个内存IC存在的引脚要更多,一个512MB的内存需要数个内存IC。
读取数据时,首先将RD信号设为1,然后设置A0-A9的数值为某值address,这样就会把内存中address地址下的数据读取到D0-D7中。
输入数据时,首先将WR信号设为1,然后设置A0-A9的数值位某值address,这样就会定位到address,然后内存会将D0-D7的数据输入到指定地址中。
输入输出都是相对于内存来说的,内存中存放的通常是变量等数据,那么外界就一般是硬盘文件等。
由于每个地址中只能存放一个字节的数据,大多数数据类型的大小都是大于一字节的,因此通过设置数据类型,可以在指定的地址和长度下查询数据。
3磁盘
程序运行顺序是保存在磁盘中,内存从磁盘中读取,在CPU中解析执行。
磁盘缓存:将数据从磁盘中读取到内存中,这样之后再读取只需要从内存中获取即可,加快了读取数据的速度。网络图片缓存到本地也和这个类似。
磁盘划分空间通过扇区方式划分,将磁盘划分为一个一个同心圆的区域是磁道。把磁道按照固定大小(能存储的数据大小相同)划分开的部分就是扇区。
假设操场是不是椭圆的。磁道就是操场的跑道,同心圆就是操场的划分的白线,每隔一百米画一块区域,这个区域就是扇区。
扇区是对磁盘读写的最小单位,一般windows使用的一个扇区是512字节,但是windows使用时的单位是簇,簇是扇区的整数倍,一簇可以是一个扇区,也可以是多个扇区,磁盘容量越大,簇就越大。
不同的文件不能存在同一个簇中。不然就会导致文件无法删除。不管多小的文件,都会至少占用一簇的空间,文件的占地大小一定是簇的整数倍。
网友评论