死锁与饥饿
《计算机操作系统教程》第三版答案
第一章操作系统概述课后习题
1. 硬件将处理机划分为两种状态,即管态和目态,这样做给操作系统设计带来什么好处 ? 答:便于设计安全可靠的操作系统。管态和目态是计算机硬件为保护操作系统免受用户程序的干扰和破坏而引入的两种状态。通常操作系统在管态下运行,可以执行所有机器指令;而用户程序在目态下运行,只能执行非特权指令。如果用户程序企图在目态下执行特权指令,将会引起保护性中断,由操作系统终止该程序的执行,从而保护了操作系统。
2. 何为特权指令?举例说明之。如果允许用户执行特权指令,会带来什么后果?答:只能在态下才能执行的指令称为特权指令。如开关中断、置程序状态寄存器等。如果允许用户执行特权指令,它将不仅影响当前运行的程序,而且还有可能影响操作系统的正常运行,甚至整个系统。
3. 中断向量在机器中的存储位置是由硬件确定的,还是由软件确定的 ? 答:中断向量在机器中的位置是由硬件确定的。例如,在 INTEL 80x86 CPU 中,内存空间0x00000——0x003ff为中断向量空间。
4. 中断向量的内容是由操作系统程序确定的还是由用户程序确定的?答:中断向量的内容是由操作系统程序确定的。向量的内容包括中断处理程序的入口地址和程序状态字(中断处理程序运行环境),中断处理程序是由操作系统装入内存的,操作系统将根据装入的实际地址和该中断处理程序的运行环境来填写中断向量。
5. 中断向量内的处理机状态位应当标明是管态还是目态 ? 为什么? 答:应当标明是管态。该状态由系统初试化程序设置,这样才能保证中断发生后进入操作系统规定的中断处理程序。
W130死锁与饥饿-(5.5.1)--C2-7-3死锁避免
2 Approaches to Deadlock Avoidance
•Do not start a process if its demands might lead to deadlock. •Do not grant an incremental resource request to a process if this allocation might lead to deadlock.
Resource Allocation Denial
•Referred to as the banker’s algorithm.
•State of the system is the current allocation of resources to process.
•Safe state is where there is at least one sequence that does not result in deadlock.
•Unsafe state is a state that is not safe.
Safe State
•指系统能按某种顺序如<P1,P2,…,Pn>(称<P1,P2,…,Pn>为安全序列),来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺序完成,则称系统处于safe state.
•若系统不存在这样一个安全序列,则称系统处于unsafe state.
Initial State
P2 Runs to Completion
P1 Runs to Completion
死锁和饥饿的区别
死锁和饥饿的区别
1. ⾸先死锁是同步的,饥饿时异步的。也就是说,死锁可以认为是两个线程或进程同时在请求对⽅占有的资源
2. 饥饿可以认为是⼀个线程或是进程在⽆限的等待另外两个或多个线程或进程占有的但是不会往外释放的资源。
当饥饿到⼀定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。
介绍“死锁”的例⼦1:如果线程A锁住了记录R1并等待记录R2,⽽线程B锁住了记录R2并等待记录R1,这样两个线程A和B就发⽣了死锁现象。
介绍“死锁”的例⼦2:两个⼭⽺过⼀个独⽊桥,两只⽺同时⾛到桥中间,⼀个⼭⽺等另⼀个⼭⽺过去了然后再过桥,另⼀个⼭⽺等这⼀个⼭⽺过去,结果两只⼭⽺都堵在中间动弹不得。
介绍饥饿的例⼦:资源在其中两个或以上线程或进程相互使⽤,第三⽅线程或进程始终得不到。想像⼀下三个⼈传球,其中两个⼈传来传去,第三个⼈始终得不到。
死锁的概念思维导图分享
死锁的概念什么是死锁?各进程互相等待对方手里的资源, 导致各进程都阻塞, 无法向前推进
死锁、饥饿、死循环的区别
死锁至少是两个进程一起死锁, 死锁进程处于阻塞态
饥饿可以只有一个进程饥饿, 饥饿进程可能阻塞也可能就绪
死循环可能只有一个进程发生死循环, 死循环的进程可以上处理机
死锁和饥饿时操作系统要解决的问题, 死循环是应用程序员要解决的死锁产生的必要条件
互斥条件对必须互斥使用的资源的争抢才会导致死锁
不剥夺条件进程保持的资源只能主动释放, 不可强行剥夺
请求和保持条件保持着某些资源不放的同时, 请求别的资源
循环等待条件
存在一种进程资源的循环等待链
循环等待未必死锁, 死锁一定需要循环等待
什么时候会发生死锁?对不可剥夺资源的不合理分配, 可能导致死锁
死锁的处理策略
预防死锁破坏死锁产生的四个必要条件
避免死锁避免系统进入不安全状态(银行家算法)
死锁的检测和解除允许死锁发生, 系统负责检测出死锁并解除
多线程编程的常见问题和解决方法
多线程编程的常见问题和解决方法多线程编程是同时运行多个线程的编程模型,可以提高程序的并发性和响应性。然而,多线程编程也会带来一些常见问题,如竞态条件、死锁、活锁、饥饿等。下面是一些常见的问题和解决方法。
1.竞态条件
竞态条件是指多个线程对共享资源进行访问和修改时的不确定性结果。解决竞态条件的方法有:
-使用互斥锁(mutex):通过确保一次只有一个线程能够访问共享资源,来避免竞态条件。
-使用信号量(semaphore):通过限制同时访问共享资源的线程数量来避免竞态条件。
-使用条件变量(condition variable):通过让线程等待某个条件满足,再进行访问共享资源,来避免竞态条件。
2.死锁
死锁是指多个线程互相等待对方释放资源,导致系统无法继续执行的状态。解决死锁的方法有:
-避免使用多个锁:尽可能减少锁的数量,或者使用更高级的同步机制如读写锁(read-write lock)。
-破坏循环等待条件:对资源进行排序,按序请求资源,避免循环等待。
-使用超时机制:在一定时间内等待资源,如果超时则丢弃请求,避免无限等待。
3.活锁
活锁是指多个线程在不停地改变自己的状态,但无法向前推进。解决活锁的方法有:
-引入随机性:当多个线程同时请求资源时,引入随机性来打破死锁的循环。
-重试策略:如果发生活锁,暂停一段时间后重新尝试执行操作。
4.饥饿
饥饿是指某个线程由于优先级或其他原因无法获得资源,导致无
法继续执行。解决饥饿的方法有:
-使用公平锁:确保每个线程获得资源的机会是公平的,避免某个
线程一直无法获得资源。
Java并发中死锁、活锁和饥饿是什么意思
Java并发中死锁、活锁和饥饿是什么意思
解答
死锁是指两个或者两个以上的进程(或线程)在执⾏过程中,因争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,他们将⽆法推进下去。
如果线程的智⼒不够, 且都秉承着“谦让”的原则,主动将资源释放给他⼈使⽤,那么就会导致资源不断地在两个线程间跳动,⽽没有⼀个线程可以同时拿到所有资源正常执⾏。这种情况就是活锁。
饥饿是指某⼀个或者多个线程因为种种原因⽆法获得所需要的资源,导致⼀直⽆法执⾏。⽐如它的线程优先级可能太低,⽽⾼优先级的线程不断抢占它需要的资源,导致低优先级线程⽆法⼯作。
补充
死锁
是指两个或两个以上的进程(或线程)在执⾏过程中,因争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。此时称系统处于死锁状态或系统产⽣了死锁,这些永远在互相等待的进程称为死锁进程。
产⽣死锁的原因
互相争夺共享资源
产⽣死锁的4⼤条件
1.互斥条件:共享资源被⼀个线程占⽤
2.请求与保持条件(占有且等待):⼀个进程因请求资源⽽被阻塞时,对已经获得资源保持不释放
3.不可剥夺条件(不可抢占):进程已获得资源,在未使⽤完之前,不能进⾏剥夺
4.循环等待条件:多个线程循环等待资源,⽽且是循环的互相等待
死锁如何解决?
只需要破坏上⾯ 4 个条件中的⼀个就能破坏。
1.请求与保持条件:放⼤锁范围,去除对资源的抢占
2.不剥夺:换成可重⼊锁ReentrantLock
3.循环等待:改成顺序加锁,避免循环等待
4.互斥是多线程的特性,所以这个条件⽆法避免
活锁
是指线程1可以使⽤资源,但它很礼貌,让其他线程先使⽤资源,线程2也可以使⽤资源,但它很绅⼠,也让其他线程先使⽤资源。这样你让我,我让你,最后两个线程都⽆法使⽤资源。活锁不会被阻塞,⽽是不停检测⼀个永远不可能为真的条件。除去进程本⾝持有的资源外,活锁状态的进程会持续耗费宝贵的CPU时间。
试述临界区管理的基本原则
试述临界区管理的基本原则
一、引言
临界区管理是指在多线程并发执行时,为了保证线程安全而需要对共享数据进行临界区保护的一种技术。在实际编程中,合理的临界区管理可以有效提高程序的性能和可靠性,因此掌握临界区管理的基本原则是非常重要的。
二、什么是临界区
在多线程编程中,当多个线程同时访问同一个共享资源时,就会出现数据竞争问题。为了避免这种问题,需要对访问共享资源的代码段进行限制,这个被限制的代码段就被称为临界区。
三、基本原则
1. 最小化锁定范围
由于锁定操作会增加系统开销和延迟时间,因此应该尽量缩小锁定范围。只有必要时才应该对共享资源进行加锁操作。
2. 避免死锁
死锁是指两个或多个进程互相等待对方释放所占用的资源而导致无法继续执行的情况。为了避免死锁问题,在设计程序时应该注意遵循以下原则:
(1)按照相同顺序获取锁;
(2)使用超时机制;
(3)避免多个锁之间的循环等待。
3. 避免饥饿
饥饿是指某个线程由于一直无法获取锁而无法执行的情况。为了避免饥饿问题,在设计程序时应该注意遵循以下原则:
(1)公平性原则:按照请求锁的顺序进行处理,先来先服务;
(2)优先级原则:按照线程优先级进行处理;
(3)随机选择原则:随机选择一个等待线程获得锁。
4. 避免数据竞争
数据竞争是指多个线程同时访问共享资源而导致的数据不一致问题。
为了避免数据竞争问题,在设计程序时应该注意遵循以下原则:
(1)使用原子操作;
(2)使用互斥量;
(3)使用条件变量。
5. 避免过度优化
过度优化可能会导致代码难以维护和调试,因此应该尽量避免过度优化。在实际编程中,应该根据具体情况进行适当的优化。
软件测试中的并发和多线程测试技巧
软件测试中的并发和多线程测试技巧在软件测试中,并发和多线程测试是非常重要的技巧之一。随着计
算机技术的不断发展和软件的复杂性增加,同时也带来了并发和多线
程的挑战。在本文中,我将介绍并发和多线程测试的基础知识,并分
享一些有效的测试技巧。
一、并发和多线程测试简介
在软件开发中,如果一个应用程序要处理多个任务或事件,就需要
使用并发和多线程技术。并发是指同时执行多个任务的能力,而多线
程是实现并发的一种方法。并发和多线程技术可以提高软件的性能和
响应速度,但也带来了一些潜在的问题和挑战。
二、并发和多线程测试的挑战
并发和多线程测试的挑战主要体现在以下几个方面:
1. 竞争条件:当多个线程同时访问共享资源时,可能会发生竞争条件。竞争条件可能会导致数据一致性问题和不确定的结果。
2. 死锁:死锁是指多个线程相互等待对方释放资源而无法继续执行
的情况。死锁可能会导致系统崩溃或无响应。
3. 饥饿:饥饿是指某个线程长时间无法获得所需资源的情况。饥饿
可能会导致系统性能下降或响应延迟。
4. 内存泄漏:并发和多线程测试可能会导致内存泄漏问题。内存泄
漏可能会使系统的内存消耗过大,最终导致系统崩溃或出现性能问题。
三、并发和多线程测试技巧
为了有效地进行并发和多线程测试,可以采用以下几种技巧:
1. 并发和多线程测试计划:在进行并发和多线程测试之前,制定详细的测试计划是非常重要的。测试计划应包括测试的范围、测试的目标、测试环境的搭建和测试用例的设计等。
2. 并发和多线程测试工具:使用合适的测试工具可以简化测试的过程,并提高测试的效率和准确性。常用的并发和多线程测试工具包括Junit、TestNG和JMeter等。
互斥锁的底层原理
互斥锁的底层原理
互斥锁是一种常用的同步机制,用于保护共享资源的访问,以避免多个线程同时修改数据而导致的数据不一致或错误。在深入了解互斥锁的底层原理之前,我们先来了解一下什么是互斥锁。
互斥锁,即互斥互斥锁,是一种用于多线程编程的同步原语。它提供了一种机制,确保在任何时刻只有一个线程可以访问共享资源。当一个线程获得了互斥锁后,其他线程就不能再获取该锁,只能等待该线程释放锁之后才能继续执行。
互斥锁的底层实现依赖于操作系统的原子操作和硬件指令。在多核处理器上,互斥锁通常使用原子操作来实现,以确保在多个线程之间的正确同步。具体而言,互斥锁的底层原理可以分为以下几个方面:
1. 硬件指令支持:现代处理器通常都提供了一些特定的硬件指令来支持原子操作,例如test-and-set、compare-and-swap等。这些指令可以在一个原子操作中完成读取和修改共享变量的过程,确保在多线程环境下的原子性。
2. 上锁与解锁:当一个线程想要访问共享资源时,它需要先获得互斥锁。如果互斥锁当前没有被其他线程持有,则该线程可以直接获得锁,并将锁的状态设置为“已锁定”。如果互斥锁已经被其他线程持有,则该线程将进入等待状态,直到锁被释放为止。
3. 等待与唤醒:当一个线程释放了互斥锁后,它需要通知其他等待锁的线程。这通常通过操作系统提供的等待队列来实现。当一个线程释放锁时,它会将锁的状态设置为“未锁定”,并从等待队列中选择一个等待的线程唤醒,使其可以继续执行。
4. 死锁与饥饿:互斥锁的底层实现需要解决死锁和饥饿的问题。死锁是指多个线程因为相互等待对方释放锁而无法继续执行的情况,而饥饿是指某个线程长时间无法获取到锁的情况。为了避免死锁和饥饿,互斥锁的实现通常包含一些策略,例如公平性、超时等待等。
如何保证线程安全
如何保证线程安全
线程安全是指当多个线程同时访问相同资源时,执行的
结果符合预期,并且没有发生任何异常。在现代计算机系统中,多线程编程已经成为日常开发中不可或缺的一部分。为了保证程序能够正确地运行,开发人员必须遵循一些规则来确保线程安全。
一、使用同步控制
同步控制是保证程序的线程安全的最基本方式。同步控
制使用一些特殊的关键字和API,例如synchronized关键字、ReentrantLock类等,来保证对于某个共享资源的访问同一时
刻只能被一个线程实现。通过使用同步控制,开发人员可以确保在任何情况下都只有一个线程访问共享变量,从而避免了在多个线程访问相同资源时产生的竞争情况。
二、避免使用共享变量
共享变量是导致竞争情况的主要原因之一,因此开发人
员应该尽量避免使用共享变量。相反,应该使用本地变量或者方法参数来替代共享变量。这样,就可以确保不同线程之间不会相互干扰。当然,有时候无法避免使用共享变量,但是这种情况应该尽可能地减少或者尽早锁定共享变量以保证线程安全。
三、使用线程安全的数据结构
线程安全的数据结构,例如ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue等,已经被专门设计
来满足多线程环境下的需求。这些数据结构可以在多个线程同时访问时保证数据的一致性和正确性。因此,在需要使用集合
类等数据结构时,应该选择线程安全的数据结构。
四、避免死锁
死锁是指多个线程无限等待彼此的资源,导致所有的线程都被阻塞,程序无法继续正常执行的一种情况。死锁是程序中常见的一种问题,必须尽可能地避免。开发人员应该避免在程序中引入复杂的锁定结构或者使用超时机制来防止死锁。
《计算机操作系统》死锁与饥饿
4.3.2 银行家算法
►银行家算法的思想 ♦ 通过动态选择资源分配的状态,确保系统总是处于安全状态来避免死锁。 ♦ 当进程请求一组资源时,假设系统同意该资源请求,从而改变了系统的 状态,然后确定系统是否还处于安全状态; ● 若系统仍处于安全状态,则系统就同意该资源请求; ● 若系统处于不安全状态,则系统就阻塞该进程直到同意该资源请求 后系统处于安全状态.
►为什么不安全状态未必导致死锁? ►判断系统是否处于安全状态的关键是查找系统是否存在一个安全序列。寻
找安全序列是根据每个进程接下来所需资源的最大需求进行判断的。而实 际执行时,进程申请的资源数目不一定达到其最大需求量。例如,一个进 程对应的程序中有一段进行错误处理的代码,其中需要n个A类资源。若该 进程在运行过程中没有发生错误,也就不需调用该段错误处理代码,那么 它就不会请求这n个A 类资源。 因而,不安全状态未必产生死锁。
♦ 请求且保持条件,又称为占有且等待条件。进程已经保持至少一个资源,但 又提出新的资源请求,因未获得资源而阻塞,进程在等待资源时,继续保持 已分配得到的资源。
♦ 不可抢占条件。进程已获得的资源在未使用完毕之前,其他进程不能强行抢 占,只能由该资源的占有进程在使用完时自行释放。
♦ 循环等待条件。存在一个封闭的进程-资源链,每个进程至少占有进程-资源链 中下一个进程所需要的一个资源。
►这样,我们只要使上述4 个必要条件中的某一个不满足,死锁就可以解除。
死锁与活锁的原因与解决方法(附加“饿死”)
死锁与活锁的原因与解决⽅法(附加“饿死”)
活、死锁的定义
1.死锁:是指两个或两个以上的进程(或线程)在执⾏过程中,因争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。此时称系统处于死锁状态或系统产⽣了死锁,这些永远在互相等待的进程称为死锁进程。
⽐如:迎⾯开来的汽车A和汽车B过马路,汽车A得到了半条路的资源(满⾜死锁发⽣条件1:资源访问是排他性的,我占了路你就不能上来,除⾮你爬我头上去),汽车B占了汽车A的另外半条路的资源,A想过去必须请求另⼀半被B占⽤的道路(死锁发⽣条件2:必须整条车⾝的空间才能开过去,我已经占了⼀半,尼玛另⼀半的路被B占⽤了),B若想过去也必须等待A让路,A是辆兰博基尼,B是开奇瑞QQ的屌丝,A素质⽐较低开窗对B狂骂:快给⽼⼦让开,B很⽣⽓,你妈逼的,⽼⼦就不让(死锁发⽣条件3:在未使⽤完资源前,不能被其他线程剥夺),于是两者相互僵持⼀个都⾛不了(死锁发⽣条件4:环路等待条件),⽽且导致整条道上的后续车辆也⾛不了。(很粗鲁的相互竞争)
因此,产⽣死锁的必要条件
(1)互斥使⽤(资源独占)
⼀个资源每次只能给⼀个进程使⽤(⽐如写操作)
(2)占有且等待
进程在申请新的资源的同时,保持对原有资源的占有
(3)不可抢占
资源申请者不能强⾏从资源占有者⼿中夺取资源,资源只能由占有者⾃愿释放
(4)循环等待
P1等待P2占有的资源,P2等待P3的资源,...Pn等待P1的资源,形成⼀个进程等待回路
2.活锁:任务或者执⾏者没有被阻塞,由于某些条件没有满⾜,导致⼀直重复尝试,失败,尝试,失败。
[整理]死锁的四个必要条件以及处理策略
[整理]死锁的四个必要条件以及处理策略
⽬录
⼀、什么是死锁
多线程以及多进程改善了系统资源的利⽤率并提⾼了系统的处理能⼒。然⽽,并发执⾏也带来了新的问题:死锁。
死锁是指两个或两个以上的进程(线程)在运⾏过程中因争夺资源⽽造成的⼀种僵局(Deadly-Embrace [ɪm'breɪs]拥抱) ,若⽆外⼒作⽤,这些进程(线程)都将⽆法向前推进。
下⾯我们通过⼀些实例来说明死锁现象。
先看⽣活中的⼀个实例:
2个⼈⼀起吃饭但是只有⼀双筷⼦,2⼈轮流吃(同时拥有2只筷⼦才能吃)。某⼀个时候,⼀个拿了左筷⼦,⼀⼈拿了右筷⼦,2个⼈都同时占⽤⼀个资源,等待另⼀个资源,这个时候甲在等待⼄吃完并释放它占有的筷⼦,同理,⼄也在等待甲吃完并释放它占有的筷⼦,这样就陷⼊了⼀个死循环,谁也⽆法继续吃饭。。。
在计算机系统中也存在类似的情况。例如,某计算机系统中只有⼀台打印机和⼀台输⼊设备,进程P1正占⽤输⼊设备,同时⼜提出使⽤打印机的请求,但此时打印机正被进程P2 所占⽤,⽽P2在未释放打印机之前,⼜提出请求使⽤正被P1占⽤着的输⼊设备。这样两个进程相互⽆休⽌地等待下去,均⽆法继续执⾏,此时两个进程陷⼊死锁状态。
关于死锁的⼀些结论:
参与死锁的进程数⾄少为两个
参与死锁的所有进程均等待资源
参与死锁的进程⾄少有两个已经占有资源
死锁进程是系统中当前进程集合的⼀个⼦集
死锁会浪费⼤量系统资源,甚⾄导致系统崩溃。
⼆、死锁、饥饿、活锁
饥饿(Starvation[stɑr'veɪʃn])指某⼀线程或多个线程在某种情况下⽆法获取所需要的资源,导致程序⽆法执⾏。
操作系统 05第五章 死锁与饥饿1
F(scanner)=1; F(tape)=2; F(printer)=3;
申请次序
r1
r2
...
rk
...
rm
进程pi可以申请资源rj中的实例rl,pi当前占有rl, F(rl)F(rj)
大学课件 22
5.6.2 有序分配法
证明无死锁(deadlock free):
反证,假定死锁 时刻t1: p1无限等待rk1中的资源实例,被p2占有;
大学课件
13
例子(无环路,无死锁)
例1. P={p1,p2,p3}, R={r1(1),r2(2),r3(1),r4(3)}
E={(p1,r1),(p2,r3),(r1,p2),(r2,p1),(r2,p2),(r3,p3), (r4,P3)} r1 r3
p1
p2
p3
r2
大学课件
r4
14
例子(有环路,有死锁)
5.6.1 预先分配法
进程:运行前申请所需全部资源; 系统:
能够满足,全部分配, 否则,一个也不分配。
破坏“hold-and-wait”条件 缺点:
资源利用效率低; 一次提出申请困难。
大学课件 21
5.6.2 有序分配法
资源集:R={r1,r2,…,rn}
函数:F:RN 例如:R={scanner,tape,printer}
linux一个读写锁的使用异常导致的故障
linux一个读写锁的使用异常导致的故障在Linux系统中,读写锁(Reader-Writer Lock)是用于优化读多写
少场景下的同步机制。它允许多个读操作同时进行,但只允许一个写操作
进行。然而,如果读写锁的使用出现异常,可能会导致各种故障,例如死锁、数据不一致等。
1.死锁:
读写锁的一个常见问题是死锁,即两个或多个线程互相等待对方释放
锁而无法继续执行。这种情况可能会发生在以下情况下:
-写者优先:若一个写操作一直等待读锁时,而其他线程又持有了读锁,那么这个写者将永远无法获取写锁,导致死锁。
-写锁饥饿:当读者一直等待写锁,但写锁不断被其他写者占用,那
么读者可能会一直等待下去,导致死锁。
为避免死锁,应该在使用读写锁时遵循一些规则,比如避免持有写锁
时再去申请读锁,或者将写锁请求转化为读锁请求等。
2.数据不一致:
读写锁的使用异常也可能导致数据不一致问题。读写锁允许并发读取,但在写操作期间,需要独占锁,以确保数据的一致性。然而,如果在读者
访问共享数据的同时,写者修改了数据,可能会导致数据的不一致性问题。例如,一个线程正在读取一篇文章的一些段落,而另一个线程正在修改这
个段落,那么读者可能会读到一个更新之前的数据,导致数据不一致。为
了避免这个问题,需要在对共享数据进行读写操作时加锁,以确保数据的
一致性。
3.性能降低:
读写锁的不当使用也可能导致性能降低的问题。读写锁适合于读多写少的场景,但如果过多地使用写锁,或者持有写锁的时间过长,那么可能会导致其他线程长时间等待,降低整体的并发性能。为了提高性能,可以尽量减少写锁的持有时间,或者使用粒度更小的锁来代替读写锁。
操作系统智慧树知到答案章节测试2023年长春大学
第一章测试
1.一个完全无软件的计算机系统,称为裸机。()
A:对
B:错
答案:A
2.为用户提供良好的使用界面,不是操作系统需要提供的功能。()
A:错
B:对
答案:A
3.如果分时操作系统的时间片一定,那么用户数越多,则响应时间越长。()
A:错
B:对
答案:B
4.由于资源等因素的限制,使进程的执行通常都不是“一气呵成”,而是以“停
停走走”的方式运行。()
A:对
B:错
答案:A
5.操作系统是一种()。
A:软件包
B:应用软件
C:系统软件
D:通用软件
答案:C
6.操作系统是对()进行管理的软件。
A:软件
B:计算机资源
C:硬件
D:应用程序
答案:B
7.从用户的观点看,操作系统是()。
A:用户与计算机之间的接口
B:合理地组织计算机工作流程的软件
C:由若干层次的程序按一定的结构组成的有机体
D:控制和管理计算机资源的软件
答案:A
8.工业控制系统中运行的操作系统最好是()
A:分时系统
B:网络操作系统
C:实时系统
D:分布式操作系统
答案:C
9.操作系统的基本类型主要有()
A:批处理系统
B:多任务系统
C:分时系统
D:多用户系统
E:实时操作系统
答案:ACD
10.分时系统具有的特征有()
A:独立性
B:可靠性
C:交互性
D:多路性
E:及时性
答案:ACDE
11.实时调度算法最早截止时间优先即EDF(Earliest Deadline First)是非抢占的。
()
A:对
B:错
答案:B
第二章测试
1.进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的
一个独立单位。()
A:对
B:错
答案:A
2.异步性是指进程按各自独立的、不可预知的速度向前推进,或说进程实体
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
该条件不可能被禁止,需要对资源的互斥访问,则操作系统必须互斥
占有并等待:
进程一次性地请求所有需要的资源,并且阻塞这个进程直到所有的请求都满足 1. 一个进程可能被阻塞很长时间,以满足其所有的资源请求 2. 分配给一个进程的资源可能在相当一段时间内都不会被使用 3. 一个进程有可能事先并不知道自己所需要的资源
产生饥饿的主要原因是:在一个动态系统中,对于每类系统资源,操作系统 需要确定一个分配策略,当多个进程同时申请某类资源时,由分配策略确定资源 分配给进程的次序。有时资源分配策略可能是不公平的,即不能保证等待时间上 界的存在。在这种情况下,即使系统没有发生死锁,某些进程也可能会长时间等 待.当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿,当饥饿 到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿 死。举个例子,当有多个进程需要打印文件时,如果系统分配打印机的策略是最 短文件优先,那么长文件的打印任务将由于短文件的源源不断到来而被无限期推 迟,导致最终的饥饿甚至饿死。
死锁与饥饿(I)
死锁的原理:
相互竞争系统资源或者进行通信的进程永久阻塞 当一组进程中的每个进程都在等待这个事件,而只有在这组进程中的其他被阻塞的进程才可 以触发这个事件
可重用资源: 资源分为两类:可重用的和可消耗的
可重用资源:一次只能供一个进程安全的使用,并且不会由于使用而耗尽的资源
可消耗资源: 可消耗资源是指可以被创建和销毁的资源 当消费进程得到一个资源时,该资源就不再存在了
上述 3 与 4 采用下面一种策略: 目前为止消耗的处理器时间最少 目前为止产生的输出最少 预计剩下的时间最长 目前为止分配的资源总量最少 优先级最低
、
死锁与饥饿(II)
在多道程序系统中,同时有多个进程并发运行,共享系统资源,从而提高了 系统资源利用率,提高了系统的处理能力。但是,若对资源的管理、分配和使用 不当,则会产生死锁或是饥饿。所谓死锁是指在多道程序系统中,一组进程中的 每一个进程军无限期等待被该组进程中的另一个进程所占有且永远不会释放的 资源。饥饿是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等 待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿 到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿 死。下面我们就来分别讨论一下死锁与饥饿各自的特点。
不可抢占: 1. 占用某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它占用 的资源 2. 一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个资 源
循环等待:
循环等待条件可以通过定义资源类型的线性顺序来预防的
死锁的避免: 1. 进程启动拒绝 2. 资源分配拒绝
安全状态:至少有一个资源分配序列不会导致死锁 允许三个必要条件,但是通过明智的选择,确保永远不会到达死锁点,死锁避免比死锁预防 有更多的并发
饥饿没有其产生的必要条件,随机性很强。并且饥饿可以被消除,因此也将 忙式等待时发生的饥饿称为活锁。
由于饥饿和饿死与资源分配策略有关,因而解决饥饿与饿死问题可从资源分 配策略的公平性考虑,确保所有进程不被忽视。如时间片轮转算法(RR)。它将 CPU 的处理时间分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片, 当时间片结束时,就强迫运行程序让出 CPU,该进程进入就绪队列,等待下一次 调度。同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片, 以投入运行。如此方式轮流调度。这样就可以在不考虑其他系统开销的情况下解 决饥饿的问题。
死锁避免的方法:
如果一个进程的请求会导致死锁,则不启动该进程 如果一个进程增加的资源请求会导致死锁,则不允许此分配 死锁避免策略不能确切的预测死锁,仅仅是预料死锁的可能性并确保永远不出现这种可能 死锁避免的限制: 声明每个进程请求的最大资源 进程执行的顺序没有任何同步要求的限制 分配的资源数目必须固定 在占用资源时,进程不能退出 死锁的恢复: 取消所有的死锁进程,操作系统最常用的方法 把死锁进程回滚到前面定义的某些检查点,还有可能存在死锁 连续取消死锁进程直到不存在死锁 连续抢占资源Hale Waihona Puke Baidu
资源是独占的且排他使用。即任意时刻一个资源只能给一个进程使用,其 他申请者只有等待,直到资源被占有者释放。如例子中的A,B资源。 (2) 不可剥夺条件 进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,而只能 由拥有该资源的进程自愿释放。如例子中 P2 不能强占 P1 拥有的 A 资源, 而 P1 也不能强占 P2 拥有的 B 资源。 (3) 请求和保持条件 进程每次申请他所需要的一部分资源,在申请新的资源的同时,继续占用 已分配到的资源。如例子中 P1 申请 B 资源时继续占有 A 资源,P2 申请 A 资源时继续占有 B 资源。 (4) 循环等待条件 在发生死锁时,必然存在一个进程等待环路,环路中的每一个进程已占有 的资源同时被另一个进程所申请。如例子中的 P1 和 P2 就是一个简单的等 待环路。 系统发生死锁不仅浪费了大量的系统资源,甚至会导致整个系统的崩溃,因 此如何解决死锁问题是操作系统设计中的一个重点。目前主要有两类方法,一类 是不让死锁发生;另一类是让死锁发生,再加以解决。 死锁预防就是力图不让死锁发生,它采用破坏“不可剥夺”条件,或破坏 “请求保持”条件,或破坏“循环等待”条件来达到目的,但这种方法给系统加 上了较强的限制条件,严重的影响了系统性能。死锁避免则是不破坏死锁的必要 条件,而是系统对进程发出的每一个系统能够满足的资源申请进行动态检验,并 根据检验结果决定是否分配资源,如果分配后系统可能发生死锁,则不分配,否 则分配。 这种方法算法复杂,会消耗很多的系统时间。 死锁的检测与解除则属于让死锁发生,再加以解决的方法。操作系统不断的 监督进程的进展路径,一旦检测到死锁的发生,则采用专门的措施解除死锁,并 以最小的代价使整个系统恢复正常。 以上大概介绍了死锁的特点和一些关于死锁的处理方法。下面看一下饥饿:
(5)在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得 不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。
总之,死锁和饥饿是操作系统中亟待解决的重要问题,发明出一个令人满意 的完善的解决方法是一个诱人的且永远不会过时的课题。
首先是死锁。 产生死锁的原因主要有两个,一是竞争资源,系统提供的资源数量有限,不 能满足每个进程的需求;二是多道程序运行时,进程推进顺序不合理。由此可见, 发生死锁时死锁进程的个数至少是两个。我们可以举一个最简单的例子来了解一 下死锁:
P1 ... Request(A) Request(B) Request(B) Request(A)
P2 ... Request(B) Request(A) Request(A) Request(B)
假如双方都拥有部分资源(P1 拥有 A,P2 拥有 B,且 A,B 均只有一个), 但这时 P1 还需要 B,P2 还需要 A,于是 P1 与 P2 都会处在无限等待状态,发生 了死锁。
由这个例子,我们可以归纳分析出产生死锁的必要条件: (1) 互斥条件
死锁的条件: 1. 互斥 2. 占用并等待 3. 不可抢占
没有上述的任何一种,不会出现死锁,前三个条件是出现死锁的可能性 4.循环等待
要出现死锁必须需要条件 4
死锁的定义也可以是不可解的循环等待
前三个条件都存在时才会出现敏感区
如果出现循环等待的情况,说明已经进入敏感区了
死锁的预防:
间接的死锁预防方法 直接的死锁预防方法 互斥: