搜档网
当前位置:搜档网 › 操作系统-第二章-进程和线程复习

操作系统-第二章-进程和线程复习

操作系统-第二章-进程和线程复习
操作系统-第二章-进程和线程复习

操作系统-第二章-进程和线程复习题(五)

第二章练习题

一、单项选择题

1.某进程在运行过程中需要等待从磁盘上读入数据,此时该进程的状态将()。

A. 从就绪变为运行;B.从运行变为就绪;

C.从运行变为阻塞;D.从阻塞变为就绪2.进程控制块是描述进程状态和特性的数据结构,一个进程()。

A.可以有多个进程控制块;

B.可以和其他进程共用一个进程控制块;

C.可以没有进程控制块;

D.只能有惟一的进程控制块。

3.临界区是指并发进程中访问共享变量的()段。

A、管理信息

B、信息存储

C、数据

D、程序

4. 当___时,进程从执行状态转变为就绪状态。

A. 进程被调度程序选中

B. 时间片到

C. 等待某一事件

D. 等待的事件发生

5. 信箱通信是一种()通信方式。

A. 直接通信

B. 高级通信

C. 低级通信

D. 信号量

6. 原语是()。

A、一条机器指令

B、若干条机器指令组成

C、一条特定指令

D、中途能打断的指令

7. 进程和程序的一个本质区别是()。

A.前者为动态的,后者为静态的;

B.前者存储在内存,后者存储在外存;

C.前者在一个文件中,后者在多个文件中;

D.前者分时使用CPU,后者独占CPU。

8. 任何两个并发进程之间存在着()的关系。

A.各自完全独立 B.拥有共享变量

C.必须互斥 D.可能相互制约

9. 进程从运行态变为等待态可能由于()。

A.执行了V操作B.执行了P操作

C.时间片用完D.有高优先级进程就绪

10. 用PV操作管理互斥使用的资源时,信号量的初值应定义为()。

A.任意整数B.1 C.0 D.-1

11. 现有n个具有相关临界区的并发进程,如果某进程调用P操作后变为等待状态,则调用P操作时信号量的值必定为()。

A.≤0B.1 C.n-1 D.n

12. 用PV操作管理临界区时把信号量的初值定义为1,现已有一个进程在临界区,但有n个进程在等待进入临界区,这时信号量的值为()。

A.-1 B.1 C.-n D.n

13. 用V操作唤醒一个等待进程时,被唤醒进程的状态应变成()状态。

A.执行B.就绪C.运行D.收容

14. 有一共享文件可供n个并发进程使用,但限制最多m个进程(n≥m≥1)可同时读文件,用PV操作进行管理时其信号量的初值应该为()。

A.n B.m C.n-m D.1

15. 当一个任务需要若干进程协同完成时,进程之间需要交换一定数量的信息,把这种信息交换称为()。

A.进程唤醒B.进程通信

C.进程互斥D.进程同步

二、判断题

1、程序在运行时需要很多系统资源,如内存、文件、设备等,

因此操作系统以程序为单位分配系统资源。()

2、若无进程处于运行状态,则就绪队列和等待队列均为空。()4、P V操作不仅可用来实现进程的同步与互斥,而且可以防止

系统死锁。()

5、并发进程的执行速度只取决于进程本身,不受外界影响。()

三、填空题

1.在现代操作系统中,资源的分配单位是,而处理机的调

度单位是,一个进程可以有线程。

2.进程调度完成进程状态从态到态的转化。

3.并发进程中涉及到的程序段称为临界区。

4.进程的基本状态有, , 。

5. 用PV操作管理相关临界区时,任何一个进程要进入自己的临界区前应调用操作,退出临界区时应调用操作。

6. 系统中存在多个进程时,这些进程对共享资源的使用存在着不同的相互制约关系,制约关系可归结为两种,一种是关系,另一种是关系。

7. 用PV操作实现进程同步时,进程应调用操作来检测自己等待的消息是否到达,调用操作则可唤醒一个等待消息的进程。

8. 如果在一个取负值的信号量上调用P操作,则将使该进程变为状态,而调用V操作将使一个等待资源的进程成为状态。

9. 有一资源可供n个进程共享,但限制它们只能互斥使用,若采用PV操作来管理则信号量的初值应定义为,可能出现的信号量的最小值为。

10. 若信号量S的初值定义为10,则在S上调用了18次P操作和15次V操作后S的值应该为。

11.若进程间利用信箱进行通信,则操作系统应该设计两个基本通信原语是原语和原语。

四、问答题

1.一个单CPU的操作系统共有n个进程,不考虑进程状态过渡

时的情况,也不考虑空转进程。给出运行进程的个数;给出

就绪进程的个数;给出等待进程的个数。

解:运行进程的个数可能是0,也可能是1;

就绪的进程的个数可能是0,也可能是n-1

等待进程的个数可能是0,也可能是n

2. 说明下列活动是属于哪些制约关系?

1)若干同学去图书馆借书进程互斥

2)两队进行篮球比赛进程互斥

3)流水线生产中的各道工序进程同步

4)商品生产和社会消费进程同步

3. 是否所有的共享资源都是临界资源,为什么?

