《程序是怎么跑起来的》读书笔记

         好久没有写过这类读书笔记,犹记得上次写还是刚学android那会读《Android群英传》写过一篇,这次应公司远程实习任务的要求,来拜读《程序是怎么跑起来的》这本书,书不厚,三天半就看完了,但读完却是甚觉过瘾,唤醒了记忆里很多即将消逝的东西,回过头来看看现在所学的东西,感觉又深入理解了一次。


第一章什么是CPU

CPU的内部由寄存器、控制器、运算器和时钟四个部分组成;

寄存器用来暂存数据和指令等对象,不同CPU内部有20-几百个;

控制器负责把内存上的指令、数据读入寄存器,并根据指令执行结果来控制整个计算机;

运算器负责运算从内存读入寄存器的数据

时钟负责发出CPU开始计时的信号;

主存:计算机的主存储器,用来存储指令和数据,但关机会清除所有数据。

宏观上讲,程序启动后,根据时钟信号,控制器从内存中读取指令和数据,通过对这些指令加以解释和运行(这里主要用到了各类寄存器),运算器就会对数据进行运算,控制器根据该结果来控制计算机。


CPU可以说是各种功能的寄存器的结合体,程序计数器、累加计数器、标志寄存器、指令寄存器和栈寄存器只有一个,其他有一到多个。


程序的流程分为顺序执行条件分支循环三种,这三种模式是通过对程序计数器的值的设定来实现的(程序计数器是用来存储下一条指令的地址的),条件和循环主要使用比较(在CPU内部做减法)和跳转指令来实现(这些在第十章会讲到)。


机器语言通过callreturn指令来解决函数调用的跳转问题,在将函数的入口地址赋值到程序计数器之前,call指令会将调用函数后要执行的指令地址存储在栈的主存内,函数处理完毕后,通过函数出口执行return命令,其功能就是把保存在栈中的地址赋值给程序计数器。

《程序是怎么跑起来的》读书笔记_第1张图片

 

 

第二章:二进制与数据

计算机内部使用二进制处理数据。


OO”的“XX”次幂,OO为基数,二进制位2,十进制为10XX是“数的位数-1”;


二进制左移一位扩大2倍,两位扩大4倍,依次类推,低位补0

对于右移,则是原来的1/2,1/4,1/8,对于高位,则有补0和补1两种情况。

 

二进制表示负数时,会把最高位当做符号位,正为0,负为1

计算机内部做减法运算时,实际是做加法运算,因此表示负数就要用到二进制的补数

一个二进制数的相反数就是该二进制数取反+1后的数,两者相加为0


二进制数表示图形而非数值时,右移在最高位补0,称为逻辑右移

二进制作为带符号的数值进行运算时,移位后在最高位填充移位前符号位的值(0或者1),这是算术右移


逻辑运算指对二进制数各数位的01分别进行处理的运算,非(NOT),与(AND),或(OR:有11),异或(XOR:不同为1

 

第三章:小数运算出错

0.1累加100次也得不到10,是因为计算机是用二进制处理数据的,一些十进制的小数无法转换成二进制数,0.1就不行

《程序是怎么跑起来的》读书笔记_第2张图片

 

小数点后四位表示的数值范围是0.0000-0.1111,如图为他能精确表示的数,可以看到只有有限几个能表示,如果增加小数的位数,与其对应的十进制数的个数也会增加,但不管增加多少位,都得不到0.1.

 

对于浮点数如下图

 《程序是怎么跑起来的》读书笔记_第3张图片

其中指数部分采用EXCESS系统表现”,尾数部分采用“将小数点前面的值固定为1的正则表达式”,关于这方面最好参考原书以便更好的理解,这里简单举下书中的例子:


 

其中符号位为0,表示正数,指数部分为01111110,十进制数是126,在EXCESS系统中为126-127=-1,尾数部分为10000000000000000000000,实际是1.1000000000000000000000,转换为十进制是1.5,所以该数为+1.5*2*-12的负一次幂)= 0.75,所以该数表示为0.75.

 

避免计算机出错的策略:一是回避这些错误,也就是无视,二是将小数转换成正数来计算。

 

二进制的4位,相当于16进制数的1位,因而可以用16进制数来表示二进制数,位数变短,结果更清晰。在数值开头加上0x就可以表示16进制数。

 

 

 

第四章:内存

什么是内存:内存实际是一种名为内存IC的电子元件,内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚,通过为其指定地址,来进行数据的读写。

《程序是怎么跑起来的》读书笔记_第4张图片

 

RDWR分别为1时表示可读/写,都为0表示不能读也不能写。

在程序中,根据变量的数据类型,为其分配相应的内存空间。

 

指针:表示的是存储着数据的内存的地址

数组:多个同样数据类型的数据在内存中连续排列的形式,作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引。栈和队列,可以不通过指定地址和索引来对数组的元素进行读写;

,后入先出;

队列,先入先出,队列一般是以环形缓冲区的方式实现的,其模型如图

《程序是怎么跑起来的》读书笔记_第5张图片

 

链表:在数组元素中,除了数据的值外,通过为其附带上下一个元素的索引,即可实现链表,链表在追加和删除的情况下效率很高。

