操作系统系列学习——进程同步与信号量


前言

一个本硕双非的小菜鸡,备战24年秋招,计划学习操作系统并完成6.0S81,加油!
本文总结自B站【哈工大】操作系统 李治军(全32讲)
老师课程讲的非常好,感谢
【哈工大】操作系统 李治军(全32讲)

进程同步与信号量

在这里插入图片描述
在这里插入图片描述
进程同步:让进程间的合作变得合理有序;

通过信号量来实现进程同步 ;

操作系统借助信号量实现进程合作,进程走走停停;(进程什么时候停,在哪个地方停特别重要)

由信号变成信号量

等待是进程同步的核心:为了很好地完成任务,一些进程在执行到一定程度要阻塞等待一个信号,当另一些进程执行到一定程度产生这个条件会给他发一个信号。让进程走走停停。
在这里插入图片描述
信号只能有还是没有,表达信息太少。要用信号量表达更丰富的信息。

根据信号量的值使进程走走停停
在这里插入图片描述
在这里插入图片描述
信号量sem值含义:

  • 2: 有2个生产者阻塞,或者欠生产者队列2个单位缓冲空间;
  • 1: 有1个生产者阻塞,或者欠生产者队列1个单位缓冲空间;
  • 0: 没有生产者阻塞,正常运行;
  • 1: 表示还有1个单位的可用缓冲空间;
  • 2:表示还有2个单位的可用缓冲空间;
    例题:
    在这里插入图片描述
    基于信号量的进程合作:
    多个进程合作完成一件事,多个进程在执行过程中,执行的推进顺序要合理有序;
    具体地,在执行一定程度后,进程根据信号量判断是否停下来等待;

生产者:若信号量等于0或负值,则生产者进程等待,且信号量减1;

消费者:若信号量等于负值,则消费者唤醒一个生产者进程,且信号量加1;

若信号量等于0,则消费者正常执行,且信号量加1;

在这里插入图片描述

// 信号量代码
struct semaphore() 
{
	// 记录资源个数
	int value ; 
	// 进程阻塞队列(记录在该信号量上等待的进程) 
	PCB *queue;  
}
 
// 生产者:消费资源(这里消费资源指的是生产者消费一个空闲缓冲区,或一个数组项)
P (semaphore s) 
{
	s.value--; // 消费资源 
	if (s.value < 0) {
		sleep(s.queue);  // 当前生产者进程睡眠 
	}
}
 
// 消费者:产生资源 (这里产生资源指的是消费者释放一个空闲缓存区,或一个数组项)
V (semaphore s)
{
	s.value++; // 释放资源
	if (s.value <=0 ) {
		wakeup(s.queue);  // 消费者唤醒睡眠的生产者进程 
	}
}
// 1 用文件定义共享缓冲区 
int fd = open("buffer.txt");
write(fd, 0, sizeof(in)); // 写入数据到in位置 
read(fd, 0, sizeof(out)); // 从out位置读取数据 
 
// 2 信号量的定义和初始化 
semaphore full = 0; // 表示缓冲区中已生产的数据(内容)个数,或已用缓冲区个数; 
semaphore empty = BUFFER_SIZE; // 表示空闲缓冲区个数 
semaphore mutex = 1; // 互斥信号量,因为是写文件所以同时只能有1个进程进去;
 
// 3 生产者 
Producer(item) {
	P(empty); // 生产者先测试empty信号量是否为0(为0表示没有空闲缓冲区)
	P(mutex); 
	// 读取in,把item写入到in的位置上 (生产操作)
	V(mutex); 
	V(full); // 增加数据(内容)个数 
}
 
// 4 消费者 
Consumer() {
	P(full);  // 消费者先测试缓冲区是否存在内容,则没有则阻塞
	P(mutex); // 判断是否可以访问文件,mutex是互斥信号量,同时只有1个进程可以访问文件(mutex减1, 获取mutex信号量或锁)
	// 读取out,从文件中的out位置读出到item,打印item (消费操作)
	V(mutex); // mutex加1,释放mutex 信号量
	V(empty);// 消费者在消费完后,增加空闲缓冲区个数 
}
  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力找工作的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值