答:不是,根据定义,一次只允许一个进程使用的进程才叫临界资源, 能同时被多个进程使用的资源不是临界资源

4. 某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题:(1)用P、V操作管理这些并发进程时,应怎样定义信号量,写出信号量的初值以及信号量各种取值的含义。

(2)根据所定义的信号量,把应执行的P、V操作填入下述方框中,以保证进程能够正确地并发执行。

COBEGIN PROCESS PI(I=1,2,……)

begin;

进入售票厅;

购票;

退出;

end;

COEND

(3)若欲购票者最多为n个人,写出信号量可能的变化范围(最大值和最小值)。

参考答案:

(1)定义一信号量S,初始值为20。

意义:

S>0S的值表示可继续进入售票厅的人数

S=0表示售票厅中已有20名顾客(购票者)

S<0|S|的值为等待进入售票厅的人数

(2)上框为P(S)

下框为V(S)

(3)S的最大值为20

S的最小值为20-n

5. 四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:

(1)应定义的信号量及初值:。(2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:

A()B() C() D()

{ { { {

[1]; [3]; [5];[7];

read F; read F; read F; read F;

[2];[4]; [6]; [8];

} } } }

思考题解答:

(1)定义二个信号量S1、S2,初值均为1,即:S1=1,S2=1。

其中进程A和C使用信号量S1,进程B和D使用信号量S2。(2)从[1]到[8]分别为:P(S1) V(S1) P(S2) V(S2) P(S1) V(S1) P(S2) V(S2)

6.设有一个发送者进程和接收者进程,其流程图如下图所示。S是用于实现进程同步的信号量,mutex是用于实现进程互斥的信号量。试问流程图中的A、B、C、D四框中应填写什么?假定缓冲区有无限多个,S和mutex的初值应为多少?

图发送者及接收者工作流程图

7. 在公共汽车上,司机和售票员的工作流程如下:

为保证乘客的安全,司机和售票员应密切配合协调工作。假定初始状态为:车辆正在起点站停着车、开着门,等待第一批乘客。当发车时间到,售票员关好车门后司机可以启动车辆。若用PV操作来实现司机与售票员之间的协调工作,请回答下列问题:

(1)司机与售票员之间的关系是同步还是互斥?解释之。(2)用PV操作来管理时应定义几个信号量?初值为多少?(3)请在司机与售票员的工作流程中填上适当的P操作和V 操作,使他们能安全、协调地工作。

8. 进程之间的通信方式有几种?在单机环境下,常用的哪几种通信方式?

答:三种:共享内存,消息机制,以及管道通信

在单机环境下:常采用共享内存以及管道通信。

五、多选题

1.有关并发进程的下列叙述中,()是正确的。

A.任何时刻允许多个进程在同一CPU上运行

B.进程执行的速度完全由进程自己控制

C.并发进程在访问共享资源时可能出现与时间有关的错误D.同步是指并发进程中存在的一种制约关系

E.各自独立的并发进程在执行时不会相互影响

2. 一个正在运行的进程调用P(S)后,若S的值为(),则该进程可以继续运行。

A.S>0 B.S<0 C.S≠0 D.S≥0 E.S≤0

进程与线程的区别 进程的通信方式 线程的通信方式

进程与线程的区别进程的通信方式线 程的通信方式 进程与线程的区别进程的通信方式线程的通信方式2011-03-15 01:04 进程与线程的区别: 通俗的解释 一个系统运行着很多进程,可以比喻为一条马路上有很多马车 不同的进程可以理解为不同的马车 而同一辆马车可以有很多匹马来拉--这些马就是线程 假设道路的宽度恰好可以通过一辆马车 道路可以认为是临界资源 那么马车成为分配资源的最小单位(进程) 而同一个马车被很多匹马驱动(线程)--即最小的运行单位 每辆马车马匹数=1 所以马匹数=1的时候进程和线程没有严格界限,只存在一个概念上的区分度 马匹数1的时候才可以严格区分进程和线程 专业的解释: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执 行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序 的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行 的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在 应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可 以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程 的调度和管理以及资源分配。这就是进程和线程的重要区别。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的 能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中 必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的 其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以 并发执行 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有 独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响, 而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线 程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程 的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者 《操作系统的设计与实现》。对就个问题说得比较清楚。 +++ 进程概念

操作系统OS报告读者与写者问题(进程同步问题)

目录 一、课程设计目的及要求 (1) 二、相关知识 (1) 三、题目分析 (2) 四、概要设计 (4) 五、代码及流程 (5) 六、运行结果 (11) 七、设计心得 (12) 八、参考文献 (12)

一、课程设计目的及要求 读者与写者问题(进程同步问题) 用n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制: 1)写-写互斥; 2)读-写互斥; 3)读-读允许; 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 二、相关知识 Windows API: 在本实验中涉及的API 有: 1线程控制: CreateThread 完成线程创建,在调用进程的地址空间上创建一个线程,以执行指定的函数;它的返回值为所创建线程的句柄。 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD DWORD dwStackSize, // initial stack size LPTHREAD_START_ROUTINE lpStartAddress, // thread function LPVOID lpParameter, // thread argument DWORD dwCreationFlags, // creation option LPDWORD lpThreadId // thread identifier ); 2 ExitThread 用于结束当前线程。 VOID ExitThread( DWORD dwExitCode // exit code for this thread ); 3Sleep 可在指定的时间内挂起当前线程。 VOID Sleep( DWORD dwMilliseconds // sleep time ); 4信号量控制: WaitForSingleObject可在指定的时间内等待指定对象为可用状态; DWORD WaitForSingleObject( HANDLE hHandle, // handle to object DWORD dwMilliseconds // time-out interval );

第二章进程管理答案

第二章进程管理 一、单项选择题 1、顺序程序和并发程序的执行相比,()。 A.基本相同 B. 有点不同 C.并发程序执行总体上执行时间快 D.顺序程序执行总体上执行时间快 2、在单一处理机上,将执行时间有重叠的几个程序称为()。 A.顺序程序 B. 多道程序 C.并发程序 D. 并行程序 3、进程和程序的本质区别是()。 A.存储在内存和外存 B.顺序和非顺序执行机器指令 C.分时使用和独占使用计算机资源 D.动态和静态特征 4、在下列特性中,不是进程的特性的是()。 A. 异步性 B. 并发性 C. 静态性 D. 动态性 5 A 6 A. 7 A. 8 A. 9 A. 10 A. 11 A. 12。 A. 13 A. 14 A. 15 A. 16、在操作系统中,对信号量S的P原语操作定义中,使进程进入相应阻塞队列等待的条件是()。 A. S>0 B. S=0 C. S<0 D. S≠0 17、信号量S的初值为8,在S上执行了10次P操作,6次V操作后,S的值为()。 A.10 B.8 C.6 D.4 18、在进程通信中,使用信箱方式交换信息的是()。 A.低级通信B.高级通信C.共享存储器通信D.管道通信 19.( )必定会引起进程切换。A.一个进程被创建后进入就绪态B.一个进程从运行态变成等待态c.一个进程从运行态变成就绪态 D.一个进程从等待态变成就绪态 20、操作系统使用( )机制使计算机系统能实现进程并发执行,保证系统正常工作。 A.中断B.查询c.同步D互斥 21.对于一个单处理器系统来说,允许若干进程同时执行,轮流占用处理器.称它们为()的。 A.顺序执行 B.同时执行c.并行执行D.并发执行

操作系统第二章进程和线程复习题

第二章练习题 一、单项选择题 1.某进程在运行过程中需要等待从磁盘上读入数据,此时该进程的状态将( C )。 A. 从就绪变为运行; B.从运行变为就绪; C.从运行变为阻塞; D.从阻塞变为就绪2.进程控制块是描述进程状态和特性的数据结构,一个进程( D )。 A.可以有多个进程控制块; B.可以和其他进程共用一个进程控制块; C.可以没有进程控制块; D.只能有惟一的进程控制块。 3.临界区是指并发进程中访问共享变量的(D)段。 A、管理信息 B、信息存储 C、数据 D、 程序 4. 当__ B__时,进程从执行状态转变为就绪状态。 A. 进程被调度程序选中 B. 时间片到 C. 等待某一事件 D. 等待的事件发生 5. 信箱通信是一种( B )通信方式。 A. 直接通信 B. 高级通信

C. 低级通信 D. 信号量 6. 原语是(B)。 A、一条机器指令 B、若干条机器指令组成 C、一条特定指令 D、中途能打断的指令 7. 进程和程序的一个本质区别是(A)。 A.前者为动态的,后者为静态的; B.前者存储在内存,后者存储在外存; C.前者在一个文件中,后者在多个文件中; D.前者分时使用CPU,后者独占CPU。 8. 任何两个并发进程之间存在着(D)的关系。 A.各自完全独立B.拥有共享变量 C.必须互斥D.可能相互制约 9. 进程从运行态变为等待态可能由于(B )。 A.执行了V操作 B.执行了P 操作 C.时间片用完 D.有高优先级进程就绪 10. 用PV操作管理互斥使用的资源时,信号量的初值应定义为(B)。 A.任意整数 B.1 C.0 D.-1

操作系统 实验 五 线程间的互斥与同步

实验五线程间的互斥与同步 实验学时:2学时 实验类型:验证、设计型 一、实验目的 理解POSIX线程(Pthread)互斥锁和POSIX信号量机制,学习它们的使用方法;编写程序,实现多个POSIX线程的同步控制。 二,实验内容 创建4个POSIX线程。其中2个线程(A和B)分别从2个数据文件(data1.txt和data2.txt)读取10个整数. 线程A和B把从文件中读取的逐一整数放入一个缓冲池. 缓冲池由n个缓冲区构成(n=5,并可以方便地调整为其他值),每个缓冲区可以存放一个整数。另外2个线程,C和D,各从缓冲池读取10数据。线程C、D每读出2个数据,分别求出它们的和或乘积,并打印输出。 提示:在创建4个线程当中,A和B是生产者,负责从文件读取数据到公共的缓冲区,C和D是消费者,从缓冲区读取数据然后作不同的计算(加和乘运算)。使用互斥锁和信号量控制这些线程的同步。不限制线程C和D从缓冲区得到的数据来自哪个文件。 在开始设计和实现之前,务必认真阅读课本6.8.4节和第6章后面的编程项目——生产者-消费者问题。

