1.28k likes | 1.43k Views
操作系统 Operating System. 教学目的. 引入三级调度 介绍各种调度方法 多处理机系统的概念和调度方法 死锁. 本章重点:. 处理机调度算法及其运用 调度队列模型 如何理解实时调度的 “ 实时 ” 含义 两种基本的实时调度算法 死锁概念的理解,产生死锁的原因 产生死锁的必要条件 死锁解决措施. 本章难点:. 调度算法的分类 实时调度算法的理解 银行家算法和安全性算法. 第 3 章 处理机调度与死锁. 线程是 OS 最基本最重要的概念,进程管理是 OS 的重点和难点。 3.1 处理机调度的基本概念
E N D
教学目的 • 引入三级调度 • 介绍各种调度方法 • 多处理机系统的概念和调度方法 • 死锁
本章重点: • 处理机调度算法及其运用 • 调度队列模型 • 如何理解实时调度的“实时”含义 • 两种基本的实时调度算法 • 死锁概念的理解,产生死锁的原因 • 产生死锁的必要条件 • 死锁解决措施
本章难点: • 调度算法的分类 • 实时调度算法的理解 • 银行家算法和安全性算法
第3章 处理机调度与死锁 线程是OS最基本最重要的概念,进程管理是OS的重点和难点。 • 3.1 处理机调度的基本概念 • 3.2 调度算法 • 3.3 实时调度 • 3.4 多处理机系统中的调度 • 3.5 死锁
3.1 处理机调度的基本概念 3.1.1 分级调度 人们一般都认为, 在计算机系统中,中央处理机CPU是最重要的资源。每一个提交给计算机的任务都必须使用CPU。 CPU管理的主要任务是对处理机时间进行分配, 也就是按照一定的策略将CPU运行时间分配给各个用户以满足用户的要求,同时要考虑到充分利用CPU来提高它的效率。这就是处理机调度的主要功能。
【处理机调度可以分为三级】 高级调度:即作业调度或宏观调度。其任务是对那些提交给系统后被收容的作业, 按照一定策略选择出某些作业, 为其分配内存等必要的资源, 建立与之对应的进程, 并将进程的PCB表放入就绪队列中, 使其具备参与竞争使用CPU的权利。作业状态变迁如图3-1所示。 图3-1 作业调度
低级调度:即进程调度或微观调度。其任务是在进入内存并处于就绪队列的进程中, 确定哪个进程真正获得CPU及其使用CPU的时间。用执行指针指向选中进程的PCB表,将它从就绪队列移出并重布现场,使其运行。进程状态变迁如图3-2所示。 图3-2 进程调度
中级调度:将就绪状态细化为内存就绪和外存就绪状态, 阻塞状态细化为内存阻塞和外存阻塞状态后,中级调度完成进程在内存与外存之间的对换。其任务是周期性地将那些在内存中暂时不用的进程换出并放到外存,而将那些在外存上需要运行的进程换入到内存。进程状态变迁如图3-3所示。 图3-3 中级调度
3.1.2 进程调度的功能 在某一给定时刻,决定哪个就绪进程运行、运行多长时间以及如何保证进程的运行,就是进程调度的主要工作 【进程调度程序的功能】: • 记录系统中所有进程的状态、优先数和资源的需求情况。 • 确定调度算法。决定将CPU分配给哪个进程及多长时间。 • 分配处理机给进程。进行CPU现场的保护和移交,并实现CPU使用权的移交。 处理机是计算机最重要的资源, 如何提高处理机的利用率及改善系统性能, 在很大程度上取决于进程调度(亦称处理机调度)性能的好坏, 进程调度成为操作系统设计中心工作。
3.1.3 进程调度方式 1.非抢占方式: 在非抢占方式下,调度程序一旦把 CPU分配给某一进程后便让它一直运行下去,直到进程完成或发生某事件而不能运行时,才将CPU分给其它进程。 这种调度方式通常用在批处理系统中。它的主要优点是简单、系统开销小。 2.抢占方式: 当一个进程正在执行时,系统可以基于某种策略剥夺CPU给其它进程。剥夺的原则有:优先权原则、短进程优先原则和时间片原则。 这种调度方式多用在分时系统和实时系统中,以便及时响应各进程的请求。
3.1.4 引进进程调度的时机 进程调度的时机是与进程调度的方式有关的。通常当发现以下情况时,当前运行进程的CPU被收回,需要重新进行进程调度: • 正在执行的进程正确完成, 或由于某种错误而终止运行(陷阱或中断); • 执行中的进程提出I/O请求, 等待I/O完成时; • 在分时系统中,分给进程的时间片用完时; • 按照优先级调度时, 有更高优先级进程变为就绪时(抢占方式); • 在进程通讯中, 执行中的进程执行了某种原语操作, 如wait操作、阻塞原语和唤醒原语时, 都可能引起进程调度。
3.1.5 进程调度算法的评价准则 可从不同的角度来判断处理机调度算法的性能。实际的处理机调度算法选择是一个综合的判断结果。 1) 面向系统的调度性能准则 • 吞吐量:单位时间内所完成的作业数,跟作业本身特性和调度算法都有关系——批处理系统。 注意:平均周转时间不是吞吐量的倒数,因为并发执行的作业在时间上可以重叠。如在2小时内完成4个作业,每个周转时间是1小时,吞吐量是2个作业/小时。 • 处理机利用率:——大中型主机 • 各种设备的均衡利用:如CPU繁忙的作业和I/O繁忙(指次数多,每次时间短)的作业搭配——大中型主机。
平均周转 T= 平均带权周转 W= n 1 Ti n i=1 n 1 Ti n Tsi i=1 2) 面向用户的调度性能准则 • 周转时间:作业从提交到完成所经历的时间——批处理系统。(公式中Tsi为实际运行时间)。 • 响应时间:用户输入一个请求(如击键)到系统给出首次响应(如屏幕显示)的时间——分时系统 • 截止时间:开始截止时间和完成截止时间——实时系统,与周转时间有些相似。 • 公平性:不因作业或进程本身的特性而使上述指标过分恶化。如长作业等待很长时间。 • 优先级:可以使关键任务达到更好的指标。
3)调度算法本身的调度性能准则 • 易于实现 • 执行开销比 • 要设计一个理想的调度算法是一件十分困难的事,在实际系统中, 调度算法往往折衷考虑。大多数操作系统都采用比较简单的调度算法。
【术语介绍】 时间片:一个很小的CPU时间间隔,通常从几ms到几百ms。 CPU执行期:是进程一次获得CPU的时间。 I/O执行期:是进程一次获得I/O的时间。 周转时间:从作业提交给系统开始,直到作业完成的时间,包括作业在外存中等待运行的时间、进程在就绪队列中的等待时间、进程占用CPU时执行的时间、进程因发生某等待事件在阻塞队列中的时间等。 响应时间:用户从键盘提交一个请求到首次获得响应的时间,包括输入时CPU处理请求的时间、处理后响应结果回送终端显示的时间等。
3.2 进程调度算法 1.先来先服务FCFS(先进先出调度算法,FIFO) 【算法思想】:最简单的算法 • 按照进程进入就绪队列的先后次序,分派CPU; • 当前进程占用CPU,直到执行完或阻塞,才出让CPU(非抢占方式)。 • 在进程唤醒后(如I/O完成),并不立即恢复执行,通常等到当前进程让出CPU。。 【特点】: • 比较有利于长作业,而不利于短作业。 • 有利于CPU繁忙的作业,而不利于I/O繁忙的作业。
先来先服务算法的实现过程如图4-6所示。设置信号量:就绪队列互斥信号量s,初值为1;就绪队列中进程个数n,初值为0。先来先服务算法的实现过程如图4-6所示。设置信号量:就绪队列互斥信号量s,初值为1;就绪队列中进程个数n,初值为0。
2.短进程优先调度算法(SJF,SPF) 【算法思想】:选择就绪队列中估计运行时间最短的进程投入运行。通常后来的短作业不抢先正在执行的作业。 【优点】: • 比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间; • 提高系统的吞吐量; 【缺点】: • 对长作业非常不利,可能长时间得不到执行; • 未能依据作业的紧迫程度来划分执行的优先级; • 难以准确估计作业(进程)的执行时间,从而影响调度性能。
3.优先权调度算法(HPF—Highest Priority First) 【算法思想】:优先选择就绪队列中优先级最高的进程投入运行。分为: • 非抢占式优先级算法:仅发生在进程放弃CPU。 • 抢占式优先级算法:可剥夺当前运行进程CPU。 【 优先权的类型】 • 静态优先级:在进程创建时指定优先级, 在进程运行时优先数不变。 • 动态优先级:在进程创建时创立一个优先级,但在其生命周期内优先数可以动态变化。如等待时间长优先数可改变。 【确定优先级的依据】 进程类型、对资源的需求、根据用户要求。
【确定优先级的原则】 • 静态优先数的确定: • 用户要求:用户可以根据作业情况提出自己的优先级要求; • 资源利用率:请求I/O服务密集的进程优先级较高; • 系统内部要求:系统进程的优先级高于用户进程的优先级。 • 动态优先数的确定: • 进程运行前被赋予一个优先数。运行中根据进程等待时间的长短、执行时间的多少、输入与输出信息量的大小等,通过计算得到新的优先数。每次调度时,仍然是从就绪队列中选择优先级最高的进程率先调度,同级的采用先来先服务(FCFS)。
等待时间+要求服务时间 要求服务时间 • 4.高响应比优先 (HRRN, Highest Response Ratio Next): • HRRN是FCFS和SJF的折衷算法,响应比R用下式动态计算: • 响应比R = • 【特点】: • 等待时间相同要求服务的时间越短优先权越高, 有利于短作业。 • 要求服务时间相同,等待时间越长优先权越高,近似于先来先服务。 • 长作业的优先权会随等待时间加长而升高,长作业也会得到执行。
5.时间片轮转调度算法 • 【算法思想】:通过时间片轮转,提高进程并发性和响应时间特性,从而提高资源利用率。 • 将系统中所有的就绪进程按照FCFS原则,排成一个队列。 • 每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。 • 在一个时间片结束时,发生时钟中断。 • 调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过CPU现场切换执行当前的队首进程。 • 进程可以未使用完一个时间片,就出让CPU(如阻塞)。
时间片长度的确定 【时间片长度变化的影响】: • 过长->退化为FCFS算法,进程在一个时间片内都执行完,响应时间长。 • 过短->用户的一次请求需要多个时间片才能处理完,CPU现场切换次数增加,响应时间长。 【对响应时间的要求】: T(响应时间)=N(进程数目)*q(时间片) 【时间片长度的影响因素】: • 就绪进程的数目:数目越多,时间片越小(当响应时间一定时)。 • 系统的处理能力:应当使用户输入通常在一个时间片内能处理完,否则使响应时间,平均周转时间和平均带权周转时间延长。
6.多级反馈队列算法(多队列轮转法)【算法思想】:6.多级反馈队列算法(多队列轮转法)【算法思想】: • 设置多个就绪队列,分别赋予不同的优先级,队列1的优先级最高,其他逐级降低。每队列分配不同的时间片,规定优先级越低则时间片越长。 • 新进程就绪后,先投入队列1的末尾,按FCFS算法调度。若一个时间片未能执行完,则降低投入到队列2的末尾;依此类推,降低到最后的队列,则按“时间片轮转”算法调度直到完成。 • 进程由于等待事件而放弃CPU后, 进入等待队列, 一旦等待的事件发生, 则回到原来的就绪队列。 • 仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。
完成 运行 就绪队列1 时间片S1 阻塞 时间片完 完成 运行 就绪队列2 时间片S1 S2>S1 阻塞 时间片完 完成 运行 就绪队列n 时间片Sn>Sn-1 阻塞 时间片完 阻塞队列i 事件发生 多级反馈队列调度算法图3-7
多级反馈队列算法—补充说明 • I/O型进程:让其进入最高优先级队列,以及时响应I/O交互。通常执行一个小时间片,要求可处理完一次I/O请求的数据,然后转入到阻塞队列。 • 计算型进程:每次都执行完时间片,进入更低级队列。最终采用最大时间片来执行,减少调度次数。 • I/O次数不多,而主要是CPU处理的进程:在I/O完成后,放回优先I/O请求时离开的队列,以免每次都回到最高优先级队列后再逐次下降。 • 为适应一个进程在不同时间段的运行特点,I/O完成时,提高优先级;时间片用完时,降低优先级;
【算法优点】: • 为提高系统吞吐量和缩短平均周转时间而照顾短进程。 • 为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程。 • 不必估计进程的执行时间,动态调节。 多级反馈队列调度算法,则不必事先知道各种进程所需的执行时间,仍能基本满足短进程优先和I/O频繁的进程优先的需要,因而是目前公认的较好的一种进程调度算法。在UNIX系统、WindowsNT、OS/2中都采用了类似的调度算法。
课堂练习 3.1 A(1)B(2)C(5)D(4)E(3)F(6) 在所学的调度算法中,对所有进程和作业都是公平合理的调度算法是A ;最有利于提高系统吞吐量的作业调度算法是B ;能兼顾作业等待时间和作业执行时间调度算法是C ;最有利于提高资源的使用率、能使短作业、长作业及交互作业用户都比较满意的调度算法是D ;为实现人机交互作用应采用调度算法是E ;能对紧急作业进行及时处理的调度算法是F 。 A—F:(1)FCFS调度算法; (2)短作业优先调度算法; (3)时间片轮转法; (4)多级反馈队列调度算法; (5)高响应比优先算法; (6)基于优先权的剥夺调度算法。
3.3实时调度 • 所谓实时是指系统能够对外部请求做出即时响应,外部请求是指与系统相连的设备提出的服务要求和数据采集。 • 由于在实时系统中存在着若干个实时进程或任务,它们反应或控制某个(些)外部事件,往往带有某种程度的紧迫性,因而对它的调度提出了某些特殊要求。 • 与前面介绍的进程调度算法相比,主要是及时响应和及时处理,即满足实时任务的时间要求。
1.实时调度的时机与算法 • 【常用的调度算法】 • ⑴ 时间片轮转调度算法:当一个实时任务到达时,它被挂在轮转队列的末尾,用于分时系统中。这种调度算法能获得数秒至数十秒的响应时间,只适用于一般实时信息处理系统。 • ⑵ 非抢占优先级调度算法:系统为每一个实时任务都赋予一个相应的优先级,当实时任务到达时,将依据它的优先级高低插入到就绪队列中。紧迫的实时任务有可能获得数秒至数百毫秒级的响应时间,故该方法可用于要求不太严格的实时控制系统中。 • ⑶ 抢占式优先级调度算法:在该方法中,若到达的实时任务优先级高于当前任务的优先级,则该实时任务就可以抢夺CPU。调度程序可由时钟中断触发,也可由代表紧迫任务的外部中断触发。这要求操作系统具有快速响应外部事件中断的能力。这种调度算法能获得很好的响应效果,其调度延迟可降为几十毫秒至100微秒,因此它可用于大多数的实时系统中。
2.实时调度的其它信息 • 要求严格的实时系统,应该提供快速响应外部中断及快速任务分派的能力。 • 对于一些小的实时系统,如果能预知任务的完成截止时间,则实时任务的调度也可采用非剥夺调度方式,以简化调度程序和任务调度所花费的系统开销。 • 系统还应向调度程序提供有关实时任务的下述一些信息: ⑴ 就绪时间。这是该任务成为就绪状态的起始时间. ⑵ 开始截止时间和完成截止时间。对于典型的实时应用只需知道开始截止时间,或者知道完成截止时间即可。 ⑶ 处理时间。一个任务从开始执行直至完成所需的时间。在某些情况下,该时间也是系统提供的 ⑷ 资源要求。任务执行时所需的一组资源。 ⑸ 优先级。如果某任务的开始截止时间已经错过就会引起系统(如受控系统)故障,此时,则应为该实时任务赋予“绝对”优先级;如果对系统的继续运行无重大影响,则可赋予“相对”优先级,供调度程序参考。
3.实时调度实例 • 由于实时任务的时效性,所以不少算法是根据任务的截止时间进行调度的。如采用最早开始截止时间优先的调度方法。 • 例1:有四个非周期性任务A、B、C、D分别到来参见表4-1所示。
【剥夺式调度】 • 在事前能知道各实时任务的开始截止时间,且对调度时延要求不太严格的情况下, 系统可采用最早截止时间优先的非剥夺调度策略。若不允许调度有时延的话,就要采用剥夺式调度策略。 • 在该例中,设C的开始截止时间是5,则在t=5时,A还没有运行完,但C的开始截止时间已到,为了保证任务的时效性,就要采用可剥夺式调度。既在t=5时改调度C任务运行,在t=10时再调度A任务执行剩余的部分,这样A、B两个任务均在指定时间内完成了。
接着若再改设A的开始截止时间是4,则在t=5时,A还没有运行完,但C的开始截止时间已到,于是调度C任务。可是当C任务完成时t=10,再调度A执行完有t=11。而A任务本应在10时完成,即A已经超时了。A、C都要求在t=10完成,但A、C任务本身就需要11个时间,超出了系统的处理能力。接着若再改设A的开始截止时间是4,则在t=5时,A还没有运行完,但C的开始截止时间已到,于是调度C任务。可是当C任务完成时t=10,再调度A执行完有t=11。而A任务本应在10时完成,即A已经超时了。A、C都要求在t=10完成,但A、C任务本身就需要11个时间,超出了系统的处理能力。
【CPU负荷度】 • 设某一任务Pi的处理时间是Ci,它允许的运行时间区域是Si,则任务Pi在其运行区间CPU的负荷度Bi=Ci/Si。在上面的例子中A的负荷度B(a)=6/11,C的负荷度B(c)=5/9。 • 单CPU下系统的处理能力为1(此时为满负荷),对任一任务总有Bi ≤1。 • 若有n个任务,其运行时间范围是重叠的,则应该满足条件: ≤ 1 若系统有M个CPU,则 ≤M : (S应取重叠时间,Ci为Pi任务在S时间内请求服务的时间。)
0 5 11 A任务运行区间0-11 到达 时间 开始截 止时间 完成 时间 3 5 10 C任务运行区间3-10 开始截 止时间 到达 时间 完成 时间 • 当A的开始截止时间为5,C的开始截止时间也是5,则二者的重叠时间是3-10,则有2/7+5/7=1为满负荷;
0 4 10 A任务运行区间0-10 开始截 止时间 到达 时间 完成 时间 3 5 10 C任务运行区间3-10 开始截 止时间 到达 时间 完成 时间 • 当A的开始截止时间是4,C的开始截止时间是5,则二者的重叠时间是3-10,则有3/7+5/7>1,这时实时任务的工作量已在系统的处理能力范围之外,即超负荷,这使得某些实时任务不能及时处理,导致后果严重。
例2:如果系统中有两个周期性实时任务甲和乙,任务甲要求每30ms执行一次,执行时间为l5ms;任务乙要求每50ms执行一次,执行时间为25ms。试给出这两个任务的调度顺序。例2:如果系统中有两个周期性实时任务甲和乙,任务甲要求每30ms执行一次,执行时间为l5ms;任务乙要求每50ms执行一次,执行时间为25ms。试给出这两个任务的调度顺序。 • 由于任务甲和乙是周期任务,其工作量为15/30+25/50=1,即任务饱满。任务甲和乙每次的开始截止时间分别为:甲1、甲2、甲3、…和乙1、乙2、乙3、…,见图4-9。同样可以采用最早截止时间优先的剥夺调度策略。
3.4 多处理机系统中的调度 • 多处理机系统可提高系统的可靠性和发生故障时能降级使用;并提高系统的吞吐量。常分为两种组织方式: (1)在主/从式(也称之为非对称式)多处理机系统中,只有主处理器可运行操作系统,从处理器只能执行用户程序。 【优点】实现简单、易于理解; 【不足】主机太忙而形成瓶颈问题,从机利用率降低(长期等待);这种系统不可靠性,主机故障会导致整个系统瘫痪。 (2)在对称式多处理机系统(SMP-Symmetric MultiProcessor)中,所有的处理器都处于同等地位,即每个处理器上都可以运行操作系统及用户进程,共享同一主存储器。 【优点】系统具有较强的重构性与健壮性; 【不足】操作系统复杂(代码应该是可重入的),还要解决互斥同步问题、以及数据一致性问题等等。
目前基于线程的多处理器调度主要有三种: • 1.自调度(负载共享调度)。系统只有一个公共的就绪线程队列,每一个处理器在自己空闲时就去查看公共就绪队列,选择一个就绪线程运行。常用于自调度的算法有以下三种: • ⑴ 先来先服务调度算法。 • ⑵ 非抢占式优先级调度算法:将就绪线程按优先级的高低进行排队,具有相同优先级的线程按FCFS排队。该方法总是让队首线程优先获得处理器执行。 • ⑶ 抢占式优先级调度算法:如果新到达的线程其优先级高于正在某个处理器上执行的线程优先级,则可以抢占该处理机运行。 • 对于多处理机系统下的线程调度,与单处理机环境相比,FCFS算法要优于其它两种算法。这是因为线程是一个较小的运行单位,并不会有很大的时延;另外系统中有多个处理机(如M个),使线程的等待时间减小为1/M。FCFS算法简单、开销小,是一种较好的自调度算法。
但是自调度算法也存在以下不足: • ⑴ 瓶颈问题。处理机必须互斥地访问系统中唯一的一个就绪线程队列,很容易形成系统的瓶颈。 • ⑵ 低效性。系统中的每台处理机上都配有高速缓存(cache),用来暂存当前运行线程的临时数据。当线程由阻塞状态又重新进入唯一的就绪队列后,再重新被调度到阻塞前的处理机上,这种可能性很小。因而高速缓存的使用效率很低。 • ⑶ 线程切换频繁。同一作业中的线程相互有合作要求,而自调度方式很难使它们同时获得处理机运行,这类线程常因要与合作线程(未同时获得处理机)通信而阻塞,导致线程切换频繁。
2.成组调度(也称之为群调度)中,系统为了灵活而有效地调度处理器,提供了创建处理器集合的机制。每个处理器在某一时刻都会属于某个处理器集合,但也可以根据需要从一个集合迁移到另一个集合之中。当某一个应用中的一组线程请求服务时,系统会为其分配一个处理机集合,这种分配方式就称之为成组调度或群调度。而处理器集合中处理器的数目可随时间而改变。可见这种处理机调度方式更为灵活、有效,它解决了自调度方式中进程频繁切换的问题,性能优于自调度,获得了广泛的认可。2.成组调度(也称之为群调度)中,系统为了灵活而有效地调度处理器,提供了创建处理器集合的机制。每个处理器在某一时刻都会属于某个处理器集合,但也可以根据需要从一个集合迁移到另一个集合之中。当某一个应用中的一组线程请求服务时,系统会为其分配一个处理机集合,这种分配方式就称之为成组调度或群调度。而处理器集合中处理器的数目可随时间而改变。可见这种处理机调度方式更为灵活、有效,它解决了自调度方式中进程频繁切换的问题,性能优于自调度,获得了广泛的认可。 • 成组调度每次可以解决一组线程的分配问题,可以使合作的线程并行处理,这样就减少了线程的阻塞机会,从而降低了线程的切换频率,相应地减少了调度开销,因而提高了系统的性能。
3.专用处理机分配方式 • 1989年Tucker提出了专用处理机分配方式。所谓专用处理机分配是指一旦调用某一个应用程序运行,将为该应用程序所拥有的每一个线程,分配一个处理器。由于每一个线程都占有一台处理器,则这组线程可以获得最佳的并行效果,或者说该应用程序可以在最短的时间内完成。 • 在该方法中,系统为一个应用程序分配固定数量(依其所拥有的线程来定)的处理器,专属于该应用程序所有直至完成。例如有一个线程为和另一线程保持同步而阻塞起来,则该线程所分配到的处理机就会空闲,导致CPU浪费。 • 【优点】 ⑴ 在并行多处理机系统中,通常有数十至数百个处理器,单个处理机的利用率远不像在单机系统中那么重要。 ⑵ 由于每个线程专用一台处理机,不用进行线程切换,显著减少了系统开销,可以使应用程序在最短的时间内完成。
专用处理机调度性能测试 • Tucher在一个具有16个处理机的系统中,做了实验。他运行了两个应用程序:一个是矩阵相乘,另一个是快速富利叶变换(FFT)。每个应用程序所含有的线程数可从1到24变化。 • 在图2-20中,给出了应用程序的加速比(speed up)与线程数目之间的关系。