计算机等级考试四级 网络工程师 之 操作系统原理1 适合懒人备考哈哈哈

第一题

1 操作系统的结构:早期操作系统是无结构的,也有人把它称为 整体系统结构;模块化结构;分层式结构; 微内核结构。
2 编译高级语言编写的程序不是操作系统所具有的功能。操作系统是管理和控制计算机硬件与软件资源的计算机程序。
3 现代操作系统最基本的特征是 并发性。现代操作系统基本特征是并发、共享、虚拟和异步,其中并发性是最基本的特性。
4 若一个单核处理机的系统中有多个进程存在,则这些进程是 并发运行的。不是并行运行的。
5 采用多道程序设计技术,能有效地提高系统的 并发性。
6 在计算机中配置操作系统的主要目的是 提高计算机系统资源的利用率。
7 计算机系统的资源分为 硬件资源和软件资源,软件资源由 程序和数据组成。
8 从计算机应用角度来看,操作系统的主要作用是提供 人机交互接口 (系统软件)。
9 从软件设计和开发角度来看,操作系统的主要作用是提供 软件开发基础平台
10 从计算机安全保护角度来看,操作系统的主要作用是提供 第一道安全防线
11 从计算机系统发展角度来看,操作系统的主要作用是提供 虚拟机和扩展机
12 操作系统作为系统软件,位于软件系统的哪一个层面? 硬件之上,支撑软件之下。
13 计算机系统中,操作系统作为系统软件集中了下列哪两类主要功能? 资源管理和控制程序执行
14 操作系统能够“合理”地组织计算机工作流程、控制程序的执行,其中“合理”是指 公平对待不同用户程序,不发生死锁和饥饿。
15 在操作系统中建立了用于记录各种软硬件资源信息的数据结构,该数据结构的用途是 了解用户需求和当前资源使用情况,对资源进行有效组织、管理。
16 随机性是操作系统的特征之一,哪种现象具有“随机性”? 操作系统内核进行进程切换这一现象具有随机性。
17 并发性是操作系统的特征之一,哪种现象具有“并发性”? 在单处理器环境下,两个程序交替在 CPU 上运行。易错项:在多处理器环境下,两个程序在两个 CPU 上同时运行。此项显然不是并发性。

第二题

1 在不同类型的操作系统中,批处理操作系统的缺点是 缺少交互性。
2 在操作系统的结构设计中,微内核结构表示的是 客户机/ 服务器结构。
3 组成操作系统的主要部分通常是进程线程管理(处理机管理)、内存管理(存储管理)、设备管理和 文件管理。还有作业管理。
4 操作系统作为系统软件,为用户提供了高效使用计算机的接口。
5 共享性是操作系统的特征之一,计算机中的各类设备在操作系统管理下实现共享CPU 、硬盘、内存 可以被 同时 共享。 打印机、 磁带机、投影仪和扫描仪 只能互斥共享 。打印机、磁带机、投影仪和扫描仪 不能被抢占,CPU 、硬盘、内存可以被抢占。
6可以同时共享的软件资源:可重入代码 、SPOOLing 系统 、log ()函数子程序。不可以同时共享的软件资源: 临界区 、 中断服务程序 、 内核调度模块 、 内存分配模块 。
7 并发性是操作系统的特征之一,所谓“并发性”是指 进程在宏观上是同时运行,而在微观上是交替运行。
8 共享性是操作系统的特征之一,所谓“共享性”是指 在一定的策略控制下,按不同资源类型共同占有使用。
9 随机性是操作系统的特征之一,所谓“随机性”是指 操作系统不能对所运行程序的行为以及硬件设备的情况做出任何事先的假定。
10 哪一个状态位不包含在程序状态字(PSW)中? 驻留位(A) )。
11 哪一项寄存器组都是用户可见寄存器? 数据寄存器、地址寄存器、条件码寄存器

第三题

