2012-06-08 21:26:42

用matlab来建模,仿真不同时刻os task在队列中的装载情况。输入参数如下

作为初学者,M文件写的有点长。能实现功能就算学以致用了。

clear;clc

%os每隔0.5ms进入一次中断,进行taskpush。设置初始值,间隔值,及结束时间。

StartTime=0;      %第0ms开始push task入队列。

TimeInterval=0.5; %每隔0.5ms push一次task。

EndTime=100;       %计算到第10ms的push task入队列数量。

%初始化:每种task类型的task周期

TaskCycle=[2.5,5,5,10,10,25,25,50,100,500,1000];

%初始化:每种task类型的起始时间

TimeStart=[0,0.5,0,1.5,0.5,2,1,0,3,5,4];

%初始化:每种task类型中的task子项数量

TaskNum=[5,1,2,2,4,1,1,1,2,0,0];

%初始化:每种周期task中装载的task子项的id号

subTaskItem=[

1, 2, 3, 4, 5

6, 0, 0, 0, 0

7, 8, 0, 0, 0

9,10, 0, 0, 0

11,12,13,14, 0

15, 0, 0, 0, 0

16, 0, 0, 0, 0

17, 0, 0, 0, 0

18,19, 0, 0, 0

0, 0, 0, 0, 0

0, 0, 0, 0, 0

];

%初始化:每种周期task中装载的task子项的代码运行时间

subTaskTimeItem=[

50,20,20,50,10

50, 0, 0, 0, 0

1000,50, 0, 0, 0

1000,50, 0, 0, 0

50,30,50,30, 0

50, 0, 0, 0, 0

50, 0, 0, 0, 0

1000, 0, 0, 0, 0

50,20, 0, 0, 0

0, 0, 0, 0, 0

0, 0, 0, 0, 0

];

%模拟运行的每次入队列的id组合

simStackNew=[];

%记录本次状态,作为下一次的输入状态。

oldsimStack=[];

%模拟运行的每次入队列的id组合的运行时间

simStackTimeNew=[];

%记录本次状态,作为下一次的输入状态。

oldsimStackTime=[];

%记录模拟运行的每次在间隔时间内没有运行完的task子项的id号

presimStack=[];

%记录模拟运行的每次在间隔时间内没有运行完的task子项的id的运行时间

presimStackTime=[];

%保存每个时间间隔的入栈id组合。

simStack=[];

%保存每个时间间隔的入栈id代码运行时间组合。

simStackTime=[];

%每个在队列中的时间累加值,将会与时间间隔比较。

simStackAllTime=0;

%每个时间间隔入队列及滞留在队列里将要运行的总的task子项的id总数。SimTotalNum>=TotalNum

SimTotalNum=[];

%每种task子项的装载个数出现的次数

count=eye(1,16);

count=zeros(size(count));

%初始化:入队列的次数,建立数组。

TimeCount=(StartTime:TimeInterval:EndTime);

%初始化:每个task种类中task子项入队列数量和。

TempNum=eye(length(TaskCycle),length(TimeCount));

TempNum=zeros(size(TempNum));

%初始化:全部task种类中task子项入队列数量和。

TotalNum=eye(1,length(TimeCount));

TotalNum=zeros(size(TotalNum));

fprintf(2,'以下统计某个时间点task子项入队列的数量\n')

%计算全部task类型在不同时间间隔点的入队列task子项的数量和

for k=1:length(TaskCycle)

%计算每种task类型在不同时间间隔点的入队列task子项的数量

for j=1:length(TimeCount)

if(mod(TimeCount(j)-TimeStart(k),TaskCycle(k))==0)

TempNum(k,j)=TaskNum(k);%每种cycle的单次入队列数量,对应excel“task计算”中的列。

else

TempNum(k,j)=0;

end

end

TotalNum=TotalNum+TempNum(k,:); %求和,TempNum为一维数组

%TotalNum=TotalNum+TempNum; %求和,TempNum为二维数组

end

%/*-----------如下代码是计算某个时间点,入栈的总的task数-----------------------*/

%计算最大的入队列task子项数量

fprintf('%d次os装载task中,入队最大数量为%d\n',length(TimeCount),max(TotalNum));

%计算最大的入队列数量出现的时间

maxTotalNum=max(TotalNum);

[row,col]=find(TotalNum==maxTotalNum);

disp(['出现在如下时间段(单位为ms):',num2str(col.*0.5)]);

%计算每种task子项的装载个数出现过几次。

for j=1:length(TotalNum)

switch(TotalNum(j))

case {0}

count(1)=count(1)+1;

case {1}

count(2)=count(2)+1;

case {2}

count(3)=count(3)+1;

case {3}

count(4)=count(4)+1;

case {4}

count(5)=count(5)+1;

case {5}

count(6)=count(6)+1;

case {6}

count(7)=count(7)+1;

case {7}

count(8)=count(8)+1;

case {8}

count(9)=count(9)+1;

case {9}

count(10)=count(10)+1;

case {10}

count(11)=count(11)+1;

case {11}

count(12)=count(12)+1;

case {12}

count(13)=count(13)+1;

case {13}

count(14)=count(14)+1;

case {14}

count(15)=count(15)+1;

case {15}

count(16)=count(16)+1;

end

end

for j=1:16

fprintf('%d次os装载task中,有%d次是装载%d个task子项\n',length(TimeCount),count(j),j-1);

end

%作图

figure(1);

plot(TotalNum,TimeCount,'y:o','LineWidth',2,'MarkerEdgeColor','r')

%stairs(TotalNum,TimeCount,'b-o','LineWidth',2,'MarkerEdgeColor','b')

title('os任务加载图')

xlabel('入队列任务子项数量和')

ylabel('时间轴')

grid on

%/*--------------如下运算加入task运行时间,模拟了实际运行中队列中滞留的task子项id号------*/

fprintf(2,'以下模拟某个时间点在队列中task子项的数量\n')

for j=1:length(TimeCount)

%在某个时间间隔点,将各种循环task的入队列数量(非0值)放入数组simStackNew,将其对应的代码运行时间放入simStackTimeNew。

for k=1:length(TaskCycle)

if(TempNum(k,j)>0)

simStackNew=[simStackNew,subTaskItem(k,1:TempNum(k,j))];%对应excel“task计算”中的行。

simStackTimeNew=[simStackTimeNew,subTaskTimeItem(k,1:TempNum(k,j))];

end

end

%对上一次入队列的task子项计算其在TimeInterval时间间隔内运行了几个task子项

%TimeInterval时间间隔内运行全部运行完成了,则无遗留task在队列中,simStack中只有新入队列的id号,

%如果TimeInterval时间间隔内没有把上次入队列的task id子项运行完成,则时间simStack中将保留前一次没有运行的task

%id及新进入的task id号

for n=1:length(oldsimStackTime)      %前一次task id号的时间组合

simStackAllTime=simStackAllTime+oldsimStackTime(n);  %前一次task id号中的时间值累加

if (simStackAllTime>TimeInterval*1000)      %判断TimeInterval*1000us中是否完成了前一次task id。

oldsimStackTime(n)=simStackAllTime-500; %前一次的task没有运行完成,则修改将要运行的时间

break;                                  %前一次的task没有运行完成,保留n,退出循环

end

end

%在时间间隔内没有运行完上一次的task id号及其对应将要运行的时间将被记录到presimStack及presimStackTime中。

if(n==length(oldsimStackTime))

presimStack=[];

presimStackTime=[];

else

presimStack=oldsimStack(n:end);

presimStackTime=oldsimStackTime(n:end);

end

%遗留的id号组合合并上新的id号组合

simStack=[presimStack,simStackNew];

%遗留的id号对应的运行时间组合合并上新的id号对应的运行时间组合

simStackTime=[presimStackTime,simStackTimeNew];

%保存目前的id号组合,供一下次计算

oldsimStack=simStack;

%保存目前的id运行时间组合,供一下次计算

oldsimStackTime=simStackTime;

%打印到工作区,显示每个时间间隔点,在队列里的task id子项

fprintf('第%.1fms装载%d个task id,',j*0.5,length(simStack));

disp(['id号:',num2str(simStack)]);

%每个时间点的最大id子项运行数量

SimTotalNum(j)=length(simStack);

%清空临时数据为下一次循环做准备

simStackNew=[];

simStackTimeNew=[];

simStackAllTime=0;

end

fprintf(2,'在时间间隔点中,task队列装载数量的最大值为%d\n',max(SimTotalNum));

%画出时间间隔与模拟实际运行中在task队列里的数量,有阻塞的概念在

figure(2);

plot(SimTotalNum,TimeCount,'r:o','LineWidth',2,'MarkerEdgeColor','k')

title('os任务加载图')

xlabel('队列中模拟任务子项数量和')

ylabel('时间轴')

Matlab学以致用--模拟os任务装载情况的更多相关文章

  1. 必须用C模拟OS?

    ASM基本必要,至于高级语言就很难说了.去osdev wiki上一翻一堆各种语言实现的玩意. 一个模拟OS其实不太容易完整搭出来,反倒是直接构造内核的后顾之忧少(如果还有真的想在SIGALRM里耍什么 ...

  2. 【matlab】模拟变焦拼接代码备份

    1.初版,边缘未处理. % % In----near % If----far % In=imread('D:\文件及下载相关\桌面\模拟变焦拼接\Matlab_code\nearframe\frame ...

  3. 搭建RAID5(5块硬盘)过程并模拟一块磁盘损坏情况

    首先:在配置RAID5之前我们先来了解一下它.RAID5,RAID是指独立磁盘冗余阵列,是把相同的数据存储在多个硬盘的不同地方的方法.通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能 ...

  4. Matlab学以致用 - 曲线拟合

    曲线拟合 使用Matlab自带的polyfit函数,可以很方便地根据现有样本数据进行多项式曲线拟合,为了有直观感受,先上例程,如下所示: x = -:; % 样本数据x坐标 y = *x.^ + *x ...

  5. python练习笔记——模拟双色球随机输出情况

    编写Python函数:完成一个双色球彩票的模拟生成过程, 其中前六个为蓝色球,数字范围1-33,不可重复.最后一个为红色球 1-16. 使用random完成,最后将7个数进行排列放到列表中 # 引入r ...

  6. 【转】【MATLAB】模拟和数字低通滤波器的MATLAB实现

    原文地址:http://blog.sina.com.cn/s/blog_79ecf6980100vcrf.html 低通滤波器参数:Fs=8000,fp=2500,fs=3500,Rp=1dB,As= ...

  7. Ubuntu 16.04 LTS 下安装MATLAB2015b 以及Matlab system error解决办法

    下载MATLAB2015b破解版 操作系统:Ubuntu 16.o4 LTS 程序文件:Matlab2015b-glnxa64破解版 解压提取文件:在ubuntu系统下可以直接提取压缩文件,得到三个文 ...

  8. Mac OS X 背后的故事

    Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏]   ...

  9. Machine Learning – 第2周(Linear Regression with Multiple Variables、Octave/Matlab Tutorial)

    Machine Learning – Coursera Octave for Microsoft Windows GNU Octave官网 GNU Octave帮助文档 (有900页的pdf版本) O ...

随机推荐

  1. (79)Wangdao.com第十五天_JavaScript 对象的继承_prototype原型对象_封装_函数式编程

    javascript 内置了许多 function 函数(){...} js 执行首先就会执行自己内置的函数定义 (function Function.function Object) 对象的继承 大 ...

  2. [LeetCode] Reaching Points 到达指定点

    A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y). Given a ...

  3. HC32F003与STM8S003资源对比,只是对比,大家评论~!

    枯藤老树昏鸦小桥流水人家                                                古道西风瘦马夕阳西下断肠人在天涯  18年悄然过去!19年向我们走来,蓦然回首过 ...

  4. 出现errSecInternalComponent

    出现errSecInternalComponent Xcode签名机制(code signing mechanism) 的 bug, Xcode 中账号多了,就会产生很多过期的描述文件,Xcode 没 ...

  5. [daily] 不让NetworkManger自动接管网络设备

    一  场景描述 有一个dpdk程序,在运行时使用了rte kni. 它启动的时候,会自动给系统增加一个网卡设备,停止运行的时候又会把它去掉.像这样: [root@T9 gen-py]# ip a : ...

  6. nginx匹配规则说明以及匹配的优先级

    location 匹配规则语法规则 location [=|~|~*|^~] /uri/ { … } 模式    含义location = /uri    = 表示精确匹配,只有完全匹配上才能生效lo ...

  7. COMP9334 Project

    COMP9334 Project, Term 1, 2019:Fog/cloud ComputingVersion 1.0Due Date: 11:00pm Friday 26 April 2019. ...

  8. LeetCode 122 Best Time to Buy and Sell Stock II 解题报告

    题目要求 Say you have an array for which the ith element is the price of a given stock on day i. Design ...

  9. DDoS攻击及防御措施

    SYN flood 伪造大量的源IP地址,分别向服务器端发送大量的SYN包,此时服务器端会返回SYN/ACK 包,因为伪造的IP并不会答应,服务器端并没有收到伪造的IP的回应,会重试3~5次并等待一个 ...

  10. Python的基本语法2

    一.运算符 # 算术运算符, +, -, *, /, //, %, **, 注意//为整除 # 赋值运算符, =, +=, -=, *=, /=, //= ,%=, **= # 比较运算符, ==, ...