当前位置: 技术问答>linux和unix
使用TSL命令实现进程同步和互斥来防止竞争条件!
来源: 互联网 发布时间:2015-06-07
本文导语: 最近,我在学习操作系统的相关理论,主要看的是机工的《现在操作系统》一书,该书介绍了几种曾经出现的几种防止竞争条件的方法,当然也详细介绍了目前流行的信号量方法,但是我觉得: 在信号量方法中如果...
最近,我在学习操作系统的相关理论,主要看的是机工的《现在操作系统》一书,该书介绍了几种曾经出现的几种防止竞争条件的方法,当然也详细介绍了目前流行的信号量方法,但是我觉得:
在信号量方法中如果用TSL命令来代替P、V操作,就操作系统就可以不用关中断来检查信号量,只要进程使用TSL命令对共享的信号量进行读写,如果复制到寄存器中的值为0,则该进程进入临界区,如果非0则该进程sleep,当进程离开临界区时,执行一条汇编命令将共享的信号量置为零,并唤醒被阻塞的进程,这样就实现了互斥,同步的实现类似,只是将共享的信号量置零的命令放到需同步的进程中去就行了!
不知我的想法是否正确,请各位前辈、大虾多提宝贵意见!谢谢!
在信号量方法中如果用TSL命令来代替P、V操作,就操作系统就可以不用关中断来检查信号量,只要进程使用TSL命令对共享的信号量进行读写,如果复制到寄存器中的值为0,则该进程进入临界区,如果非0则该进程sleep,当进程离开临界区时,执行一条汇编命令将共享的信号量置为零,并唤醒被阻塞的进程,这样就实现了互斥,同步的实现类似,只是将共享的信号量置零的命令放到需同步的进程中去就行了!
不知我的想法是否正确,请各位前辈、大虾多提宝贵意见!谢谢!
|
使用TSL指令实现对临界区的同步互斥与信号量P、V操作的方法是差别比较大的两种方法。
TSL指令通过CPU锁内存总线来实现读写操作原子性。
但它的缺点是忙等待。
而信号量可以通过睡眠来保证不浪费CPU。但检测、修改信号量以及使进程睡眠的操作需要关中断,只几条指令不会有什么副作用。
如果是多CPU,就需要对每个信号量有一个锁变量保护了。
TSL指令可以用来确保同一时刻只一个CPU在对信号量操作。
这里使用TSL是来防止几个CPU同时访问信号量的,与生产者或消费者使用忙等待来等待临界区是不同的。
信号量操作只需几个微秒,而生产者消费者可能需要任意长时间。
TSL指令通过CPU锁内存总线来实现读写操作原子性。
但它的缺点是忙等待。
而信号量可以通过睡眠来保证不浪费CPU。但检测、修改信号量以及使进程睡眠的操作需要关中断,只几条指令不会有什么副作用。
如果是多CPU,就需要对每个信号量有一个锁变量保护了。
TSL指令可以用来确保同一时刻只一个CPU在对信号量操作。
这里使用TSL是来防止几个CPU同时访问信号量的,与生产者或消费者使用忙等待来等待临界区是不同的。
信号量操作只需几个微秒,而生产者消费者可能需要任意长时间。
|
对于单CPU的系统,如果P、V操作在KERNEL中实现,本身应该是原语,无需要再使用TSL实现。
|
对的