Java基础
1、Java数据类型的装箱与拆箱
2、Integer中的缓存类IntegerCache
3、Integer源码
数据结构
操作系统
进程调度算法
1、非抢占式进程调度算法(先来先服务算法,短作业优先算法,高响应比优先算法)
2、抢占式进程调度算法(时间片轮转算法,优先级调度算法,多级反馈队列调度算法)
注意: 优先级调度算法既有抢占也有非抢占,区别在于非抢占式在当前的进程执行完毕后,再从就绪队列中的进程取出优先级最大的进程分配CPU
调度算法 | 是否为抢占式算法 | 是否会导致饥饿现象 | 饥饿原因 |
---|---|---|---|
短作业优先算法 | 否 | 是 | 源源不断地来短作业,则长作业无法被分配CPU |
优先级调度算法 | 抢占式与非抢占式均存在 | 是 | 源源不断地有更高优先级的进程来临,则优先级低的进程无法被分配CPU |
多级反馈队列调度算法 | 是 | 是 | 源源不断地有新进程进入,则已处于较高级队列的进程无法被分配CPU |
时间片轮转算法 | 是 | 否 | 不会导致饥饿 |
先来先服务算法 | 否 | 否 | 不会导致饥饿 |
高响应比优先算法 | 否,只有当前运行的进程主动放弃CPU,才会进行就绪队列中进程的响应比计算 | 否 | 不会导致饥饿 |
信号量机制
信号量其实就是一个变量,来表示系统中某种资源的数量,可以是整型信号量或者记录型信号量
原语是一种特殊的程序段, 其执行职能一起和恒,不可被中断,原语是由关中断/开中断指令实现的。
信号量机制可以实现进程互斥(占用P,释放V),进程同步(前操作后V,后操作前P)和对一类系统资源的申请和释放(申请P,释放V)
进程同步与互斥问题
内存基础
地址转换(装入)
逻辑地址向物理地址的转换
转换方式:
- 绝对装入:编译器负责地址转换(适用于单道程序阶段)
- 静态重定位(可重定位装入):装入时将逻辑地址转换为物理地址
- 动态重定位(动态运行时装入):运行时将逻辑地址转换为物理地址,需要设置重定位寄存器
概念
编译:由源代码生成目标模块,链接后形成完整的逻辑地址
链接:由目标模块生成装入模块,链接后形成完整的逻辑地址,即 将所有的目标模块单独的逻辑地址整合成一个完整的逻辑地址
装入:将装入模块装入内存,装入后即生成了物理地址
链接方式
- 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开
- 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式
- 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。优点是便于修改和更新,便于实现对目标模块的共享
区别在于:
静态链接是将需要的所有目标模块和库函数全部打包成一个可执行文件。
装入时动态链接是将所有目标模块都单独装入内存,边装入边链接
运行时动态链接是在运行时,调用到该目标模块时,才会将该目标模块装入到内存进行链接
覆盖技术
分为一个固定区和若干个覆盖区
固定区:存放最活跃的程序段,固定区中的程序段在运行过程中不会调入调出
覆盖区:不可能同时访问的程序段可共享一个覆盖区,而覆盖区中的程序段在运行过程中会根据需要调入调出
交换技术
在外存的什么位置保存被换出的进程?
对换区为了追求换入换出速度,使用连续分配方式
文件区为了追求更高的存储空间利用率,使用离散分配方式
什么时候交换?
交换通常在许多进程运行且内存不够的情况使进行,而系统负荷降低就暂停。
应该换出哪些进程?
优先换出阻塞进程,优先级低的进程,以及需要考虑在内存驻留时间长短(驻留时间较短的进程换出的可能性越小)。
所有被换出的进程都会在内存中保留其PCB
覆盖技术是在同一个程序或进程中的,而交换技术是在不同进程间的。
动态分区分配
常用的分区数据结构
- 空闲分区表(分区号,分区大小,起始地址,状态)
- 空闲分区链(每个分区的起始部分和末尾部分分别设置前向指针和后向指针,其实部分处还可记录分区大小等信息)
动态分区分配算法
-
首次适应算法:空闲分区按地址递增,每次从低地址开始查找,找到第一个能满足大小的空闲分区,分配后重新调整空闲分区。(优点:尽可能保留了高地址部分的大分区,缺点:导致低地址部分尽可能被使用,产生很多很小的外部碎片)
-
最佳适应算法:空闲分区按容量递增,每次顺序查找满足要求的第一个空闲分区,并在分配后按照容量递增来重新排序空闲分区表/空闲分区链。(缺点:会产生很多很小的外部碎片,难以利用,算法开销大)
-
最大适应算法:空闲分区按容量递减,每次顺序查找满足要求的第一个空闲分区,并在分配后按照容量递减来重新排序空闲分区表/空闲分区链。(缺点:会导致大进程无内存使用,算法开销大)
-
邻近适应算法:空闲分区按地址递增,每次从上次查找结束的位置开始查找,找到大小满足的第一个空闲分区。 (不管高地址还是低地址,分区被使用的可能性都一样,缺点:也可能导致大进程无内存使用)
部分琐碎理论
内部碎片:分配给某进程的内存区域中,有些内存没有用上
外部碎片:内存中的某些空闲分区由于太小而难以利用
可以采用紧凑(拼凑,Compaction)技术来解决碎片,此时应该采用的是动态重定位技术将进程调入内存
动态分区分配没有内部碎片(需要多少分配多少),但是有外部碎片