while TS(&lock); //进入区
//当lock一直为TRUE时继续while循环测试,当lock为false(即进程执行结束,临界区空闲),下一个进程可以进入
critical section; //临界区
lock=FALSE; //退出区
remainder section; //剩余区
}while(TRUE);
boolean TS(boolean *lock){ //lock为资源的状态(指令的执行过程不可分割,即为一条原语) boolean old; old=*lock; *lock=TRUE; //lock的初始值为false,即临界区空闲,进程进入临界区,将TRUE赋予lock,临界区正被访问 return old;}do{ while TS(&lock); //进入区 //当lock一直为TRUE时继续while循环测试,当lo...
SimIt-ARM-3.0 给予命令行ARM
指令
模拟器,短小精悍,是研究ARM处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux
操作系统
;提供了简单易用的调试命令,可以逐条跟踪
指令
的执行。
SimIt-ARM-3.0-gk-20150902.tar.bz2 HowTo
0.what is SimIt-ARM-3.0
SimIt-ARM 3.0 is an instruction-
set
simulator that runs both system-level and user-level ARM programs,
for more about it please read user's guide file.
1.how to build
tar jxvf SimIt-ARM-3.0-gk-20150902.tar.bz2
cd SimIt-ARM-3.0-gk
./configure
make install
After these steps, the ./build/bindirectory contains the following programs:
ema An ARM interpreter.
To
test
the installation was successful type
./build/bin/ema
test
/wc configure
modifiy PATH environment variable:
PATH=$PATH:$HOME/SimIt-ARM-3.0-gk/build/bin ; export PATH
2. how to use
2.1 run user-level ARM programs
[root@ORA9 SimIt-ARM-3.0-gk]# cd gcc-asm
[root@ORA9 gcc-asm]# more hello.c
* hello.c
* Tue Sep 8 10:13:40 CST 2015
int main()
printf("hello world\n");
__asm("mov r0,#2\n\t" "swi 0x1\n\t"); // syscall: exit(2);
[root@ORA9 gcc-asm]# arm-linux-gcc -v
Reading specs from /usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/specs
Configured with: /opt/crosstool/crosstool-0.28/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.4.1
[root@ORA9 gcc-asm]# arm-linux-gcc hello.c -o hello -static
[root@ORA9 gcc-asm]# ls -l hello*
-rwxr-xr-x 1 root root 520775 Sep 8 10:18 hello
-rw-r--r-- 1 root root 160 Sep 8 10:15 hello.c
[root@ORA9 gcc-asm]# file hello
hello: ELF 32-bit LSB executable, ARM, vers
1、技术背景
书中原文:
通过加锁的方式来解决临界区的问题,许多现代系统提供特殊的硬件
指令
,用于检测和修改字的内容,或者用于原子地交换两个字(作为不可中断地
指令
)。我们可以采用这些特殊的
指令
,相对简单地解决临界区问题,在这里通过
指令
test
_and_
set
()和compare_and_swap()抽象了这些
指令
背后地主要概念。
2、问题分析
2.1
指令
test
_and_
set
()可以按照如下代码来定义:
这一
指令
的
死等状态:进程在有限时间内根本不能进入临界区,而一直在尝试进入,陷入一种无结果的等待状态。(没有进入临界区的正在等待的某进程根本无法获得临界资源而进入进程,这种等待是无结果的,是死等状态~)-> 这个时候应该放弃这个无结果的事情,保证自己等待的时间是有限的
忙等状态:当一个进程正处在某临界区内,任何试图进入其临界区的进程都必须进入代码连续循环,陷入忙等状态。连续测试一个变量直到某个值出现为...
定义和伪代码
TestAnd
Set
(TS
指令
和TSL
指令
)用硬件来实现,boolean
TestAnd
Set
()的过程一起呵成,属于原子操作。
boolean
TestAnd
Set
(boolean *lock){
boolean old = *lock;
*lock= TRUE;
return old;
while(
TestAnd
Set
(&lock));
criticalsection;//临界区
lock= FALSE;
remaindersection;//剩余区
TS
指令
1
test
-and-
set
详解
//注意
test
-and-
set
是原语操作,3条
指令
必须一次执行完毕
boolean
test
-and-
set
(*lock)
boolean old=*lock;
*lock=true;
return old;
while(
test
-and-
set
(*lock))
//你没有看错,里面啥也没有...
每个并发的进程都有一个代码段,被叫做临界区,这个代码段也是临界区可能会改变并发进程的公告资源数据,更新数据,写入文件等操作;
在并发的进程中,当有一个进程正在执行临界区的代码时候,其他并发的进程是不可以被允许去执行临界区的代码的,换句话说:两个进程是不可以不可能同时执行临界区的内容;
总的来说:临界区问题就是设计一种协议:这种协议它可以保证进程之间相互协作;
进程进入临界区协议
当我们一个进程需要进入临界区时候,需要获取进入临界区的许可,当我们离开临界区时候,需要归还临界区的许可;
key = true;
while(waiting[i]&&key)
key=
TestAnd
Set
(&lock); // 如果进程Pi抢到了锁,记录key=false
waiting[i]=false;
原子库为细粒度的原子操作提供组件,允许无锁并发编程。涉及同一对象的每个原子操作,相对于任何其他原子操作是不可分的。原子对象不具有数据竞争(data race)。原子类型对象的主要特点就是从不同线程访问不会导致数据竞争。因此从不同线程访问某个原子对象是良性(well-defined)行为,而通常对于非原子类型而言,并发访问某个对象(如果不做任何同步操作)会导致未定义(undifined)行为发生。
原子操作:(Atomic Operation)原子操作是指一次不存在任何中断或失败的操作
要么操作成功完成,或者操作没有执行,不会出现部分执行的状态
操作系统
需要利用同步机制在并发执行的同时,保证一些操作是原子操作
进程的交互关系:相互感知程度
互斥(mutual exclusion):一个进程占用资源,其他进程不能使用
死锁(deadlock):多个进程各自占用部分资源,形成循环等待
饥饿(s...
CAS是Compare-and-swap的缩写。CAS本质上是硬件(CPU)提供的原子比较和交换操作。大多数多处理器架构在硬件中支持 CAS,比较和交换操作是实现基于锁和非阻塞并发数据结构的最流行的同步原语。
在CAS之前,
test
-and-
set
指令
是用于将 1 写入(设置)到内存位置并将其旧值作为单个原子(即不可中断)操作返回的
指令
。然后调用者可以“测试”结果以查看调用是否改变了状态,不过目前在大多现代CPU中
test
-and-
set
已经被淘汰。