Matlab学以致用--模拟os任务装载情况
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任务装载情况的更多相关文章
- 必须用C模拟OS?
ASM基本必要,至于高级语言就很难说了.去osdev wiki上一翻一堆各种语言实现的玩意. 一个模拟OS其实不太容易完整搭出来,反倒是直接构造内核的后顾之忧少(如果还有真的想在SIGALRM里耍什么 ...
- 【matlab】模拟变焦拼接代码备份
1.初版,边缘未处理. % % In----near % If----far % In=imread('D:\文件及下载相关\桌面\模拟变焦拼接\Matlab_code\nearframe\frame ...
- 搭建RAID5(5块硬盘)过程并模拟一块磁盘损坏情况
首先:在配置RAID5之前我们先来了解一下它.RAID5,RAID是指独立磁盘冗余阵列,是把相同的数据存储在多个硬盘的不同地方的方法.通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能 ...
- Matlab学以致用 - 曲线拟合
曲线拟合 使用Matlab自带的polyfit函数,可以很方便地根据现有样本数据进行多项式曲线拟合,为了有直观感受,先上例程,如下所示: x = -:; % 样本数据x坐标 y = *x.^ + *x ...
- python练习笔记——模拟双色球随机输出情况
编写Python函数:完成一个双色球彩票的模拟生成过程, 其中前六个为蓝色球,数字范围1-33,不可重复.最后一个为红色球 1-16. 使用random完成,最后将7个数进行排列放到列表中 # 引入r ...
- 【转】【MATLAB】模拟和数字低通滤波器的MATLAB实现
原文地址:http://blog.sina.com.cn/s/blog_79ecf6980100vcrf.html 低通滤波器参数:Fs=8000,fp=2500,fs=3500,Rp=1dB,As= ...
- Ubuntu 16.04 LTS 下安装MATLAB2015b 以及Matlab system error解决办法
下载MATLAB2015b破解版 操作系统:Ubuntu 16.o4 LTS 程序文件:Matlab2015b-glnxa64破解版 解压提取文件:在ubuntu系统下可以直接提取压缩文件,得到三个文 ...
- Mac OS X 背后的故事
Mac OS X 背后的故事 作者: 王越 来源: <程序员> 发布时间: 2013-01-22 10:55 阅读: 25840 次 推荐: 49 原文链接 [收藏] ...
- 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 ...
随机推荐
- JS_ Date对象应用实例
一.获取日期时间,秒数实时跳动 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 2018-2019-1 20189210 《LInux内核原理与分析》第五周作业
一.系统调用实验 1.库函数将系统调用封装起来,大多数程序员使用库函数进行系统调用. 2.Linux操作系统的体系架构分为用户态和内核态.CPU的执行级别对应的就是内核态,所有指令都可以执行.用户态对 ...
- [LeetCode] Largest Triangle Area 最大的三角区域
You have a list of points in the plane. Return the area of the largest triangle that can be formed b ...
- shell 环境下MySQL的基本操作指令总结
一.对数据库的基本操作 show databases; //列出数据库use database_name; //使用databas ...
- 太原面经分享:如何在vue面试环节,展示你晋级阿里P6+的技术功底?
前言 一年一度紧张刺激的高考开始了,与此同时,我也没闲着,奔走在各大公司的前端面试环节,不断积累着经验,一路升级打怪. 最近两年,太原作为一个准二线城市,各大互联网公司的技术栈也在升级换代,假如你在太 ...
- Python练手例子(2)
7.将一个列表的数据复制到另一个列表中. 程序分析:使用列表[:]. #python3.7 #适用于简单列表(即列表中都是基本的元素) a1 = [1,2] b1 = a1[:] print(b1) ...
- 长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
小结: 1. 当文件句柄数目超过 10 之后,epoll 性能将优于 select 和 poll:当文件句柄数目达到 10K 的时候,epoll 已经超过 select 和 poll 两个数量级. 2 ...
- CSS盒子模型 box-sizing 用法
盒子模型 box-sizing 属性 语法:box-sizing :content-box || border-box || inherit 属性值: content-box 为(w3c标准盒子模型 ...
- OSPF(Open Shortest Path First)
1.概述 路由协议OSPF全称为Open Shortest Path First,也就开放的最短路径优先协议,因为OSPF是由IETF开发的,所以所有厂商都可以用. OSPF的流量使用IP协议号. O ...
- 利用MathType为公式编号并引用
序言 在理工科的论文撰写过程中, 公式编辑.编号以及引用非常普遍, 但是笔者没有发现word本身对公式编号和引用有比较好的支持, 所以只好求助于第三方插件. MathType在公式编辑方面表现比较出色 ...