【愚公系列】软考中级-软件设计师 027-操作系统(进程管理-银行家算法和线程)
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
进程和线程是操作系统中的两个重要概念。
进程是计算机中正在运行的程序的实例。它拥有自己的地址空间、内存、文件描述符等资源,可以独立地执行和调度。每个进程都是独立运行的,拥有自己的程序计数器、寄存器和堆栈,可以进行上下文切换。
线程是进程中的执行单元,一个进程可以拥有多个线程。它们共享进程的资源,如内存、文件和打开文件。线程之间可以并发执行,每个线程有自己的程序计数器、栈空间、寄存器,但共享进程的地址空间。线程的创建、切换和销毁都比进程轻量级,消耗的资源较少。
与进程相比,线程之间的切换更快,因为线程共享相同的地址空间,它们可以直接访问进程中的数据,而无需通过进程间通信的方式。线程之间的通信更加方便和高效。
进程和线程之间的关系是一对多的关系,一个进程可以拥有多个线程。多线程可以提高程序的性能和响应速度,充分利用多核处理器的优势。但是,线程之间的同步与互斥也是一个挑战,需要使用同步机制来保证数据的一致性和避免竞态条件。
🚀一、死锁和线程
🔎1.死锁
死锁指的是在多进程/线程系统中,当两个或多个进程无法继续执行,因为它们所需要的资源被其他进程占用并且无法释放时产生的一种状态。换句话说,死锁是指两个或多个进程在互相等待对方所占有的资源而无法继续向前推进的情况。
死锁的发生是由于四个必要条件同时满足所导致的,即互斥条件、不可抢占条件、占有并等待条件和循环等待条件。当这四个条件同时满足时,系统进入死锁状态。
死锁的解决方法包括资源预分配策略、死锁检测与恢复、死锁预防和死锁避免等。这些方法旨在避免或解决死锁情况,使系统能够正常运行。
死锁产生的四个必要条件:
必要条件 | 描述 |
---|---|
互斥条件 (Mutual Exclusion) | 资源只能被一个进程占用,其他进程必须等待该资源的释放 |
不可抢占条件 (Hold and Wait) | 进程在持有至少一个资源的同时,又请求获取其他进程占有的资源 |
占有并等待条件 (Hold and Wait) | 进程在申请新的资源时,保持对已占有资源的占有,并等待获取新的资源 |
循环等待条件 (Circular Wait) | 一组进程形成循环等待资源关系,每个进程都需要下一个进程所占有的资源才能继续执行,而这种资源关系存在循环的依赖关系 |
当上述四个条件同时满足时,系统就会进入死锁状态。
为了避免死锁的发生,我们需要采取适当的算法和策略来破坏这些条件之一,有下列方法:
解决措施 | 描述 |
---|---|
死锁预防 | 通过限制并发进程对资源的请求,破坏死锁产生的四个条件之一,使系统在任何时刻都不满足死锁的条件。 |
死锁避免 | 使用银行家算法来避免死锁。预先计算出一条不会导致死锁的资源分配方法,只分配资源给能够保证系统安全性的进程,否则不分配资源,从而避免死锁的发生。 |
死锁检测 | 允许死锁的产生,但系统定时运行一个检测死锁的程序。如果检测到系统中发生死锁,则设法加以解除,可以通过资源剥夺或进程撤销来解除死锁。 |
死锁解除 | 在死锁发生后采取解除方法,例如强制剥夺资源,撤销进程等。这些方法会破坏死锁中的某个条件,以解除死锁。 |
死锁计算问题:系统内有n个进程,每个进程都需要R个资源,那么其发生死锁的最大资源数为n*
(R-1)。其不发生死锁的最小资源数为n*(R-1)+1。
🔎2.线程
线程(Thread)是计算机中最小的执行单元,是进程内的一个独立执行流程。一个进程可以包含多个线程,而线程共享进程的资源,如内存空间、文件句柄等。每个线程有自己的程序计数器、栈和一些状态信息,但在同一个进程中的多个线程可以共享同一块内存空间。
相比于进程,线程更加轻量级,线程的切换和创建所需的开销较小,可以更高效地利用处理器的时间片。多线程可以同时进行多个任务,可以充分利用多核处理器的并行计算能力。
在多线程编程中,线程可以并发地执行,可以同时处理多个任务,提高了程序的并发性和效率。线程之间的通信可以通过共享内存或消息传递等机制进行。但线程之间的共享资源也可能引发同步问题,需要合理地使用锁、信号量等同步机制来保证数据的一致性和避免竞态条件。
线程是操作系统中的执行单位,可以将一个进程的任务划分为多个并发执行的线程,提高程序的并发性和效率。
🚀二、银行家算法
银行家算法是一种资源分配算法,主要用于避免死锁的发生。它最初由艾兹格·迪科斯彻发表,并被称为银行家算法。
该算法基于以下原则:
- 每个进程在启动时,必须声明其最大需求的资源数量。
- 在运行时,进程可以请求分配一定数量的资源。
- 如果系统可以满足进程的资源请求,并且分配后不会导致死锁,则分配资源。
- 如果系统不能立即满足进程的资源请求,进程进入等待状态,直到资源可用。
- 当进程完成时,系统回收分配给该进程的资源。
银行家算法的核心是资源分配的安全性检查。在安全状态下,即使所有进程同时请求资源,也不会进入死锁状态。否则,系统会拒绝分配资源,以避免死锁的发生。
银行家算法的实现涉及到资源分配的数据结构和算法,可以通过银行家算法来进行资源的合理分配,从而提高系统的性能和可靠性。
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)