操作系统中的Swap指令实现互斥(java实现)

在学习操作系统这本书的时候,我们使用的是汤小丹老师的《计算机操作系统》接下来我将会使用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


 

发布了84 篇原创文章 · 获赞 39 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Abit_Go/article/details/104025325