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. haskell实现简易计算器

    > module Main where > import System.IO > import Data.Char > import Control.Monad > im ...

  2. Javascript Date类型

      Date 类型使用自 UTC 1970 年 1 月 1日 午夜 开始经过的毫秒数来保存日期.   创建日期对象 var now = new Date();//获取当前日期   Date.parse ...

  3. 数据结构-堆 Java实现

    数据结构-堆 Java实现. 实现堆自动增长 /** * 数据结构-堆. 自动增长 * */ public class Heap<T extends Comparable> { priva ...

  4. css_文本溢出

    1.单行文本溢出隐藏,显示省略号 2.多行文本溢出隐藏,显示省略号 1.只针对用webkit内核浏览器渲染页面才会有效果 2.(多行文本溢出隐藏,显示省略号)通用方法

  5. [dev][ipsec][dpdk] strongswan/dpdk源码分析之ipsec算法配置过程

    1 简述 storngswan的配置里用一种固定格式的字符串设置了用于协商的预定义算法.在包协商过程中strongswan将字符串转换为固定的枚举值封在数据包里用于传输. 协商成功之后,这组被协商选中 ...

  6. ROS串口通信

    身处机器人行业,不想一直只做低端的单片机控制,老是待在舒适区,所以一直都想学一下ROS系统,但看了几个月资料后,感觉还是云里雾里,似懂非懂,感念似乎都很清楚,但要实际去做,却又感觉无从下手. 于是想先 ...

  7. Fiddler忽略捕捉大文件流

    Fiddler是款非常不错的抓包软件,可以方便的捕捉各种软件发起的HTTP请求,甚至可以在发送给服务器前或响应给应用前修改数据.但是在使用时发现,在开启Fiddler时,在浏览器中下载文件时不会马上弹 ...

  8. VSS(Virtual Switching System)

    一.虚拟交换系统(VSS) VSS是一种网络虚拟化技术,讲两台Catalyst 6500系列交换机组合为单一虚拟交换机,从而提高运营效率.增强不间断通信,并将系统带宽容量扩展到1.4Tbps.在初始阶 ...

  9. python练习题-day22

    1.编写程序, 编写一个学生类, 要求有一个计数器的属性, 统计总共实例化了多少个学生 class Student: count=0 def __init__(self,name,age,gender ...

  10. Vue框架创建项目常遇到问题

    利用npm安装cnpm时出现的错误 npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least ...