2.1 进程
1. CPU 只能运行一个进程
2. 一个程序运行了两遍,也算作两个进程
3. 进程创建原因:
(1) 系统初始化
(2) 正在执行的进程调用的 进程创建 系统调用
(3) 用户请求创建
(4) 一个批处理作业初始化
4. UNIX系统 用 fork 系统调用创建新进程: 先创建一个相同的副本 再执行execve等系统调用修改其存储映像并运行一个新程序
WIN 则调用 CreateProcess 它即创建 还负责把正确程序装入新进程
5. 进程终止原因:
(1)正常退出 (2)出错推出 ========》自愿
(3) 严重错误 (4) be killed ==============》非自愿
6. UNIX 所有进程属于以init 为根的树
WIN 所有进程地位相同 即使创建进程时候父进程有子进程句柄(可用于控制) 但可以传给其他进程
7. 进程状态: (1) 运行 (2)就绪 (3)阻塞
有些进程是系统一部分 一般处于阻塞态等待触发
8. 操作系统维护一张进程表
9. 大致估算 内存有n个进程 进程等待IO(此时CPU空转) 概率 p^n
则CPU利用率 = 1 - p^n
更精确应该用排队论
2.2 线程
1.不同进程有不同地址空间 而线程共享所属进程的地址空间 全局变量 互相之间无保护 可以修改等
但每个线程有自己的堆栈
2. 线程轻量级 比进程更容易创建 撤销
3. Web服务器模型
(1)多线程 : 并行 阻塞系统调用 “顺序进程” 即 一个线程可阻塞着然后执行其他线程
(2)单线程: 无并行 阻塞系统调用 阻塞时CPU就干等着 “顺序进程”
(3)有限状态机: 并行 非阻塞系统调用 中断 (需要保存一个记录不同线程状态的表 一个原本需要阻塞的线程 不阻塞而是记录下来状态 等到信息返回时再从表抽出来执行 这样没有了“顺序进程”概念) 编程复杂
4. 线程状态可以是: 运行 阻塞 就绪 终止
5. 有一个常用线程调用thread_yield 线程自动放弃CPU让另一个线程运行 因为线程不同于进程 无法利用时钟中断强制线程让出CPU (线程比较高尚 互相信任 合作,进程则不一样)
6. 在用户空间中实现线程 : 线程对内核不可见 内核认为是传统的单线程进程来运行 用户空间中每个进程有自己的线程表
优点:(1) 可以在不支持线程的操作系统实现
(2)线程切换速度比内核快至少一个数量级
(3)线程切换不需陷阱 不需上下文切换 不需刷新内存高速缓冲
(4)每个进程可以定制自己的调度算法 可扩展性高 堆栈空间大
缺点:(1)无法实现阻塞系统调用 (一个进程有线程 abc 如果b阻塞 那么内核认为整个进程阻塞 所以线程ac同样无法执行) (页面故障同样会导致)
可以通过修改操作系统 用select(即先检查是否会阻塞 会就不执行 不会就执行)(包装器)
(2)需要线程自己让去CPU 否则其他线程无法工作 因为内核无法调度他们 没有时间中断
7.内核中线程 : 内核中有专门线程表
优点:(1)可以调度线程
缺点: (1)开销大
8. 混合实现
9. 调度程序激活机制:
线程在用户级 阻塞时 内核通过一个已知地址通知用户级运行时系统(上行调用) 运行时系统重新调度线程 当阻塞的那个线程可以开始时 再一次上行调用 运行时系统自己判断要重启被阻塞的线程 还是等下再执行该线程
10. 弹出式线程 :消息到达使系统创建一个线程 无历史 快速 在内核空间实现更容易便捷
2018/03/05 11:20