1 用户态下只能使用非特权指令,内核态下可以使用所有制令,特权指令只能在内核态下运行。属于特权指令的有: 屏蔽中断 、 关中断指令。
2 用户程序在用户态下使用特权指令而引起的中断是 访管中断 。是 访管中断是 CPU 由用户态向核心态转换的方法 。
3 用户应用程序不属于操作系统内核程序。属于操作系统内核程序的有进程调度程序、中断服务程序、设备驱动程序。
4 中断服务程序是固定在某个地址的代码段,不能作为进程来管理。
5 用户编程需要打印输出,使用操作系统提供的 系统调用 write()。
6 操作系统提供给用户的接口是 命令输入和系统调用。
7 当用户程序需要调用操作系统所提供的文件读写功能时,该功能首先执行的指令是 访管指令。访管中断由访管指令产生,程序员使用访管指令向操作系统请求服务。
8 内核态和用户态是用于操作系统运行安全而设置的一种状态标志,其含义是指 CPU 在运行时所处的状态。不是操作系统。
9 在操作系统中,只能在内核态下运行的指令(特权指令)是 屏蔽中断 、 关中断指令。
10 操作系统需要处理器从内核态转为用户态时,采用的是 修改程序状态字。 访管中断是 CPU由用户态向核心态转换的方法 。
11 在操作系统中,既可以在内核态下运行又可以在用户态下运行的指令是 置移位方向标志。
12 处理器中对用户可见的寄存器 包括:数据寄存器、地址寄存器以及条件码寄存器。
13 不包含在程序状态字(PSW)中的标志位有: 保护位(P) ) 、 修改位(M) ) 、 访问位(R) ) 、驻留位(A) )。
14 中断是由外部事件引发的,而异常则是由正在执行的指令引发的。属于中断的事件有: 用户按鼠标左键;属于异常的事件有:执行访管指令、进程打开文件时出错、程序对只读内存执行写指令。

第四题

1 引入中断技术可以使计算机的运行效率得到提高,中断优先级对中断响应顺序产生影响。
2 指令错不属于 I/O 中断的事件。 3 用户编写程序时调用 fork()创建进程,其使用的是操作系统提供给用户系统调用接口。
4 当用户在终端窗口通过输入命令来控制计算机运行时,使用的是操作系统的命令行接口。
5 用户程序需要关闭中断响应(执行特权指令),他必须首先发起访管中断。
6 计算机操作系统位于核心态时,它既可运行特权指令,也可以运行任何非特权指令。
7 中断处理程序的入口地址一般存放在中断向量表中。
8 外部 I/O 设备向处理器发出的中断信号又称为中断请求。
9 中断是由外部事件引发的,而异常则是由正在执行的指令引发的。 属于中断的事件有:用户按鼠标左键、用户敲击键盘、网卡上数据缓冲区满、系统掉电、 控制台出现故障、完成写硬盘操作、时钟中断、控制台命令、存储器校验错、定时器计时结 束; 属于异常的事件有:被零除、运行过程中执行了除零操作、算术溢出、内存保护出错、程 序执行时所访问的变量不在内存、执行访管指令、目态程序试图执行特权指令、进程打开文 件时出错、程序对只读内存执行写指令。 10 进程运行时,当运行中的进程不希望被外部事件打扰时,可以采用屏蔽中断。
11 程序性中断与当前运行的进程有关。
12 中断源是指引起中断的那些事件。
13 中断请求是指中断控制器向处理器发出的信号。
14 中断响应是指处理器暂停当前程序,转而进入中断处理程序。
15 中断断点是指正在运行的程序的暂停点。
16 将一个整型变量转换为浮点数变量(用户程序变量类型转换)不属于系统调用。
17 系统调用时,调用程序和被调用程序位于不同状态;一般过程调用只需要在用户态就能 完成。

第五题