三,实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。 四,实验设计 1,功能设计 根据实验要求,主程序需要创建四个线程,两个线程负责从文件读取数据到缓冲区,两个线程负责将缓冲区的数据做数学运算。由于同一个进程中的各个线程共享资源,可以用一个二维数组的全局变量作为公共缓冲区,同时还需要一个整形全局变量size用来做数组的索引。读线程的运行函数打开不同的文件并从中读取数据到二维数组中,每次写入数组后size加一。运算线程从二维数组中读数并做运算,每次读数之前size减一。本题的关键在于如何使用信号量保证进程的同步与互斥。在运算线程从缓冲区读取之前缓冲区里必须有数,即任意时刻运算操作的执行次数必须小于等于读取操作的执行次数。同时应该保证两个读线程和两个运算线程两两互斥。由于以上分析,使用了四个信号量sem1,sem2,sem3和sem4。sem1保证线程1和线程2互斥,sem2保证线程3和线程4互斥,sem3保证线程3和线程4互斥,sem4保证线程4和线程1互斥。即这四个信号量使四个线程循环进行,从而保证了运行结果的正确性。 源代码及注释: #include #include #include #define NUM 200

操作系统课程设计用多进程同步方法解决生产者-消费者问题

操作系统课程设计 用多进程同步方法解决生产者-消费者问题 系别:计科系 专业: 计算机科学与技术 班级:04 级 4 班 学号:0410******* 姓名:苏德洪 时间:2006-7-7—2006-7-14

目录 一、题目: (3) 二、设计目的: (3) 三、总体设计思想概述: (3) 四、说明: (3) 五、设计要求: (3) 六、设计方案: (3) 七、流程图: (5) 八、运行结果 (7) 九、源程序 (11) 十、总结 (18) 十一、参考文献 (20)

一、题目: 用多进程同步方法解决生产者-消费者问题。 二、设计目的: 通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。 三、总体设计思想概述: 1、生产者—消费者问题是一种同步问题的抽象描述。 2、计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一 资源时,可以看作是消耗,且该进程称为消费者。 3、而当某个进程释放资源时,则它就相当一个生产者。 四、说明: 有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。 五、设计要求: 1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前 指针位置和生产者/消费者线程的标识符。 2、生产者和消费者各有两个以上。 3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。 六、设计方案: 通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。 应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。 为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量g_hMutex,起初值为1。

南昌大学操作系统线程进程同步实验报告

南昌大学实验报告 ---(1)进程/线程同步 学生姓名:学号:专业班级:网络工程131班 实验类型:■验证□综合□设计□创新实验日期:实验成绩: 一、实验目的 本实验讨论临界区问题及其解决方案。首先创建两个共享数据资源的并发线程。在没有同步控制机制的情况下,我们将看到某些异常现象。针对观察到的现象,本实验采用Windows 的信号量机制解决临界区互斥访问。 二、实验内容 2.1 进程/线程并发执行 Windows操作系统支持抢先式调度,这意味着一线程运行一段时间后,操作系统会暂停其运行并启动另一线程。也就是说,进程内的所有线程会以不可预知的步调并发执行。为了制造混乱,我们首先创建两个线程t1和t2。父线程(主线程)定义两个全局变量,比如accnt1和accnt2。每个变量表示一个银行账户,其值表示该账户的存款余额,初始值为0。线程模拟在两个账户之间进行转账的交易。也即,每个线程首先读取两个账户的余额,然后产生一个随机数r,在其中一个账户上减去该数,在另一个账户上加上该数。线程操作的代码框架如下: counter=0; do { tmp1 = accnt1 ; tmp2 = accnt2 ; r = rand ( ) ; accnt1 = tmp1 + r ; accnt2 = tmp2 ? r ; counter++; } while ( accnt1 + accnt2 == 0 ) ; print ( counter ) ; 两个线程执行相同的代码。只要它们的执行过程不相互交叉,那么两个账户的余额之和将永远是0。但如果发生了交叉,那么某线程就有可能读到新的accnt1值和老的accnt2值,从而导致账户余额数据发生混乱。线程一旦检测到混乱的发生,便终止循环并打印交易的次数(counter)。 请编写出完整的程序代码并运行,然后观察产生混乱需要的时间长短。因为这是我们编写的第一个程序,因此这里我给出了完整的代码,请参考。有能力的同学在参考下面的代码之前,请先自己尝试一下。 #include "stdafx.h" #include

用多线程同步方法解决生产者-消费者问题(操作系统课设)

. 题目用多线程同步方法解决生产者-消费 者问题(Producer-Consumer Problem) 学院计算机科学与技术学院 专业软件工程 班级 姓名 指导教师 年月日

