版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Chapter7死锁Deadlocks本章目标CHAPTEROBJECTIVES描述死锁Descriptionofdeadlocks提供一些预防避免死锁的方法Topresentanumberofdifferentmethodsforpreventingoravoidingdeadlocks
死锁例子
exampleofadeadlock当两列火车在十字路口逼近时,它们要完全停下来,且在一列火车开走之前,另一列火车不能启动。Whentwotrainsapproacheachotheratacrossing,bothshallcometoafullstopandneithershallstartupagainuntiltheotherhasgone目前绝大多数操作系统并不提供死锁预防功能,但这些功能可能很快会加入。Mostcurrentoperatingsystemdonotprovidedeadlock-preventionfacilities.butsuchfeatureswillprobablybeaddedsoon.7.1系统模型SystemModel资源类型的例子ExampleofresourcetypesCPU周期,内存空间,I/O设备
CPUcycles,memoryspace,I/Odevices
每种资源类型Ri有Wi个实例
EachresourcetypeRihasWiinstances.
每个进程按如下方式利用资源
Eachprocessutilizesaresourceasfollows:申请request使用use释放release死锁定义当一组进程中的每个进程都在等待一个事件,而这一事件只能由这组进程中的另一个进程引起,那么这组进程就处于死锁状态。死锁是指多个进程因竞争系统资源或相互通信而造成的一种僵局,若无外力作用,这些进程都将永远不能向前推进。Asetofprocessesisinadeadlockstatewheneveryprocessinthesetiswaitingforaneventthatcanbecausedonlybyanotherprocessintheset.Example系统有两个磁带设备,进程P1和P2各占有一个磁带设备,并且实际需要两个磁带设备。Systemhas2tapedrives.P1andP2eachholdonetapedriveandeachneedsanotherone.假设一条河上有一座独木桥,若桥两端的人相向而行……此时死锁发生了7.2死锁的特性
DeadlockCharacterization死锁产生的原因与资源的使用相关。下面介绍资源分类。可剥夺和非剥夺资源可剥夺资源是指某进程获得这类资源后,该资源可以被其他进程或系统剥夺。如CPU,存储器。非剥夺资源又称不可剥夺资源,是指系统将这类资源分配给进程后,再不能强行收回,只能在进程使用完后主动释放。如打印机、读卡机。注意:竞争可剥夺资源不会产生死锁!永久性资源和消耗性资源永久性资源:可顺序重复使用的资源。如打印机。消耗性资源:由一个进程产生,被另一个进程使用短暂时间后便无用的资源,又称为临时性资源。如消息。竞争永久性资源和临时性资源都可能产生死锁。
死锁产生的原因死锁产生的原因是:竞争资源:多个进程竞争资源,而资源又不能同时满足其需求。进程推进顺序不当:进程申请资源和释放资源的顺序不当。竞争非剥夺资源引起的死锁竞争非剥夺资源例。如,打印机R1和读卡机R2供进程P1和P2共享。P1R1R2P2竞争消耗性资源引起的死锁如消息通信按下述顺序进行,则不会发生死锁:P1:...Release(S1);Request(S2);...P2:...Release(S2);Request(S1);...若按下述顺序,则可能发生死锁:P1:...Request(S2);Release(S1);...P2:...Request(S1);Release(S2);...P1S2S1P2进程推进顺序不当引起的死锁当进程P1、P2共享资源A、B时,若推进顺序合法则不会产生死锁,否则会产生死锁。合法的推进路线:①②③不合法的推进线路:④P2释放AP2释放BP2申请AP2申请BP1申请AP1申请BP1释放AP1释放B①②③④死锁区死锁点7.2.1必要条件
NecessaryConditions互斥:一次只有一个进程可以使用一个资源Mutualexclusion:onlyoneprocessatatimecanusearesource.占有并等待:一个至少持有一个资源的进程等待获得另外的资源,而该资源由其他进程所持有。Holdandwait:aprocessholdingatleastoneresourceiswaitingtoacquireadditionalresourcesheldbyotherprocesses.
必要条件2
NecessaryConditions非抢占:资源不能被抢占,即资源只能在进程完成任务后自动释放Nopreemption:aresourcecanbereleasedonlyvoluntarilybytheprocessholdingit,afterthatprocesshascompleteditstask.循环等待:等待资源的进程之间存在环Circularwait:thereexistsaset{P0,P1,…,Pn}ofwaitingprocessessuchthatP0iswaitingforaresourcethatisheldbyP1,P1iswaitingforaresourcethatisheldbyP2,…,Pn–1iswaitingforaresourcethatisheldbyPn,andPniswaitingforaresourcethatisheldbyP0.
死锁产生的必要条件互斥条件:在一段时间内某资源仅为一个进程所占有。请求和保持条件:又称部分分配条件。当进程因请求资源被阻塞时,已分配资源保持不放。不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走。循环等待条件:死锁发生时,存在一个进程资源的循环。注意死锁是因资源竞争造成的僵局通常死锁至少涉及两个进程死锁与部分进程及资源相关7.2.2资源分配图
Resource-AllocationGraph资源分配图由一个节点集合V和一个边集合E组成Theresource-allocationgraphconsistsofasetofverticesVandasetofedgesE.V被分为两个部分:系统中全部进程集合P={P1,P2,…,Pn},系统中全部资源集合R={R1,R2,…,Rm}V
ispartitionedintotwotypes:P={P1,P2,…,Pn},thesetconsistingofalltheprocessesinthesystem.R={R1,R2,…,Rm},thesetconsistingofallresourcetypesinthesystem.请求边:有向边PiRj;分配边:有向边Rj
Pirequestedge:directededgePiRj;assignmentedge:directededgeRj
Pi
资源分配图2
Resource-AllocationGraph在图中,用圆形表示进程Pi,用方框表示资源类型Rj,在方框中用圆点表示实例。Pictorially,wepresenteachprocessPiasacircleandeachresourcetypeRjasarectangle,wepresentaninstanceofaresourcetypeasadotwithintherectangle.资源分配图的例子
ExampleofaResourceAllocationGraph资源分配图3
Resource-AllocationGraph可以证明:如果资源分配图没有环,那么系统就没有进程死锁。如果分配图有环,那么可能存在死锁。Itcanbeshownthat,ifthegraphcontainsnocycles,thennoprocessinthesystemisdeadlocked.Ifthegraphdoescontainacycle,thenadeadlockmayexist.有死锁的资源分配图
ResourceAllocationGraphWithADeadlock有环但没有死锁的资源分配图Resource
AllocationGraphWithACycleButNoDeadlock7.3处理死锁的方法
MethodsforHandlingDeadlocks有三种方法可以处理死锁:通过协议预防或避免死锁Useaprotocolpreventoravoiddeadlock允许系统进入死锁状态,然后检测它并恢复系统
Allowthesystemtoenteradeadlockstate,detectitandrecover忽略这个问题Ignoretheproblem第三种方法被大部分的操作系统采用,包括UNIX和Windows。Thethirdsolutionistheoneusedbymostoperatingsystems,includingUNIXandWindows.
处理死锁的基本方法用于处理死锁的方法主要有:忽略死锁。这种处理方式又称鸵鸟算法,指像鸵鸟一样对死锁视而不见。
预防死锁:设置某些限制条件,通过破坏死锁产生的四个必要条件之一来预防死锁。避免死锁:在资源的动态分配过程中,用某种方法来防止系统进入不安全状态。检测死锁及解除:系统定期检测是否出现死锁,若出现则解除死锁。7.4死锁的预防
DeadlockPrevention只要确保至少有一个必要条件不成立,就能预防死锁发生。Byensuringthatatleastoneoftheseconditionscannothold,wecanpreventtheoccurrenceofdeadlock.预防死锁。通过破坏产生死锁的四个必要条件中的一个或几个条件,来防止发生死锁。特点:较易实现,广泛使用,但限制较严,资源利用率低。7.4.1互斥MutualExclusion通常不能通过否定互斥条件来预防死锁,有的资源本身就是非共享的。Ingeneral,wecannotpreventdeadlocksbydenyingthemutual-exclusioncondition,becausesomeresourcesareintrinsicallynonsharable互斥是设备本身固有的属性,此条件不能破坏。7.4.2占有并等待
HoldandWait必须保证进程申请资源的时候没有占有其他资源wemustguaranteethatwheneveraprocessrequestsaresource,itdoesnotholdanyotherresources.
要求进程在执行前一次申请全部的资源,或只有没有占有资源时才可以分配资源Requireprocesstorequestandbeallocatedallitsresourcesbeforeitbeginsexecution,orallowprocesstorequestresourcesonlywhentheprocesshasnone资源利用率低,可能出现饥饿。
Lowresourceutilization;starvationpossible.破坏请求和保持条件要求进程一次申请它所需的全部资源,若有足够的资源则分配给进程,否则不分配资源,进程等待。这种方法称为静态资源分配法。特点:简单、安全且易于实现;但资源利用率低,进程延迟运行。7.4.3非抢占
NoPreemption
如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配的资源都可被抢占。Ifaprocessthatisholdingsomeresourcesrequestsanotherresourcethatcannotbeimmediatelyallocatedtoit,thenallresourcescurrentlybeingheldarereleased.该协议通常应用于状态可以保存和恢复的资源,如CPU寄存器、内存Thisprotocolisoftenappliedtoresourceswhosestatecanbeeasilysavedandrestoredlater,suchasCPUregistersandmemoryspace破坏不剥夺条件一个已获得某些资源的进程,若新的资源请求得不到满足,则它必须释放已获得的所有资源。特点:实现较复杂,释放已获得资源可能造成前一段工作的失效,重复申请和释放资源会增加系统开销,降低系统吞吐量。
7.4.4循环等待CircularWait对所有资源类型进行完全排序,且要求进程按照递增顺序来申请资源。imposeatotalorderingofallresourcetypes,andrequirethateachprocessrequestsresourcesinanincreasingorderofenumeration.破坏循环等待条件将所有资源按类型排队,并赋予不同序号,要求进程均严格按照序号递增的次序请求资源,同类资源一次申请完。这种方法称为有序资源分配法。特点:比前两种方法资源利用率高,吞吐量大。但要求资源序号相对稳定,从而限制了新设备的增加;使用资源的顺序与系统规定顺序不同,造成资源的浪费;使用资源的次序限制用户编程。为什么有序资源分配法可以防止死锁1假设循环已经出现并且含于环中的进程是p0、…、pn,这意味着pi正占有ri类资源,而请求ri+1类资源,设函数f能获得资源序号,则有f(ri)<f(ri+1),故f(r0)<f(r1)<…<f(rn)<f(r0)。矛盾,原假设不成立。r1pnp0p1r0…rnr2为什么有序资源分配法可以防止死锁2采用有序资源分配法,系统中的进程必须按照资源编号的升序申请资源。因此在任一时刻,系统中总会存在一个进程,它占有已申请资源中编号最高的资源,且它继续请求的资源必定是空闲的,因而它可以一直向前推进直至完成。当该进程运行完成后,即会释放它所占有的全部资源。这样剩余进程集合中又会存在一个进程,它占有已申请资源中编号最高的资源,且它继续请求的资源必定是空闲的,因而它也可以一直向前推进直至完成。以此类推,最终所有进程均可运行完成,故不会发生死锁。7.5死锁避免
DeadlockAvoidance死锁避免算法动态检查资源分配状态以确保不会出现循环等待的情况。Thedeadlock-avoidancealgorithmdynamicallyexaminestheresource-allocationstatetoensurethattherecanneverbeacircular-waitcondition.资源分配状态由可用资源、已分配资源和进程所需的最大资源数量定义。Resource-allocationstateisdefinedbythenumberofavailableandallocatedresources,andthemaximumdemandsoftheprocesses.死锁的避免死锁的避免是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁的发生。特点:以较弱的限制获得较高的利用率,但实现有一定难度。7.5.1安全状态SafeState如果存在一个安全序列,系统处于安全态,Systemisinsafestateifthereexistsasafesequenceofallprocesses如果每个进程Pi所申请的资源数可以由当前可用资源数加上其他所有进程Pj(j<i)所持有的该资源数的和来满足,则进程序列<P1,P2,…,Pn>是安全的。Sequence<P1,P2,…,Pn>issafeifforeachPi,theresourcerequeststhatPicanstillmakecanbesatisfiedbycurrentlyavailableresourcesplustheresourcesheldbyallthePj,withj<i.安全状态在避免死锁的方法中,允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程等待。安全状态是指系统能按某种顺序如<P1、P2…、Pn>来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利完成,则称此时的系统状态为安全状态,称序列<
P1、P2、…、Pn>为安全序列。不安全状态若不存在一个安全序列,则称系统状态为不安全状态。安全状态不是死锁状态,死锁状态是不安全状态。Ifnosuchsequenceexists,thenthesystemstateissaidtobeunsafe.Asafestateisnotadeadlockedstate.Adeadlockedstateisanunsafestate.安全、不安全、死锁状态空间安全状态例AttimeT0,thereare3free:
MaxNeeds
CurrentNeeds
freeP01053P142P297这时P1可立即得到需要的所有资源,并能将资源归还。安全状态例2
MaxNeeds
CurrentNeeds
freeP01055
P142P297接着P0可得到需要的所有资源,并能将资源归还。
安全状态例3
MaxNeeds
CurrentNeeds
free
P010510
P142P297最后P2可得到需要的所有资源,并能将资源归还。在T0时刻,系统状态安全。序列<P1、P0、P2>满足安全条件。从安全状态转换为不安全状态假设在T1时刻,进程P2申请并得到了1个资源,系统就不安全了。
MaxNeeds
CurrentNeeds
freeP01052P142P2967.5.3银行家算法最具代表性的死锁避免算法是Dijkstra的银行家算法。
每一个进程必须事先声明资源最大使用量。当用户申请一组资源时,系统必须确定这些资源的分配是否仍会使系统处于安全状态,如果是就可分配资源,否则等待。银行家算法的数据结构设n为进程的数目,m为资源类型的数目。可用资源向量Available:长度为m的向量。表示每种资源的现有实例数。如果available[j]=k,那么Rj类资源现在有k个实例。最大需求矩阵Max:n×m的矩阵,定义了每个进程的最大需求。如果Max[i,j]=k,那么进程Pi最多可以请求Rj类资源的k个实例。分配矩阵Allocation:n×m的矩阵。定义每个进程现在所分配的各类资源实例数目。如果Allocation[i,j]=k,那么进程Pi当前分配了Rj类资源的k个实例。Allocationi表示进程Pi的分配向量,由矩阵Allocation的第i行构成。需求矩阵Need:n×m的矩阵,表示每个进程还需要的资源数目。如果Need(i,j)=k,表示进程Pi还需Rj类资源k个。Needi表示进程Pi的需求向量,由矩阵Need的第i行构成。注意:
Need[i,j]=Max[i,j]–Allocation[i,j].1.安全性算法SafetyAlgorithm1)设Work和Finish分别是长度为m和n的向量。初始化为:Work=availableFinish[i]=falsei=1,2,...,n2)查找这样的进程i使其满足:Finish(i)=false;Needi≤Work;Ifnosuchiexists,gotostep41.安全性算法2SafetyAlgorithm3)当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行:Work=Work+AllocationiFinish[i]=trueGotostep24)如果对所有i,Finish[i]=true,那么系统处于安全状态。2.资源请求算法(银行家算法)设Requesti是进程Pi的请求向量,如Requesti(j)=k,那么进程Pi需要Rj类资源k个。当Pi发出资源请求后,系统按下述步骤进行检查。银行家算法21)如果Requesti≤Needi
,则转向步骤2;否则出错。2)如果Requesti≤Available,则转向步骤3;否则Pi等待。3)试分配并修改数据结构:Available=Available-Requesti
;Allocationi=Allocationi+Requesti;Needi=Needi-Requesti;4)系统执行安全性算法,检查此次资源分配是否安全。若安全,才正式分配;否则,试分配作废,让进程Pi等待。银行家算法例假定系统中有5个进程P0、P1、P2、P3、P4和三种类型的资源A、B、C,数量分别为12、5、9,在T0时刻的资源分配情况如下所示。资源情况进程
MaxAllocation
Need
Available
ABC
ABC
ABC
ABCP0853110743332
P1323201122
P2903303600
P3222211011
P4533102431T0时刻的安全性利用安全性算法对T0时刻的资源分配情况进行分析,可得如下所示的T0时刻的安全性分析。
T0时刻的安全性检查Need0:7,4,3Need1:1,2,2Need2:6,0,0Need3:0,1,1Need4:4,3,1Alloc0:1,1,0Alloc1:2,0,1Alloc2:3,0,3Alloc3:2,1,1Alloc4:1,0,2Avail33213420
true
true
true
truetrueFinish533201122332P112591107431149
P01149303600846
P2846102431744
P4
ABC
ABCABCABC744211011533
P3Work+Alloc
AllocNeed
Work资源情况进程T0时刻是安全的从上述分析得知,T0时刻存在着一个安全序列<P1、P3、P4、P2、P0>,故系统是安全的。P1请求资源P1发出请求向量Request1
(1,0,2),系统按银行家算法进行检查:1)Request1(1,0,2)≤Need1(1,2,2)2)Request1(1,0,2)≤Available(3,3,2)3)系统先假定可为P1分配资源,并修改Available、Allocation1、Need1向量,由此形成的资源变化情况如下所示。
为P1试分配资源后4)再利用安全性算法检查此时系统是否安全,可得如下所示的安全性分析。资源情况进程
MaxAllocation
Need
Available
ABC
ABC
ABC
ABCP0853110743
230
P1323
303
020
P2903303600
P3222211011
P4533102431
P1申请资源后的安全性检查Need0:7,4,3Need1:0,2,0Need2:6,0,0Need3:0,1,1Need4:4,3,1Alloc0:1,1,0Alloc1:3,0,3Alloc2:3,0,3Alloc3:2,1,1Alloc4:1,0,2Avail230
true
true
true
truetrueFinish533
303020
230P112591107431149
P01149303600846
P2846102431744
P4
ABC
ABCABCABC744211011533
P3Work+Alloc
AllocNeed
Work资源情况进程可以为P1分配资源从上述分析得知,可以找到安全序列<P1、P3、P4、P0、P2>,系统安全,可以分配。P4请求资源P4发出请求向量Request4(3,3,0),系统按银行家算法进行检查:1)Request4(3,3,0)≤Need4(4,3,1)2)Request4(3,3,0)>Available(2,3,0),让P4等待。P0请求资源P0发出请求向量Request0
(0,2,0),系统按银行家算法进行检查:1)Request0(0,2,0)≤Need0(7,4,3)2)Request0(0,2,0)≤Available(2,3,0)3)系统先假定可为P0分配资源,并修改有关数据,如下所示。
为P0试分配资源后4)再利用安全性算法检查此时系统是否安全。从上表中可以看出,可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。资源情况进程
MaxAllocation
Need
Available
ABC
ABC
ABC
ABCP0853
130
723
210
P1323303020
P2903303600
P3222211011
P45331024317.6死锁检测DeadlockDetection通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁。特点:死锁检测和解除可使系统获得较高的利用率,但是实现难度最大。死锁判定法则将资源分配图简化可以检测系统状态S是否为死锁状态,方法如下:在资源分配图中,找出一个既不阻塞又非孤立的进程结点pi,进程pi获得了它所需要的全部资源,能运行完成然后释放所有资源。这相当于消去pi的所有请求边和分配边,使之成为孤立结点。进程pi释放资源后,可以唤醒因等待这些资源而阻塞的进程,从而可能使原来阻塞的进程变为非阻塞进程。在进行一系列化简后,若能消去图中所有的边,使所有进程都成为孤立结点,则称该图是可完全简化的;若不能使该图完全化简,则称该图是不可完全简化的。
死锁定理可以证明:所有的简化顺序将得到相同的不可简化图。S为死锁状态的条件是当且仅当S状态的资源分配图是不可完全简化的。该条件称为死锁定理。资源分配图简化例p1p2r1r2p1p2r1r2p1p2r1r2资源分配图简化例2下图是否存在死锁?p1p2p3r1r4r2r3此图不可完全简化,存在死锁。资源分配图简化例3下图是否存在死锁?p2p3p4r1r2p1此图可以完全简化,不存在死锁。死锁检测算法中的数据结构Available:长度为m的向量,表示每类资源的可用数目。Allocation:n×m矩阵,表示当前每个进程已分配的资源数目。请求矩阵Request:n×m矩阵,表示当前每个进程的资源请求数目。工作向量Work:表示系统当前可提供资源数。进程集合L:记录当前已不占用资源的进程。死锁检测的算法Work=Available;L=<Li|Allocationi=0∩Requesti=0>forallLiLdo{if(Requesti≤Work){Work=Work+Allocationi;L=L∪Li;}}deadlock=(L==<p1,p2,…pn>)7.7死锁恢复(死锁解除)
RecoveryfromDeadlock一旦检测出系统中出现了死锁,就应将陷入死锁的进程从死锁状态中解脱出来,常用的死锁解除方法有两种:资源剥夺法撤消进程法7.7.1进程终止(撤消进程)通过终止进程消除死锁有两种方法:终止所有死锁进程:这种方法打破了死锁环,但代价大。一次只终止一个进程直到消除死锁:这种方法开销大,因为每终止一个进程就要检测死锁。影响中止进程选择的因素进程的优先级进程已经计算了多久,还需要多长时间完成进程使用的资源,进程完成还需要多少资源多少个进程需要被终止进程是交互的还是批处理7.7.2资源抢占(资源剥夺)逐步从进程中抢占资源给其他进程使用,直到死锁环被打破为止。使用抢占来处理死锁,有三个问题需要处理:选择一个牺牲:最小代价回退:返回到安全状态,然后重新启动进程饥饿:同一进程可能总是被选中处理死锁的综合方法单独使用处理死锁的某种方法不能全面解决OS中遇到的所有死锁问题。综合解决的办法是:将系统中的资源按层次分为若干类,对每一类资源使用最适合它的办法解决死锁问题。即使发生死锁,一个死锁环也只包含某一层次的资源,因此整个系统不会受控于死锁。综合方法例将系统的资源分为四个层次:内部资源:由系统本身使用,如PCB,采用有序资源分配法。主存资源:采用资源剥夺法。作业资源:可分配的设备和文件。采用死锁避免法。交换空间:采用静态分配法。习题8.3Considerthefollowingsnapshotofasystem:Answerthefollowingquestionsusingthebanker’salgorithm:a.WhatisthecontentofthematrixNeed?b.Isthesysteminasafestate?c.IfarequestfromthreadT1arrivesfor(0,4,2,0),cantherequestbegrantedimmediately?AllocationMaxAvailableABCDABCDABCDT0001200121520T110001750T213542356T306320652T400140656习题8.18Whichofthesixresource-allocationgraphsshowninFigure8.12illustratedeadlock?Forthosesituationsthataredeadlocked,providethecycleofthreadsandresources.Wherethereisnotadeadlocksituation,illus
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026生物制药原料供应需求现状评估期货规划
- 2026区块链技术在知识产权保护领域的应用与前景
- 2026中国叶黄素酯功能性食品开发与市场接受度调研报告
- 2026中国制药药业行业市场深度调研及发展趋势和投资前景预测研究报告
- 2026中国食品饮料行业市场供需研究及投资发展趋势规划分析研究报告
- 整治虚假努力重塑高效学风-高中生“假努力”专项整治实施方案
- 2026年黄山市徽州区街道办人员招聘考试备考试题及答案详解
- 2026年阜阳市颍泉区法检系统书记员招聘考试参考试题及答案详解
- 2026年商丘市梁园区中小学教师招聘考试参考试题及答案详解
- 2026年南宁市青秀区街道办人员招聘笔试参考试题及答案详解
- 煤矿入井安全操作规程培训
- 高中数学立体几何学习现状及教学策略
- 饲草产品加工工安全技能测试水平考核试卷含答案
- 甘肃省民航机场集团招聘笔试题库2026
- 《JBT 14962-2025磁悬浮离心式压缩机能效限定值及能效等级》专题研究报告
- 2025年案件管理检察业务竞赛真题及答案
- 2026广岩国际投资有限责任公司招聘14人备考题库及答案详解(各地真题)
- 券商从业人员专属2026新三板考试试题答案
- 华为基本法(更新)
- 钛白粉行业风险分析报告
- NCIC临床实践指南:免疫检查点抑制剂毒性管理指南(2026版)课件
评论
0/150
提交评论