回头看进程的创建

来源:互联网 发布:python win32api 安装 编辑:程序博客网 时间:2024/04/29 13:05

这个时候回头看进程的创建,在进程池中查找空闲的进程对象时,就属于一个临界段代码,并没有任何的约束,所以这时存在很大的隐患的。现在利用锁机制对其进行改写,有了锁的保护,还可以同时加入pid生成代码。

proc_t  *   Proc_create(const char * name,void * entry,void * param,void * stack){    static uint32_t         pid = 0;    int                     i;    proc_t              *   proc;    uint_t              *   sp;            proc = NULL;        Lck_lock(&proc_lock);        for( i = 1 ; i < PROC_MAX ; i++)    {        if( PROC_STAT_FREE == proc_pool[i].proc_stat )        {            proc = proc_pool + i;            proc->proc_stat = -1;            break;        }     }        if( NULL == proc )    {        printf("no proc space\n");        Lck_free(&proc_lock);        return NULL;    }    create_pid:    pid++;    if( 0 == pid ) pid++;                              /*  0是系统进程的PID                */        for( i = 1 ; i < PROC_MAX ; i++)                   /*  检测PID是否存在重复             */    {        if( PROC_STAT_FREE == proc_pool[i].proc_stat ) /*  跳过空闲的进程对象              */            continue;                    if( pid == proc_pool[i].proc_pid )             /*  出现重复的pid,则重新生成一个   */            goto create_pid;                           /*  pid                             */            }        proc->proc_pid = pid;            Lck_free(&proc_lock);        /*  设置运行环境    */    sp      = stack;        sp--;    *sp--   = 0;                                       /*  进程退出代码                    */    *sp--   = (uint_t)param;                           /*  进程入口参数                    */    *sp--   = (uint_t)Proc_exit;                       /*  进程退出函数入口                */    *sp--   = (uint_t)entry;                           /*  进程入口                        */        *sp--   = 0x200;                                   /*  进程对应的机器状态字            */        *sp--   = 0;                                       /*  以下为寄存器环境                */    *sp--   = 0;    *sp--   = 0;    *sp--   = 0;        *sp--   = 0;    *sp--   = 0;    *sp--   = 0;    *sp     = 0;                                       /*  运行环境设置结束                */        strcpy(proc->proc_name,name);        proc->proc_stack        = sp;    proc->proc_entry        = entry;    proc->proc_cpu_time     = CPU_TIME;    proc->proc_stat         = PROC_STAT_RUN;                return proc;}


 

原创粉丝点击