本文最后更新于39 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
2024.11.20
- 想代码文件这种用阿克斯码值来表示的文件是文本文件,其他所有的文件都是二进制文件
- 数字的机器表示是对真值的有限近似( 二进制导致的)
- 文件是对I/O设备的抽象,在操作系统的设计中,无论是存储在磁盘上的数据、键盘输入、屏幕输出,还是网络通信,都可以被视为“文件”。这种抽象统一了不同类型设备的操作接口,使得程序可以用相同的方式处理不同的I/O设备。
- 并发的上下文切换,会保存当前进程的上下文,加载新进程的上下文,并将控制权交给新进程(肯定会有开销)
- 如果一个进程需要用操作系统的功能(如打开文件),会将控制权交给系统内核。
- 内核不是一个独立的进程,是一个管理所有进程和数据结构的集合
- 多线程比多进程更容易共享数据
2024.11.21
- 前后端交互用JSON不用xml的原因是,xml比较臃肿,内容没多少,标签很多
- 指针也有值跟类型,值是指向位置处的地址,类型是所储存对象的类型
- 大多数计算机都以字节为最小的可寻址单位而非一个比特位。每个对象都是一个字节块,而程序就是一个更大的字节块、
- 机械级程序将内存看做一个非常大的字节数组,称为虚拟内存,内存的每一个字节都由唯一的数字来表示,称为地址
- 所有可能的地址的集合就是虚拟地址空间
- 意思就是,有的数据类型在不同的编译环境下占的内存大小不同,所以整了几个不会变的(解释的下图)
2024.10.23
- 乘除运算的开销(*约10个时钟周期,/30个)非常大可以用位移运算代替尤其是2的整数次幂
2024.11.29
操作系统,启动
- 计算机的基本结构运算器,控制器,储存器,输入设备,输出设备冯诺依曼模型
- 储存的基本单位是字节,每个字节是八个比特位,每个字节对应一个内存地址。内存地址也是从零开始编号的
- cpu
- cpu64位和32位是cpu位宽,决定cpu一次可以处理多少位的数据。cpu位宽也代表一次最多能控制多少线路位宽,所以cpu位宽一般与线路位宽是一致的,cpu位宽少于线路位宽会有的线路位宽用不上。大于则同理。
- 超过32位的数据(包括各种类型的数据整数,地址啥的都算),32位的cpu无法一次性访问。所以32位的cpu最多可以控制4gb左右的内存(装的内存再多也不行),而64位的cpu可以操控的地址非常大2的64次方个字节,超级大,根本用不完。然后32位的cpu运算超过三十二位的数字的时候,无法一次运算就解决。得先拆开,再各部分相加,再运算进制,会多好几步。如果计算小于32位的数据,64位和32位并没有什么区别
- cpu执行程序的过程(cpu的指令周期)
- 第一步cpu读取程序计时器的值(该指令所在的地址)。再通过cpu的控制单元控制地址总线访问指令所在地址,通知内存准备好数据,数据准备好之后通过数据总线将数据传给cpu,然后cpu将数据存到指令寄存器
- 第二步程序计数器自增如果是64位那就自增八个字节
- 第三步分析指令寄存器中的数据,确定指令的类型和参数,若是计算指令就交给逻辑运算单元,若是存储指令就交给控制单元
- 总结一下就是先获取指令到指令寄存器,再程序计数器自增,最后执行指令寄存器里面的指令就行。
- 数据段存数据,正文段存指令,这俩是分开的
- 每一条指令占的内存大小都是固定的,而数据占的内存大小则取决于数据
- 上图是一个32位的指令
- 执行指令的四个阶段
- 获取指令
- 指令解码
- 执行指令
- 数据回写
指令一共有五种类型
- 数据传输指令 数据的存储
- 运算类型 无需多言 数学预算 逻辑运算 位运算都算
- 跳转类型 分支循环啥的 函数调用
- 信号类型 如中断
- 闲置类型 如cpu空转
指令执行速度 GHz (cpu的一个参数)代表1秒可以产生多少G次数的脉冲信号,每一次脉冲信号高低电平的转换就是一个周期,称为时钟周期 对于cpu来说一个时钟周期只能执行一个最基本的动作,所以时钟频率越高,时钟周期就越短,工作速度就越快 一般来说,每个指令需要多个时钟周期,乘除法的时钟周期要远大于加减和位移运算
计算机的存储设备
除了内存和硬盘计算机还有其他的存储设备
cpu运算速度特别快,但是从硬盘读取数据就非常慢了,从硬盘读取数据会拖慢整体的结构,所以在cpu和硬盘之间加了一层内存,减少对硬盘的操作(有的数据可以从头到尾都不经过硬盘,我们平常写的变量,通常只有存入数据库了(持久化)才会存入硬盘),加快速度。
上面的很好理解,那么为什么在cpu与内存之间又加了那么多层呢。那是因为,随着硬件技术的发展,cpu的运算速度越来越快,就连内存存取数据的速度也跟不上了,所以多加了几层速度更快的,相应的,容量也更小。64位cpu大多容量只有8个字节。速度越快,能耗越高,材料越贵,所以容量小,而且太大也没必要。
寄存器
寄存器的存取速度超级快,只需要半个时钟周期。cpu执行一条指令的时候,除了要存取寄存器还需要解码指令,控制指令执行和计算。所以读取寄存器的速度非常重要。
cpu cache
首先这个是分为三层的
L1跟L2是每个核心都有的,L3是多个核心共享的。
L1的访问速度几乎和寄存器一样快,需要2-4的时钟周期,大小在几十kb和几百kb之间不等。
指令和数据在L1中是分开存放的,所以分为指令缓存和数据缓存