操作系统:进程和线程 && CPU调度算法
进程和线程
- 进程是系统进行资源分配和调度的一个独立单位,最小的资源管理单位。
- 线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,最小的 CPU 执行单元。
线程拥有的资源: 程序计数器 寄存器 栈 状态字
进程的通信方式
- 管道:半双工,用于父子进程(亲缘关系进程)
- 有名管道:半双工,允许无亲缘关系进程通信
- 信号量:是一个计数器,是一种进程/线程间的同步机制
- 消息队列:消息的链表
- 信号:用于通知线程某个事件的发生
- 共享内存:开辟一个能被其他进程访问的内存空间
- 套接字
僵尸进程
什么是僵尸进程:
当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
怎样来清除僵尸进程
- 改写父进程,在子进程死后要为它收尸。具体做法是接管 SIGCHLD 信号。子进程死后,会发送 SIGCHLD 信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用 wait,内核也会向它发送 SIGCHLD 消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
- 把父进程杀掉。父进程死后,僵尸进程成为”孤儿进程”,过继给 1 号进程 init,init 始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
死锁
产生死锁的必要条件
- 互斥条件
- 不可抢占条件
- 占有并申请条件
- 循环等待条件
死锁的避免安全序列
安全序列:如果系统按照这种序列分配资源,则每个进程都能 顺利完成。
只要能找出一个安全序列,那么系统就处于安全状态
死锁的避免 - 银行家算法
核心思想:在进程提出资源申请时,先预判此次分配是否会进入不安全状态,如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞着。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
- 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
- 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
- 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
- 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。