操作系统中的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


 

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值