问答题
文件F由200条记录组成,记录从1开始编号。用户打开文件后,欲将内存中的一条记录插入到文件F中,作为其第30条记录。请回答下列问题,并说明理由。
问答题
若文件系统采用连续分配方式,每个磁盘块存放一条记录,文件F存储区域前后均有足够的空闲磁盘空间,则完成上述插入操作最少需要访问多少次磁盘块?F的文件控制块内容会发生哪些改变?
【正确答案】向前移动文件的前29条记录,每条记录读写各1次,腾出一个磁盘块空间,以将该记录插入到此磁盘块作为文件的第30条记录。故需要磁盘访问的次数为:29×2+1=59次。
文件控制块中文件的起始地址和文件大小发生了变化。
【答案解析】
问答题
若文件系统采用链接分配方式,每个磁盘块存放一条记录和一个链接指针,则完成上述插入操作需要访问多少次磁盘块?若每个磁盘块大小为1kB,其中4个字节存放链接指针,则该文件系统支持的文件最大长度是多少?
【正确答案】采用链接分配方式存储文件F,需要读文件的前29块的链接指针(共读29次),在第29块内找到指向原第30块的链接指针。再为该记录分配一个空闲磁盘块,将该记录及第29块内保存的链接指针写入其中,将该块写到磁盘(写1次)。最后修改第29块的链接指针,指向新的插入块,并将第29块写回磁盘(写1次)。故需要磁盘访问的次数:29+2=31次。
该文件系统支持的文件最大长度是:(1024-4)×232B=4080GB。
【答案解析】
问答题
系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取走10件产品后,其他消费者进程才可以取产品。请使用信号量的P、V(wait()、signal())操作实现进程间的互斥与同步,要求写出完整的过程,并说明所用信号量的含义和初值。
【正确答案】伪代码如下:
semaphore empty=1000; //空缓冲区数
semaphore full=0; //非空缓冲区数
semaphore mutexl=1; //用于实现生产者之间的互斥
semaphore mutex2:1; //用于实现消费者之间的互斥
int in=0;
int out=0;
生产者进程
while(TRUE)
{ produce;
P(erapty);
P(mutax1);
put an item into buf[in];
in=(in+1)mod n;
V(mutex1);
V(full);
}
消费者进程
while(TRUE)
{ P(mutex2);
for(int i=0;i<10;i++)
{ P(full);
get an item from buf[out];
out=(out+1)mod n;
V(empty);
}
V(mutex2);
consume;
}
【答案解析】