1 操作系统提供给用户用于应用程序编程的唯一接口是 系统调用 (程序接口)。
2 在屏幕上画出一个红色的圆,需要使用 系统调用显示屏的驱动程序。
3 用户进程从用户态转变为内核态时,使用的指令是 访管指令。从内核态转为用户态时,采用的是 修改程序状态字。
4 在用户态或内核态下执行的指令(非特权指令):算术运算指令、关机、读文件、设置时间、读时钟指令、取数指令、移位指令、 置移位方向标志(既可以在内核态下运行又可以在用户态下运行)。
只能在内核态下执行的指令(特权指令):屏蔽中断、关中断指令、置程序计数器、清指令寄存器、设置控制寄存器指令、切换栈指针指令。
5 关于操作系统的结构, “ 清晰的单向依赖和单向调用性 ” 不是微内核结构的特点。
6 若用户数为 100,为保证响应时间≤100ms;则时间片设置为 100ms/100=1ms。
7 用户需要动态请求和释放系统资源,在用户程序中所使用的方法是通过 系统调用。
8 调用程序多次嵌套与递归是 系统调用无法实现的功能。
9 函数 open 是 文件操作类系统调用。
10 函数 fork 是 进程控制类 系统调用。
11 用户进程在实现 系统调用时, 通过变量传递不能用于传递参数。
12 系统调用时调用程序位于用户态,被调用程序位于核心态。 一般过程调用只需要在用户态就能完成。
13 系统调用时需要通过陷入机制(访管指令使用系统调用),从用户态的调用程序转到核心态的被调用程序。
14 过程调用和系统调用均可以嵌套使用。
15 过程调用直接返回到调用程序, 系统调用在返回到调用程序前先运行调度程序。
16 不属于系统调用: 查找数据库中的某个学生信息不属于系统调用,它是对数据库应用系统的调用; 将成绩填入学生成绩数据库不属于系统调用,它是对数据库应用系统的调用; 查找数组中的最大数不属于系统调用,属于一般过程调用;将一个整型 变量转换为浮点数变量(用户程序变量类型转换)不属于系统调用。属于系统调用:用户程序创建一个新进程(fork)或用户程序终止一个进程(exit)或用户程序需要获得当前进程的属性或用户程序需要将本进程休眠或进程通过共享内存交换数据属于 进程控制方面的系统调用;一个进程向另一个进程发送消息属于 进程通信方面的系统调用;关闭一个打开的文件(close)或打开磁盘上的一个文件(open)或读写(read、write)硬盘上一个打开的文件或在硬盘上创建一个公共目录属于 文件操作方面的系统调用;对临界区加互斥锁属于 信号量方面的系统调用;请求使用光盘驱动器属于 设备管理类系统调用。
17 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如 程序计数器、 寄存器和栈)

第六题

1 与进程具有一一对应关系的是 进程控制块 (PCB) )。
2 在多道程序设计系统中,能并行工作的是 CPU 与外部设备。
3 多道程序设计的意义是 宏观上有多个进程在计算机中同时运行。 多道程序技术运行的特征:多道、宏观上并行、微观上串行。
4 进程调度所需的信息-- 进程优先级–是存放在 进程控制块(PCB) )。
5 从静态的角度看, 进程控制块(PCB )是进程必须拥有而程序所没有的。
6 进程优先级是位于进程控制块中而不是位于进程中。
7 多道程序设计技术使得进程能够并发运行,相比单道程序运行,并发运行的多道程序不再具有 可再现性。
8 计算机操作系统中,所谓进程的唯一"标志"是指 进程控制块(PCB) )。
9 进程控制块的基本内容有: 进程标识符、进程调度状态、进程相应的程序和数据地址、进程优先级、CPU 现场保护区、进程同步与通信机制、进程所在队列文件句柄、与进程有关的其他信息。 进程的用户栈不保存在进程控制块中。
10 所谓“可再入程序”是指“ 纯代码程序,运行中不需要修改”的程序。
11 进程控制块(PCB)的组织方式主要有三种: 线性方法、索引方法、链接方法。没有 B+树方法。
12 进程控制块(PCB)的内容一般可以分成调度信息和现场信息两大部分, 现场信息包括:程序状态字、时钟 信息 、界地址寄存器等;调度信息包括:进程名、进程号、存储信息、优先级、当前状态、资源清单、“家族”关系、消息队列指针等。
13 进程的实质是程序在多道程序系统中的一次执行过程。进程具有 并发性、动态性、独立性 和异步性 。进程的“并发性”是指 宏观上,不同的进程可以一起向前推进。进程的“动态性”是指 进程是动态产生、 动态变化 、动态消亡的。进程的“独立性”是指 一个进程是一个相对完整的资源分配单位。进程的“异步性”是指 每个进程按照各自独立的、不可预知的速度向前推进。
14 多道程序设计的含义是指 允许多个程序同时进入内存并运行

第七题

1 某个进程由多个线程组成,其中一个线程被调度程序选中投入运行,其他的线程有的位于就绪队列,有的被阻塞,则此时该进程的状态是 运行状态。运行中的进程可以具有以下三种基本状态。
1) 就绪状态:进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。
2) 运行状态:进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。
3) 阻塞状态:由于进程等待某种条件(如 I/O 操作或进程同步),在条件满足之前无法继续执行。

2 Linux 操作系统进程有 5 种状态: 运行、 中断、 不可中断、 僵死、 停止。 安全状态不是 Linux支持的进程状态。

3 引起进程阻塞的事件有:
1)请求系统服务;
2)启动某种操作;
3) 新数据尚未到达 ( 需要的数据没有准备好) ;
4)无新工作可做。

