OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现

信号量:通过对这个量的修改和访问,让大家有序推进。

OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第1张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第2张图片

counter已经不能满足所需,不能判断睡眠了几个进程OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第3张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第4张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第5张图片

mutex是互斥信号量,表示一次只能进一个进程

临界保护

OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第6张图片

左侧的代码肯定错   右侧的代码偶尔会对   就是因为不知道什么时候调度,代码不知道断在哪,右边正好断前三行是正确的,但是不可估计

OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第7张图片只有P1做完之后P2才能操作,要不我做,要不都不做OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第8张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第9张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第10张图片

P0执行完,turn = 1,但万一P1在睡眠,那就会堵塞。(类似于值日的想法)OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第11张图片 满足互斥,但是有问题,当flag[0] = true时调度,flag[1]=true;这时都进入while循环,无限等待

OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第12张图片

OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第13张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第14张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第15张图片 OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第16张图片cli()关中断,中断关闭那么schedule()函数也不会执行,那么也就不会有调度

sti'()开中断

但是在多核(多CPU)不好使。中断是在CPU上有个寄存器叫INTR,有个时钟中断,cli()后就不看INTR了,但是多CPU有多个INTR,控制一个,另一个可以执行进程二。

OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第17张图片

直接一整个函数作为参数,要不一点不做,要么做完,不会被打断

代码实现

OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第18张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第19张图片OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第20张图片

bh中的b_lock = 1代表上锁 while(bh->b_lock) 则sleep

*p = curent 代表*p去了正在执行的进程,并把状态设为柱塞态

tmp = *p tmp去了即将执行的里面OS 进程同步与信号量 && 信号量临界区保护&&信号量代码实现_第21张图片schedule()函数决定优先级高的先执行,然后优先级高的在while(lock)里面先跳出,然后执行,其他人看到lock继续睡眠

你可能感兴趣的:(操作系统,操作系统)