1.一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量当前值,每一个进程都包含一个主线程,线程是CPU调度的基本单元。
2.四种事件导致进程的创建:系统初始化 执行了正在运行的进程所调用的进程创建系统调用 用户请求创建一个新进程(点击了某个应用图标) 一个批处理作业的初始化
3.父子进程有各自不同的地址空间,但在Unix系统上,子进程的初始地址是父进程的一个副本,不可写的内存区是共享的,两步建立进程。windows下则父子关系通过参数来确定,实际上进程间是平等的,地址空间也是完全不同的。
4.进程的终止有四种情况,一是正常退出 二是出错自愿退出(终端是命令参数不对时) 三是严重错误被迫退出(内存读取错误等) 四是被其他进程杀死
5.一个进程在它整个生命周期里一般有这三种状态 运行态 就绪态 阻塞态
运行态是CPU给定时间片给进程运行
就绪态是进程随时准备被CPU调度运行
阻塞态是进程执行I/o操作或者某个系统调用导致的,等待外部某个事件的发生
6.需要多线程的原因
许多应用都需要同时进行多个活动,多个活动共享同一份内存数据
线程比进程更轻量,容易创建和销毁
如果是CPU跟IO操作都有,则能提升应用程序执行的速度,同时能够更多的获取CPU的时间
7.线程被称作迷你进程,同样拥有模拟的程序计数器、参数堆栈等结构
8.操作系统线程的多种实现方式
用户空间实现线程,每个进程都有个线程表,允许每个进程有自己的调度算法,控制线程的调度。
内核实现线程,内核里面有整个系统的线程表,通过时间片来随机分配
混合实现,内核只识别内核级线程,并对其进行调度,内核级线程被多个用户级线程多路复用
调度程序激活机制 当内核了解到一个线程被阻塞知乎,内核通知进程的运行时系统,并且在堆栈中以参数的形式传递有问题的线程编号和所发生的事件的描述,内核通过在一个已知的起始地址启动运行时系统,从而发送通知。
9.弹出式线程
分布式系统经常使用,当有任务时创建一个新线程来处理 ps:应该也可以使用线程池
10.多线程的数据保护
禁止使用全局变量
为每个线程赋予该线程私有的全局变量
使用锁机制 信号量 临界区 条件变量 (TSL XCHG)
11调度算法
批处理调度算法:先来先服务 最短作用优先 最短剩余事件优先
交互式调度算法:轮转调度 优先级调度 多级队列 最短进程优先 保证调度 彩票调度 公平分享调度
12 哲学家就餐问题和读者写者问题