4 进程在运行过程中具有多种状态,当它从 等待态 (阻塞态)转换为 就绪态时称为 唤醒。当被阻塞的进程所期待的事件出现时,如 I/O 完成或者其所期待的数据已经到达,则由有关进程调用唤醒原语 wakeup(),将等待该事件的进程唤醒。

5 进程运行时所发生的典型事件中, 设备忙不会导致进程终止,将导致阻塞。被 被 0 除 、 对只读内存执行写操作 、 堆栈溢出均会导致进程终止。

6 进程运行过程中,导致进程从运行态转换为就绪态的典型事件是到 时间片到 ( 时间片用完) )。
图 进程的三种基本状态及其转换

在这里插入图片描述
7 单核处理机的计算机系统中,处于运行状态的进程至多有 1 个,最少为为 0。单核处理机的计算机系统中共有 20 个进程, 处于就绪状态的进程已经获得了除处理机外的所需资源,此时再分配给它处理机,就可以执行; 假设 20 个进程都处于就绪状态,那么必将有一个进程会分配到处理机,转为运行状态,那么最多有 19 个进程处于就绪状态 。 若进程推进的顺序不当,或资源不足(或分配不当)则 所 有进程全部阻塞, 那么 处于就绪状态的进程最少可以是 0 个。单核处理器的计算机系统因为竞争资源而发生死锁时,最多有可能 20 个进程全部阻塞。

以上内容注意总结记忆: 进程数 n,单核运行多少(1, ,0) ) 、就绪多少(n-1, ,0) ) 、阻塞 (n )。一般一个进程会有多个线程,也可以有一个线程。

8 某 4 核处理器的计算机系统中共有 50 个进程,4 核心处理器意味着同时可以执行 4 个进程的指令,所以处于运行状态的进程 最多可以有 4 个。但是当计算机系统中的多个进程由于竞争资源等原因导致系统处于死锁状态而无法运行,那么此时处于运行状态的 进程为 0 个。处于就绪状态的进程已经获得了除处理机外的所需资源,此时再分配给它处理机,就可以执行;题目计算机系统有 4 核处理器,50 个进程,假设 50 个进程都处于就绪状态,那么必将有一个进程会分配到处理机,转为运行状态,若此进程(多线程)运行时所需处理机为 4个,那么 最多有 49 个进程处于就绪状态。若进程推进的顺序不当,或资源不足(或分配不当)则所有进程全部阻塞,因而处于就绪状态的进程 最少可以是 0 个。

以上内容注意总结记忆:进程数 n ,多核(m 核)运行多少(m ,0 )、就绪多少(n-1 ,0 )、阻塞多(n )。一般一个进程会有多个线程,也可以有一个线程。

9 服务器装有四颗处理器,每颗处理器有八个核,共计 4*8=32 核。32 核也就是存在 32 个CPU 系统,所以处于运行状态的进程最多可以有 32 个。

第八题

1 一个运行着的进程打开了一个新的文件,则指向该文件数据结构的关键指针存放在 进程控制块
2 当一个新的进程创建完成后,该进程的进程控制块将被插入到 就绪队列

3 当进程从运行态转换到就绪态时,处理机的现场信息必须保存在 进程控制块中;
操作系统的重要概念是进程,不同的进程执行的 代码可能相同(不是不同);
进程存在的标志是进程控制块,与本进程相关的运行状态 只能操作系统读取(用户不能读取);
当进程申请处理机而得不到满足时,它将进入 就绪状态(不是阻塞态)。

4 为使进程从阻塞态转换为挂起态,使用的原语是 suspend()。
原语是由 若干条机器指令构成的完成某种特定功能的一段程序,具有不可分割性。即原语的执行必须是连续的,在执行过程中不允许被中断。

5 当用户在编程中需要创建一个进程时,他可以 调用进程创建原语由操作系统创建进程。
进程具有多种状态,操作系统改变进程状态主要是通过 调用进程控制原语实现。
当使用进程创建原语创建进程时,正确的顺序是 申请 PCB ,填写 PCB ,放入就绪队列。

当使用进程撤销原语撤销进程时,正确的顺序是的 找到对应进程的 PCB ,撤销其下的子孙进程,释放该进程资源,撤销该 PCB。

当使用进程唤醒原语唤醒进程时,正确的顺序是 在等待队列中找到该进程 PCB ,修改 PCB中进程状态为就绪,将其插入到就绪队列。

