首先我们来理解“任务”,所谓任务,就是需要CPU周期“关照”的事件,绝大多数任务不需要CPU一直“关照”,例如启动ADC的启动读取。甚至有些任务“害怕”CPU一直“关照”例如LCD的刷新,因为LCD是显示给人看的,并不需要高速刷新,即便是显示的
内容在高速变化,也不需要高速刷新,道理是一样的。这样看来,让CPU做简单任务一定很浪费,事实也是如此,绝大多数简单任务,CPU都是在“空转”(循环踏步延时)。对任务总结还可以知道,很多任务需要CPU不断“关照”,其实这种“不断”也是有极限的,比如数码管动态扫描,能够做到40Hz就可以了,又如键盘扫描,能够做到20Hz(经验值),基本上也就不会丢有效按键键值了,再如LCD刷新,我觉得做到10Hz就可以了,等等。看来,绝大多数任务都是工作在低速频度。而我们的CPU一旦运行起来,速度又很快,CPU本身就是靠很快的速度执行很简单的指令来胜任复杂的任务(逻辑)的。如果有办法把“快”的CPU分成多个慢的CPU,然后给不同的任务分配不同速度的CPU,这种设想是不是很好呢!确实很好,下面就看如何将“快”的CPU划分成多个“慢”的CPU。
这是用VC++模拟多任务:
这个卖票的程序……
#include "stdafx.h"
int main(int argc, char* argv[])
{
int tastf[]={0,1,1,1}; //1待完成
int tast[]={1,912,993,994}; //待售票
int ticks=2917; //70;
int i1,i2,i3;
int ti1,ti2,ti3;
for(int n=0;n<9999;++n) { //for10
//int tn=n%4;
switch (n%4)
{
case 3: if(0<tast[3]) goto t3_1; break;
case 2: if(0<tast[2]) goto t2_1; break;
case 1: if(0<tast[1]) goto t1_1; break;
case 0: break;
}//switch(tn
select12:
if (ticks<=0) {printf("票已销售謦!%",ticks); goto end11;}
if (0>=tast[1] & 0>=tast[2] & 0>=tast[3]) {goto end11;}
}//for int n//for10
for(i1=tast[1];i1>=0;) {
t1_1:
printf("还剩下%d张票,",ticks);
printf("售票窗(1),还有%d个购票者,",tast[1]);
if(tast[1]>0) {
--ticks; --i1; --tast[1];
printf("售票窗一服务了1个购票者,还剩%d个购票者\n",tast[1]); }//if11
printf("还剩下%d张票\n",ticks);
goto select12;
}//fori1 11
do {
t2_1:
printf("还剩下%d张票,",ticks);
printf("售票窗(2),还剩%d个购票者,",tast[2]);
if(tast[2]>0) {
--ticks;--i2; --tast[2];
printf("售票窗二服务了1个购票者,还剩%d个购票者\n",tast[2]); }//if22
printf("还剩下%d张票\n",ticks);
goto select12;
}while(1); //fori2 22
do {
t3_1:
printf("还剩下%d张票,",ticks);
printf("售票窗(3),还剩%d个购票者,",tast[3]);
if(tast[3]>0) {
--ticks;--i3; --tast[3];
printf("售票窗三服务了1个购票者,还剩%d购票者\n",tast[3]); }//if33
printf("还剩下%d张票\n",ticks);
goto select12;
}while(1) ; //do while(1 dowhile33//fori3 33
goto select12;
end11:
printf("end11!\n");
return 0;
}
这是教学用的……用c 写 汇编……
想实用还得多改进……
-----------------------------------------------------------------------
//三个窗口,不用函数的,以后再补充用函数的
#include "stdafx.h"
int main(int argc, char* argv[])
{
int tastf[]={0,1,1,1}; //1待完成
int tast[]={1,912,993,994}; //待售票
int ticks=2917; //70;
int i1,i2,i3;
int ti1,ti2,ti3;
for(int n=0;n<9999;++n) { //for10
//int tn=n%4;
switch (n%4)
{
case 3: if(0<tast[3]) goto t3_1; break;
case 2: if(0<tast[2]) goto t2_1; break;
case 1: if(0<tast[1]) goto t1_1; break;
case 0: break;
}//switch(tn
select12:
if (ticks<=0) {printf("票已销售謦!%",ticks); goto end11;}
if (0>=tast[1] & 0>=tast[2] & 0>=tast[3]) {goto end11;}
}//for int n//for10
for(i1=tast[1];i1>=0;) {
t1_1:
printf("还剩下%d张票,",ticks);
printf("售票窗(1),还有%d个购票者,",tast[1]);
if(tast[1]>0) {
--ticks; --i1; --tast[1];
printf("售票窗一服务了1个购票者,还剩%d个购票者\n",tast[1]); }//if11
printf("还剩下%d张票\n",ticks);
goto select12;
}//fori1 11
do {
t2_1:
printf("还剩下%d张票,",ticks);
printf("售票窗(2),还剩%d个购票者,",tast[2]);
if(tast[2]>0) {
--ticks;--i2; --tast[2];
printf("售票窗二服务了1个购票者,还剩%d个购票者\n",tast[2]); }//if22
printf("还剩下%d张票\n",ticks);
goto select12;
}while(1); //fori2 22
do {
t3_1:
printf("还剩下%d张票,",ticks);
printf("售票窗(3),还剩%d个购票者,",tast[3]);
if(tast[3]>0) {
--ticks;--i3; --tast[3];
printf("售票窗三服务了1个购票者,还剩%d购票者\n",tast[3]); }//if33
printf("还剩下%d张票\n",ticks);
goto select12;
}while(1) ; //do while(1 dowhile33//fori3 33
goto select12;
end11:
printf("end11!\n");
return 0;
}
=========================================
下面是按时间片来的:
----------------------
// 模拟 按时间片的多任务.
//
#include "stdafx.h"
#include<iostream>
#include<windows.h>
const int tick10=1; //2;
int ticks99=999; //9999;
int ar[4]={0,92,93,94};
int tas1t (int n1,int arn)
{
//DWORD
// DWORD t0=GetTickCount();
for(int i1i=arn;i1i>0; ++i1i) {
//1处: 从(1处)到(2处)(强制要求)是线程安全的…当然,如果出现阻塞,当然会影响别的时间片的进行,(所以据此只能说是某种程度的时间片多任务
if (ticks99<=0) break;
printf("第(%d号窗:还有%d个客人需要服务,还有%d张票,Waiting…",n1, arn,ticks99);
--arn; ticks99--;
printf("服务了1个人…还有%d个人需要服务,还剩%d张票!\n",arn, ticks99);
DWORD t1=GetTickCount();
//2处: 从(1处)到(2处)(强制要求)是线程安全的…
// if ( (t1-t0)>tick10) goto fan_hui22;
}//for(int i1i
//fan_hui22:
return arn;
}
int main(int argc, char* argv[])
{
DWORD t0=GetTickCount();
DWORD t1=t0;
for(int i=1; true; ++i) {
if (ticks99<=0) break;
if ( 0>=ar[1]+ar[2]+ar[3] ) break; //没有这句就跑飞!
int imod=i%4;
switch (i%4)
{
// case 1: if( ar[imod]>0) {ar[imod]=tas1t( imod,ar[imod] ); }
// break;
// case 2: if( ar[imod]>0) {ar[imod]=tas1t( imod, ar[imod] ); }
// break;
case 0: break;
default: if( ar[imod]>0) {
//ar[imod]=tas1t( imod,ar[imod] );
for(int i1i=ar[imod];i1i>0; ++i1i) {
if (ticks99<=0) break;
if (ar[imod]<=0) break;
printf("第(%d号窗:还有%d个客人需要服务,还有%d张票,Waiting…", imod, ar[imod],ticks99);
--ar[imod]; ticks99--;
printf("服务了1个人…还有%d个人需要服务,还剩%d张票!\n",ar[imod], ticks99);
//DWORD
t1=GetTickCount();
if ( (t1-t0)>tick10) {t0=t1; goto fan_hui11;}
}//for(int i1i
}
break;
}//switch(i%4
fan_hui11:
;
}//for(int i
printf("hello1!");
return 0;
}