专栏首页原创分享用js模拟一下操作系统

用js模拟一下操作系统

var TASKNUM = 10;
  var STATE = {
    RUNNING: 0,
    HANGON: 1,
    STOP: 2
  };
  var DEFAULTPRI = 10;
  var lastPid = 0;
  function Task(config = {}) {
    this.pid = lastPid++;
    this.state = STATE.RUNNING;
    this.priority = config.priority || DEFAULTPRI;
    this.executeTime = 0;
  
  }

  Task.prototype = {
    run: function() {
      // nothing to do
    },
    
    init: function() {

    }
  }
  var RUNTIME = 10;
  var TASKS = [];//new Array(TASKNUM);
  var current;
  function schedule() {
    var i = 0;
    TASKS = TASKS.sort(function(a, b) {
      return b.priority - a.priority;
    });
    while(i < TASKNUM) {
      
      current = TASKS[i];
      i++;
      if (current && current.state == STATE.RUNNING) {
        var startTime = Date.now();
        current.run();
        var endTime = Date.now();
        current.executeTime += endTime - startTime;
        if ((endTime - startTime)  > RUNTIME) {
          current.priority > 0 && current.priority--;
        }
        break;
      }
    }
  }

  function sleep(param) {
    param.push(current);
    current.state = STATE.HANGON;
  }


  function wakeup(param) {
    var task = param.shift();
    task.state = STATE.RUNNING;
  }

  function removeTask() {
    var i = 0;
    while(i < TASKS.length) {
      if (TASKS[i].pid == current.pid) {
        TASKS.splice(i, 1);
        return;
      }
    }
  }
var LEN = 8;
// 进程间通信
var buf = {
  buffer: new Array(LEN),
  read: 0,
  write: 0,
  len: 0,
  readQueue: [],
  writeQueue: []
}

var INC = function(ptr) {
  return (ptr + 1 ) & (LEN -1);
};

function read(len) {
  var readableLen = buf.len;
  if (!readableLen && len) {
    sleep(buf.readQueue);
    return -1;
  }
  var realLen = len > readableLen ? readableLen : len;
  var i = 0;
  var data = [];
  while(i < realLen) {
    data.push(buf.buffer[buf.read]);
    buf.len--;
    buf.read = INC(buf.read);
    i++;
  }
  if (realLen && buf.writeQueue.length) {
    wakeup(buf.writeQueue)
  }
  return data;
}


function write(data) {
  var writableLen = (LEN - buf.len);
  if (!writableLen && data.length) {
    sleep(buf.writeQueue);
    return -1;
  }
  var realLen = data.length > writableLen ? writableLen : data.length;
  var i = 0;
  while(i < realLen) {
    buf.buffer[buf.write] = data[i];
    buf.len++;
    buf.write = INC(buf.write);
    i++;
  }
  if (realLen && buf.readQueue.length) {
    wakeup(buf.readQueue);
  }
  return realLen;
}


var task0 = new Task({priority: -1});
task0.run = function() {
  console.log('run 0');
}
var task1 = new Task();
task1.init = function() {
  
  this.data = [1,2,3,4,5,7,8,9,11];
}
task1.run = function() {
  console.log('run 1')
  var sourcelen = this.data.length;
  if (!sourcelen) {
    return;
  }

  var writeLen = write(this.data);
  if (writeLen == -1) {
    return ;
  }
  if (writeLen == sourcelen) {
    var self = this;
    setTimeout(function() {
      self.data = 'a'.repeat(~~(Math.random() * 20) + 1).split('');

    },2000)
    //removeTask();
  } else {
    this.data = this.data.slice(writeLen);
  }
};

var task2 = new Task();
task2.init = function() {
  this.data = [];
}
task2.run = function() {
  console.log('run 2')

  var data = read(~~(Math.random() * 10));
  if (data == -1) {
    return ;
  }
  this.data = this.data.concat(data);
  console.log(this.data);
  // if (this.data)
  //   TASKS.splice(this.pid, 1);
};
task0.init();
task1.init();
task2.init();
TASKS.push(task0);
TASKS.push(task1);
TASKS.push(task2);

setInterval(function() {
  schedule();
}, RUNTIME * 100)

本文分享自微信公众号 - 编程杂技(theanarkh),作者:theanarkh

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用js实现一个状态机

    theanarkh
  • js实现图的构造

    theanarkh
  • nodejs可读流源码分析

    可读流是对数据消费的抽象,nodejs中可读流有两种工作模式:流式和暂停式,流式就是有数据的时候就会触发回调,并且把数据传给回调,暂停式就是需要用户自己手动执行...

    theanarkh
  • 面试官:你分析过mybatis工作原理吗?

    当然,还有很多可以在XML 文件中进行配置,上面的示例指出的则是最关键的部分。要注意 XML 头部的声明,用来验证 XML 文档正确性。environment ...

    阮键
  • javascript中定义私有方法(private method)

    一度以为在javascript的世界里,所有方法都是公有的,无法真正从技术上定义一个私有方法,今天又一次发现:其实我错了!  var Person = func...

    菩提树下的杨过
  • Egret语法DataGroup使用案例

    class Main extends egret.DisplayObjectContainer{ public constructor() { ...

    苦咖啡
  • RocketMQ主从同步源码分析

    1.HAService:主从同步的核心实现类2.HAService$AcceptSocketService:主服务器监听从服务器连接实现类3.HAService...

    张乘辉
  • php版链表的实现

    魔王卷子
  • 面试题:你能写一个Vue的双向数据绑定吗?

    Vue的双向数据绑定的原理相信大家也都十分了解了,主要是通过 Object对象的defineProperty属性,重写data的set和get函数来实现的,这里...

    前端博客 : alili.tech
  • Backbone源码研究 – Backbone.Model

    都因为 IE8 不支持 Object.defineProperty,但是业务还不能脱离 IE7 和 IE8,故研究下 Backbone.Model 的实现机制,...

    libo1106

扫码关注云+社区

领取腾讯云代金券