读《程序是怎样跑起来的》总结

第一章 对程序员来说CPU是什么

1. CPU的内部结构解析

在这里插入图片描述

2. CPU是寄存器的集合体

在这里插入图片描述

3. 决定程序流程的是程序计数器

在这里插入图片描述

4. 条件分支和循环机制

在这里插入图片描述
在这里插入图片描述

5. 函数的调用机制

在这里插入图片描述

6. 通过地址和索引实现数组

在这里插入图片描述

第二章 数据是用二级制数表示的

补数

在这里插入图片描述

逻辑右移和算术右移

在这里插入图片描述

在这里插入图片描述

计算机进行小数运算时出错的原因

二进制数表示小数

在这里插入图片描述

计算机出错的原因

  1. 有一些十进制数的小数无法转换成二进制数,小数点后四位用二进制数表示时的数值范围是0.0000-0.1111。因此,这里只能表示0.5、0.25、0.125、0.0625这四个二进制数小数点后面的位权组合而成(相加总合)的小数

什么是浮点数

  • 浮点数:用符号,尾数,基数和指数这四部分来表示的小数,因为计算机内部使用的是二进制数,所以基数自然为2
    2.
    在这里插入图片描述
  1. 符号部分:使用一个数据位来表示数据值的符号,1位负,0为正

  2. 尾数部分:使用的是,将小数点前面的值固定为1的正则表达式,将表现形式多样的浮点数统一为一种表现形式,在二进制数中,我们使用的是“将小数点前面的值固定为1的正则表达式”
    在这里插入图片描述

  3. 指数部分:EXCESS系统表现,指的是通过将指数部分表示范围的中间值设为0,是的负数不需要用符号来表示
    在这里插入图片描述

  4. 例子:0.75
    在这里插入图片描述

如何避免计算机计算出错

  1. 原因:采用浮点数来处理小数(另外,也有因为“位溢出”而造成计算错误的情况)
  2. 解决办法:①回避策略:无视错误,小的误差不影响②小数转为整数,先把小数变成整数进行计算,然后把计算结果用小数来表示③BCD二进制表示十进制

熟练试用有棱有角的内存

内存的物理机制

  • 内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出大量引脚(IC的引脚),通过为其指定地址,来进行数据的读写
    在这里插入图片描述

内存IC能存多少数据

  • 数据信号引脚有D0-D7,八个,表示一次可以输入输出8位(=1字节)的数据,此外地址信号有A0-A9共十个,表示可以指定0000000000-1111111111共1024个地址,而地址用来表示数据的存储场所,因此可得出,这个内存IC可以存储1024个1字节的数据。因为1024=1K,所以该内存IC的容量就是1KB

读写过程

在这里插入图片描述

内存的逻辑模型——楼房

在这里插入图片描述

栈、队列和环形缓冲区

  1. 栈:后入先出(LIFO),类似于桶里加水
  2. 队列:先入先出(FIFO),类似于排队
  3. 环形缓冲区:队列一般使用环形缓冲区来实现的
    在这里插入图片描述

链表使元素的添加和删除更加容易

在这里插入图片描述

二叉查找树使数据的查找更有效

  • 二叉查找树是指在链表的基础上往数组中追加元素,考虑到数据大小的关系,将其分成左右两个方向
    在这里插入图片描述

内存和磁盘的亲密关系

程序要加载到内存中才能运行

在这里插入图片描述

磁盘缓存加快了磁盘的访问速度

  • 磁盘缓存:从磁盘中读出的数据存储到内存空间中的方式
    在这里插入图片描述

虚拟内存把磁盘作为部分内存来使用

  • 虚拟内存:把磁盘的一部分作为假想的内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)
  • 借助虚拟内存,在内存不足的情况下,也可以运行程序,为了实现虚拟内存,就必须把实际内存(物理内存)的内容,和磁盘上的虚拟内存进行部分置换,并同时运行程序
    在这里插入图片描述
    在这里插入图片描述

节约内存的编程方法

通过DLL文件实现函数共有

  • DDL文件:在程序运行时可以动态加载Library(函数和数据的集合)的文件,多个应用可以公有同一个DLL文件,可以达到节约内存的方法
  • windows的操作系统本身就是一个DLL文件的集合体,有时安装新应用的时候,DLL文件也会被追加,应用则会通过利用这些DLL文件的功能来运行
  • 之所以利用多个DLL文件,是为了节约内存,并且DLL文件还有一个优点,在不变EXE文件的情况下,只通过升级DLL文件就可以更新

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

  • 通过调用_stdcall减小程序文件的方法,使用C语言编写应用时可以利用的高级技巧
  • 栈清理处置:把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出去
  • 栈清理处理,比起在函数调用方进行,在反复被调用的函数一方进行时,程序整体要小一点。这时使用的就是_stdcall.在函数前面加上_stdcall,就可以把栈清理处理变为在被调函数一方进行。
    在这里插入图片描述

磁盘的物理结构

在这里插入图片描述

亲自尝试压缩数据

文字以字节为单位保存

  • 文件是字节数据的集合,用1字节(=8位)表示的字节数据有256种,用二进制表示,范围就是00000000-11111111
  • 如果文件中存储的的数据是文字,文件就是文本,若果是图形,文件就是图像文件
  • 任何情况下,文件中的字节数据都是连续存储的

RLE算法的机制

在这里插入图片描述

  • RLE算法的缺点:实际的文本文件中的,同样字符重复出现的情况并不多,不适合文本文件的压缩,针对相同数据经常连续出现的图像,有不错的效果(常用于传真FAX)

哈夫曼算法

  • 可用摩斯编码进行理解
  • 出现频率高的尽量用少的位数编码来表示
    在这里插入图片描述

可逆压缩和非可逆压缩

在这里插入图片描述

程序是在何种环境中运行的

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

在这里插入图片描述

不同操作系统的API不同

  1. API:应用程序向操作系统传递指令额途径称为API(ApplicationProgramming Interface),不同的操作系统的API是有差异的
  2. 程序(本地代码)的运行环境是由操作系统和硬件来决定的

不依赖特定的硬件及操作系统的程序运行

  1. 利用虚拟机获得其他操作系统环境
  2. 提供相同运行环境的java虚拟机
    1. java有两层意思,一个是编程语言,一个是作为程序运行环境的java
    2. 同其他编程语言相同,java也是将ava语法记述的源代码编译后运行,不过编译后生成的并不是特定CPU使用的本地代码,而是名为字节代码的程序
    3. 字节代码运行的环境就称java虚拟机。java虚拟机是一边把java字节代码逐一转为本地代码运行的
      在这里插入图片描述
  3. 缺点:
    1. 不同的java虚拟机之间无法进行完整的互换,这是以为,想让所有字节代码在任意java虚拟机上都能运行是十分困难的,并且,当我们用只适用于某些特定硬件的功能时,就会出现在其他java虚拟机上无法运行,或者功能使用受限等情况
    2. 运行速度的问题,java虚拟机每次都要把字节代码转换为本地代码,,这一机制是造成运行速度慢的原因

BIOS和引导

  1. BIOS:存储在ROM中,是预先内置在计算机主机内部的程序,BIOS除了键盘、磁盘、显卡等基本控制之外,还有启动“引导程序”的功能
  2. 引导程序:存储在启动驱动器起始区域的小程序。操作系统的启动驱动器一般是硬盘,不过有时也可以是CD-ROM或软盘

从源文件到可执行文件

计算机只能运行本地代码

  1. 源代码:用某种编程语言编写的程序,保存源代码的文件就叫源文件(C语言源文件扩展名 .c)
  2. 任何语言编写的源代码,最后都要翻译成本地代码,否则CPU就不能理解

本地代码的内容

  1. Dump:把文件的内容,每个字节用过2位十六进制数来表示的方式
    在这里插入图片描述

windows编译及链接的机制

在这里插入图片描述

  1. 编译器:用能把C语言等高级语言编写的源代码转换成本地代码的程序就叫编译器
  2. 目标文件:指的是编译器生成结果的意思,如.c文件编译后生成.obj目标文件
  3. 链接器:把多个目标文件结合,生成一个EXE文件的处理就是链接,运行链接的程序就是链接器
  4. 库文件:指的是把多个目标文件集成保存到一个文件中的形式,链接器指定库文件之后,就会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件
  5. 外部符号:指其他目标文件中的变量或函数
  6. 标准函数:不是通过源代码形式而是通过库文件形式和编译器一起提供的
  7. 静态链接库:存储着目标文件的实体,并直接和EXE文件结合的库文件形式称为静态链接库
  8. 导入库:存储着两个信息,一个是函数存在某个DLL文件中,另一个是存储这DLL文件的文件夹信息的库文件(如:import32.lib)

操作系统和应用的关系

早期的操作系统

在这里插入图片描述
在这里插入图片描述

windows操作系统的特征

  1. 32(64)位操作系统

  2. 通过API函数集来提供系统调用(API:联系作成应用的程序员和操作系统之间的接口)

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

  4. 通过WYSIWYG实现打印输出(WYSIWYG是指显示器上显示的内容可以直接通过打印机打印输出)

  5. 提供多任务功能(通过时钟分割技术来实现的)
    在这里插入图片描述

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

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

硬件控制方法

应用与硬件

  1. 应用通过操作系统间接的控制硬件
  2. 利用操作系统提供的系统调用功能就可以实现对硬件的控制,系统调用称为API,各API就是应用调用的函数,这些函数的实体被存储在DLL文件中

IN和OUT指令

  1. IN指令:通过指定的端口的端口输入数据,并将其存储在CPU内部的寄存器中
  2. OUT指令:把CPU寄存器中存储的数据,输出到指定端口号的端口
  3. I/O控制器:计算机主机中,附带了用来连接显示器及键盘等外围设备的连接器,各连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的IC,这些IC,统称为I/O控制器
  4. 端口:I/O控制器中有用于临时保存输入输出数据的内存,I/O控制器内部的内存,也称寄存器,与CPU内部的寄存器不同。CPU内部的寄存器是用来进行数据运算处理的,而I/O控制器则主要是用来临时存储数据的
    在这里插入图片描述

外围设备的中断请求

  1. 中断请求IRQ:暂停当前正在运行的程序,并跳转到其他程序运行的必要机制
  2. 实施中断请求的是连接外围设备的I/O控制器,负责实施中断处理程序的是CPU,为了进行区分,外围设备的中断请求会使用不同与I/O端口的其他编号,该编号称为中断编号。
  3. 操作系统和BIOS会提供响应中断编号的中断处理程序

DMA可以实现短时间内传送大量数据

  1. DMA:不通过CPU的情况下,外围设备直接和主内存进行数据传送。
  2. I/O端口号、IRQ、DMA通道是识别外围设备的3点组合,不过IRQ、DMA不是每个外围设备都必须具备的

文字及图片显示机制

  1. 显示器中显示的信息一直存储在某内存中,该内存称为VRAM

猜你喜欢

转载自blog.csdn.net/ilvjiale/article/details/122536728