设计内容:
1.创建进程:手动创建几个进程,或者随即创建几个进程,都在界面上完成;要求包括进程的名称(不能重复)、执行时间和申请资源的等待时间等。在此同时刻可能有多个进行在内存申请某资源。 假设创建5个进程
2.类临界资源的管理,包括申请以及分配等。分别通过信号量实现或者管程实现。
3.银行家算法,判断是否可以进行资源的分配。
设计要求:
调用相关的Linux系统内核函数
要求在屏幕上输出各进程的创建信息,资源的分配信息,进行执行信息,进行动态申请资源信息等。..
1、为什么要进行进程信号量互斥申请?
在多道环境下,计算机系统中存在多个进程,这些进程并非相互隔绝,一方面,他们相互协作以达到运行作业所预期的目的,另一方面他们又相互竞争使用有限的资源,既协作又竞争,这两个要素都意味着进程之间需要某种形式的通信,这主要表现为同步和互斥两个方面。
同步指的是有写作关系的进程之间要不断地调整他们的相对速度,比如说AB进程,A产生数据,B计算结果,AB公用一个缓存区。缓存区为空时,B不能运行,等待A向缓存区传递数据后B才能运行,缓存区满时,A不能运行,等待B取走数据后,A才能运行。此时AB为直接制约(即同步)关系。
互斥指多个进程之间要互斥地共享某一资源,也就是说,如果一个进程已经开始使用某个资源且未使用完毕,则别的进程不得使用,若另一个进程想使用则必须等待。
2、那么多个进程如何互斥地共享某一资源(为什么引入进程临界资源)?
假定某一游乐场,用一个计数器count表示在场人数,进入一人时,进程PIN实现计数+1,出去一人时,进程POUT实现计数器-1,由于入场与退场是随机的,因此进程PIN和POUT是并发的,程序如下:
PIN R1:count; R1:=R1+1; count:=R1; |
POUT R2:=count; R2:=R2-1; count:=R2; |
如果两个进程执行中,由于某种原因使进程PIN打断,且进程调度使他们呈下面次序:
PIN: R1:count; R1:=R1+1; POUT: R2:=count; R2:=R2-1; count:=R2; PIN: count:=R1; |
按这样的次序执行后,count的最终值不能保持为n,而变成n+1,如果进程被打断的情况如下:
PIN: R1:count; R1:=R1+1; POUT: R2:=count; R2:=R2-1; PIN: count:=R1; POUT: count:=R2; |
于是,两个进程执行完后,count的最终值为n-1,也就是说两个进程的执行次序对结果是有影响的,就这个例子来说,导致错误的原因有两个:一是共享了变离,二是同时使用了这个变量,也就是说,在一个进程开始使用且尚未结束使用的期间,另一个进程也开始使用了,这种错误通常也叫做“与时间有关的错误”;
为了避免这种错误,理论上有两种办法:一是取消变量、表格等的共享;二是允许共享,但要互斥地使用;前者当前还不可行,而如何互斥的使用这些资源就引入了临界资源和临界区的概念。(这里不进行更多解释)
3、那么,信号量如何实现互斥量申请呢?
一种方法是实施临界区互斥的锁操作法(自行百度),重要的是后面一种方法,P,V操作,需要引入信号量的概念。
信号量是1965年由荷兰人Dijkstra提出的一种卓有成效的进程间同步及互斥工具,有时也叫信号灯,本质上是一个计数器,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。是一个记录行数据结构,定义如下:
struct Semaphore {
int value; //信号量的值
int *ptr-of-semque; //指向队列的指针
}S;
信号量的一般结构以及PCB队列如图:
创建或打开信号量以及PV操作:
https://blog.csdn.net/enjoymyselflzz/article/details/81603577
4、所要求的利用linux内核函数又是什么,这些函数又怎么用?
参考链接:https://blog.csdn.net/qinglongqishi1/article/details/81015787
https://blog.csdn.net/github_33719169/article/details/84838979
目前还未找到完整的内核函数介绍的链接,本次课设以这两个链接为参考