[オペレーティング・システム]実験例2:プロセス管理

免責事項:この記事はブロガーオリジナル記事です。再現ブロガーの承認を連絡してください。ブロガー公共マイクロチャネル番号] [部門知るのとキャンパスを行います。https://blog.csdn.net/cxh_1231/article/details/86481718

注意:この記事の文書WHUT-専門学校-オペレーティングシステム上のコース 実験2:プロセス管理

紙はZhongjueを来る、実際には、問題を認識することが不可欠です!

 

1.実験:

実験の準備は:処理するために、コンテンツ、プロセス管理、同期やミューテックス、セマフォのメカニズムを習得しての深い理解を持っています

実験:セマフォメカニズム用いた決済食事する哲学者の問題をシミュレート  (または他の古典同期の問題を)

具体的な要件:

  • 1高​​レベルのコンピュータプログラミング言語を選択してください
  • 達成5 哲学(5本の志箸)スムーズに食事を
  • 避ける必要性、デッドロックを
  • セマフォを使用して、セマフォ待ちキューと
  • 使用したP 演算子を、Vの操作
  • 各ディスプレイは箸のそれぞれの哲学者、および状態可能   

 

2、実行ショット:

 

図3に示すように、ソースコード:

package test2;

/*每个哲学家安排一个线程*/
class Philosopher extends Thread{
    private String name;
    private Chopsticks Chopsticks;
    public Philosopher(String name,Chopsticks Chopsticks){
        super(name);
        this.name=name;
        this.Chopsticks=Chopsticks;
    }

    //重构
    public void run(){
        while(true){
        	//哲学家的状态就是:思考→进餐→思考  循环
            thinking();
            Chopsticks.P();
            eating();
            Chopsticks.V();
        }
    }
    
    public void eating(){
    	int i = Integer.parseInt(name);
        System.out.println("哲学家 " + name + "号 开始拿着筷子 "+ i +" 和 "+ (i+1)%5 + "进餐!");//打印哲学家状态和筷子状态
        try {
            sleep(2000);//假设吃饭时间为5秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
   
    public void thinking(){
        System.out.println("哲学家 " + name + "号 陷入了思考!");
        try {
            sleep(2000);//假设思考4秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


class Chopsticks{
    /*5只筷子,初始为1,即未被用*/
    private int[] ChopStatus={1,1,1,1,1};

    //避免死锁
    /*P操作:只有当左右手的筷子都未被使用时,才允许获取筷子,且必须同时获取左右手筷子*/
    public synchronized void P(){
    	//获得当前线程的名字(哲学家)
        String name = Thread.currentThread().getName();
        int i = Integer.parseInt(name);
        
        //当当前线程哲学家左右手的筷子已经被占用
        while(ChopStatus[i]==0||ChopStatus[(i+1)%5]==0){
            try {
            	System.out.println("哲学家 "+ name +"号 正在等待筷子!");
                //当前哲学家线程进入等待状态         
            	wait();  
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        //获得左右筷子,修改筷子状态
        ChopStatus[i]-=1 ;
        ChopStatus[(i+1)%5]-=1;
    }

    
    /*V操作:同时释放左右手的筷子*/
    public synchronized void V(){
    	//获得当前线程的名字(哲学家)
        String name = Thread.currentThread().getName();
        int i = Integer.parseInt(name);

        //释放左右筷子
        ChopStatus[i]+=1;
        ChopStatus[(i+1)%5]+=1;
        
        //唤醒等待序列中的线程
        notifyAll();
    }
}


public class Think_Eat {
    public static void main(String []args){
    	
        Chopsticks Chopsticks = new Chopsticks();
        new Philosopher("0",Chopsticks).start();
        new Philosopher("1",Chopsticks).start();
        new Philosopher("2",Chopsticks).start();
        new Philosopher("3",Chopsticks).start();
        new Philosopher("4",Chopsticks).start();
        
    }
}

 

おすすめ

転載: blog.csdn.net/cxh_1231/article/details/86481718