操作系统——信号量机制(练习题)

习题一

1、进程的三种基本状态( 就绪状态 )、( 执行状态 )和阻塞状态。当进程因时间片用完而让出处理机时,该进程的状态应从( 执行状态 )态转为( 就绪状态 )态。
2、进程控制就是对系统中的进程实施有效的管理,通过使用( D )进程撤消、 进程阻塞、进程唤醒等进程控制原语实现。
A. 进程同步
B. 进程管理
C. 进程运行
D. 进程创建
3、下面对进程的描述中,错误的是( B )。
A. 进程是有生命期的 B. 进程是指令的集合 C. 进程是动态的概念 D. 进程执行需要处理机
4、什么是操作系统?其特征是什么?

答:操作系统是直接控制和管理计算机软件和硬件资源,合理的对各类作业进行调度,以方便用户使用的程序的集合
特征:并发、共享、虚拟、和异步性

5、什么是进程?其创建过程是什么?

答:进程是程序关于某个数据集合的一次执行过程;
进程创建的过程:
①申请空白PCB
②为新进程分配资源
③初始化进程控制块
④将新进程插入就绪队列

6、当一进程因在记录型信号量S上执行P(S)操作而被阻塞后,S的值为( B )。
A. >0 B. <0 C. >=0 D. <=0
7、 有m个进程共享同一临界资源,若使用信号量机制实现对一临界资源的互斥访问,则信号量的变化范围是( A )。
A. 1至-(m-1) B. 1至m-1
C. 1至-m D. 1至m
8、设两个进程共用一个临界资源的互斥信号量mutex,当mutex=1时表示( B )。
A. 一个进程进入了临界区,另一个进程等待
B. 没有一个进程进入临界区
C. 两个进程都进入了临界区
D. 两个进程都在等待

习题二

1、有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。现请用wait和signal操作写出能同步执行的程序。

var Sempty, Stiger, Spig,: semaphore:= 1,0,0;  
begin
     parbegin
     猎人: begin
     do{
           wait(Sempty);
           放入老虎;
           signal(Stiger);
           }while(TRUE);
           end;
     农民: begin
             do{
                   wait(Sempty);
                   放入猪;
                   signal(Spig);
               }while(TRUE);
             end;
     动物园: begin
           do{
           wait(Stiger);
           取出老虎;
           signal(Sempty);
           }while(TRUE);
          end;
    饭店: begin
           do{
                wait(Spig);
                取出猪;
                signal(Sempty);      
                }while(TRUE);
          end;
    parend;
end;

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信号量是一种用于进程间通信和同步的机制。它是一个计数器,用于保证在共享资源上的互斥访问。在Linux系统中,可以使用信号量来实现进程间的同步和互斥。以下是信号量的基本概念: - 计数器:信号量的值是一个计数器,它可以被多个进程共享。 - P操作:当一个进程需要访问共享资源时,它必须执行P操作,该操作会将信号量的值减1。如果信号量的值为0,则进程将被阻塞,直到信号量的值大于0。 - V操作:当一个进程使用完共享资源后,它必须执行V操作,该操作会将信号量的值加1。如果有进程正在等待该信号量,则唤醒其中一个进程继续执行。 在ZUCC中,可以使用信号量来实现进程的同步和互斥。首先,需要使用semget函数创建一个信号量集合,并使用semctl函数对信号量进行初始化。然后,可以使用semop函数执行P和V操作。例如,下面是一个简单的示例程序,用于演示信号量的使用: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/sem.h> #define SEM_KEY 1234 union semun { int val; struct semid_ds *buf; unsigned short *array; }; int main() { int semid, pid; union semun arg; struct sembuf sb; // 创建信号量集合 semid = semget(SEM_KEY, 1, IPC_CREAT | 0666); if (semid == -1) { perror("semget"); exit(EXIT_FAILURE); } // 初始化信号量 arg.val = 1; if (semctl(semid, 0, SETVAL, arg) == -1) { perror("semctl"); exit(EXIT_FAILURE); } // 创建子进程 pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子进程执行P操作 sb.sem_num = 0; sb.sem_op = -1; sb.sem_flg = SEM_UNDO; if (semop(semid, &sb, 1) == -1) { perror("semop P"); exit(EXIT_FAILURE); } printf("Child process\n"); // 子进程执行V操作 sb.sem_num = 0; sb.sem_op = 1; sb.sem_flg = SEM_UNDO; if (semop(semid, &sb, 1) == -1) { perror("semop V"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } else { // 父进程执行P操作 sb.sem_num = 0; sb.sem_op = -1; sb.sem_flg = SEM_UNDO; if (semop(semid, &sb, 1) == -1) { perror("semop P"); exit(EXIT_FAILURE); } printf("Parent process\n"); // 父进程执行V操作 sb.sem_num = 0; sb.sem_op = 1; sb.sem_flg = SEM_UNDO; if (semop(semid, &sb, 1) == -1) { perror("semop V"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } return 0; } ``` 在上述代码中,创建了一个信号量集合,并将其初始化为1。然后,创建了一个子进程和一个父进程,它们分别执行P和V操作。由于信号量的初始值为1,因此父进程和子进程都可以顺利地执行。如果将信号量的初始值改为0,那么父进程和子进程都将被阻塞,直到有一个进程执行V操作为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值