canvas模拟实现磁盘调度算法

canvas-demo

canvas模拟实现磁盘调度算法 Canvas simulation implements disk scheduling algorithm

项目地址:canvas-demo

demo

界面

在这里插入图片描述

实现过程

1.定义磁盘磁道总个数和需要生成的磁道序列个数:

const track = 150;
const trackNumber = 40;

2.定义磁道序列数组

let trackSequence = [];

3.生成trackNumber个磁道号序列

generateTrackNumberSequence(trackNumber);

4.根据用户设置的算法和磁头初始位置形成相应的磁头轨迹数组

(1)先来先服务算法(FCFS)

这种算法的思想比较容易理解。假设当前磁道在某一位置,依次处理服务队列里的每一个磁道,这样做的优点是处理起来比较简单,但缺点是磁头移动的距离和平均移动距离会很大。

实现方法:依次将磁头初始位置和磁道号序列放入磁头轨迹数组即可。

function fcfs(headInitalPosition) {
  let headPath = [];
  headPath.push(headInitalPosition);
  return headPath.concat(trackSequence);
}

(2)最短寻道时间算法(SSTF)

这种算法的本质是利用贪心算法来实现,假设当前磁道在某一位置,接下来处理的是距离当前磁道最近的磁道号,处理完成之后再处理离这个磁道号最近的磁道号,直到所有的磁道号都服务完了程序结束。这样做的优点是性能会优于FIFO算法,但是会产生距离当前磁道较远的磁道号长期得不到服务,也就是“饥饿”现象。

实现方法:形成一个当前磁头位置与磁道号序列里每个元素距离的数组distance,在distance里找到最小值并返回下标,通过该下标找到磁道号序列里面对应的磁道号,并将该磁道号加入磁头轨迹数组。一直循环上述方法。

function sstf(headInitalPosition) {
  let headPath = [];
  headPath.push(headInitalPosition);
  let trackSequenceCopy = trackSequence.concat();
  for(let i = 0; i < trackSequence.length; i++) {
    let distance = trackSequenceCopy.map(key => Math.abs(key - headPath[i]));
    let minCoor = distance.min();
    headPath.push(trackSequenceCopy[minCoor]);
    trackSequenceCopy.splice(minCoor, 1);
  }
  return headPath;
}

(3)电梯调度算法(SCAN)

先按照一个方向(比如从外向内扫描),扫描的过程中依次访问要求服务的序列。当扫描到最里层的一个服务序列时反向扫描。

实现方法:将磁道序列里面小于等于初始磁头位置的元素按降序排好后插入磁头轨迹数组,再将磁道号序列里面大于初始磁头位置的元素按升序排好后插入磁头轨迹数组。

function scan(headInitalPosition) {
  let headPath = [];
  headPath.push(headInitalPosition);
  headPath = headPath.concat((trackSequence.filter(key => key <= headInitalPosition)).sort((a, b) => b - a));
  headPath = headPath.concat((trackSequence.filter(key => key > headInitalPosition)).sort((a, b) => a - b));
  return headPath;
}

(4)循环扫描算法(C-SCAN)

CSCAN算法的思想是,访问完最里面一个要求服务的序列之后,立即回到最外层欲访问磁道。也就是始终保持一个方向。故也称之为单向扫描调度算法。

实现方法:将磁道序列里面小于等于初始磁头位置的元素按降序排好后插入磁头轨迹数组,再将磁道号序列里面大于初始磁头位置的元素按降序排好后插入磁头轨迹数组。

function cScan(headInitalPosition) {
  let headPath = [];
  headPath.push(headInitalPosition);
  headPath = headPath.concat((trackSequence.filter(key => key <= headInitalPosition)).sort((a, b) => b - a));
  headPath = headPath.concat((trackSequence.filter(key => key > headInitalPosition)).sort((a, b) => b - a));
  return headPath;
}

5.效果图

(1)绘制X轴及标记点

/**
 * 绘制X轴及标记点
 * 
 * @param  {Array} xCoorArray 按升序排好的横坐标数组
 */
function drawCoordinateAxis(xCoorArray) {
  ctx.strokeStyle = '#566a80';
  ctx.fillStyle = '#566a80';
  ctx.lineWidth = 2;
  for(let i = 0; i < xCoorArray.length; i++) {
    const startXCoor = (xCoorArray[i] / track) * canvas.width;
    const endYCoor = (xCoorArray[i + 1] / track) * canvas.width;
    drawText(xCoorArray[i], startXCoor, 25); 
    drawLine(startXCoor, 40, endYCoor, 40);
    drawLine(startXCoor, 40, startXCoor, 30);
  }
}

(2)绘制折线图

/**
 * 绘制折线图
 * 
 * @param  {Array} headPath 磁头轨迹数组
 */
function drawLineChart(headPath) {
  ctx.strokeStyle = '#566a80';
  ctx.fillStyle = '#566a80';
  ctx.lineWidth = 2;
  ctx.lineJoin = 'round';
  ctx.lineCap = 'round';

  //起点和终点纵坐标
  let startYCoor = 50;
  let endYCoor = 60;
  for(let i = 0; i < headPath.length; i++) {
    //起点和终点横坐标
    let startXCoor = (headPath[i] / track) * canvas.width;
    let endXCoor = (headPath[i + 1] / track) * canvas.width;
    if(startXCoor == endXCoor) {
      endYCoor = startYCoor;
    }
    drawPoint(startXCoor, startYCoor, 5);
    drawLine(startXCoor, startYCoor, endXCoor, endYCoor);
    startYCoor = endYCoor;
    endYCoor += 10;
  }
}

(3)显示磁头移动道数

将磁头轨迹数组中各元素的差值的绝对值放如数组moveNumber中,将moveNumber中各元素依次相加。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容