📜  操作系统中的特殊机器指令

📅  最后修改于: 2022-05-13 01:56:11.597000             🧑  作者: Mango

操作系统中的特殊机器指令

机器指令是机器代码程序或命令。换句话说,用计算机的机器代码编写的可以识别并随后执行的命令。

机器代码或机器语言是指由字符串一和零组成的计算机编程语言,即二进制代码。计算机可以直接响应机器代码,即无需任何方向或转换。

特殊机器说明:

  • 这些类型的指令通常是对内存位置的访问排除对同一位置的其他访问
  • 扩展:设计者提出了在同一内存位置(例如读取和写入)以原子方式(不可分割)执行两条指令的机器指令
  • 这种指令的执行也是互斥的(即使在多处理器上)
  • 它们可用于提供互斥,但需要由其他机制补充以满足关键解决问题的其他要求

以下技术用于硬件解决关键问题:

1. 测试和设置说明:

将内存位置设置为 1 并返回该位置的先前值。如果返回值为 1,则表示锁已被其他人获取。如果返回值为0,则锁是空闲的,它会被设置为1。自动测试和修改一个单词的内容

int test_and_set (int &target) {
int tmp ;
tmp = target ;
target =1 ;     /* True */
return ( tmp )
}

使用 test 和 set 实现互斥:

external bool lock (false) ;
do {
while ( test_and_set (lock)) ;      /* Wait for Lock  */
critical_section ( )  ;          
Lock =false ;                 /* release the Lock  */
remainder_section ( ) ;
} while (1) ;

2. 交换指令:

  • 原子交换两个变量
  • 测试和集合的另一个变体是两个布尔变量的原子交换
void Swap ( boolean &a , boolean &b ) {
boolean temp = a ;
a= b ;
b = temp ;
}

执行 :

Shared Data :  boolean lock = false ;
Process Pi :
do {
key = true ;
while ( key == true ) 
        Swap ( lock , key ) ;
< critical section >
lock = false ;
< remainder section >
}

3.比较和交换指令:

将内存位置的值与传递给指令的旧值进行比较。如果两个值匹配,则将新值写入内存位置。使用此指令,我们将内存位置设置为提供的特定值,该值在我们读取内容后不会对内容进行收费。如果他们这样做了,那么我们的新值将不会被设置。

int compare_and_swap (int *x , int old , int new ) {
int save = *x ;           /* current contents of the memory */
if (save == old)     *x = new ;
return save ;          /* tell the caller what was read */
}

执行 :

while ( compare_and_swap ( &locked , 0 , 1 ) != 0 ) ;    /* spin until locked == 0  */
 /* if we got here lock got set to 1 and we have it  */

locked = 0 ;      /* release the lock  */

4.获取和增量指令:

该指令递增内存位置并返回该位置的先前值。我们拿一张票(获取和增量)并等到轮到我们。完成后,我们增加 turn 以便抓取下一张票的线程开始运行。

int fetch_and_increment ( int *x ) {
last_value = *x ;
*x = *x +1 ;
return last_value ;
}

返回值对应于我们的票号,而机器现在已准备好生成下一个更高的数字。

执行 :

ticket = 0 ;     turn = 0  ;
. . .
myturn = fetch_and_increment ( & ticket ) ;
while ( turn !=myturn )    /* Busy wait  */

fetch_and_increment ( &turn ) ; 

变量ticket代表机器中的票号,变量myturn代表我们的票号,turn代表当前正在服务的号码。每次有人通过 fetch_and_increment 拿一张票时,票的价值就会增加。每次有人完成他们的关键部分并准备好下一个线程服务时,他们就会增加轮次。