一、操作系统原理——单选题8. UNIX操作系统中,fork()系统调用用于创建进程。仔细阅读、分析下列程序,假设程序正确运行并创建子进程成功,那么输出到屏幕的正确结果是______。
main()
{
pid_t pid;
pid=fork();
if(pid==0)printf("Hello world\n");
else if(pid>0)printf("Hello World\n");
else printf("Hello World\n");
}
- A.什么都没有
- B.1行Hello World
- C.2行Hello World
- D.3行Hello World
A B C D
C
[解析] fork()函数执行的特点是,只被调用一次,却会返回两次,一次是在调用进程(父进程)中,一次是在新创建的子进程中。在父进程中,fork()返回子进程的pid。在子进程中,fork()返回0。否则出错返回-1。假设程序正确运行并创建子进程成功,那么,子进程中pid得到返回值为0,父进程中pid得到返回值为子进程号,父进程执行一次输出,子进程执行一次输出,故输出2行Hello WorId。故本题答案选择C选项。
13. 学生小王在选课时编写了一个程序,为了保证有足够的学分,他先选了课程B,然后继续申请心仪的课程A。若能选到课程A,则退掉课程B。部分程序如下:
count.A //表示课程A的信号量
count.B //表示课程B的信号量
{
…
P(count.A);
select_course(A);
relese_course(B);
V(count.B);
…
}
请问:小王的程序能否达到选到课程A又退掉课程B的目的?______
A B C D
C
[解析] 当P(count.A)永远阻塞的情况下,小王选不了A课程;若有人退选,小王将完成选到课程A又退掉课程B的目的。故本题答案选择C选项。
二、操作系统原理——多选题4. 在有N个缓冲区的生产者消费者的问题中,下列叙述中哪些是错误的?______
producer()
{int item;
while(TRUE){
item=produce_item();
P(empty);
P(mutex);
insett_item(item);
V(mutex)
V(full);
}
}
consumer()
{int item;
while(TRUE){
P(full);
P(mutex);
item=remove_item();
V(mutex);
V(empty);
consume_item(item);
}
}
- A.信号量empty的初值为N
- B.信号量full的初值为0
- C.信号量mutex的初值为0
- D.P(full)和P(mutex)两条语句可以颠倒顺序
- E.V(mutex)和V(empty)两条语句可以颠倒顺序
A B C D E
CD
[解析] empty信号量表明的是空闲资源数目,这里为N,所以其初始值为N;full信号量表明的是满的资源数目,这里为0,即其初始值为0;mutex信号量用于实现互斥访问,初始值为1。P(full)和P(mutex)两条语句若颠倒顺序,可能导致死锁。故本题答案选择CD选项。