操作系统---第二章进程管理---进程同步---应用题

基于信号量的进程同步与互斥(2) 基于信号量的进程同步与互斥(2) 1. 三个进程P1、P2、P3 互斥使用一个包含N(N>0)个单元的缓冲区。P1 每次用produce()生成一个正整数并用put()送入缓冲区某一个空单元中;P2 每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3 每次用 geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。 本题主要考察生产者-消费者的变形,一个生产者对应 阅读详情

1同步与互斥

同步就是先V后P,互斥就是先P后V。
三个进程P1,P2,P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次使用produce()生成一个正整数并用put()送入缓冲区某一空单元;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用conuteven()统计偶数个数。请用信号量机制实现这3个进程得同步与互斥活动,并说明所定义的信号量的含义。
首先本题中有两个缓冲区,第二个缓冲区是P1,P2,P3互斥访问的,因此信号量初值只能为1。
此外进程P1,P2,P3还需要实现同步,就是说P1先生成数并放入缓冲区,P2或P3才能从缓冲区中取数,因为同步是先V后P,因此信号量初值设置为0。
综合上述,标准答案是这样的
做这种题有几个要点,第一是信号量的设置要正确,是同步信号量还是互斥信号量要弄明白,二是题目中的函数要出现在代码中。

semaphore mutex = 1;//缓冲区操作互斥信号量
semaphore odd = 0,even = 0;//奇数,偶数进程的同步信号量
semaphore empty = N;//空缓冲区单元个数信号量
cobegin{
 Process P1()
 while(True)
 {
  x = produce();//生成一个数
  P(empty);
  P(mutex);
  put();
  V(mutex);//释放缓冲区
  if(x%2==0)
   V(even);//若是偶数,向P3发出信号
  else
   V(odd);
 }
 Process P2()
 while(True)
 {
  P(odd);
  P(mutex);
  getodd();
  V(mutex);
  V(empty);
  countodd();
 }
 Process P3()
 while(True)
 {
  P(even);
  P(mutex);
  geteven();
  V(mutex);
  V(empty);
  counteven();
 }
}coend

2 在一个仓库中可以存放A和B两种产品,要求:

(1)每次只能存入一种产品。
(2)A产品数量-B产品数量<M。
(3)B产品数量-A产品数量<N。
其实这道题给我整懵逼了,设互斥信号量mutex我会,但A和B的信号量怎么设置呢?
因为A和B都是变量,两个变量交互在一起,我感觉十分的头大,这时候就要利用极限的思想。如果仓库只存放A产品呢?如果仓库只存放B产品呢?
如果仓库只存放A产品,那么它的最大值就是M-1,同理,只存放B产品,最大值就是N-1。因为A和B之间有这种约束关系,所以它们应该是同步信号量。
在存入A产品的时候,首先进行P操作,看允不允许往仓库中放入A,放完A之后,基于A和B之间的约束关系,相比于之前,B可以多放一个,大概就是
这样的。

