进程是CPU资源分配的最小单元。(电脑打开个qq,打开个迅雷等都是进程)
线程是CPU调度的最小单元。(qq里发送一段文字,和女朋友开个视频都是线程)
线程是建立在进程基础上的一次程序运行单位。
进程的状态:
相关知识点:
1)一个进程,至少包含一个线程,同一个进程,可以包含多个线程。
2)线程共享同个进程的所有资源(寄存器,堆栈,上下文等),所以线程在进行时一般要进行同步和互斥。
3)进程结束后它拥有的所有线程都将销毁,而线程结束不会影响同个进程中其他线程的结束。
4)所有操作系统中的执行功能都是线程是去完成的。
5)线程和进程都有自己的私有属性,不被共享。线程:线程ID,寄存器,硬件上下文等 进程:进程控制块PCB
6)线程属于进程。
多线程编程优点:
1)线程可以有效提高系统的执行效率,当多个任务需要处理机处理时,减少处理机的切换时间 。
2)线程创建和结束所需要的系统开销比进程的创建和结束要小的多。
3)因为同一进程中的线程共享资源,便于通信,而进程间的通信(IPC)则很困难且消耗更多资源。
死锁:
什么是死锁?
多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
死锁产生的原因:
1)系统资源(不可抢占的资源和可消耗资源)的竞争。
2)进程推进顺序非法。
产生死锁的四个必要条件: (即需要同时满足四个条件才会发生死锁)
1)互斥条件:进程要求对所分配的资源进行排他性控制,即在某段时间内,资源只能被该进程占有,此时其他进程请求该资源那只能等待。
2)不剥夺条件:进程所获得的资源在没有使用完成之前,不能被其他进程强行夺走,即只能由该进程自己来释放资源(只能是主动地释放)。
3)请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而新的资源已被其他进程占有,此时请求进程会被阻塞,但对自己已经持有的资源保持不放。
4)循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被下一个进程所请求,即存在一个处于等待状态的进程集合{P1, P2, P3, P4....PN},其中Pi等待的资源被Pi+1占有,Pn等待资源被P0占有,如图。
右图则说明了循环等待条件 != 死锁条件 资源可能为环外进程所占有。
如何处理死锁?
(一)预防死锁:破坏四个必要条件。
1)破坏互斥条件:即允许进程同时访问某些资源,缺点:有些资源本身的属性决定了他不能被同时访问,比如打印机。
2)破坏不剥夺条件:即允许进程强行从其他进程中抢夺某些资源,缺点:这种方法实现困难,且会降低系统性能。
3)破坏请求-保持条件:采取资源预先分配策略,即进程运行前一次性向系统申请所需要的全部资源,只有当要到全部资源时进程才运行。缺点:1.许多情况下一个进程运行前不可能知道他所需要的全部资源,因为进程执行时是动态的。2.资源利用率低。3.降低了进程的并发性。
4)破坏循环等待条件:实行资源有序分配策略,采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成回路。缺点:1.给所有资源编号费时耗力2.为了遵循按编号申请的次序,暂不使用的资源也需要提前申请,增加了进程对资源的占有时间。
(二)避免死锁:动态策略,它不限制进程有关申请资源的命令,而是对进程所发出的每一个申请资源命令加以动态地检查,并根据检查结果决定是否进行资源分配。就是说,在资源分配过程中若预测有发生死锁的可能性,则加以避免。这种方法的关键是确定资源分配的安全性。
1)安全序列 2)银行家算法
(三)检测死锁:运行时出现死锁,能及时发现死锁,把程序解脱出来。
(四)解除死锁:发生死锁后,解脱进程,通常撤销进程,回收资源,再分配给正处于阻塞状态的进程。