讀<王垠:一種新的操做系統設計>

一個操做系統

爲了說明某種狀況, 我先寫一段僞代碼模擬從Torrent到下載MP4,而後建立窗口再到播放的過程!node

請注意數據庫

  • 他不是任何現實的語言,也不是一個真實的過程
  • 該過程不是創建在任何已有的系統之上的
  • 這爲了讓有些東西看起來更直觀一些
  • 目前而言沒有任何痕跡代表這個系統是確實可行的

//----節點node0
//----這是進程0(或者微函數0,如下的進程和微函數請自行區別)(pid0)----
//微函數是有參數和返回值的,這裏的(*)匹配任何類型,我省略了微函數返回值的聲明
TINY((*) argv)("/process/pid0")//這是微函數的聲明,這裏直接將它安裝到系統的/process/pid0 目錄下,
{
    Torrent test = new Torrent("data1/test.torrent");//
    //或者能夠這樣 : Torrent test = System.fs.get<Torrent>("test.torrent")
    String name = test.getName();
    String infoHash = test.infoHash().toHexStr();//假設這個種子的InfoHash爲:FF
    //這在標準輸出中寫入:InfoHash is :FF!
    System.out.println("InfoHash is :${infoHash}!");//這裏借用Dart形式的帶變量字符串(${infoHash})來渲染一種智能的氣氛!!

    if(!"abc.mp4".equals(name)){
        test.setNmae("abc.mp4",FLUSH);//修改種子的名稱,而後直接(算是手動觸發)同步到存儲器!.至於底層如何同步暫時忽略
    }
    MP4 mp4 = (MP4)test.download2("/data/test.mp4");// 同步下載文件(固然也可使用異步的寫法),
                                                    //保存到目錄/data下(簡單的強制類型轉換看做是自動的解碼把)
    Window win = System.gui.createWindow("Window Title!");//在系統中建立一個窗口,固然窗口也可使持久化的數據結構
    EventBus hub = mp4.play(win);//將下載以後的視頻扔到窗口播放!
    hub.onEnd([](){
            win.close();//播放完畢,自動關閉窗口
    });

    Process current = System.process.getCurrent();//得到當前進程其路徑爲:/process/pid0
    current.addData("key",mp4.getMeta("a"));//將MP4的Meta跟pid0關聯,由於我以爲構建結構化的查詢過程比較複雜,在此只用KV數據庫的方式將數據與進程關聯
    current.funsh()//將數據刷到System中
    //--這是另一種形式
    //System.send("pid1",mp4); //把mp4發送到進程爲pid的外部進程,結構化的進程之間通訊
    //System.send("pid1",mp4)
    //這裏的進程不單單是一個動態的"任務",也是文件系統之上的一個結構(他是持久化的)
    //直接得到進程1,用路徑的形式讓他看起來像是從文件系統中獲得的(若是文件系統中的進程不存在,則自動建立一個)
    Process p1 = System.process.get("/process/pid1",true);
    System.send(p1,mp4)//將"結構化的MP4"發送到進程1,

    //而後退出或者循環等待!若是是微函數退出,則發送過程就交給操做系統來管理!若是阻塞,提供超時!具體底層實現不解釋!
}//END OF TINY

//----節點node0
//----同一系統上的另一個進程:id爲pid1----
TINY("/process/pid0")
{
    System.process.get("/process/pid1");//得到pid0保存在process的進程
    System.onReceiveData([](Process sender,MP4 data){//這是進程1,接受進程0的數據
        if(sender.name == "pid0")
        {
            Window win = System.gui.createWindow("Window 2");//在系統中建立一個窗口
            win.show(data);//而後播放
        }
    });
}

//----不一樣節點(node1)上的另一個進程(pid2)----
TINY("/process/pid2"){
    MP4 m = System.network.get("node0:/data/test.mp4");//這個過程是瞬時
    Meta metaFromMP4 = m.getMeta("a");//從mp4中得到meta信息

    Process ppp = System.process.get("node0:/process/pid1",false);//從節點0得到關聯進程
    Meta metaFromProcess = (Meta)ppp.getData("a");//從節點0進程1關聯的數據庫中得到meta信息!

    if(metaFromProcess != metaFromMP4){
        //... ERROR
    }
}


//----這是調用代碼---tiny函數能夠任意組合,這種每一種組合能夠表示爲一個任務!!
Tiny tiny = System.getTiny("node0:/process/pid0")
EventBus busPid0 = tiny.getEventBus();//這裏返回一個事件插座!
busPid0.onExit(....);//監聽pid0是否結束運行
tiny.run(1,ANYTIME);//將Tiny加入運行Schedule,這裏的1表示只運行一次,
                        //ANYTIME表示系統能夠調度在任什麼時候間運行(看操做系統心情),說明時間對函數的影響將不考慮!
                        //固然也能夠設置優先級,或者讓他當即執行或者安排在哪一個函數以前或者以後???

System.run("node0:/process/pid1");//同步,當即運行
System.run("node1:/process/pid2");//
System.exit();//退出系統,繼續...Reloop!

//Process.onExit(....);//

這個系統的簡單說明"數據結構

  • 一切都是結構(對象)
  • 數據傳輸是帶類型的結構
  • 這裏的System的角色是所謂的操做系統,能夠看到他負責管理全部資源,以及負責通訊!
  • 分佈式系統中全部的節點共享一個System!
  • 全部節點的路徑結構nodeX:/someDir/someData,其中nodeX表示特別指定某個節點,缺省爲當前節點
  • 這個系統中的任何東西都是能夠進行某種持久化的,flush進外存,或者save進KV!
  • 這裏的Process是所謂的微函數,同時他是有名稱的除了方便調用(他是一個能夠持久化的數據結構,固然在運行的時候他是動態的,爲何須要持久化?由於能夠做爲一些持久化的數據的Root!)!
相關文章
相關標籤/搜索