计算机4个主要部件:CPU 内存(主存) I/O 系统总线
MAR:存储器地址寄存器
MBR:存储器缓冲寄存器
计算机其实所做的事就是:取指令和执行指令
取到的指令被放到:指令寄存器(IR)
指令也分为四类:
举个例子:
指令是16位bit 4个16进制 第一个字节是要执行的操作 后三个字节是执行的操作的数字的地址
1 940-》1代表加载AC 940代表数字地址为940
一个指令周期=取指令+执行指令
DMA直接内存存取:I/O模块直接读取主存 不经过CPU
中断:IO或者主存停止CPU当前的工作去处理他们的。
最初为了提高效率,因为CPU比I/O模块和主存快的多 要等他们 所以先去做自己的事情,他们好了来中断CPU
因此在指令周期中加了一个中断阶段:
指令周期中的中断阶段:
发送中断时候,需要保存当前的信息,包括程序状态字(PSW)和PC(程序计数器)等将其压栈,执行IO等中断的中断处理程序,执行完再恢复,继续执行刚才的任务。
多个中断的处理:
1.当中断执行时候禁止发生中断。后续的中断按顺序处理。缺点:没有考虑优先级,有的中断比较着急,不快处理后面的可能会溢出
2.定义中断优先级。
cache存在的意义:CPU和内存速度不匹配。CPU会大量访问主存。
解决:由于局部性原理,在处理器和内存之间提供一个容量小并且速度快的存储器 即cache。
所以CPU访问数据的时候,看数据是否在cache中,否则先从内存读入缓存再读取数据。
内存中的最小单位是字 也就是字节(8bit)
一个快是由n个字组成。
cache中有C个存储曹(多少行)每个槽K个字,槽的数字远远小于块的个数 C< 因此每个槽有一个标签 用于存储是哪一个块。标签通常是高位。 cache 替换策略。 cache的三种映射: 直接映射: 全相连映射: 组相连映射: IO通信技术: 可编程IO:CPU读取的时候一直在IO模块这里 做不了别的事情 中断驱动IO:cpu给模块发送io命令,然后去做别的工作,读一个字后,再利用中断来使用CPU,这样效率会高,但是仍然很低下,因为每个字都要中断(对读入的每个字,CPU必须状态检查,来确定这个字已经在io的数据寄存器了)。 DMA:需要控制总线与主存进行数据交换,不用CPU 操作系统:应用程序和计算机硬件的接口。 单道程序设计:运行完一个作业再去运行另一个作业。 多道程序设计:可以同时运行多个,并且在一个任务IO的时候,cpu去完成另一个事情。 执行上下文: 进程中的基址寄存器和界限寄存器定义了进程所占的存储器区域,基址寄存器保存了区域的起始地址,界限寄存器保存了大小,这样保护进程之间互不干扰。 分页系统实现了虚拟地址和物理地址的动态映射。 进程的五个状态: 新建态和就绪态的区别:新建态分配了空间但是执行代码没有进入内存,程序贮存在外存中,通常是磁盘。 通常,一个事件对应一个队列。队列中存放着待执行的进程,当事件发生,相应的队列中所有的进程都转换为就绪态。 挂起状态:如果进程处于阻塞态,OS可以把进程置于挂起态,转移到磁盘。 设计挂起态的原因:好多进程在等待I/O IO比计算慢得多 cpu处于空闲,因此把这些进程放到外存,也就是挂起。 操作系统维护的表:内存、IO、文件、进程。 PCB:和进程向关联的属性,属性的集合是PCB。 进程映像:数据 程序、栈、属性的集合。 用户态:不可以修改PCB等内存区域。 内核态:可以修改PCB等内存区域。 这样保护了PCB和操作系统不受用户程序的干涉。 程序状态字有一位表示状态字:内核还是用户。当用户调用系统服务或者中断时候,执行模式为内核态。 创建进程的步骤:1.给进程分配进程标识符2.给进程分配空间。3初始化PCB 4.设置正确的连接(放在调度队列里面)5.创建和扩充其他数据结构。 中断陷阱:中断:外部事件造成。陷阱:进程产生的错误或异常造成。 发生中断:1.PC设置成中断的开始地址2.切换成内核态。 线程:有独立的栈,还有独立的控制块用于包含寄存器的值、优先级、和其他与线程有关的状态信息。 线程优点:创建开销小、终止开销小、线程切换开销小、提高了不同执行程序的通信的效率。进程间通信需要内核介入。 用户线程和内核线程:内核线程需要在内核空间执行 ,需要切换到内核态。 SMP对称多处理:多个CPU ,通过总线共享主存。 信号量: 互斥信号量:0或者1 管程:局部数据只能被管程过程访问,任何外部过程不能访问。进程通过调用管程过程进入管程。 消息传递: 银行家算法: 内存管理 内部碎片:内存分了N个大小相等的分区,假设分区为8M,一个长度小于2M的程序被换进来后,导致其他空间浪费,内存碎片。 固定分区:大小相等的分区 大小不等的分区 对于分区不等的内存,放置算法:维持一个从小到大的队列来放置进程 动态分区:分区数目大小可变 来多少分多少。 缺点:外部碎片。 解决方法:压缩。 压缩:把所有进程都挪挪地方 把空的空间腾出地方来。但是很耗时。 伙伴系统:一直一分为二 重定位: 可能进程换入换出每次待的物理地址都不一样。进程使用的都是逻辑地址,需要转换为物理地址。 地址转换的一种方法:基址寄存器 界限寄存器 分页:解决上面的固定分区和动态分区的问题。 将内存分为多个页,将进程空间也分为多个页,这样可以最大化利用空间 进程的空间的物理地址可以不连续,用页表来一一对应。 举个例子: 分段:进程被划分为很多段。并且段的大小不需要相等。并且段可以不连续。可能产生外部碎片。 进程的常驻集:进程执行的任何时候都在内存中的部分。 当访问不在内存中的逻辑地址,产生中断,进程变为阻塞态。OS产生一个读磁盘的OI请求,在执行磁盘io期间,os可以调度另一个进程运行。 虚拟内存的原因:即使一个很大的进程,短时间内,执行也会在很小的程序里面,访问一两个数组的数据。这样给内存装入太多的块就会造成巨大的浪费。这样可以在内存中保存更多的进程。 但是OS必须管理的很好对进程的空间换入换出。如果频繁的换入换出,就会造成系统抖动。 系统抖动:CPU大部分的时间在把进程的块换入换出,而不是在执行指令。 虚拟内存大部分和分页一起。 页表:一个大表,存放着每一个虚拟内存中的块的基地址(物理地址),块中有偏移量,一相加就是所有的空间。 PLE页表项: P M P是否该页在内存,如果在,还包括该页的页框号。 同样的页表也保存在虚拟内存中,而不是在实际内存。 由于访问页表也会访问物理内存,增加了消耗,因此用类似于cache的高速缓存----TLB来存页表 长程调度:把那个进程加到当前活跃进程。 短程调度:下一次执行哪个进程。 中程调度:把进程从内存放到磁盘或者从磁盘放到内存。 调度算法: FCFS 段作业优先 高响应比优先线程: