操作系统中的Test-and-Set指令实现互斥(java实现)

 在学习操作系统这本书的时候,我们使用的是汤小丹老师的《计算机操作系统》接下来我将会使用java语言去实现内部代码。

Test-and-Set指令

用TS指令管理临界值区时,为每个临界资源设置一个布尔变量lock,由于变量lock代表了该资源的状态,故可以将它看成一把锁。lock的初值为false,表示临界值资源空闲。进程在进入该线程之前,首先会使用TS指令测试lock,如果lock为false,则表示没有进程在临界区内,可以进入,并将TRUE赋值于lock,则等效于关闭了临界资源,使没有进程可以进入临界区。

在书中说到,借助一条硬件指令--测试并建立 指令(TS)以实现互斥的方法。伪代码如下:

boolean TS(boolean *lock)
{
    boolean old;
    old = &lock;
    *lock = TRUE;
    return old;
}

//利用TS指令实现互斥的循环进程结构可描述如下:
do{
    //....
    while(TS(&lock);
    //临界代码
    lock = false;
    //剩余代码
}while(true);

这是使用java语言实现的代码。 

package chapter02;

import java.util.Currency;

//the class is the operation system's code
public class P056TS {
    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 TS(){
        boolean old = lock;
        lock = true;
        return old;
    }
    static class ProvThreadClass extends Thread{
        @Override
        public void run() {
            while(true){
                //缓冲池满的话
                if(buffer==10){

                }
                else{
                    while (TS());
                    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{
                    while (TS());
                    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
消费1件产品,目前剩余产品个数:8
生产出1件产品,目前剩余产品个数:9
消费1件产品,目前剩余产品个数:8
生产出1件产品,目前剩余产品个数:9
生产出1件产品,目前剩余产品个数:10
消费1件产品,目前剩余产品个数:9
生产出1件产品,目前剩余产品个数:10
消费1件产品,目前剩余产品个数:9
生产出1件产品,目前剩余产品个数:10
消费1件产品,目前剩余产品个数:9
生产出1件产品,目前剩余产品个数:10
消费1件产品,目前剩余产品个数:9
生产出1件产品,目前剩余产品个数:10
消费1件产品,目前剩余产品个数:9

Process finished with exit code -1
发布了84 篇原创文章 · 获赞 39 · 访问量 9万+

猜你喜欢

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