目录 目录 (1) 课程设计任务书 (2) 正文 (2) 1.设计目的与要求 (2) 1.1设计目的 (2) 1.2设计要求 (2) 2.设计思想及系统平台 (2) 2.1设计思想 (2) 2.2系统平台及使用语言 (2) 3.详细算法描述 (3) 4.源程序清单 (5) 5.运行结果与运行情况 (10) 6.调试过程 (15) 7.总结 (15) 本科生课程设计成绩评定表 (16)

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: 用多线程同步方法解决生产者-消费者问题 (Producer-Consumer Problem) 初始条件: 1.操作系统:Linux 2.程序设计语言:C语言 3.有界缓冲区内设有20个存储单元,其初值为0。放入/取出的数据项按增序设定为1-20这20个整型数。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要 求) 1.技术要求: 1)为每个生产者/消费者产生一个线程,设计正确的同步算法 2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、当前指针位置和生产者/消费者线程的自定义标识符。 3)生产者和消费者各有两个以上。 4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 2.设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机IP地址和目录。) 5)运行结果与运行情况 (提示: (1)有界缓冲区可用数组实现。 (2)编译命令可用:cc -lpthread -o 目标文件名源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1)调试记录 2)自我评析和总结 上机时间安排: 18周一~ 五 08:0 - 12:00 指导教师签名:年月日

(完整版)操作系统第二章课后答案

第二章进程管理 2. 试画出下面4条语句的前趋图: S2: b:=z+1; S3: c:=a-b; S4: w:=c+1; 3. 程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作, 致使在这些并发执行的进程之间,形成了相互制约的关系,从而也就使得进程在执行期间出现间断性。 4. 程序并发执行时为什么会失去封闭性和可再现性? 因为程序并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态是 由多个程序来改变,致使程序的运行失去了封闭性。而程序一旦失去了封闭性也会导致其再失去可再现性。 5. 在操作系统中为什么要引入进程概念?它会产生什么样的影响? 为了使程序在多道程序环境下能并发执行,并能对并发执行的程序加以控制和描述,从而在操作系统中引入了进程概念。 影响: 使程序的并发执行得以实行。 6. 试从动态性,并发性和独立性上比较进程和程序? a. 动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源 而暂停执行,以及由撤销而消亡,因而进程由一定的生命期;而程序只是一组有序指令的集合,是静态实体。 b. 并发性是进程的重要特征,同时也是OS的重要特征。引入进程的目的正是为了使其 程序能和其它建立了进程的程序并发执行,而程序本身是不能并发执行的。 c. 独立性是指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和 独立调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。 7. 试说明PCB的作用?为什么说PCB是进程存在的唯一标志? a. PCB是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB中记录了操 作系统所需的用于描述进程情况及控制进程运行所需的全部信息。因而它的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能和其它进程并发执行的进程。 b. 在进程的整个生命周期中,系统总是通过其PCB对进程进行控制,系统是根据进程 的PCB而不是任何别的什么而感知到该进程的存在的,所以说,PCB是进程存在的唯一标志。 8. 试说明进程在三个基本状态之间转换的典型原因. a. 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态变 为执行状态。 b. 当前进程因发生某事件而无法执行,如访问已被占用的临界资源,就会使进程由执行 状态转变为阻塞状态。 c. 当前进程因时间片用完而被暂停执行,该进程便由执行状态转变为就绪状态。 9. 为什么要引入挂起状态?该状态有哪些性质? a. 引入挂起状态主要是出于4种需要(即引起挂起的原因): 终端用户的请求,父进程 请求,负荷调节的需要,操作系统的需要。

操作系统实验线程同步

实验2:线程同步 一、实验目的 (1)掌握Windows2000环境下,线程同步。 (2)熟悉Windows2000提供的线程同步与互斥API。 (3)用Windows2000提供的线程同步与互斥API解决实际问题 (producer-consumer)。 二、实验内容 生产者与消费者问题的实现。在Windows 2000环境下,创建一组“生产者”线程和一组“消费者”线程,并建立一个长度为N的全局数组作为共享缓冲区。“生产者”向缓冲区输入数据,“消费者”从缓冲区读出数据。当缓冲区满时,“生产者”必须阻塞,等待“消费者”取走缓冲区数据后将其唤醒。当缓冲区空时,“消费者”阻塞,等待“生产者”生产了产品后将其唤醒。试用信号量实现“生产者”与“消费者”线程之间的同步。 三、实验环境 (1)使用的操作系统及版本。 Windows xp professional (2)使用的编译系统及版本。 Visual c++ 6.0 四、实验步骤 1.等待一个对象(相当于p操作) WaitForSingleObject用于等待一个对象。它等待的对象可以为: Change notification:变化通知。 Console input:控制台输入。 Event:事件。 Job:作业。 Mutex:互斥信号量。 Process:进程。 Semaphore:计数信号量。

