虚拟技术
- 物理实体转化为多个逻辑实体的过程
时分复用
- 通过时间的复用,
- 多个程序访问同一个资源(时间片轮转)
空分复用
- 虚拟内存
进程地址空间
内核空间
用户空间
- 代码段
- 数据段
- 堆区
- 栈区
- 未初始化段
- 映射区
一个进程创建的线程数目
- 由进程的虚拟空间和线程栈的大小决定
进程三状态
- 运行态 - >阻塞态(出现资源短缺)
- 等待->就绪(等待事件完成)
- 就绪->运行(cpu调度)
- 运行->就绪(时间片用完)
进程调度算法
- 先来先服务
- 短作业优先
- 时间片轮转
- 优先级调度
- 多级反馈队列算法
进程通信的方式
- 管道通信
- 信号量
- 共享内存
- 套接字
- 消息队列
守护线程
- 后台运行,与控制终端没有联系,周期性执行一个任务
- 孤儿进程:父进程先与子进程退出,子进程就称为孤儿进程,孤儿进程被init(进程号为1)的进程收养,完成收集和退出工作
- 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
操作系统什么时候会进入内核态
系统调用, 异常,中断
中断和异常
异常
- 异常也称为内中断, cpu内部指令出现问题出现问题的情况
中断
- 中断也称为外中断 ,是cpu外部的事件发出的中断
进程同步的方式
- 信号量机制
- 临界区串行访问
锁
- 互斥锁(只能有一个进程获得锁)
- 读写锁(读读并发,读写互斥)
- 自旋锁(当没有获得锁,周期性尝试申请锁)
乐观锁 与悲观锁
- 悲观锁:先加锁,再进行操作,然后释放锁
- 乐观锁:认为数据不会被更改,在初始时查看一次数据,然后修改时查看和初始时数据是否一致,一致然后进行修改
乐观锁实现方式
CAS机制
- 写入的内存V
- 预期值A
- 写入的值B
- 若 V == A , 则将V 更新为B
版本号机制
- 数据字段添加一个版本号字段,修改数据时,版本号一致才能修改
死锁的产生条件
- 互斥条件
- 不可剥夺条件
- 循环等待
- 请求和保持条件
死锁避免: 银行家算法(先进行资源的检查是否处于安全序列,然后再决定进行资源的分配)
死锁预防: 限制死锁产生条件的发生
内存管理
连续式内存管理
- 单一连续式内存分配
- 固定分区分配
- 动态分区分配
- 首次适应(First Fit)算法:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
- 最佳适应(Best Fit)算法:空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。
- 最坏适应(Worst Fit)算法:又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。
- 邻近适应(Next Fit)算法:又称循环首次适应算法,由首次适应算法演变而成。不同之处是分配内存时从上次查找结束的位置开始继续查找。
离散式内存管理
内部碎片与外部碎片
- 内部碎片:分配出去的空间无法被完全利用
- 外部碎片: 没有被分配的空间,但是太小了,无法进行分配
页面置换算法
- 最佳置换算法(以后最长未使用的内存块, 无法实现)
- 先进先出
- 最久未被使用算法
- 时钟置换算法