当使用进程阻塞原语阻塞进程时,正确的顺序是 中断 CPU 执行,保存现场信息,修改 PCB中进程状态为阻塞,将其插入到阻塞队列。

6 若一个进程由于申请的内存资源长期不能得到满足,那么,操作系统处理该进程的最佳方法是 挂起该进程。 挂起是指 把一个进程从内存转到外存。当条件允许的时候,会被操作系统再次调回内存,重新进入等待被执行的状态即就绪态。

7 系统中有多个进程分别处于就绪状态、运行状态和阻塞状态, 运行状态→ 阻塞状态的变化( 让出 CPU 引起就绪状态进程得到运行)必然引起另一个进程的状态发生变化。

8 进程控制块 PCB 的组织方式主要有三种: 线性方法、索引方法、链接方法。没有哈希表方式。

9 进程由 程序代码、数据和 PCB (进程控制块)三部分组成 ,没有人机交互界面。

10 为了实现对进程的管理,系统将所有进程的 PCB 排成若干个队列, 进程队列分为三类:就绪队列、等待队列和运行队列。没有调度队列。

11 用于进程控制的原语一般有: 创建进程、撤销进程、挂起进程、激活进程、阻塞进程、唤醒进程以及改变进程优先级等。没有进程上下文切换。

12 为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为 进程控制块(PCB)

第九题

1 在 Pthread 线程包中,线程操作 pthread_join 的含意是 等待一个特定的线程退出。
2 在 Pthread 线程包中,线程操作 pthread_yield 表示的是 线程让出 CPU。

3 分析下列程序,不考虑其他因素,程序正常运行时最多会派生出多少个进程(8 个)。
int main() //1 个进程
{
fork(); //2 个进程
fork(); //4 个进程
fork();} //8 个进程

4
例 1:
int main() //进程数 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //进程数 2
printf(“HelloWorld\n”); //打印 2 行
fork(); //进程数 4
printf(“Hello World\n”); //打印 4 行
}
在 UNIX 操作系统中正确编译链接后,其正确的运行结果是( 共打印出 7 行 Hello World)
例 2:分析下列程序。
int main() //进程数 1
{ printf(“Hello”); //打印 1 个
fork(); //进程数 2
printf(“Hello”); //打印 2 个
fork(); //进程数 4
printf(“Hello”); //打印 4 个
fork(); //进程数 8
printf(“Hello”);} //打印 8 个
不考虑其他因素,程序正常运行后共打印出多少个"Hello"(15 个)。

5
例 1:
对于如下 C 语言程序
int main() //进程数 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //进程数 2
printf(“Hello World\n”); //打印 2 行
}
在 UNIX 操作系统中正确编译链接后,其正确的运行结果是( 共打印出 3 行 Hello World)。
例 2:
int main() //进程数 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //进程数 2
fork(); //进程数 4
printf(“Hello World\n”); //打印 4 行
}
在 UNIX 操作系统中正确编译链接后,其正确的运行结果为( 共打印出 5 行 Hello World)。
例 3:
int main() //进程数 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //进程数 2
fork(); //进程数 4
fork(); //进程数 8
printf(“Hello World\n”); //打印 8 行
}
在 UNIX 操作系统中正确编译链接后,其正确的运行结果是( 共打印出 9 行 Hello World)。

6
例 1:
对于如下 C 语言程序
int main()
{
int i;
for ( i = 0; i < 1;i++) //由于 i 初始值为 0,且 i 自增,循环进行下去的条件是 i<1,而 i 加了
一个 1 就不符合 i<1 了,所以 for 循环只执行 1 次。
{
fork();
printf(“Hello World\n”);
}
}
在 UNIX 操作系统中正确编译链接后,其运行结果为( 共打印出 2 行 行 Hello World)。
上述程序等价于:
int main()
{
fork();
printf(“Hello World\n”);
}
例 2:
int main()
{
int i;
for ( i = 0; i < 2;i++) //for 循环执行 2 次
{
fork();
printf(“Hello World\n”);

}
}
在 UNIX 操作系统中正确编译链接后,其运行结果为( 共打印出 6 行 行 Hello World)。
上述程序等价于:
int main()
{
fork();
printf(“Hello World\n”);
fork();
printf(“Hello World\n”);
}

