进程和线程
进程的各个状态
就绪等待被调度
运行 正在执行中
阻塞;缺少需要的资源 等待中
只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得
线程的各个状态之间的切换
- 就绪 :进程处于准备好的状态 得到CPU 就可以运行
- 执行:进程获得cpu 执行
- 阻塞:正在执行的进程由于发生某事件 暂时无法继续执行
进程和线程
- 进程: 进程是系统进行资源分配和调度的一个独立单位
- 线程:是CPU分配和调度的基本单位
进程和线程的关系
- 一个进程可以拥有多个线程
进程和线程的区别
- 进程有自己的独立地址空间 线程没有
- 进程是资源分配的最小单位线程是CPU分配的最小单位
- 线程通信更方便:
- 比如同一进程下线程共享数据(全局变量 静态变量)
进程切换代价高
- 进程切换
- 需要切换目录地址空间
- 切换内核栈 硬件上下文
- 进程切换
进程调度
- 非抢占式调度 抢占式调度
- 调度算法
- 先进先出,最短作业优先
- 优先权调度算法
- 轮转调度算法
- 多级队列调度
一个程序从开始到结束的过程
- 预处理 :头文件包含 宏替换
- 编译:将预处理的文件转换成汇编语言
- 汇编:将汇编代码转成二进制文件
- 链接:链接目标生成可执行文件
程序和进程
程序是永久的,进程是暂时的,程序是在数据集上的一次执行
程序是静态的观念,进程是动态的观念
进程具有并发性,而程序没有
进程和程序不是一一对应的,一个程序可以拥有多个进程。
程序有一定的生命周期
了解哪些寄存器
通用寄存器 标志寄存器 段寄存器
进程通信的方式
1. 管道通信 :
命名管道:在内核申请一块固定大小的缓冲区 。程序拥有读写的权利
匿名管道:
2. 消息队列:
在内核中创建一个队列,队列存储的元素是一个个数据报,不同进程通过句柄去访问这个队列
3. 信号量:
主要是PV操作
4. 共享内存:
主要是将一块物理地址映射到不同的进程虚拟地址空间中,实现不同进程堆同一志愿的共享
5. 套接字( socket ) :
套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。 比如QQ 聊天
死锁的四个条件
互斥 不可剥夺 循环等待 请求和保持
当系统出于安全状态时一定不会进入死锁
当系统处于不安全状态时不一定会死锁
进程调度算法:
先来先服务
短作业优先
时间片轮转调度
高响应比优先
优先权调度算法
多级队列调度算法
内存管理的方式:
段页式存储
① 随机算法:用软件或硬件随机数产生器确定替换的页面
② 先进先出:先调入主存的页面先替换
③ 近期最少使用算法(LRU,Least Recently Used):替换最长时间不用的页面
④ 最优算法:替换最长时间以后才使用的页面。这是理想化的算法,只能作为衡量其他各种算法优劣的标准。
IO 控制的方式:
有轮询 中断 DMA
外中断和异常有什么区别?
外中断是指由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。
而异常时由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。
磁盘调度算法
先来先服务
最短寻道优先
电梯算法
动态分区分配算法有哪几种?可以分别说说吗?
1、首次适应算法
算法思想:每次都从低地址开始查找,找到第–个能满足大小的空闲分区。
如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链( 或空闲分[表),找到大小能满足要求的第-一个空闲分区。
2、最佳适应算法
算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。
如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。
3、最坏适应算法
又称最大适应算法(Largest Fit)
算法思想:为了解决最佳适应算法的问题—即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第-一个空闲分区。
4、邻近适应算法
算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
如何实现:空闲分区以地址递增的顺序排列(可排成-一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
程序的编译过程
- 预编译 主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
1 | 1. 处理所有的预处理命令 |
编译 进行语法语义分析生成 汇编代码 .i 文件
汇编: 将汇编代码转化成机器码
链接:将不同目标文件链接转化成一个可执行文件
操作系统在对内存进行管理的时候需要做些什么?
- 操作系统负责内存空间的分配与回收。
- 操作系统需要提供某种技术从逻辑上对内存空间进行扩充。
- 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换。
- 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰
五大IO 模型
阻塞Io
非阻塞IO 不断询问 询问中间 可以做其他的事情
信号驱动:
用户事先在内核注册一个信号处理函数,管道和内核进行交互,当管道中的某个请求需要的数据处理好之后,进程再把对应的数据拷贝到用户空间中。
IO 复用模型 NIO Channel , Selector,Buffer
多个进程的IO 可以注册到同一个管道上,这个管道会统一和内核进行交互,当管道中数据准备好之后,进程再把对应的数据拷贝到用户空间。
异步IO
应用进程 把IO请求传递给内核后,完全由内核去操作文件拷贝,内核完成相关操作后,会发信号告诉本次应用进程本次IO 已经完成。