目录
1.进程和线程的区别
(1)一个程序至少有一个进程,一个进程至少有一个线程
(2)进程是系统中资源分配的基本单位,线程并不拥有系统资源(利用进程的资源),仅有一点必不可少的能保证独立运行的资源
(3)不同线程之间的独立性比不同进程间的独立性低得多。因为进程不允许别的进程来访问它的资源(除了共享全局变量),但同一个进程下的所有线程可以共享进程的内存地址空间和资源
(4)线程的创建和撤销需要的系统开销明显小于进程的创建和撤销
引入进程是为了程序可以并发执行,互不影响
2.进程和线程的状态
进程
创建:在进程表中为进程建立一个进程控制块PCB
线程
创建:由线程创建函数创建的
3.进程和线程的同步通信
线程同步机制
多个相关线程可以按照一定规则共享系统资源,并能很好的相互合作,使程序的执行具有可再现性
进程同步机制的方法
(1)互斥锁
只有一个,开锁、关锁。拥有互斥锁才可以访问公共资源,所以保证公共资源不会被多个线程访问
(2)信号量(P、V操作改变,属于原子操作,不可中断)
允许同一时刻多个线程访问资源,但需要控制线程的数量
信号量>0:当前可用资源数量
信号量<0:绝对值表示正在等待该资源的进程数
P:申请
wait(s){
while(s<=0){}
s--;
}
V:释放
signal(s){
s++;
}
4.进程、线程结束对对方的影响
(1)进程:剩余所有线程终止执行
(2)线程:普通线程结束,对进程没有影响,主线程退出,进程结束
5.进程的调度算法
(1)先来先服务:FCFS
带权周转时间=周转时间/服务时间=(完成时间-到达时间)/服务时间
按照作业/进程进入系统的先后次序进行调度
优点:有利于长作业
缺点:不利于来的较晚的短作业
(2)短作业优先
好处:降低作业平均等待时间,提高吞吐量
缺点:对长作业不利、紧迫性作业不利
(3)高优先权-高响应比优先
优先权=(等待时间+需要服务时间)/(需要服务时间)
响应比=响应时间/需要服务时间
两者一样
6.僵尸进程
孤儿进程: 没有父进程的进程,当父进程退出时,子进程就转为孤儿进程。孤儿进程没有危害
僵尸进程: 子进程结束了,父进程没有对其回收。父进程还在运行但是子进程挂了,但是父进程却没有使用wait来清理子进程的进程信息,导致子进程虽然运行实体已经消失,但是仍然在内核的进程表中占据一条记录,这样长期下去对于系统资源是一个浪费。
解决僵尸进程:
(1)干掉父进程,转为孤儿进程。init进程会进行托管,成为父进程
(2)通过信号机制singal
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。调用wait()或者waitpid(),让父进程阻塞等待僵尸进程的出现,处理完在继续运行父进程。
(3)重启系统
当系统重启时,所有进程在系统关闭时被停止,包括僵尸进程,开启时init进程会重新加载其他进程。
7.死锁
(1)什么是死锁
多个进程因竞争资源或相互通信而造成的一种僵局,都在等待对方释放自己需要的资源,但同时不去释放自己占用的资源,若无外力作用,这些进程永远无法向前推进
(2)产生原因
- 竞争资源
- 进程间推进顺序不当
(3)产生死锁的必要条件
- 互斥条件:进程对分配到的资源进行排他性使用
- 请求和等待:进程已经保持了至少一个资源,又提出了请求资源的要求,但该资源被其他进程占有,请求进程阻塞,但对已获得的其他起源不释放
- 不抢占:进程已获得的资源,使用完之前不能被其他进程抢占
- 环路等待:发生死锁时,必然存在进程-资源的环形链
(4)怎么解决死锁
- 预防死锁:设置限制条件,破环四个必要条件中的一个或几个
- 避免死锁:在资源动态分配过程中,用某种方法防止系统进入不安全状态
*银行家算法:*
a:进程申请资源
b:系统假设分配资源
c:检查分配后的系统是否安全,如果安全,确认本次分配。否则,取消本次分配并
阻塞该进程
- 检测死锁:预先不采取任何限制,也不检查系统是否已进入不安全状态,通过设置检测机构检测出死锁后进行解除
- 解除死锁:常用撤销或挂起一些进程,回收一些资源的方式
8.并发和并行
并发
一个时间段中有几个程序处于已启动运行到运行完毕之间,这个程序都是在一个处理器CPU上运行,时间片轮转 (一个人做多个事情)
并行
系统又一个以上CPU,不同进程可用被不同CPU执行,两个进程不去强制CPU资源,可以真正同时进行 (多个人同时做各自的事情)