习题答案 17.docx
《习题答案 17.docx》由会员分享,可在线阅读,更多相关《习题答案 17.docx(46页珍藏版)》请在冰点文库上搜索。
习题答案17
附录各章习题参考答案
第1章习题参考答案
8.答:
ls–a显示当前目录下所有文件信息,包括隐藏文件,而”.”、”.”分别为当前目录及其父目录,是从当前目录下可以访问的,因此作为两个项目放置在当前目录列表中。
9.答:
当前用户为can,当前工作目录为/home/can/work时,则文件/home/can/work/lib/wrapper.h的相对路径是lib/wrapper.h,文件~/a.out的绝对路径是/home/can/work/a.out。
12.答:
(1)
mkdirwork
cp-rf/home/NachOS-4.1work
(2)
rm-rf/home/can/work/NachOS-4.1/
14.答:
(1)0644
(2)rwxr-xr-x,0755
15.答:
(1)rmf**.o
(2)ls?
?
20.答:
命令及输出
当前用户对目录/root缺少何种缺陷所致
$cd/root
bash:
cd:
/root:
Permissiondenied
缺少x权限
$ls/root
ls:
cannotopendirectory/root:
Permissiondenied
缺少r权限
$mkdir/root/work
mkdir:
cannotcreatedirectory‘/root/work’:
Permissiondenied
缺少w权限
21.答:
(1)john的家在/home/john;root的家在/root
(2)若当前工作目录是/home/john,mike的相对路径为../mike,绝对路径为/home/mike
usr的相对路径为../../usr,绝对路径为/usr
第3章习题参考答案
17.解:
4
complexparam
praram2
param1
PHONE=10086
第4章习题参考答案
1.答:
mode
umask
实际权限
0777
0022
0755
0666
0077
0600
S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH
S_IWGRP|S_IWOTH
0644
3.答:
(1)abcd
(2)abcd1234ijklmnopqrstuvwxyz
4.答:
定位前位置
定位操作
定位后指针位置
50
lseek(fd,20,SEEK_SET);
20
50
lseek(fd,-20,SEEK_SET);
50
50
lseek(fd,-20,SEEK_CUR);
30
50
lseek(fd,20,SEEK_END);
70
50
lseek(fd,120,SEEK_END);
170
50
lseek(fd,-120,SEEK_CUR);
50
5.答:
ABCDEFGHIJ12345OPQRST
8.答:
12345679
9.答:
会包含乱码,因为结构体中的整数20、2000、25、3000以二进制形式写入文件后,gedit以文本方式打开时,这些值可能不是可打印字符。
10.答:
将变量所在存储区内容直接写入文件,占据文件存储区会小一些,而转换成字符串写入时,文件会大一些。
11.答:
f2出现乱码,因为文件f2的内容是整数30000的值,2个字节,16进制字节值分别为0xC3和0x50,其中C3超过了7f,将显示为乱码。
14.答:
fd3=4
15.答:
fd1=3fd4=4fd3=5fd4=0
16.答:
intfd;
fd=open("dup2.c",O_RDONLY,0);
dup2(fd1,0)
18.答:
先从1号磁盘块读出”/”的目录表,找到etc行,获得etc目录表所在磁盘块号7;然后将7号磁盘块度如内存,从中找到passwd行,获得passwd数据所在磁盘块号192;最后将192号磁盘块内容读入内存,从中读出passwd第1行
19.答:
INT(pos/512)
20.答:
先归还文件分配给f2存储数据的磁盘块2和7,再在can的目录表中删去f2的属性行
21.答:
(1)相对块号为:
INT(1000/512)=1INT(1499/512)=2
对应的盘块号为7、11
因此,需读盘2次,将7、11号盘块读入内存。
(2)相对块号为:
INT(2000/512)=3INT(2499/512)=4
对应的盘块号为25、87
因此,需执行2次读盘和2次写盘操作,磁盘块25、87被更新了。
22.答:
(1)
254*64/512=31.75,分解前查找该目录中某个文件控制块的平均访问磁盘次数为16.5
254*10/512=4.96,分解后查找该目录中某个文件控制块的平均访问磁盘次数为3
26.答:
设置一个当前目录,可大大减少打开一个文件时,需要搜索的目录数。
27.答:
(1)
逻辑地址
磁盘块号
0
19
1
20
2
21
3
22
(2)INT(1000/512)=1,在20号盘块中
28.解:
(1)
逻辑地址
磁盘块号
0
9
1
16
2
1
3
10
4
25
(2)INT(1000/512)=1,数据在16号盘块中
(3)略
29.解:
(1)256MB/4KB=64K64K*16/2=128KB
(2)500MB/1KB=500K500K*16/2=1MB
30.解:
(10+1024+10242+10243)×4KB=40KB+4MB+4GB+4TB
31.解:
(1)INT(9000/4K)=2,数据块的磁盘块号登记在addr
(2)中,为直接索引,仅需读1个磁盘块
(2)INT(180000/4K)=43,数据块登记在一级间接索引块状,需读2次磁盘块
(3)INT(4200000/4K)=1025,1025-10<1023,数据块登记在一级间接索引块状,需读2次磁盘块
32.解:
(1)分配34、54号磁盘块
(2)将行18、列12的位清0
33.解:
(1)12、56、49、50、51
(2)334、404、405、782
36.答:
loc1=10ch=k,loc2=27
40.答:
open()执行过程:
当程序中执行open函数打开时文件时,系统首先检查该文件的v_node是否存在,若不存在,则先为其创建其v_node,将文件的属性从外存读入v-node;接着,创建其文件表(filetable)表项,设置读写方式、读写位置、v-node指针,访问计数器置为1;然后,在进程的描述符表中找到索引号最小的空闲表项,在其中填入文件表表项的指针,返回描述符表项的索引号。
close()执行过程:
先检查fd指向的文件对象,其计数器大于1,则减1,否则撤销文件对象;然后检查对应的v-node,如果其计数器大于1,则减1,否则撤销v-node;最后将fd对应的描述符置为空闲。
如果撤销v-node,应将变化后的内容更新到外存。
41.答:
Theoldfd1filedescriptor=3
Theoldfd2filedescriptor=4
Thenewfdfiledescriptor=5
Thenewfd2filedescriptor=0
Ihavereadfroma.txt:
abcdefgh
42.答:
0601
43.解:
89abc
44.答:
fd1=3
fd2=4
fd3=3
45.答:
fd2=5
46.答:
c1=s
c2=s
47.解:
fd2=4
fd3=0
48.解:
2016LINUXEXAMGOOD!
GOOD!
49.解:
(1)M=(M2-M1)/N
(2)func真实执行时间T测量误差δ=|Δ1+Δ2|/N,由于Δ1为不变值,通过增大N可减少测量误差
51.答:
100/512=19.53逻辑块号为19
53.答:
分解式目录
当前目录
54.解:
(1)pos,pos+len-1
(2)
~
55.解:
(1)pos,pos+len-1
(2)
~
56.解:
(1)500/8=62.5,需要63字节
(2)16i+j
57.解:
(1)起始字节相对块号9000/1024=8.7即8号块
末字节相对块号10024/1024=10.25,为10号块
要读8、9.、10三个数据块
8、9号数据块分别位于addr(8)和addr(9)号索引块中
10号数据块位于一级间接索引下
共需读4次磁盘,三个数据块,一个索引块
(2)起始字节相对块号180000/1024=175.78即175号块
末字节相对块号10024/1024=177.24,为177号块
要读175、176、177三个数据块,它们都在一级间接索引块状。
共需读4次磁盘,三个数据块,一个索引块
(3)起始字节相对块号4200000/1024=4101.5即4101号块
末字节相对块号4201499/1024=4103.02,为4103号块
要读4101、4102、4103三个数据块
4102-1034=30683068%1024=1020
三个数据块登记在二级间接索引的同一索引块下
需读盘5次,三个数据块,2次索引块
58.解:
(1)3555
(2)(62,8)
59.答:
141
60.答:
(1)文件Wang的路径是/D/DC/DDA/Wang
(2)系统需要读取4个目录文件后才能查到Wang:
/、/D、/D/DC、/D/DC/DDA
(3)系统找到文件Wang,至少需读7个磁盘块
(4)采用分解法管理文件目录
61.答:
组织方式
在开始增加一块
在中间增加一块
在末端增加一块
在开始删除一块
在中间删除一块
在末端删除一块
连续
101
51
1
99
49或50
0
链接
1
50
100
1
50
100
单级索引
1
1
1
0
0
0
第5章习题参考答案
5.1答:
ABBC
5.2答:
无运行à阻塞状:
运行中才能执行等待事件的操作
无阻塞à就绪状:
等待事件发生后,CPU可能被其他进程占用,被唤醒进程加入就绪队列,就不会出现冲突
5.3答:
scanf:
导致调用进程从运行到阻塞
fork:
导致调用进程从运行到就绪
read、write、、wait、sleep、pause:
导致调用进程从运行到阻塞
exit:
导致调用进程从运行到终止
5.9答:
父:
x=0
子:
x=2
x=1
5.11答:
只有p1和p11一定并发
5.12答
exfork1.c:
16行
exfork2.c:
4行
exfork3.c:
无穷多行
5.14答:
6种:
abcbcacabacbbaccba
5.15答:
3种
Hello
1
0
Bye
2
Bye
Hello
0
1
Bye
2
Bye
Hello
1
Bye
0
2
Bye
5.20答:
1)x=0;y=10;z=y/x;
2)int*p;*p=100;
5.25答:
可能输出结果:
2种
2
1
1
1
2
1
5.26.答:
(1)包含哪些属性:
…
(2)不可少属性:
进程状态、存储器信息、CPU现场信息
5.27.答:
就绪:
进程获得除CPU之外的所有资源,一旦获得CPU即可运行
运行:
进程获得所需一切资源,正在CPU上运行
阻塞:
进程在等待资源或事件
5.28答:
(1)运行到就绪:
时间片用完
(2)创建到就绪:
执行fork
(3)运行到阻塞:
printf、scanf、read
(4)阻塞到就绪:
用户提供了输入、printf输出完成、进程获得read想读的信息
(5)运行到终止:
调用exit、调用abort、收到9号信号、用户按下Ctrl_C
5.29答:
进程控制块
进程状态
进程队列
fork
创建一个新PCB
新PCB状态为ready
新PCB进入就绪队列
exit
当前进程归还多数系统资源
当前进程状态变为终止状态
运行进程从运行队列退出
wait
被回收进程PCB撤销
调用进程进入阻塞状态
调用进程进入阻塞队列
5.33答:
90种
5.33答:
8行
5.34答:
6行
5.35答:
三种:
4
3
2
4
2
3
2
4
3
5.36答:
3行
5.37答:
2n行
5.38答:
12钟
axbcaxcbbcaxcbaxbaxccaxb
acxbacbxabxcabcxacbxabcx
5.39答:
5.40答:
5.41答:
2
3
4
hellofatherprocess
5.42答:
原因:
用户点按Cntl_C时,子进程收也先收到了SIGINT信号,按缺省方式处理而终止,当父进程向子进程发送SIGINT信号时,子进程已经终止
修改方法是创建子进程前,忽略SIGINT信号,代码如下:
pid_tpid;
voidpa(intsig){
kill(pid,SIGUSR1);
}
voidchild(intsig){
if(sig==SIGUSR1){
printf("killedbypaprocess);
exit(0);
}
intmain(){
signal(SIGINT,SIG_IGN);
pid=fork();
if(pid==0){
usleep
(1);
signal(SIGUSR1,child);
pause();
exit(0);
}
else{
signal(SIGINT,pa);
pause();
exit(0);
}
}
5.43答:
ACE
5.45答:
(1)父子进程都有两种输出:
abcdefghij
(2)abcde
(3)cdefghijkljklmn
5.46.答:
父进程:
90
子进程1:
30
子进程2:
80
第6章习题参考答案
6.2.答:
A.原因是对等线程尚未执行printf操作,主线程执行exit(0)已经让进程终止了,进程终止时也终止了所有线程
B.pthread_exit(NULL)或pthread_join(tid,NULL);
C.仅去掉exit(0)并不能修复该错误,因为如果一个程序的main函数最后没有exit(0)函数调用,编译程序会自动添加exit(0)函数调用
6.3.答:
主线程和对等线程每执行一次循环迭代就调用printf函数输出一行,就执行usleep睡眠阻塞,放弃CPU,另一个线程获得CPU也执行一次循环迭代,调用printf打印一行,这样两个线程的输出就交错显示。
6.4答:
(1)变量运行实例有:
pointer,i.m,tid.m,messages[0].m,messages[1].m,vargp.t0,vargp.t1,mytid.t0,mytid.t1,count
(2)变量运行实例引用情况:
pointer:
m,t0,t1
messages[0].m:
m,t0
messages[1].m,:
m,t1
count:
t0,t1
tid.m:
main,i.m:
main
mytid.t0,vargp.t0:
t0
mytid.t1,vargp.t1:
t1
(3)共享变量有:
pointer,messages[0].m,messages[1],count
6.6答:
模式1
结果
模式3
结果
模式5
结果
S1
柜台1卖出票号8
S1
柜台1卖出票号8
S2
柜台2卖出票号8
T1
ticket=7
S2
柜台2卖出票号8
S1
柜台1卖出票号8
S2
柜台2卖出票号7
T1
ticket=7
S2
ticket=7
T2
ticket=6
T2
ticket=6
T2
ticket=6
模式2
结果
模式4
结果
模式6
结果
S2
柜台2卖出票号8
S2
柜台2卖出票号8
S1
柜台1卖出票号8
T2
ticket=7
S1
柜台1卖出票号8
S2
柜台2卖出票号8
S1
柜台1卖出票号7
T2
ticket=7
T2
ticket=7
T1
ticket=6
T1
ticket=6
T1
ticket=6
6.7.答:
步骤
线程
指令
%eax1
%eax2
count
1
1
H1
-
-
0
2
1
R1
0
-
0
3
2
H2
0
-
0
4
2
R2
0
0
0
5
2
C2
0
1
0
6
2
W2
0
1
1
7
1
C1
1
1
1
8
1
W1
1
1
1
9
1
T1
1
1
1
10
2
T2
1
1
1
6.8.答:
随niters增大,循环
和
用时不断增加,很难在分配给线程的一个CPU时间片内完成循环的执行,在执行序列R1、C1、W1或R2、C2、W2中间发生CPU切换,因此开始出现错误结果。
6.9.答:
(1)线程1的指令R1或R1、C1后,该线程时间片用完,CPU分配给线程2使用;
(2)CPU切换的时机有:
中断到达、优先级更高的任务到达等。
6.10.答:
答:
(1)原语:
原因一般是操作某种特殊共享变量的例程,一般有操作系统内核实现,其特点是由系统内核采用某种手段对同一共享变量的原语例程调用完全错开执行,保证执行原语的并发流以非并发方式操作共享变量。
(2)原语可用于实现不允许并发执行的函数例程,如信号量的P、V操作以及用于进程在不同状态转换的控制函数。
6.11答:
max(r-m+n,0)
6.12答:
答:
(1)互斥:
任何时候最多只能允许一个线程进入临界区;
(2)有限等待:
当一个线程在等待队列挂起时,最多等待前面线程完成临界区执行时间;
(3)空闲请进:
若无线程在临界区执行,一个请求线程立即进入其临界区;
(4)让权等待:
临界资源忙时,请求线程立即挂起,释放处理器,避免“循环测试”
6.13解:
设置互斥信号量mutex
semaphoremutex=1;
void*increase(void*vargp)
{
unsignedlonglongi,niters=(int)vargp;
for(i=0;iwait(mutex);
count++;
signal(mutex);
}
returnNULL;
}
void*decrease(void*vargp)
{
unsignedlonglongi,niters=(int)vargp);
for(i=0;iwait(mutex);
count--;
signal(mutex);
}
returnNULL;
}
6.14解:
semaphoremutex=1;
6.15.解:
semaphoremutex1=mutex2=1,lots=100;//lots为车位数
voidpark()
{
wait(lots);
wait(mutex1);
进入停车场;
signal(mutex1);
找到车位停车
驶离车位
wait(mutex2);
出停车场;
signal(mutex2);
signal(lots);
}
6.16解:
semaphoremutex=1,seats=100;//seats为座位数
voidreader()
{
wait(seats);
wait(mutex);
进入阅览室;
signal(mutex);
找到空座位
坐下看书
wait(mutex);
出阅览室;
signal(mutex);
signal(seats);
}
6.17.
解:
semaphores12=s13=s24=s34=0;
P3(){
wait(s13);
T3;
sgnal(s34);
}
P2(){
wait(s12)
T2;
signal(s24);
}
6.18解:
semaphoreplate=1,orange=apple=0;
father(){
while
(1){
洗水果
wait(plate);
放水果
if(是苹果)
signal(apple);
elsesignal(orange);
}
}
Son(){
while
(1){
wait(orrange);
取橘子
signal(plate);
吃水果
}
}
daughter(){
while
(1){
wait(apple);
取苹果
signal(plate);
吃水果
}
}
6.19.解
void*counter(void*no)
{while
(1){
sem_wait(&mutex);
if(tickets>0){
printf("柜台%d卖出一张票,票号为%d\n",(int)no,tickets);
usleep
(1);
tickets--;
}
else{
sem_post(&mutex);
break;
}
sem_post(&mutex);
usleep
(1);
}
}
6.20.解:
sem_tmutex=1;
void*increase(void*vargp)
{
unsignedlonglongi,niters=(int)vargp;
for(i=0;isem_wait(&mutex);
count++;
sem_post(&mutex);
}
returnNULL;
}
void*decrease(void*vargp)
{
unsignedlonglongi,niters=(int)vargp;
for(i=0;i