热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Matlab学以致用模拟os任务装载情况

2012-06-0821:26:42  用matlab来建模,仿真不同时刻ostask在队列中的装载情况。输入参数如下作为初学者,M文件写的有点长。能实现功能就算学以致用了。cle

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('时间轴')

 


推荐阅读
  • 数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇
    数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇,Go语言社区,Golang程序员人脉社 ... [详细]
  • Mac版Office 2021与2016:项目管理软件下载、安装及一键永久激活指南
    Mac版Office 2021与2016:项目管理软件下载、安装及一键永久激活指南 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文总结了《编程珠玑》第12章关于采样问题的算法描述与改进,并提供了详细的编程实践记录。参考了其他博主的总结,链接为:http://blog.csdn.net/neicole/article/details/8518602。 ... [详细]
  • 本文将详细介绍如何在Webpack项目中安装和使用ECharts,包括全量引入和按需引入的方法,并提供一个柱状图的示例。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
author-avatar
信美玲小祖宗q84
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有