读<王垠:一种新的操作系统设计>

一个操作系统

为了说明某种情况, 我先写一段伪代码模拟从Torrent到下载MP4,然后创建窗口再到播放的过程!

请注意

  • 他不是任何现实的语言,也不是一个真实的过程
  • 该过程不是建立在任何已有的系统之上的
  • 这为了让有些东西看起来更直观一些
  • 目前而言没有任何痕迹表明这个系统是确实可行的

//----节点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!)!

转载于:https://my.oschina.net/kialun/blog/199728

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值