二叉查找树:在链表基础上往数组中追加元素时,考虑到数据的大小关系,将其分成左右两个方向的表现形式。因为其由链表发展而来因此在追加和删除方面同样有效,除此之外在搜索数据也更加效率。

 

第五章:内存和磁盘

磁盘中存储的程序,必须加载到内存中后才可以运行。因为负责解析和运行程序内容的CPU,需通过内部程序计数器来指定内存地址,然后才能读出程序。即使CPU可以直接读取并运行磁盘中的程序由于磁盘读取速度慢,程序运行速度也会降低。

 

磁盘缓存:把从磁盘中读取出来的数据存储到内存空间的方式,这样当接下来读取同一数据时,就不用通过实际的磁盘,而是从磁盘缓存中将内容读出。可以大大改善访问磁盘的速度。

虚拟内存:把磁盘的一部分作为假象的内存来使用。这与磁盘缓存是假想的磁盘(实际是内存)相对,虚拟内存是假想的内存(实际是磁盘)。

虚拟内存的方式有分页和分段式

分页式:在不考虑程序构造的情况下,把运行的程序按照一定大小的页进行分割,并以页为单位在内存和磁盘间进行置换。

分段式:把要运行的程序分割成以处理集合及数据集合等为单位的段落,然后再以分割后的段落为单位在内存和磁盘之间进行数据置换。

 

节约内存

虚拟内存发生的Page InPage Out往往伴随着低速的磁盘访问,因而无法彻底解决内存不足的问题。

将运行的应用文件变小:

1)通过DDL文件实现函数共有:DDL指的是程序运行时可以动态加载Library(函数和数据的集合)的文件,多个应用可以共有一个DDL文件,从而节约内存。

2)通过调用_stdcall来减小程序文件的大小

 

磁盘的物理结构

划分方式有扇区可变长方式,扇区方式中把磁盘分成若干个同心圆的空间为磁道,把磁道按照固定大小划分而成的空间就是扇区。

扇区是对磁盘进行物理读写的最小单位,一般为512字节,windows在软件方面对磁盘进行读写的单位是扇区整数倍蔟,可以为5121024等。

不同的文件不能存储在同一簇中,因此不管多小的文件都会占用一簇的。

 

第六章:压缩

文件以字节为单位保存。

RLE算法:把文件内容按“数据*重复次数”来表示。(并不适合文本文件)

 

哈夫曼算法:多次出现的数据用小于8位的字节数表示,不常用的数据用多于8位的字节数表示,为各压缩对象文件分别构造最佳的编码体系。

 

可逆压缩:能还原到压缩前状态

不可逆压缩:无法还原到压缩前状态

 《程序是怎么跑起来的》读书笔记_第6张图片

 

第七章:程序运行环境

运行环境  =  操作系统+  硬件

本地代码:机器语言的程序

源代码:程序员用C语言等编写的程序,仅仅是文本文件。

应用程序向操作系统传递指令的途径称为API


第八章:源文件到可执行文件

将源代码转换成本地代码的程序称为编译器

链接:把多个目标文件结合,生成一个EXE文件的处理

链接器:运行链接的程序

程序即使不调用其他目标文件的函数,也必须进行链接,并和启动结合起来。

库文件:把多个目标文件集成保存到一个目标文件的形式,使用库文件是为了简化为链接器的参数指定多个目标文件这一过程。

标准函数:不是通过源代码形式而是通过库文件形式和编译器一起提供的。

Windows以函数的形式为应用提供了各种功能,这些函数统称为APIAPI存储在名为DLL文件的特殊库中,DLL文件是程序运行时动态结合的文件。与此相反,存储着目标文件的实体,并直接和EXE文件结合的库文件形式称为静态链接库。

《程序是怎么跑起来的》读书笔记_第7张图片

 

第九章:操作系统和应用

Windows操作系统的特征

32/64位操作系统

通过API函数集来提供系统调用

提供采用了图形用户界面的用户界面

通过WYSIWYG实现打印输出

提供多任务功能

提供网络功能和数据库功能

通过即插即用实现设备驱动的自动设定

 


第十章:汇编语言与程序

汇编语言:使用助记符的语言

汇编器:本地代码与汇编语言的转换器

汇编:汇编语言---->本地代码

反汇编:本地代码---->汇编语言

汇编语言的语法是操作码+操作数

函数的参数通过栈来传递,返回值是通过寄存器来返回的

循环分支和条件分支是通过比较和跳转指令来实现的

 


第十一章:硬件控制方法

计算机通过I/O控制器与外围设备进行数据传递。

中断请求IRQ:用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制,称为中断处理机制

实施中断请求的是连接外围设备的I/O控制器,负责实施中断处理程序的是CPU,若有多个外围设备进行中断请求,为方便处理,可在CPUI/O控制器中间加入中断控制器。

CPU收到中断控制器的请求后,会把当前正在运行的主程序中断,并切换到中断处理程序,第一步是把CPU所有寄存器的值保存到内存的栈中,中断处理程序完成外围的设备的输入输出后,将栈中保存的值还原到CPU寄存器,再继续对主程序的处理。

DMA: 不通过CPU的情况下,外围设备直接和主内存进行数据传送。

内存VRAM存储的数据就是显示器上显示的信息。

你可能感兴趣的:(基础知识)