前言
本文是作者专门用来自测Java后端相关面试题的,所有问题都是在牛客、知识星球或网上找到的最近最新的面试题,全文回答都是作者按自己的真实水平仿照真实环境的回答,所以答案不一定真实(但回答一定真诚🤣),其他即将面试的小伙伴可以试试自测一下💪
谈谈死锁,它产生的必要条件,以及如何预防的?
好的,
首先对于死锁,它其实是在多任务环境中,也就是在两个或多个进程的执行过程中,因为争夺资源产生的一种僵局状态,因为已经资源被分配完,所以所有的进程都在等待对方释放资源,但谁都不释放,导致所有的进程都无法继续执行
然后,死锁的发送必须满足四个条件,这四个条件缺一不可,这四个条件分别是:互斥条件、占有和等待条件、不可抢占条件和循环等待条件
(一定要解释一下四个条件的定义,这是问题的核心!!!)
- 互斥条件:资源不能被多个进程同时使用,一个资源一次只能由一个进程占用
- 占有和等待条件:进程至少占有一个资源,并且等待获取其他进程占有的资源
- 不可抢占条件:资源只能由占有它的进程资源释放,不能被强制夺走
- 循环等待条件:存在一个进程资源的循环等待链,每个进程都在等待下一个进程所占有的资源
由刚刚的死锁产生的四个必要条件,我们可以知道预防死锁的策略,因为四个条件缺一不可,所以我们只要破坏其中一个条件死锁也就不会发送了
- 破坏互斥条件:这在实际操作中很难实现,因为很多资源天生就是需要互斥访问的。
- 破坏占有和等待条件:可以通过要求进程在开始执行前一次性请求所有需要的资源来实现,但这可能导致资源利用率低下。
- 破坏不可抢占条件:允许资源被抢占,但这在实际操作中可能很复杂,并且可能导致数据不一致。
- 破坏循环等待条件:通过对所有资源类型进行排序,并要求进程按顺序请求资源,可以避免循环等待。
(关于死锁知识点,还有死锁的避免,检测和解除)
你知道进程通信的方式嘛?
当然,进程通信是操作系统中的一个非常重要的概念,它允许不同的进程之间交换信息,协同工作。在多任务操作系统中,进程通信时实现资源共享和任务协调的关键机制
(简单解释了什么是进程通信后,就开始说进程通信的方式了,因为进程通信的方式有很多,能说几个说几个)
-
管道(Pipes)和命名管道(Named Pipes)
管道是一种最基本的进程通信方式,它允许具有亲缘关系的进程(比如父子进程)进行通信。管道是单向的,数据只能从一端流向另一端。而命名管道则允许不具有亲缘关系的进程进行通信,它类似于文件,可以通过路径名进行访问。 -
消息队列(Message Queues)
消息队列提供了一种从一个进程向另一个进程发送数据的方式,这些数据被存储在队列中,直到接收进程读取它们。消息队列支持异步通信,并且可以跨多个进程和系统进行通信。 -
信号量(Semaphores)和互斥锁(Mutexes)
信号量和互斥锁主要用于控制对共享资源的访问。信号量可以用于控制多个进程对共享资源的访问数量,而互斥锁则确保一次只有一个进程可以访问共享资源,从而避免竞态条件。 -
共享内存(Shared Memory)
共享内存是一种效率非常高的进程通信方式,它允许两个或多个进程共享一个给定的存储区。由于多个进程可以同时操作同一块内存,因此共享内存是最快的进程通信方式,但也需要额外的同步措施来避免数据不一致。 -
套接字(Sockets)
套接字是一种更为通用的进程通信机制,它不仅支持本机进程间的通信,还支持跨网络的进程通信。套接字可以基于TCP/IP协议提供可靠的通信服务,也可以基于UDP提供不可靠的快速通信。 -
信号(Signals)
信号是一种比较复杂的进程通信方式,它用于通知进程某个事件已经发生。信号可以用于处理异步事件,比如中断和终端输入。
(结尾话语)
每种进程通信方式都有其特定的用途和限制。在实际应用中,选择合适的进程通信方式还是要取决于具体的应用需求,比如通信的进程是否具有亲缘关系、是否需要同步、是否跨网络通信等。