我正在阅读Abrahim,Galvin的操作系统原则。在进程同步主题中,为TestAndSet函数提供了以下定义,该函数稍后用于确保互斥:
boolean TestAndSet(boolean *target) {
boolean rv = *target;
*target = TRUE;
return rv;
}
书中提到该指令是一种特殊的硬件指令,它是以原子方式执行的。 我的问题是如何在C中实现这一点?我是否需要像其他用户定义的函数一样提供其定义,还是需要导入一些已实现此功能的库?如果案例是前者并且我自己定义了函数,那么它将以原子方式执行的保证是什么?
通过原子一词,我理解的是它将作为单个指令执行,即,如果两个进程调用此函数,则被调用的函数将被顺序执行,并且它们的语句不会交错(甚至在转换为机器语言)。
请帮助。我对理解本书的内容有很多困难。
答案 0 :(得分:0)
书中提到该指令是一种特殊的硬件指令,它是以原子方式执行的。我的问题是我如何在C中实现这个?
本书提供了一个C函数,您可以用它来解释行为。它已经完成了所有工作,除非没有任何原子性保证。
C2011基本上以atomic_flag_test_and_set()
的形式提供了您预先构建的内容。如果您可以将C2011视为您的实现语言,那么您可以使用它。
标准C的早期版本没有提供实现此类函数所需的内容,实际上,即使C2011也没有为您提供实现自己的原子操作的机制,而不依赖于C的内置原子类型和功能
我是否需要像其他用户定义的函数一样提供其定义,还是需要导入一些已实现此功能的库?
提供的代码似乎是解释性而非功能性。如果该函数可以保证以原子方式运行,那么原子测试和设置就像该函数一样。
如果案件是前者并且我自己定义了这个函数,那么它将以原子方式执行的保证是什么?
没有。
通过原子一词,我理解的是它将作为单个指令执行,即,如果两个进程调用此函数,则被调用的函数将被顺序执行,并且它们的语句不会交错(甚至在转换为机器语言)。
可能更具描述性的是,每个可能的观察者都会看到原子操作开始前的状态,或者完成后的状态,而不是处于中间位置的状态。