Linux内核中的线程死锁

一、死锁的概念

    1.什么是死锁:

      死锁 (deadlocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

   2.死锁的常见表现:

     死锁不仅会发生多个进程中,也会发生在一个进程中。一种交叉持锁死锁的情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其它线程占用并堵塞了的资源。例如,如果线程 1 锁住了记录 A 并等待记录 B,而线程 2 锁住了记录 B 并等待记录 A,这样两个线程就发生了死锁现象。在计算机系统中 , 如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。

   (1)多进程死锁:有进程A,进程B,进程A拥有资源1,需要请求正在被进程B占有的资源2。而进程B拥有资源2,请求正在被进程A战友的资源1。两个进程都在等待对方释放资源后请求该资源,而相互僵持,陷入死锁。
   (2)单进程死锁:进程A拥有资源1,而它又在请求资源1,而它所请求的资源1必须等待该资源使用完毕得到释放后才可被请求。这样,就陷入了自己的死锁。

二、产生死锁的原因及条件

   1.原因:

   (1)进程推进顺序不当造成死锁。
   (2)竞争不可抢占性资源引起死锁。
   (3)竞争可消耗性资源引起死锁。

   2.产生死锁的四个必要条件:

   (1) 互斥条件:一个资源每次只能被一个进程(线程)使用。
   (2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。
   (3) 不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。
   (4) 循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。

三、如何避免死锁

   1..预防死锁:这是一种较简单和直观的方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个,来预防发生死锁。但由于所施加的限制条件往往太严格,因而会导致系统资源利用率和系统吞吐量低。

   2.避免死锁:该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。这种方法只需事先施加较弱的限制条件,便可获得较高的资源利用率及系统吞吐量,但在事实上有一定的难度。目前在较完善的系统中常用此方法来避免发生死锁。

   3. 检测死锁:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,而是允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时的检测出死锁的发生,并精确地确定与死锁有关的线程和资源;然后采取适当措施,从系统中将已发生的死锁清除掉。

   4.解除死锁:这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将线程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些线程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的线程,是之转为就绪状态,以继续运行。死锁的检测和解除措施有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

四、常见算法与原理

   银行家算法:

      避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法:

      银行家算法是避免死锁的一种重要方法,防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
      程序实现思路银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
       把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行家算法进行资源分配可以避免死锁


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础(三) IP数据报格式 网际校验和 路由 04TCPIP基础(四) TCP特点 TCP报文格式 连接建立三次握手 连接终止四次握手 TCP如何保证可靠性 05TCPIP基础(五) 滑动窗口协议 UDP特点 UDP报文格式 Linux网络编程之socket编程篇 06socket编程(一) 什么是socket IPv4套接口地址结构 网络字节序 字节序转换函数 地址转换函数 套接字类型 07socket编程(二) TCP客户/服务器模型 回射客户/服务器 socket、bind、listen、accept、connect 08socket编程(三) SO_REUSEADDR 处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline实现 用readline实现回射客户/服务器 getsockname、getpeername gethostname、gethostbyname、gethostbyaddr 11socket编程(六) TCP回射客户/服务器 TCP是个流协议 僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14socket编程(九) select 读、写、异常事件发生条件 用select改进回射服务器程序。 15socket编程(十) 用select改进第八章点对点聊天程序 16socket编程(十一) 套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) epoll使用 epoll与select、poll区别 epoll LT/ET模式 19socket编程(十四) UDP特点 UDP客户/服务基本模型 UDP回射客户/服务器 UDP注意点 20socket编程(十五) udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程之进程间通信篇 23进程间通信介绍(一) 进程同步与进程互斥 进程间通信目的 进程间通信发展 进程间通信分类 进程间共享信息的三种方式 IPC对象的持续性 24进程间通信介绍(二) 死锁 信号量 PV原语 用PV原语解决司机与售票员问题 用PV原语解决民航售票问题 用PV原语解决汽车租赁问题 25System V消息队列(一) 消息队列 IPC对象数据结构 消息队列结构 消息队列在内核的表示 消息队列函数 26System V消息队列(二) msgsnd函数 msgrcv函数 27System V消息队列(三) 消息队列实现回射客户/服务器 28共享内存介绍 共享内存 共享内存示意图 管道、消息队列与共享内存传递数据对比 mmap函数 munmap函数 msync函数 29System V共享内存 共享内存数据结构 共享内存函数 共享内存示例 30System V信号量(一) 信号量 信号量集结构 信号量集函数 信号量示例 31System V信号量(二) 用信号量实现进程互斥示例 32System V信号量(三) 用信号集解决哲学家就餐问题 33System V共享内存与信号量综合 用信号量解决生产者消费者问题 实现shmfifo 34POSIX消息队列 POSIX消息队列相关函数 POSIX消息队列示例 35PO
### 回答1: 《linux内核情景分析pdf》是一本介绍Linux内核的教材,作者是罗柏特(Robert Love),他是一位资深的Linux内核开发者。这本书主要分为三个部分,分别是进程管理、内存管理和文件系统,涵盖了Linux内核三个最核心的子系统。 在进程管理方面,这本书详细地介绍了进程的创建、调度、信号处理以及线程和多核处理等内容,涉及的知识点非常广泛和深入。在内存管理方面,罗柏特介绍了Linux内核的内存管理机制、虚拟内存和页表等概念,还介绍了内存分配、缓存和交换等操作。在文件系统方面,这本书介绍了文件系统的实现、文件的编写、缓存和磁盘的相关操作等内容。 《linux内核情景分析pdf》这本书的特点是非常系统和细致,作者不仅深入解析了Linux内核的工作原理,还提供了大量的代码实例,让读者可以更深入地理解内核的实现过程。此外,这本书也很适合那些希望深入学习Linux内核的程序员和系统管理员来阅读,因为它涉及了很多实用的知识点和调优技巧。 总的来说,《linux内核情景分析pdf》是一本非常优秀的Linux内核学习资料,它拥有非常严谨的逻辑和非常详细的介绍方式,所以非常适合在Linux内核开发、系统调优和性能优化方面进行借鉴和参考。 ### 回答2: 《Linux内核情景分析》是一本深入浅出地介绍Linux内核的经典之作,也是Linux内核开发者必读的一部书。该书的叙述深入浅出,条理清晰,配合大量的代码和图表,既便于初学者学习理解,又给有经验的开发者带来了不少启示。书对于Linux系统架构和Linux内核源代码的分析,对于读者深入理解Linux内核工作原理和应用具有非常重要的参考价值。 本书主要围绕内核调试、进程管理、内存管理、文件系统和网络协议栈等方面进行详细的讲解。值得一提的是,书对于内核的调试章节非常详细,包括了内存泄露、死锁、oops等常见问题的分析与解决方法。另外,书还有一些经典的案例分析,如进程调度、文件系统实现、网络协议栈实现等,让读者更加深入地了解Linux内核的实现细节以及内核开发者实现的思路。 总之,《Linux内核情景分析》是一本十分经典、权威的Linux内核书籍,对于任何想深入学习Linux内核的开发者以及系统管理员都是一本必读之作。它的内容结构严密、内容丰富、通俗易懂,可以帮助读者快速掌握Linux内核的工作原理和开发技术。 ### 回答3: 《Linux内核情景分析》是由赵炯、张锟著作的一本介绍Linux内核的技术书籍,该书分为三个部分,分别是系统调用、内存管理和进程管理等方面的内容,涵盖了Linux内核的基础知识和高级技术。 书详细介绍了Linux内核的结构、架构和实现原理,而且通过一系列的案例分析和代码实现,让读者深入了解Linux内核的不同模块,包括进程调度、文件系统、网络等等。通过这些案例,读者能够更好地了解内核的设计和实现方式,同时也能够学会如何利用Linux内核提供的特性进行应用开发和系统优化。 此外,该书还包括了一些高级主题,如虚拟化、调试、性能优化等等。这些主题可以让读者更全面地了解Linux内核的实现细节,并深入研究Linux内核的高级特性。 总之,《Linux内核情景分析》是一本全面介绍Linux内核的技术书籍。它不仅适合Linux内核开发人员、系统管理员和运维人员阅读,也适合对Linux内核有兴趣的读者阅读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值