Thread:线程。 Waitable timer:定时器。 返回值: 如果成功返回,其返回值说明是何种事件导致函数返回。 访问描述 WAIT_ABANDONED 等待的对象是一个互斥(mutex)对象,该互斥对 象没有被拥有它的线程释放,它被设置为不能被唤 醒。 WAIT_OBJECT_0 指定对象被唤醒。 WAIT_TIMEOUT 超时。 2.创建信号量 CreateSemaphore用于创建一个信号量。 返回值: 信号量创建成功,将返回该信号量的句柄。如果给出的信号量名是系统已经存在的信号量,将返回这个已存在信号量的句柄。如果失败,系统返回NULL,可以调用函数GetLastError查询失败的原因。 3.打开信号量 OpenSemaphore用于打开一个信号量。 返回值: 信号量打开成功,将返回该信号量的句柄。如果失败,系统返回NULL,可以调用函数GetLastError查询失败的原因。 4.增加信号量的值 ReleaseSemaphore用于增加信号量的值。 返回值: 如果成功,将返回一个非0值。如果失败,系统返回0,可以调用函数GetLastError 查询失败的原因。 方法一: 程序代码: #include #include

操作系统课程设计利用多线程和信号量解决哲学家进餐问题java实现.

操作系统课程设计 课程设计报告 课题:利用信号量和多线程机制实现“哲学家进餐”问题 所在学院:信息工程学院 班级:计科1201 学号:121404114 姓名:魏祥 指导教师:徐向英 2015年1月1日

目录 一、课程设计目标 (3) 二、课题内容 (3) 三、设计思路 (3) 四、源代码 (5) 五、运行与测试 (9) 六、心得体会 (10)

一、课程设计目标 学习多线程编程,使用线程的同步机制实现“哲学家进餐”问题。具体要求:1.创建POSIX线程,实现多线程的并发执行,验证多线程共享进程资源的特性。 2.使用互斥量和条件变量,或使用信号量实现线程的同步互斥。 3. 验证“ 哲学家进餐”问题中的死锁情况,并加以解决。 二、课题内容 哲学家进餐问题由Dijkstra提出,问题描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。 本次课题要求使用多线程和信号量解决哲学家进餐问题。并演示产生死锁的情况。 三、设计思路 经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许以为哲学家使用。为了实现对筷子的互斥,可以用一个信号量表示一只筷子,由着五个信号量构成信号量数组。 当哲学家饥饿时总是先去拿左筷子,成功后在拿右筷子。当五位哲学家同时拿起左筷子,这是每位哲学家都没有右筷子可以拿,就会造成死锁。 思路1:利用记录型信号量 设置值为4的记录型信号量,至多只允许四位哲学家同时去拿左筷子(leftStick.getSema().acquire()),只有拿到左筷子,才能继续拿右筷子(rightStick.getSema().acquire())。拿到两双筷子之后便可以用餐,用餐完毕,先放下左筷子(leftStick.getSema().release()),再放下右筷子(rightStick.getSema().release())。这样便可以避免思索问题。 思路2:利用AND型信号量 要求每个哲学家必须获取两个筷子的时候才能够进餐,只得到一只筷子不能进餐时,要求释放那一只筷子。可以使用AND型信号量将左筷子和右筷子信号量的获取组成一个原子操作。如此也可以避免死锁问题。

用多线程同步方法解决生产者-消费者问题(操作系统课设)

用多线程同步方法解决生产者-消费者问题(操作系统课设)

题目 用多线程同步方法解决生产者-消费 者问题(Producer-Consume r Problem) 学院 物理学与电子信息工程学院 专业电子信息工程班级08电信本一班姓名 指导教师 2010 年12 月日

目录 目录 0 课程设计任务书 (1) 正文 (3) 1.设计目的与要求 (3) 1.1设计目的 (3) 1.2设计要求 (3) 2.设计思想及系统平台 (3) 2.1设计思想 (3) 2.2系统平台及使用语言 (3) 3.详细算法描述 (4) 4.源程序清单 (7) 5.运行结果与运行情况 (12) 6.调试过程 (16) 7.总结 (16)

课程设计任务书 题目: 用多线程同步方法解决生产者-消费者问题 (Producer-Consumer Problem) 初始条件: 1.操作系统:Linux 2.程序设计语言:C语言 3.有界缓冲区内设有20个存储单元,其初 值为0。放入/取出的数据项按增序设定为 1-20这20个整型数。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.技术要求: 1)为每个生产者/消费者产生一个线程,设计正确的同步算法 2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部 内容、当前指针位置和生产者/消费者

线程的自定义标识符。 3)生产者和消费者各有两个以上。 4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 2.设计说明书内容要求: 1)设计题目与要求 2)总的设计思想及系统平台、语言、工具 等。 3)数据结构与模块说明(功能与流程图) 4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个 程序及其运行结果的主机IP地址和目 录。) 5)运行结果与运行情况 (提示: (1)有界缓冲区可用数组实现。 (2)编译命令可用:cc -lpthread -o 目标文件名源文件名 (3)多线程编程方法参见附件。) 3. 调试报告: 1)调试记录 2)自我评析和总结

进程线程的概念