Semaphore Sa=M-1,Sb=N-1;//分别代表产品A和B还可容纳的数量差,以及B和A的数量差。
Semaphore mutex = 1;//访问仓库的互斥信号量
rocess_A()
{
 while(True){
  	P(Sa);
  	P(mutex);
  	A产品入库;
  	V(mutex);
  	V(Sb);
}
process_B()
{
 while(True){
  	P(Sb);
  	P(mutex);
  	B产品入库;
  	V(mutex);
  	V(Sa);
}

3面包师有很多面包,由n名销售人员推销。每名顾客进店后取一个号,并且等待叫号,当一名销售人员空闲后,就叫下一个号。试设计一个使销售人员和顾客同步的算法。

int i=0,j=0;
semaphore mutex_i=1;mutex_j=1;
Consumer(){
 进入面包店;
 P(mutex_i);
 取号i;
 i++;
 V(mutex_i);
 等待叫号i并购买面包;
}
Seller()
{
	while(True){
  		P(mutex_j);
  		if(j<=i){
  			叫号j;
   			j++;
   			V(mutex_j);
   			销售面包;
   		}
  		else{
  			V(mutex_j);
  			休息片刻;
  			}
  		}
}

4某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一人通过。参观者的活动描述如下:

cobegin
	参观者进程i;
	{
		…………
		进门;
		…………
		参观;
		…………
		出门;
		……………
	}
coend

请添加必要的信号量和P,V[或wait(),aignal()]操作,以实现上述过程中的互斥与同步。
要求写出完整的过程,说明信号量的含义并赋初值。

出入口一次仅允许一个人通过,设置互斥信号量mutex,初值为1.博物馆最多可同时容纳500人,因此设置信号量empty,初值为500。

Semaphore empty = 500;//博物馆可以容纳的最多人数
Semaphore mutex = 1;//用于出入口资源的控制
cobegin
参观者进程i:
{
	……
	P(empty);//可容纳人数-1
	P(mutex);//互斥使用门
	进门;
	V(mutex);
	参观;
	P(mutex);//互斥使用门
	出门;
	V(mutex);
	V(empty);//可容纳人数+1
	……
}

5某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A,B两种零件,装配车间的任务是把A,B两种零件组装成产品。两个车间每生产一个零件后,都要分别把它们送到专配车间的货架F1,F2上。F1存放零件A,F2存放零件B,F1和F2的容量均可存放10个零件。装配工人每次从货架上取一个零件A和一个零件B后组装成产品。用PV操作正确管理。

我发现做这种题,最重要的就是找准约束关系
(1)F1和F2的容量为10
(2)必须先放零件再取零件
这是我之前发现的约束关系,但我还忘了一个
生产车间要访问货架,装配工人也要访问货架,他俩总不能同时访问货架吧,他俩得互斥访问,我错就错在这个地方。

本题需要设置6个信号量:
empty1对应货架F1上的空闲空间,初值为10,empty2对应货架F2上的空闲空间,初值为10;
full1对应货架F1上的A产品,初值为0,full2对应货架F2上的B产品,初值为0;
mutex1用于互斥地访问货架F1,mutex2用于互斥地访问货架F2。
process_A
while(True){
	生产一个产品A;
	P(empty1);//判断货架F1是否有空
	P(mutex1);//互斥访问货架F1
	将产品A存放到货架F1上;
	V(mutex1);
	V(full1);
}
process_B
while(True){
	生产一个产品B;
 	P(empty2);//判断货架F2是否有空
 	P(mutex2);//互斥访问货架F2
 	将产品B存放到货架F2上;
 	V(mutex2);
 	V(full2);
 }
 assemble
 while(True){
 	P(full1);//判断货架F1上是否有产品A
 	P(mutex1);//互斥访问货架F1
 	从货架F1上取一个A产品;
 	V(mutex1);//释放货架F1
 	V(empty1);货架F1上的空闲空间数+1
 	P(full2);//判断货架F2上是否有产品B
	P(mutex2);//互斥访问货架F2
  	从货架F2上取一个B产品;
  	V(mutex2);//释放货架F2
  	V(empty2);货架F2上的空闲空间数+1
  	将取得的A产品和B产品组装成产品
}

6某寺庙有小和尚,老和尚若干,有一水缸,由老和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容纳一个桶取水。水桶总数为3个。每次入缸取水仅为1桶水,且不可同时进行。试给出有关从缸取水,入水的算法描述。

在本题中我忽略了一个限制关系,那就是老和尚取水的时候,缸里没水怎么办?所以要多设置一个信号量表示缸中水的数量。
在这里插入图片描述
从井中取水并放入水缸是一个连续的动作,可视为一个进程;从缸中取水可视为另一个进程。设水井和水缸为临界资源,引入mutex1和mutex2;三个水桶无论是从井中取水还是将水倒入水缸都是一次一个,应该给他们一个信号量empty1,抢不到水桶的进程只好等待。水缸满时,不可以再放水,设置empty2信号量来控制入水量;水缸空时,不可以取水,设置empty3信号量来控制。

semaphore mutex1 = 1;//用于互斥地访问水井
semaphore mutex2 = 1;//用于互斥的访问水缸
semaphore empty2 = 10;//用于表示水缸中剩余空间能容纳的水的桶数
semaphore empty1 = 3;//表示有多少个水桶可用,初值为3
semaphore empty3 = 0;//表示水缸中水的桶数
//小和尚
while(True)
{
	P(mutex1);//互斥访问水井
	P(empty2);//申请使用一个水桶
	从井中打一桶水;
	V(mutex1);
	P(mutex2);//互斥访问水缸
	P(empty2);
	将水倒入水缸中;
	V(mutex2);
	V(empty1);
	V(empty3);
}
//老和尚
while(True)
{
	P(empty3);//申请从水缸中取水
	P(mutex2);//互斥访问水缸
	P(empty1);//申请使用一个水桶
	从水缸中打一桶水;
	V(mutex2);
	V(empty2);
	喝水;
	V(empty1);//释放一个水桶
}
这种题很需要加注释。

7如下图所示,三个合作进程P1,P2,P3,它们都需要通过同一设备输入各自的数据a,b,c,该输入设备必须互斥的使用,而且其第一个数据必须由P1进程读取,第二个数据必须由P2进程读取,第三个数据必须由p3进程读取。然后,三个进程分别对输入数据进行下列计算:

在这里插入图片描述
P1:x=a+b;
P2:y=a*b;
P3:z=y+c-a;
最后,P1进程通过所连接的打印机将计算结果x,y,z的值打印出来,请用信号量实现它们的同步。
在这里插入图片描述这种题很少见,因为它居然没有mutex,就是只考了同步,我觉得真是太妙了。而且最后还要由进程P1把结果输出,这又是一个同步。另外这种有多个进程的还是要分开写。这题实在是太精妙了。

为了控制三个进程依次使用输入设备进行输入,需分别设置三个信号量S1,S2,S3,其中S1的初值为1,S2和S3的初值均为0.使用上述信号量后,三个进程不会同时使用输入设备,因此不必再为输入设备设置互斥信号量。另外,还需要设置信号量Sb,Sy,Sz来表示数据b是否已经输入,以及y,z是否已计算完成,他们的初值均为0。

semaphore S1=1,S2=0,S3=0;
semaphore Sb=0,Sy=0,Sz=0;
P1(){
	P(S1);
	从输入设备输入数据a;
	V(S2);
	P(Sb);
	x=a+b;
	P(Sy);
	P(Sz);
	使用打印机打印出x,y,z的结果;
}
P2(){
	P(S2);
	从输入设备输入数据b;
	V(S3);
	V(Sb);
	y=a+b;
	V(Sy);
}
P3(){
	P(S3);
	从输入设备输入数据c;
	P(Sy);
	z=y+c-a;
	V(Sz);
}

8

cobegin
semaphore seat = 10;//供顾客等待的座位,初始值为10
semaphore costomer = 0;//银行内在座位上等待的顾客数,初始为0
semaphore mutex = 1;//用于取号机的互斥访问
semaphore service =0;总归是营业员先叫号,然后顾客再离开座位去接受服务,这里又有一重同步关系,所以要设一个service。

{
	process顾客i;
	{	
		P(seat);
		P(mutex);
		从取号机获取一个号码;
		V(mutex);
		V(costomer);
		P(service);
		等待叫号;
		获取服务;
	}
	process 营业员
	{
		while(true)
		{
			P(costomer);//有顾客等待才叫号,没有顾客等待就不叫号			
			叫号;
			V(service);			
			为顾客服务;
			V(seat);//顾客接受服务完走了,空闲座位+1
		}
	}
}

9有桥如下图所示,车流方向如箭头所示,回答下列问题:

(1)假设桥上每次只能有一辆车行驶,试用信号灯的P,V操作实现交通管理。4
(2)假设桥上不允许两车交会,但允许同方向多辆车一次通过(即桥上可有多辆同方向行驶的车)。试用信号灯的P,V操作实现桥上的交通管理。
8
过桥错误答案
在这里插入图片描述
我说写着写着怎么一直感觉不对劲,原来是这里是要分成两个进程来写,分别是从北边往南走和从南边往北走。

semaphore bridge = 1;//用于互斥的访问桥
NtoS(){
	P(bridge);
	通过桥;
	V(brisge);
}
StoN(){
	P(bridge);
	通过桥;
	V(brisge);
}

(2)遇到这种没有给定具体数量的题目,得用count和if了
桥上可以同方向多车行驶,需要设置bridge,还需要对同方向车辆计数。为了防止同方向计数中同时申请bridge造成同方向不可同时行车的问题,要对计数过程加以保护,因为设置信号量mutexSN,mutexNS。

int countSN = 0;
int countNS = 0;
semaphore mutexSN = 1;
semaphore mutexNS = 1;
semaphore bridge = 1;
StoN(){
	P(mutexSN);
	if(countSN==0)
		P(bridge);
	countSN++;
	V(mutexSN);
	过桥;
	P(mutexSN);
	countSN--;
	if(countSN==0)
		V(bridge);
	V(mutexSN);
}
NtoS(){
	P(mutexNS);
	if(countNS==0)
		P(bridge);
	countNS++;
	V(mutexNS);
	过桥;
	P(mutexNS);
	countNS--;
	if(countNS==0);
		V(bridge);
	V(mutexNS);
}

10假设有两个线程(编号为0和1)需要去访问同一个共享资源,为避免竞争状态的问题,我们必须实现一种互斥机制,使得在任何时候只能有一个线程访问这个资源。假如有如下一段代码:

bool flag[2];//flag数组,初始化为FALSE
Enter_Critical_Section(int my_thread_id,int other_thread_id){
	while(flag[other_thread_id]==TRUE);
	flag[my_thread_id]=TRUE;
}
Exit_Critical_Section(int my_thread_id,int other_thread_id){
	flag[my_thread_id]=FALSE;
}

当一个线程想要访问临界资源时,就调用上述的这两个函数。例如,线程0的代码可能是这样的:
Enter_Critical_Section(0,1);
使用这个资源;
Exit_Critical_Section(0,1);
做其他的事情;
试问:
(1)上述的这种机制能够实现资源互斥访问吗?为什么?
(2)若把Enter_Critical_Section()函数中的两条语句互换一下位置,结果会如何?
一开始都是FALSE,线程1是TRUE的时候,线程0陷入忙等状态,直到线程1是FALSE的时候,才跳出死循环,去执行线程0,因此可以实现互斥访问。

啥玩意还要时钟中断,还要考虑原子性,我看408的题目咋没说原子性,我真是服气。好像真的考虑原子性,要不就是线程1执行完,线程0才能进行实现这种同步。

不能实现互斥访问。考虑如下情形:
(1)初始化时,flag数组的两个元素值均为FALSE。
(2)线程0先执行,执行while循环语句时,由于flag[1]为FALSE,所以顺利结束,不会被卡住。假设这时来了一个时钟中断,打断了它的运行。
(3)线程1去执行,执行while循环语句时,由于flag[0]为FALSE,所以顺利结束,不会被卡住,然后进入临界区。
(4)后来当线程0再执行时,也进入临界区,这样就同时有两个线程在临界区。
总结:不能成功的根本原因是无法保证Enter_Critical_Section函数执行的原子性。我们从上面的软件实现方法中可以看出,对于两个进程互斥,最主要的问题是标志的检查和修改不能作为一个整体来执行,因此容易导致无法保证互斥访问的问题。
如果两条语句换一下位置,那么无论线程1是什么状态,线程0都会区执行,这就无法实现互斥访问,会陷入死锁状态。

11同步与死锁

semaphore empty = N;
semaphore frame = 0;
semaphore wheel = 0;
semaphore s1 = N-2;
semaphore s2 = N-1;
工人1活动:
do{
	加工一个车架;
	P(s1);
	P(empty);
	车架放入箱中;
	V(frame);
}while(1);
工人2活动:
do{
	加工一个车轮;
	P(s2);
	P(empty);
	车轮放入箱中;
	V(wheel);
}while(1)
工人3活动:
do{
	P(frame);
	箱中取一车架;
	V(empty);
	V(s1);
	P(wheel);
	P(wheel);
	箱中取两个车轮;
	V(empty);
	V(empty);
	V(s2);
	V(s2);
	组装为一台车;
}while(1)


12设P,Q,R共享一个缓冲区,P,Q构成一对生产者-消费者,R既为生产者又为消费者。使用P,V操作使其同步。

其实本题的难点就在于如何理解这个R进程。R既为消费者又为生产者,因此必须在执行前判断状态,若empty=1,则执行生产者功能,若full=1,则执行消费者功能。

semaphore full = 0;//表示缓冲区的产品
semaphore empty = 1;//表示缓冲区的空位
semaphore mutex = 1;//互斥信号量
Procedure P
{
	while(True){
		P(empty);
		P(mutex);
		Product one;
		V(mutex);
		V(full);
		}
}
Procedure Q
{
	while(True){
		P(full);
		P(mutex);
		Consume one;
		V(mutex);
		V(empty);
		}
}
Procedure R
{
	if(empty==1){
		P(empty);
		P(mutex);
		produce one;
		V(mutex);
		V(full);
	}
	if(full==1){
		P(full);
		P(mutex);
		Consume one;
		V(mutex);
		V(empty);
	}
}

13理发店里有一位理发师,一把理发椅和n把供等候理发的顾客坐的椅子。若没有顾客,理发师便在理发椅上睡觉,一位顾客到来时,顾客必须叫醒理发师,若理发师正在理发时又有顾客到来,若有空椅子可坐,则坐下来等待,否则就离开。试用P,V操作实现,并说明信号量的定义和初值。

'''控制变量waiting用来记录等待理发的顾客数,初值为0,进来一个顾客时,waiting加1,一个顾客理发时,waiting减1。
信号量coustomers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0。
信号量baebers用来记录正在等候顾客的理发师数,并用作阻塞理发师进程,初值为0。
信号量mutex用于互斥,信号量为1。
int waiting = 0;//等候理发的顾客数
int chairs = n;//为顾客准备的椅子数
semaphore cuotomers=0,barbers=0,mutex=1;
barber(){
	while(True){
		P(customers);//若无顾客,理发师睡眠
		P(mutex);//进程互斥
		waiting = waiting-1;//等候顾客数少1个
		V(barbers);//理发师为一个顾客理发
		V(mutex);
		Cut_hair();
		}
}
customer(){
	P(mutex);
	if(waiting<chairs){
		waiting=waiting+1;//等待顾客数加1
		V(customers);
		P(mutex);
		P(barbers);//无理发师,顾客坐着
		get_hair_cut();
		}
	else
		V(mutex);//人满,顾客离开
}





14 有录像厅和观众两个主体。

限制条件1:只有3种录像片
限制条件2:看其他录像片的观众不允许进入
在这里插入图片描述
这一题犯的错误是明明有三种想看电影的人,但我却把他们统一处理了。

16设公共汽车上驾驶员和售票员的活动分别如下图所示。驾驶员的活动:启动车辆,正常行驶,到站停车;售票员的活动:关车门,售票,开车门。在汽车不断地到站,停车,行驶的过程中,这两个活动有什么同步关系?用信号量和P,V操作实现它们的同步。

在这里插入图片描述
在汽车行驶过程中,驾驶员活动与售票员活动之间的同步关系为:售票员关闭车门后,向驾驶员发开车信号,驾驶员接到开车信号后启动车辆,在汽车正常行驶过程中售票员售票,到站时驾驶员离车,售票员在车停后开门让乘客上下车。因此,驾驶员启动车辆的动作必须和售票员关车门的动作同步;售票员开车门的动作也必须与驾驶员停车同步。应设置两个信号量S1,S2,S1表示是否允许驾驶员启动汽车,初值为0;S2表示是否允许售票员开门(初值为0)

semaphore S1=S2=0;
Procedure driver
{
	P(S1);
	Start;
	Driving;
	Stop;
	V(S2);
}
Procedure Conductor
{
	while(1)
	{
		关车门;
		V(S1);
		售票;
		P(S2);
		开车门;
		上下乘客;
	}
}

17信箱辩论

在这里插入图片描述
很nice,这种类型的题目我差不多已经掌握了。

18某进程中有3个并发执行的线程thread1,thread2和thread3,其伪代码如下所示:

//复数的结构类型定义
typedef struct
{	
	float a;
	float b;
} cnum;
cnum x,y,z;//全局变量

//计算两个复数之和
cunm add (cnump,cnumq)
{
	cnum s;
	s.a=p.a+q.a;
	s.b=p.b+q.b;
	return s;
}

}

在这里插入图片描述
在这里插入图片描述

19有n(n>=3)名哲学家围坐在一张圆桌边,每名哲学家交替就餐和思考。在圆桌中心有m(m>=1)个碗,每两名哲学家之间有一根筷子。每名哲学家必须取到一个碗和两侧的筷子后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学家同时就餐,且防止出现死锁现象,请使用信号量的P,V操作……

在这里插入图片描述

20现有5个操作A,B,C,D和E,操作C必须在A和B完成后执行,操作E必须在C和D完成后执行,请使用信号量的wait(),signal()操作(P,V操作)描述上述操作之间的同步关系,并说明所用信号量及其初值。

在这里插入图片描述

信号量机制实现进程的互斥、同步、前驱 1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制 信号量其实就是一个变量(可以是一个整数,也可以是一个更复杂的变量),可以用信号量来表示系统中某种资源的数量。比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。 P、V操作: P表示通过,V表示释放 1.整型信号量: 整型信号量与普通的信号量的区别: 对信号量的操作只有:初始化、P操作、V操作 缺点:不满足“让权等待”原... 阅读详情

相关推荐

操作系统进程同步习题记录

目录BUAA OS 习题奇偶数生产者-消费者问题野人吃肉缓冲区产品寿司店问题搜索-插入-删除问题 BUAA OS 习题 奇偶数生产者-消费者问题 三个进程 P1、P2、P3 互斥使用一个包含 N(N>0)个单元的缓冲区。 P1 每次用 produce()生成一个正整数并用 put()送入缓冲区某一个空单元中; P2 每次用 getodd()从该缓冲区中取出一个奇数并用 countodd()统...

weixin_40500026的博客 2643

3 个进程 P1、P2、P3 互斥地使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数,并用 put() 将其送入缓冲区的某一空单元中 ;P2每次用 get

3 个进程 P1、P2、P3 互斥地使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数,并用 put() 将其送入缓冲区的某一空单元中;P2每次用 getodd() 从该缓冲区中取出一个奇数,并用 countodd() 统计奇数的个数;P3 每次用geteven() 从该缓冲区中取出一个偶数,并用 counteven() 统计偶数的个数。请用信号量机制实现这 3 个进程的同步与互斥活动,并说明所定义的信号量的含义。

qq_59224200的博客 2176

操作系统:第二章 进程管理3 - 进程同步与互斥

什么是进程同步 进程互斥的原则 进程互斥的软件实现方法 1、单标志法 2、双标志先检查法 3、双标志后检查法 4、Peterson 算法 进程互斥的硬件实现方法 1、中断屏蔽方法 2、TestAndSetLock 指令 TSL和中断屏蔽的区别 利用TSL完成进程间互斥 - 《现代操作系统》P71 3、XCHG 指令 信号量机制 1、整型信号量 2、记录型信号量(默认) 记录型信号量定义 P 操作(wait 操作) V 操作(signal 操作) 信号量机制实现进程互斥 信号量机制实现进程同步 - 前 V 后

寒泉 6万+

生产者-消费者问题(三个进程P1、P2、P3互斥使用一个包含N个单元的缓冲区)

1.问题描述 2.问题分析 同步问题: (1)包含N个缓冲区单元,有空位置时才能写,即P1、P2、P3共享缓冲区空位,设置同步信号量empty; (2)存在奇数时才能读出奇数,P1、P2共享奇数缓冲区,设置同步信号量odd; (3)存在偶数时才能读出偶数,P1、P3共享偶数缓冲区,设置同步信号量even。 互斥问题: 三个进程彼此之间互斥的访问缓冲区,设置互斥信号量mutex。 3.注意事项 1.不要误认为是读者-写者问题,注意这里P2、P3之间也是互斥的,而读者之间的访问可以同时,这里只是单生产者多消费

super_iron_man的博客 1万+

王道考研视频——操作系统笔记第二章:进程管理

王道考研视频——操作系统笔记第二章:进程管理

guojiaqi_的博客 1694

操作系统第二章进程管理习题及其答案

一、选择题 一个运行进程必须具有的 3 种基本状态是(C) A.就绪状态、挂起状态和执行状态 C.就绪状态、执行状态和阻塞状态 进程和程序的根本区别在于( A)。 A.静态与动态特点 B.是不是被调入到内存中 C.是不是具有就绪、运行和等待三种状态 D.是不是占有处理器 下面所列的进程的 3 种基本状态之间的转换不正确的是(D )。 A.就绪状态→执行状态 B.执行状态→就绪状态 C.执行状态→...

ivhs的博客 1436

操作系统概论【二】- - 进程管理

感谢内容提供者:金牛区吴迪软件开发工作室 接上一篇:操作系统概论【一】 - - 操作系统概述 文章目录第二章、进程管理一、进程的描述1. 为什么要引入进程的概念?a.程序的顺序执行b.程序的并发执行c.进程的概念2. 进程的定义3. 进程的特征4. 进程与程序的比较5.进程控制块6. 进程的状态7. 进程的组织三种组织方式:二、进程的控制1. 创建a.什么情况下需要创建新进程?b.如何创建新进程? | 创建新进程的步骤?2. 阻塞a.什么情况下会进行进程的阻塞呢?b.完成进程阻塞的过程?3. 唤醒a.进.

吴小迪的博客 1万+

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

操作系统——第二章 进程管理 练习题

(一)单项选择题1.多道程序设计系统中,让多个计算问题同时装入计算机系统的主存储器(   )。 A.并发执行  B.顺序执行  C.并行执行  D.同时执行2. 引入多道程序设计技术后,处理器的利用率(  )。 A.无改善  B.极大地提高  C.降低了  D.无变化,仅使程序执行方便3.计算机系统采用多道程序设计技术后,(  )。 A.缩短了每个程序的执行时间  B.系统效率随并行工作道数成比例...

zmc1248234377的博客 1万+

什么是OAuth 2.0?

OAuth2.0是一种授权协议而非登录协议,核心思想是通过令牌(Token)而非密码实现安全授权。它涉及三个关键角色:用户、第三方应用和身份提供商(IdP)。最常用的授权码流程(AuthorizationCode Flow)通过浏览器三方对话,确保用户密码只提供给IdP而非第三方应用。OAuth2.0提供四种授权方式,其中授权码和客户端凭证是当前主流,而隐式和密码模式已不推荐。需要注意的是,OAuth2.0解决的是授权问题,身份认证需通过OpenID Connect实现。该协议通过临时令牌机制,实现了&qu

sonadorje的专栏 1162

HFSS/ADS仿真实操:手把手调优一个2.4GHz SAW滤波器的IDT结构

本文详细介绍了使用HFSS和ADS仿真工具优化2.4GHz表面声波滤波器(SAW)的IDT结构。从材料参数设置到IDT建模,再到参数化扫描与频率调谐,提供了实用的操作步骤和优化技巧,帮助工程师快速掌握SAW滤波器的设计方案与性能调优方法。

weixin_29197835的博客 533

【操作系统】第二章:进程管理(下)

【操作系统】第二章:进程管理(下) 一、进程同步和互斥 1. 进程同步 2. 进程互斥 二、进程互斥的软件实现方法 1. 单标志法 2. 双标志先检查 3. 双标志后检查 4. Peterson算法 三、进程互斥的硬件实现方法 1. 中断屏蔽方法 2. TestAndSet(TS指令 / TSL指令) 3. Swap指令(XCHG指令) 4. 互斥锁 四、信号量机制 1. 信号量 2. 整型信号量 3. 记录型信号量‼️ ⚠️ 4. 信号量机制实现进程互斥 5. 信号量机制实现进程同步 6. 信号量机制实现

iFulling的博客 2474

华为防火墙双ISP出口实战:如何用策略路由实现电信联通流量自动切换(附配置截图)

本文详细解析了华为防火墙在双ISP环境下的智能选路技术,通过策略路由与健康检测的深度应用,实现电信联通流量的自动切换。文章包含实战配置截图,帮助企业解决切换延迟、路径劣化等核心挑战,提升业务连续性。

backprop5master的博客 646

操作系统王道考研复习——第二章(进程管理) 下

操作系统考研复习——第二章(进程管理) 下2.4 进程同步2.4.1 进程同步的基本概念1. 进程同步2. 进程互斥3. 临界资源4. 同步机制应遵循的规则2.4.2 实现临界区互斥的基本方法1. 软件实现方法1)单标志法2)双标志先检查法3)双标志后检查法4)Peterson算法2. 硬件实现方法1)中断屏蔽方法2)TestAndSet指令3)Swap指令2.4.3 信号量1. 整型信号量2. 记录型信号量3. 利用信号量实现进程互斥4. 利用信号量实现进程同步5. 利用信号量实现前驱关系2.4.4 管程

壹的博客 1万+

控制台模拟前端请求实现快速刷网课时长

本教程仅用于学习前端技术和网页开发,旨在提供教育与技术指导。对于任何未经授权或违反规定的使用行为,本人不承担任何责任。注意到那个serive后面有timestamp时间戳,暗示它很可能就是每30秒汇报一次进度和播放时长的命令,我们右键——复制——复制为fetch。有的网站上的网课需要的不仅仅是进度,而是时长,所以倍速插件失效,但我们可以使用控制台命令来模拟请求实现快速刷网课时长。尝试修改即可,例如我修改time为800,然后复制粘贴到控制台执行。播放视频,等待前端请求出现,然后复制前端请求为fetch。

m0_74823408的博客 2070

Lumerical官方案例、FDTD时域有限差分法仿真学习(三)——环形谐振器(Ring resonator)之第一部分

环形谐振器教程的第 1 部分使用 MODE 来设计和仿真环形谐振器。 自由光谱范围 (FSR) 和品质因数 (Q 因数) 是这种面向片上通信应用的基于绝缘体上硅 (SOI) 波导设计的关键性能指标。

weixin_45719141的博客 3万+

【操作系统】第二章:进程管理

进程是进程实体的运行过程,是系统进行资源分配和调度的一个单位。概念说明程序是指静态的存放在磁盘里、的可执行的文件,实际上为一系列的指令集合进程是指动态的、程序的一次执行过程一个程序可以同时创建多个进程,当进程被创建时操作系统会为该进程分配唯一不重复的身份证号PID。PCB是进程存在的唯一标志,当进程被创建时系统会为其创建PCB,结束时会收回其PCB。这些信息都将被保存在一个数据结构PCB(Process Control Block)中,即进程控制块。

https://blog.youkuaiyun.com/m0_74834215 1835

occ算法真值构建

occ算法真值产生

xiaomu_347的博客 611

王道考研 操作系统 第二章 进程管理

第二章 进程管理 文章目录前言2.1.1进程的定义、组成、组织方式思维导图本节内容2.1.2进程的状态与转换思维导图本节内容2.1.3进程控制思维导图本节内容2.1.4进程通信思维导图本节内容2.1.5线程概念和多线程模型思维导图本节内容2.2.1处理机调度的概念、层次思维导图本节内容2.2.2进程调度的时机、切换与过程思维导图本节内容2.2.3调度算法的评价指标思维导图本节内容2.2.4FCFS、SJF、HRRN调度算法思维导图本节内容2.2.5时间轮转法、优先级、多级反馈队列思维导图本节内容2.3.1进

张时贰的博客 2005

YOLO26 改进 | 基于特征蒸馏 | 知识蒸馏 (Response & Feature-based Distillation)

本文系统介绍了YOLO26中的知识蒸馏技术,包含五大核心方法:基于响应的蒸馏(学习分类概率)、基于特征的蒸馏(学习中间层表示)、基于关系的蒸馏(学习特征关联)、通道维度蒸馏(CWD)和前景背景分离蒸馏(FGD)。文章深入解析了每种方法的数学原理与实现细节,并提出动态训练策略,包括一致性匹配和蒸馏权重退火机制。通过教师模型向学生模型传递"暗知识",在保持模型轻量化的同时逼近大模型性能。配套代码支持模块化组合不同蒸馏方法,为YOLO26模型压缩提供了一套完整的解决方案。

weixin_51988935的博客 275

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

《操作系统》期末复习 第一、二章 引论、进程管理

《计算机操作系统》期末课程复习第一、二章,有关操作系统引论和进程管理(重点在PV操作,不含调度算法)

A21281005_的博客 2179

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

(二)进程管理——进程同步与互斥

操作系统学习笔记 思维导图 第二章 进程管理 第三部分 进程同步与互斥

小鹅仔的博客 2558

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【操作系统】第二章:进程管理(上)

【操作系统】第二章:进程管理(上) 一、进程的概念 1. 概念 2. 组成 3. 特征 二、进程的状态与转换、组织 1. 进程的状态 2. 进程状态间的转换 3. 进程的组织 三、进程控制 1. 概念 2. 如何实现进程控制 3. 进程控制相关的原语 四、进程通信 1. 概念 2. 共享存储 3. 消息传递 4. 管道通信 五、线程 1. 概念 2. 引入线程的变化 3. 线程属性 4. 线程的实现方式 5. 多线程模型 6. 线程的状态与转换 7. 线程的组织与控制

iFulling的博客 3148

操作系统笔记(王道考研) 第二章:进程管理(2)

操作系统笔记(王道考研) 第二章:进程管理2

zimuzi2019的博客 3282

操作系统期末复习——第二章:进程管理

在操作系统的知识体系中,第二章进程管理可是重中之重,在考试里经常以大题的形式出现,分值占比相当高。这部分内容概念多,还相互关联,理解起来有点难度。不过别担心,咱们通过一个个有趣的小问题,来轻松走进这些知识点。

weixin_74334636的博客 762

【计算机408操作系统】第二章:进程管理

本文摘要: 进程管理是操作系统核心功能之一。进程是程序的一次执行过程,由程序段、数据段和进程控制块(PCB)组成。进程具有动态性、并发性、独立性等特征,并存在运行态、就绪态、阻塞态等状态转换。进程控制通过原语实现创建、终止、阻塞、唤醒等操作。进程间通信方式包括共享存储、消息传递和管道通信。共享存储需互斥访问,消息传递通过格式化消息交换,管道通信则使用固定缓冲区实现数据流传输。这些机制共同实现了操作系统的并发控制和资源共享功能。(150字)

qq_73484464的博客 1307
上一篇: 操作系统---第三章内存管理---虚拟内存管理---选择题
下一篇: 操作系统---第二章进程管理---死锁---应用题
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值