进程间通讯

进程间通讯

竞争条件 race conditions
  • 两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,此种现象称为竞争条件。

  • 存在竞争条件的程序是不合格的,虽然大多数情况此程序会准确执行。

  • 例子:假脱机打印程序

    • 当进程A刚刚读取完打印空闲槽的位置就被进程B打印,进程B读取相同的打印空闲槽的位置,此时CPU回到进程A,进程A又把任务放到刚才读的打印空闲槽位置,那么进程B的打印任务永远不会被执行
临界区
  • 对共享内存进行访问的程序片段称为临界区。比如对共享变量的修改。定义临界区是为了避免竞争条件。
  • 避免竞争条件的解决方案具备的条件
    1. 任何两个进程不能同时处于临界区
    2. 不应对CPU的速度和数目进行任何假设
    3. 临界区外的进程不得阻塞其他进程
    4. 不得使进程在临界区外无休止的等待

阻塞进程的方法

一个好的多进程程序要满足:逻辑正确,并行度高。

忙等待: 自旋锁
  • 使用条件:用于等待时间很短的情况。避免进程切换的时间,但白白消耗资源
Peterson互斥解法: 纯软件解法
#define FALSE 0
#define TRUE 1
#define N 2

int turn;
int interested[N];

void enter_region(int process)
{
    int other;
    other = 1 - process;
    interested[process] = TRUE;
    turn  = process;
    while(turn == process && interested[other] == TRUE)
}
void leave_ region(int process)
{
    interested[process] = FALSE;
}
TSL 解法:软硬件结合的方法,现实中使用的方法

测试并上锁

汇编实现:

enter_region:
	TSL register,lock
	cmp register,#0
	jne enter_region
	ret
	
leave_region:
	move lock,#0
	ret
优先级翻转问题

考虑两个进程,H进程优先级高,L优先级低。调度规则规定只要高优先级进程处于就绪状态,他就可以运行,所以当L处于临界区,H处于就绪态时,H开始忙等待,但由于H优先级高又处于就绪态,L就不会被调度。所以L无法离开临界区。所以H永远忙等待下去。

睡眠等待
  • 适用:等待时间很长或者等待时间不确定。减少资源量费

SLEEP系统调用将引起调用进程阻塞

生产者-消费者问题

问题

  • 唤醒等待位。当向一个清醒的进程发送一个唤醒信号时,唤醒信号丢失。导致进程永远睡眠,由于对count的访问未加限制,会导致生产者填满整个缓冲区,最终进程将永远睡眠。
信号量
  • 原语: 由若干指令构成的原子操作过程,作为一个整体而不可分割。
  • 信号量:使用一个整型变量累计唤醒次数。
    • 当它为0时,表示没有累计下来的唤醒操作;
    • 当它为正值时,表示有一个或多个被累积下来的唤醒操作
down操作(不可分割的原子操作):是一个原语
  • 检查信号量的值

    • 如果大于0,将其值-1并继续

    • 如果等于0,则进程将睡眠,而且此时down操作并未结束

up操作

如果一个或多个进程在该信号量上睡眠,无法完成一个先前down操作,则由系统选择其中一个,并允许其完成它的down操作

用信号量解决生产者-消费者问题–信号量丢失问题

down和up操作包括检测信号量、修改信号量以及在需要的时候使进程睡眠。TSL指令保证上述三个操作,同一时刻只有一个CPU对信号量进行操作。
在生产者-消费之问题中,使用三个信号量:

  • full:慢的缓冲槽数目 初始化为0
  • empty:记录空的缓冲槽总数 初始化为N
  • mutex:确保生产者和消费者不会同时访问缓冲区 初始化为1

管程

信息传递

  • send(destination,&message,&staus)
  • receive(source,&message,&status)

为了防止信息丢失,发送方和接收方达成一致:一旦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值