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