1. 死锁。
1. 一系列进程集合中,每个进程都因为等待其他进程引发的事件而阻塞,就是死锁。
2. 死锁的原因有三点,一是系统资源不足,二是系统资源分配不合理,三是进程运行
推进的顺序不当。
3. 死锁四个必要条件是:互斥条件,一个资源只能被一个进程使用;请求和保持条件,
一个进程在等待请求的资源而阻塞时,自身已获取的资源不会释放;不可剥夺条件,
一个进程已经获取的资源不能被剥夺,只能自己释放;循环等待条件,若干进程之
间形成头尾相连循环等待资源关系。
4. 解决死锁方法:死锁预防,就是设计之初就破坏死锁四个必要条件之一,达到预防
效果,比方说,1.破坏互斥,一切都使用假脱机技术,虚拟设备功能使多个进程可
以同时使用一个独享设备;2.破坏请求等待,在开始就请求全部资源;3 破坏不可抢
占,抢占资源;4.破坏环路等待,对资源按序编号。死锁避免,就是每次申请资源
的时候,系统都判断这次申请是否会导致死锁,如果会就不分配资源,比如:银行
家算法,判断请求是否到达不安全状态,如果是,就延迟请求,其中安全状态和不
安全状态,可以用资源轨迹图来寻找。安全状态就是如果没有死锁发生,并且即使
所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每个进程
运行完毕。死锁的检测, 系统执行死锁检测算法,来检测是否有死锁,比如:每种
类型一个资源的话,可以判断有向图是否有环;多个资源的话,可以基于矩阵的检
测,现有资源、可用资源、当前占有资源和请求资源的矩阵,来检测是否会产生死
锁。死锁恢复,如果存在死锁,就采取措施恢复。比如撤销死锁进程,回收他们占
用的资源;或者挂起死锁进程,抢占他们的资源;利用回滚恢复到检查点。
2. 活锁。
1. 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝
试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是在不断的改变
状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则
不能。
2. 活锁例子:单一实体的活锁:线程从队列中拿出一个任务来执行,如果任务执
行失败,那么将任务重新加入队列,继续执行。假设任务总是执行失败,或者某种
依赖的条件总是不满足,那么线程一直在繁忙却没有任何结果。协同导致的活锁:
两个线程发生了某些条件的碰撞后重新执行,那么如果再次尝试后依然发生了碰撞,
长此下去就有可能发生活锁。
3. 解决方案:引入一些随机性;约定重试机制避免再次发生冲突。
3. 饥饿。
一个进程的请求无限制的被推后,而没有阻塞。比方说打印机优先打印小文
件,所以一个大文件可能会一直被推迟打印,但是没有阻塞。可以用先来先
服务的策略解决。
4 进程和线程区别:
答:1.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,
进程是系统进行资源分配和调度的一个独立单位。
2.线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小
的运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中
必不可少的资源如:程序计数器,栈;但是它可以与同属于一个进程的其他
线程共享进程所拥有的全部资源。线程不能够独立运行。
3.一个线程可以创建或者撤销另一个线程,同一个进程中多个线程可以并发
执行。一个程序至少有一个进程,一个进程至少有一个线程。
4.一个进程死掉不影响其他进程,但是一个线程死掉,会影响同在这个进程
下的其他线程,等于这个进程死掉。但是线程之间切换比进程之间方便效率
高,所以多线程实现比多进程方便简单。
5.进程通信方式,IPC。
答:1.管道:命名管道和匿名管道,匿名管道可以用于具有亲缘关系的进程
间通信,命名的可以用于没有亲缘关系的进程间通信。亲缘关系一般指父子
进程。只支持单向数据流。
2.信号或者消息:用于通知接收进程有某种事件发生,除了用于进程之间也
可以用于进程本身。消息队列是消息的链表,他克服了信号承载信息量少,
管道只能承载无格式字节流以及缓冲区大小受限的缺点。信号量主要作为进
程之间和同一进程不同线程之间同步的手段,不能传递复杂对象,只能用来
同步。
3.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用 IPC 形式。
4.套接字:更为一般的进程通信机制,可用于不同机器之间的进程通信。
6.进程和线程同步问题。
答:1. 线程同步指多个线程同时访问某资源时,采用一系列的机制以保证同时
最多只能一个线程访问该资源。线程同步是多线程中必须考虑和解决的问题,因
为很可能发生多个线程同时访问(主要是写操作)同一资源,如果不进行线程同
步,很可能会引起数据混乱,造成线程死锁等问题。
2. 进程在并发执行时为了保证结果的可再现性,各进程执行序列必须加以限制
以保证互斥地使用临界资源,相互合作完成任务。多个相关进程在执行次序上的
协调称为进程同步。用于保证多个进程在执行次序上的协调关系的相应机制称为
进程同步机制。
3.进程同步准则:(1)空闲让进。当无进程进入临界区时,相应的临界资源处于空闲状态,
因而允许一个请求进入临界区的进程立即进入自己的临界区。
(2)忙则等待。当已有进程进入自己的临界区时,即相应的临界资源正被访问,因而其它试
图进入临界区的进程必须等待,以保证进程互斥地访问临界资源。
(3)有限等待。对要求访问临界资源的进程,应保证进程能在有限时间进入临界区,以免陷
入“饥饿”状态。
(4)让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入忙等。
4.同步机制:
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合
控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线
程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程
将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才
可以抢占。
2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的
权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。
互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公
共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程
序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对
资源的安全共享。
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时
刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法
不同,信号允许多个线程同时使用共享资源,这与操作系统中的 PV 操作相同。
它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同
一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
PV 操作及信号量的概念都是由荷兰科学家 E.W.Dijkstra 提出的。信号量 S 是一个
整数,S 大于等于零时代表可供并发进程使用的资源实体数,但 S 小于零时则表
示正在等待使用共享资源的进程数。
P 操作申请资源:
(1)S 减 1;
(2)若 S 减 1 后仍大于等于零,则进程继续执行;
(3)若 S 减 1 后小于零,则该进程被阻塞后进入与该信号相对应的队列中,
然后转入进程调度。
V 操作 释放资源:
(1)S 加 1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,
然后再返回原进程继续执行或转入进程调度。
4、事 件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程
的优先级比较的操作 .
7.进程线程共享
A.线程共享的内容:进程代码段,进程的公有数据,进程打开的文件描述符,
信号的处理器,进程的当前目录,进程用户 ID 和进程组 ID
B.线程独享:线程 ID,寄存器组的值,线程的堆栈,错误返回码,线程的信号屏
蔽码
8.伙伴地址