在学习操作系统这本书的时候,我们使用的是汤小丹老师的《计算机操作系统》接下来我将会使用java语言去实现内部代码。
Swap指令
该指令又称为对换指令,在Intel 80x86中又称为XCHG指令,用于交换两个字的内容。下面为伪代码。
void swap(boolean *a,boolean *b){
boolean temp;
temp = *a;
*a = *b;
*b = temp;
}
方法是为每个临界资源设置一个全局的布尔变量lock,初值为false,在每个进程中再利用一个局部变量key,利用swap指令实现进程互斥的循环进程,下面为伪代码描述。
do{
key = true;
do{
swap(&lock,&key);
}while(key!=false);
//临界区操作
lock = false;
}while(true);
利用上述硬件指令能够有效地实现进程互斥,但当临界资源忙碌时,其他访问进程必须不断地进行尝试,处于一种忙等的状态,不符合“让权等待”的原则,造成处理机时间的浪费,同时难以解决复杂问题。
接下来为java语言描述。
package chapter02;
//the class is the operation system's code
public class P057Swap {
private static int buffer;
private static boolean lock;
public static void main(String[] args) {
lock = false;
buffer = 0;
Thread prov = new ProvThreadClass();
prov.start();
Thread cust = new CustThreadClass();
cust.start();
}
public static boolean swap(boolean param){
boolean temp = lock;
lock = param;
param = temp;
//将替换的param参数回调回去
return param;
}
static class ProvThreadClass extends Thread{
@Override
public void run() {
while(true){
//缓冲池满的话
if(buffer==10){
}
else{
boolean key = true;
do{
//将key值兑换,除非当前的lock为false的时候就可以跳出循环
key = swap(key);
}while (key!=false);
buffer+=1;
System.out.println("生产出1件产品,目前剩余产品个数:"+buffer);
lock = false;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class CustThreadClass extends Thread{
@Override
public void run() {
while(true){
//缓冲池空的话
if(buffer==0){
}
else{
boolean key = true;
do{
//将key值兑换,除非当前的lock为false的时候就可以跳出循环
key = swap(key);
}while (key!=false);
buffer-=1;
System.out.println("消费1件产品,目前剩余产品个数:"+buffer);
lock = false;
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
实验代码运行结果:
"C:\Program Files\Java\jdk1.8.0_101\bin\java.exe"
生产出1件产品,目前剩余产品个数:1
消费1件产品,目前剩余产品个数:0
生产出1件产品,目前剩余产品个数:1
消费1件产品,目前剩余产品个数:0
生产出1件产品,目前剩余产品个数:1
消费1件产品,目前剩余产品个数:0
生产出1件产品,目前剩余产品个数:1
生产出1件产品,目前剩余产品个数:2
消费1件产品,目前剩余产品个数:1
生产出1件产品,目前剩余产品个数:2
消费1件产品,目前剩余产品个数:1
生产出1件产品,目前剩余产品个数:2
生产出1件产品,目前剩余产品个数:3
消费1件产品,目前剩余产品个数:2
生产出1件产品,目前剩余产品个数:3
消费1件产品,目前剩余产品个数:2
生产出1件产品,目前剩余产品个数:3
生产出1件产品,目前剩余产品个数:4
消费1件产品,目前剩余产品个数:3
生产出1件产品,目前剩余产品个数:4
消费1件产品,目前剩余产品个数:3
生产出1件产品,目前剩余产品个数:4
生产出1件产品,目前剩余产品个数:5
消费1件产品,目前剩余产品个数:4
生产出1件产品,目前剩余产品个数:5
消费1件产品,目前剩余产品个数:4
生产出1件产品,目前剩余产品个数:5
生产出1件产品,目前剩余产品个数:6
消费1件产品,目前剩余产品个数:5
生产出1件产品,目前剩余产品个数:6
消费1件产品,目前剩余产品个数:5
生产出1件产品,目前剩余产品个数:6
生产出1件产品,目前剩余产品个数:7
消费1件产品,目前剩余产品个数:6
生产出1件产品,目前剩余产品个数:7
消费1件产品,目前剩余产品个数:6
生产出1件产品,目前剩余产品个数:7
生产出1件产品,目前剩余产品个数:8
消费1件产品,目前剩余产品个数:7
生产出1件产品,目前剩余产品个数:8
消费1件产品,目前剩余产品个数:7
生产出1件产品,目前剩余产品个数:8
生产出1件产品,目前剩余产品个数:9
Process finished with exit code -1