提起程序这个概念,大家再也熟悉不过了,程序与进程概念是不可分的。程序是为了完成某项任务编排的语句序列,它告诉计算机如何执行,因此程序是需要运行的。程序运行过程中需要占有计算机的各种资源才能运行下去。如果任一时刻,系统中只有一道程序,即单道程序系统,程序则在整个运行过程中独占计算机全部资源,整个程序运行的过程就非常简单了,管理起来也非常容易。就象整个一套房子住了一个人,他想看电视就看电视,想去卫生间就去卫生间,没人和他抢占资源。但为了提高资源利用率和系统处理能力,现代计算机系统都是多道程序系统,即多道程序并发执行。程序的并发执行带来了一些新的问题,如资源的共享与竞争,它会改变程序的执行速度。就象多个人同时住一套房子,当你想去卫生间的时候,如果此时卫生间里有人,你就得等待,影响了你的生活节奏。如果程序执行速度不当,就会导致程序的执行结果失去封闭性和可再现性,这是我们不希望看到的。因此应该采取措施来制约、控制各并发程序段的执行速度。由于程序是静态的,我们看到的程序是存储在存储介质上的,它无法反映出程序执行过程中的动态特性,而且程序在执行过程中是不断申请资源,程序作为共享资源的基本单位是不合适的,所以需要引入一个概念,它能描述程序的执行过程而且可以作为共享资源的基本单位,这个概念就是进程。 进程的生命周期 进程和人一样是有生命的,从诞生到死亡要经历若干个阶段。一般说来进程有三种状态:就绪、执行、等待。由多种原因可以导致创建一个进程,例如一个程序从外存调入内存开始执行,操作系统就要为其创建进程,当然还可以有其它原因,如一个应用进程为完成一个特殊的任务,可以自己创建一个子进程。进程被创建后就是在内存中,处于就绪状态,所谓就绪状态就是具备除了CPU之外的所有资源,万事具备,只欠东风,一旦占有 了CPU,就变成了执行状态,执行中如果需要等待外围设备输入数据,则进程就沦落为 等待状态,操作系统又会从就绪状态队列中调度一个进程占有CPU。等到数据到来后, 等待状态的进程又被唤醒成为就绪状态。这些状态的转换是通过进程控制原语实现的。程序的运行是通过进程体现的,操作系统对进程进行管理和控制,那么操作系统怎么了解到进程的状态呢,怎么把资源分配给进程呢,而且进程做状态转换时CPU现场保存在那呢?这要说到PCB(进程控制快)。PCB是进程的唯一标志,在其中记录了进程的全部信息,它是一种记录型的数据结构,相当于进程的档案。操作系统就通过PCB感知进程的存在,通过PCB了解进程和控制进程的运行。PCB也是放在内存中的,如果PCB太大,有些系 统把PCB中一些不重要的信息放在外存中。 进程执行速度的制约 并发进程由于共享系统内部资源,因此导致进程执行速度上的制约,这种制约分为:间接制约与直接制约。间接制约引起进程之间的互斥执行,直接制约引起进程间的同步执行。例如一个家里如果只有一个卫生间,卫生间这个公有资源使得每个人只能互斥使用它,这就是间接制约。而直接制约是指并发进程各自执行的结果互为对方的执行条件,例如司机与售票员的关系,当司机到站停车后,售票员才能开门,而只有售票员关门后,司机才

《操作系统》习题集:第2章 进程与线程(第1部分)

第2章进程与线程-习题集 一、选择题 1.以下关于进程的描述中,正确的是()。【*,联考】 A. 进程获得CPU运行是通过调度得到的 B. 优先级是进程调度的重要依据,一旦确定就不能改变 C. 在单CPU的系统中,任意时刻都有一个进程处于运行状态 D. 进程申请CPU得不到满足时,其状态变为阻塞 2.一个进程是()。【*,联考】 A. 由处理机执行的一个程序 B. 一个独立的程序+数据集 C. PCB结构、程序和数据的组合 D. 一个独立的程序 3.并发进程指的是()。【*,★,联考】 A. 可并行执行的进程 B. 可同一时刻执行的进程 C. 可同时执行的进程 D. 不可中断的进程 4.当一个进程处于这样的状态时,(),称为阻塞态。【*,★,联考】 A. 它正等着输入一批数据 B. 它正等着进程调度 C. 它正等着分给它一个时间片 D. 它正等进入内存 5.某个运行中的进程要申请打印机,它将变为()。【*,联考】 A. 就绪态 B. 阻塞态 C. 创建态 D. 撤销态 6.以下进程状态转变中,()转变是不可能发生的。【**,★,联考】 A. 运行→就绪 B. 运行→阻塞 C. 阻塞→运行 D. 阻塞→就绪 7.当()时,进程从执行状态转变为就绪状态。【*,联考】 A. 进程被调度程序选中 B. 时间片到 C. 等待某一事件 D. 等待的事件发生 8.一个进程的基本状态可以从其他两种基本状态转变过来,这个基本状态一定是()。【**,联考】 A. 运行状态 B. 阻塞状态 C. 就绪状态 D. 完成状态 9.当一个进程完成一个时间片后,系统需要将该进程的状态由运行状态转变为()。【*,联考】 A. 就绪状态 B. 阻塞状态 C. 撤销状态 D. 创建状态 10.进程状态由就绪态转换为运行态是由()引起的。【**,联考】 A. 中断事件 B. 进程状态转换 C. 进程调度 D. 为程序创建进程 11.下列选项中,降低进程优先级的合理时机是()。【***,10考研】 A. 进程的时间片用完 B. 进程刚完成I/O,进入就绪队列 C. 进程长期处于就绪队列中 D. 进程从就绪状态转为运行态 12.()必会引起进程切换。【**,★,联考】