7
例 1:
对于如下 C 语言程序
int main()
{
pid_t pid;
int x=1;
pid = fork();
if(pid==0)
printf(“I am the child process, x=%d\n”, ++x);
else
printf(“I am the parent process, x=%d\n”, --x);
}
在 UNIX 操作系统中正确编译链接后,其正确的运行结果是(I am the child process, x=2 I am the parent process, x=0)。
//子进程中,返回值是 0,走第一个 if 语句打印,++x(自增),即 x 加 1,再取值打印,结果为 2;、父进程中,返回值不是 0,执行 else 打印,--x(自减),即 x 减 1,再取值打印,结果为 0。
运行后的输出为 I am the child process, x=2 I am the parent process, x=0。
例 2:
对于如下 C 语言程序
int main()
{
pid_t pid;
int a = 20;
pid = fork();
if (pid == 0)
printf(“This is the son process, a=%d\n”, --a);
else
printf(“This is the dad process, a=%d\n”, ++a);
}
在 UNIX 操作系统中正确编译链接后执行,其运行结果为(This is the son process, a=19 This is the dad process, a=21)。

第十题

1 一定不会引起进程调度的操作是 一个进程从就绪状态变成了运行状态。
2 在采用非抢占式调度的操作系统中,不能引起 新进程调度的事件是新创建的进程进入就绪队列。
3 在 Pthread 线程包的使用中,当用户编程创建一个新的线程时,需要使用的线程库函数是
pthread_create()。
4 在 Pthread 线程包的使用中,当用户需要结束一个线程时,可以使用的线程库函数是pthread_exit()。
pthread_yield()线程让出 CPU,pthread_join()等待一个特定的线程退出。
5 在 Pthread 线程包关于条件变量的使用中,pthread_mutex_init()表示的是 创建一个互斥量。
6 管程实现了进程的互斥,但是 管程无法保证本身互斥。
7 有如下 C 语言程序
void * th_f(void * arg)
{
printf(“Hello World”);
pthread_exit(0);
}
int main(voiD)
{
pthread_t tid;
int st;
st = pthread_create(&tid, NULL, th_f, NULL);
if(st==0)
printf(“Oops, I can not createthread\n”);
exit(NULL);
}
针对上述程序,下列叙述中哪一个是正确的()。
A)线程 th_f 运行后主动退出
B)线程 th_f 运行后等待一个特定的线程退出
C)线程 th_f 运行后主动释放 CPU 给其他线程
D)线程 th_f 运行后进入等待态
A【解析】
pthread_create 是类 Unix 操作系统(Unix、Linux、Mac OS X 等)中创建线程的函数,里面
包含四个参数,
第一个参数为指向线程标识符的指针;
第二个参数用来设置线程属性;
第三个参数是线程 入口 函数的起始地址也即线程名;
最后一个参数是入口函数的参数。
题目程序在 main()函数中调用 pthread_create()函数创建一个新线程 th_f,设置新线程的入口
函数为 th_f,所以新线程创建后执行 th_f 函数,在 th_f 函数中输出 Hello World,接着 调用
pthread_exit(0) 后 线程 th_f 主动退出,答案为 A。

//分析上述程序关键语句(正数第 4 句和倒数第 4 句)
pthread_exit(0);
st = pthread_create(&tid, NULL, th_f, NULL);
结论: 调用 pthread_exit(0) 后 线程 th_f 主动退出

pthread_join(2);
st = pthread_create(&tid, NULL, th_f, NULL);
结论: 调用 pthread_join(2) ,线程 th_f 运行后等待该线程退出后 再 退出 。

pthread_yield(0);
st = pthread_create(&tid, NULL, th_f, NULL);
结论:用 调用 pthread_yield(0) ,线程 th_f 运行后等待该线程退出后挂起自己,将 CPU 让给其他线程

pthread_exit(0);
st = pthread_create(&tid, NULL, th_f, NULL);
结论:在引入线程的操作系统中每一个进程里有都一个主线程,由主线程再创建其他线程,
所以题目程序中如创建线程成功(pthread_create)则存在 2 个线程,否则还是只有 1 个主线程。 即程序运行中最多存在 2 个线程 。
上述程序经过 正确编译链接后执行,当 pthread_create 运行成功后, 进程有 2 个线程。

pthread_exit(0);
st = pthread_create(&tid, NULL, th_f, NULL);
结论:pthread_create 函数表示创建线程, 线程名为 th_f。

其他题目复习在下一篇博文

猜你喜欢

转载自blog.csdn.net/weixin_44001568/article/details/105229850