当前位置:   article > 正文

操作系统 精髓与设计原理 第四章部分题目_操作系统精髓与设计原理第九版答案

操作系统精髓与设计原理第九版答案

第四章重要题目

注:书参考《操作系统——精髓与设计原理(第九版)》
复习题
4.1表3.5列出了无线程操作系统中进程控制块的基本元素。对于多线程系统,这些元素中的哪些可能属于线程控制块,哪些可能属于进程控制块?
在这里插入图片描述
答案:
PCB中可能包含的元素包括:
(1)存储管理信息
(2)资源的所有权和使用情况
(3)标识符(线程和进程都需要标识其身份)
(4)调度和状态信息中的部分信息,例如:运行状态(进程仍然有新建、终止、运行、阻塞等状态。注意进程和它内部包含的线程可能有不同的状态,例如进程处于运行状态时,它的一个线程可能处于阻塞状态。)
(5)数据结构中的部分信息,例如:进程间的亲缘关系。
(6)通信信息的一部分(通信的消息可视为是一种资源,因此当两个不同进程之间的线程通信时,操作系统的某些管理工作需要在进程层次上完成)
(7)特权信息(特权可能是分层次设定的,首先是设定进程的特权,然后进程内的各线程再细分特权,因此,在PCB和TCB中可能都会有特权信息)
TCB中可能包含的元素包括:
(1)用户可见寄存器
(2)控制和状态寄存器
(3)栈指针
(4)调度和状态信息
(5)数据结构中的部分信息,例如:线程的就绪队列
(6)通信信息的一部分(进程内的线程通信时,基于线程进行管理,因此有部分通信信息在TCB中;但注意到同一进程内的所有线程可以共享通信的消息,因此即使是同一进程内的线程通信时,也可能有部分信息会记录在PUB中)
(7)特权信息
(8)标识符
4.6列出用户级线程相对于内核线程的三个优点
答案:
(1)线程切换不需要内核态特权,切换开销小。
(2)调度可以是应用相关的,各个应用程序可以使用不同的线程调度算法。
(3)不依赖操作系统,可在任何操作系统中运行。
习题
4.7在很多诸如C和C++语言的现行规范中,并未提供对多线程编程的支持。如下面的程序所示,这一问题可能会对编译器和代码的正确性造成影响。考虑如下的函数定义和声明:
int global_positives = 0 ;
typedef struct list {
struct list *next ;
double val ;
} *list ;
void count_positives(list l)
{
list p;
for(p=1;p;p=p->next)
if(p->val>0.0)
++global_positives;
}
a.该函数的功能是什么?
b.C语言只对单个线程的执行进行了规范。对于本题中所声明的函数,在两个并发的线程中使用是否会有明显或潜在的问题?
答案:
a.数出链表中val值为正数的节点的个数。
b.(1)没问题
(2)线程A中count_positives()函数的实参是一个不包含正值节点(val值为正数的节点)的链表,所以线程A不会修改全局变量global_positives的值,即不会出现线程A和B同时修改全局变量的情况,因此A,B并发没有问题。
4.8 对于一些已优化的编译器(包括比较保守的GCC),上题中的count_positives函数一般会被优化成类似下面的代码:
void count_positives( list l)
{
list p;
register int r ;
r=global -positives;
for(p=1;p;p=p->next)
if(p->val>0.0) ++r;
global_positives =r;
}
若有A,B两个线程并发执行,则被这样编译优化会有什么明显或潜在的问题发生?
答案:
线程A中的寄存器变量r暂存了全局变量global_positives的值,线程B修改global_positives的值之后,可能会被线程A修改为r中的暂存值,使得global_positives的值产生错误。
出错的例子:
A:
list p;
register int r;
r =global_positives ;
B:
++global_positives ;
A:
for (p =1 ;p ;p-> next )
if ( p->val >0.0) ++r ;
global_positives = r ;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/69920
推荐阅读
相关标签
  

闽ICP备14008679号