操作系统 实验四 线程同步

集美大学计算机工程学院实验报告 课程名称:操作系统指导教师:王丰实验成绩: 实验编号:实验四实验名称:线程同步 班级:计算12姓名:学号: 上机实践日期:2015.5上机实践时间:2学时 一、实验目的 1、掌握在Linux环境下的线程创建: clone(); 2、线程同步:信号灯sem_t实现线程同步与互斥; 3、实现经典同步问题读者-写者问题。 二、实验环境 Ubuntu-VMware、Linux 三、实验内容 1、用信号灯 + PV操作实现读者—写者问题; 2、用clone()函数4个读者线程和4个写者线程; 3、每次读者在共享数据区(缓冲区)读操作,或者写者在共享数据区写操作时,要 显示当前正在操作的线程; 4、按读者优先或者写者优先编写程序,但要明确是那个优先。 函数和变量 1)信号灯: 头部文件:semaphore.h (线程:pthread.h) 2)信号灯初始化: sem_t r_w_w, mutex;//定义信号灯 初始化: sem_init(&r_w_w, 0, 1); sem_init(&mutex,0, 1); 3)信号灯操作: 对信号等进行P操作: sem_wait(&r_w_w); sem_wait(&mutex);

对信号灯进行V操作: sem_post(&r_w_w); Sem_post(&mutex); 四、实现过程 #include #include #include #include #include //定义信号灯变量 sem_t r_w_w; sem_t mutex; int readCount=0; char info[20];//共享数据区 int Reader(int r_n) { char rc[20]; while(1){ sem_wait(&mutex); readCount++; if(readCount==1) { sem_wait(&r_w_w); printf(“First reader inter CR!\n”); } sem_post(&mutex); printf(“ %dth reader is reading:”,r_n); strcpy(rc,info); printf(“%s\n”,rc); sem_wait(&mutex); readCount--; if(readCount==0) sem_post(&r_w_w); printf(“%dth reader exit.\n”,r_n);

线程、进程、多线程、多进程和多任务之间的区别与联系

线程、进程、多线程、多进程和多任务之间的区别与联系

可能学习操作系统开发的读者都听说过这些专业名词,但又多少人理解了? 首先,从定义开始,先看一下教科书上进程和线程定义:进程:资源分配的最小单位。线程:程序执行的最小单位。 1 进程进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。 举例说明进程:想象一位有一手好厨艺的计算机科学家正在为他的女儿烘制生日蛋糕,他有做生日蛋糕的食谱,厨房里有所需的原料:面粉、鸡蛋、糖、香草汁等。在这个比喻中,做蛋糕的食谱就是程序(即用适当形式描述的算法)计算机科学家就是处理器(CPU),而做蛋糕的各种原料就是输入数据。 进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和。现在假设计算机科学家的儿子哭着跑了进来,说他的头被一只蜜蜂蛰了。计算机科学家就记录下他照着食谱做到哪儿了(保存进程的当前状态),然后拿出一本急救手册,按照其中的指示处理蛰伤。这里,我们看到处理机制是从一个进程(做蛋糕)切换到另一个高优先级的进程(实施医疗救治),每个进程拥有各自的程序(食谱和急救手册)。当蜜蜂蛰伤处理完之后,这位计算机科学

家又回来做蛋糕,从他离开时的那一步继续做下去。 2 线程线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 一个标准的线程有线程ID、当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现处间断性。 线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。举例说明线程:假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西——-文本内容,不停的切换造成性能上的损失。若有一种机制,可以使任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内容就少了,同时又可以减少通信所带来的性能损耗,那就好了。这种机制就是线程。 总的来说:进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

进程、线程、管程三者之间的关系

进程、线程、管程三者之间的关系 首先我们先了解进程、线程、管程各自的概念:进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。线程:线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。 管程:管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。 现在我们来了解进程和线程的关系: 简而言之,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有

多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。 下面我们用实际图解来加以分析进程和线程之间的关系:

操作系统实验线程的同步

操作系统实验线程的同步 部门: xxx 时间: xxx 整理范文,仅供参考,可下载自行编辑

实验六线程的同步 1、实验目的 (1)进一步掌握Windows系统环境下线程的创建与撤销。 (2)熟悉Windows系统提供的线程同步API。 (3)使用Windows系统提供的线程同步API解决实际问题。 2、实验准备知识:相关API函数介绍 ①等待对象 等待对象

·Waitable timer:定时器。 原型: DWORD WaitForSingleObject( HANDLE hHandle, // 对象句柄 DWORD dwMilliseconds // 等待时间 ); 参数说明: (1)hHandle:等待对象的对象句柄。该对象句柄必须为SYNCHRONIZE访问。 dwMilliseconds:等待时间,单位为ms。若该值为 0,函数在测试对象的状态后立即返回,若为 INFINITE,函数一直等待下去,直到接收到一个信 号将其唤醒,如表2-1所示。p1EanqFDPw 返回值: 如果成功返回,其返回值说明是何种事件导致函数返回。 表2-1 函数描述 用法举例: Static HANDLE hHandlel = NULL。

相关主题