进程管理测试(1)

来源:互联网 发布:下载电脑软件 编辑:程序博客网 时间:2024/06/06 20:23
有了之前的了解,可以对进程管理进行一个测试。在测试之前,还需要做一些准备工作。

首先,需要增加一个刷新调度因子的程序,如果没有这个程序,调度因子将一直为0。

void        Proc_alarm(void){    int i;        for( i = 1 ; i < PROC_MAX ; i++)    {        if( !proc_pool[i].proc_stat )            continue;                    if( proc_pool[i].proc_alarm ) proc_pool[i].proc_alarm--;                proc_pool[i].proc_sched_factor += 5;    }}

在每次调用这个程序,调度因子加5,这个函数主要在时钟中断处理程序中调用,所以之前的时钟处理程序也要进行修改。

void        Clk_do_clock(void){    ticks++;        Clk_msg();        Proc_alarm();        if( --proc_current->proc_cpu_time < 1 )                 /*  进程时间消耗完,需要进行调度        */    {        proc_current->proc_cpu_time = 0;        Proc_sched();    }}

每次时钟中断发生后,首先计算调度因子,然后递减进程的CPU时间,如果进程的CPU时间耗尽,则进行任务调度。

做了以上的准备后,可以进行测试了。

#define STACK_SIZE      512byte_t  stack1[STACK_SIZE];byte_t  stack2[STACK_SIZE];int     app1(void){    long i = 0;    char    msg[32];    for(;;)    {        sprintf(msg,"app1.%8ld ",i++);        Con_write_string(60,5,msg);    }    return 0;}int     app2(void){    long i = 0;    char    msg[32];    for(;;)    {        sprintf(msg,"app2.%8ld ",i++);        Con_write_string(60,6,msg);    }    return 0;}void main(void){    Disable_irq();                Proc_initial();    Clk_initial();        Enable_irq();        Proc_create("app1",app1,0,MAKE_STACK(stack1,STACK_SIZE));    Proc_create("app2",app2,0,MAKE_STACK(stack2,STACK_SIZE));        for(;;)    {        Cpu_hlt();    }    }

 

一些辅助程序如下:

#define Disable_irq()               do{ asm{ cli } }while(0)#define Enable_irq()                do{ asm{ sti } }while(0)

 

#define MAKE_STACK(sp,size)         (void *)(((uint_t)(sp) + (size)) & (~7))


 

_Cpu_hlt:db 0f4hdb 0f4hdb 0f4hdb 0f4hdb 0f4hret

f4h是停机指令的机器码,这个指令是稍后的CPU才支持,BC31不能识别,所以就直接采用机器码编程。这个程序主要作用是在系统没有其他进程是,可以让CPU停止运行,减少能量消耗。
 

测试的方式是建立两个死循环的程序,这两个程序向屏幕的指定位置输出不断变化的字符串。按照正常的理解,这两个程序是不能同时执行的,但是在Lenix下,就可以做到同时运行。也就是说,Lenix实现了一个基本多任务管理。

看看Lenix运行的截图: