一些内核进程调度API (3)

//进程状态描述
TASK_RUNNING             0              可运行状态,要么准备执行,要么正在执行


TASK_INTERRUPTIBLE       1              可中断的等待状态,进程在睡眠状态,直到某个条件为真
                                        才被调度执行,函数interruptible_sleep_on()使进程进入
该状态


TASK_UNINTERRUPTIBLE     2              和 TASK_INTERRUPTIBLE 类似,但是进入此状态将不能被唤醒
                                        uninterruptible_sleep_on() 使进程进入该状态


__TASK_STOPPED           4              此状态的进程的执行被暂停
__TASK_TRACED            8              此状态的进程的执行已由debugger程序暂停
EXIT_DEAD          16             僵死撤销状态,最终状态
EXIT_ZOMBIE          32             僵死状态,进程执行被终止,但是父进程没有发布wait4或
                                        waitpid,则此进程的描述符数据还存在,仍然可被父进程
使用


EXIT_TRACE          (EXIT_ZOMBIE | EXIT_DEAD) 复合


TASK_DEAD                64             死亡状态,函数do_exit()使进程进入此状态
TASK_WAKEKILL      128            唤醒杀死状态,和 TASK_UNINTERRUPTIBLE 类似,但是可以
                                        接收致命信号唤醒线程


TASK_WAKING          256            唤醒状态
TASK_PARKED          512            休眠状态
TASK_STATE_MAX      1024           预留,暂时无用
TASK_KILLABLE      (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)          可杀死状态
TASK_STOPPED      (TASK_WAKEKILL | __TASK_STOPPED)                暂停状态
TASK_TRACED          (TASK_WAKEKILL | __TASK_TRACED)                 跟踪状态
TASK_NORMAL          (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)     普通状态
TASK_ALL          (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED)  全状态
TASK_REPORT          (TASK_RUNNING | TASK_INTERRUPTIBLE | \          报告态
          TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \
          __TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD)




//用于唤醒等待队列中处于特定状态的进程,唤醒后获得CPU资源,从而被调度执行
/*wait_queue_head_t 等待队列头指针
  mode  处于如下状态的进程才能够被唤醒:TASK_ALL/TASK_NORMAL
                                        TASK_NORMAL:可中断或不可中断的等待状态的进程
TASK_ALL:   TASK_NORMAL及暂停状态和跟踪状态的进程
  nr_exclusive 唤醒等待队列中进程的个数:<0 时唤醒所有满足mode状态的进程
                                         >0 时扫描完等待队列,唤醒等待队列中进程的个数
  key 代表唤醒进程时执行的函数,一般传递NULL  
*/
void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr_exclusive , void *key)
{
unsigned long flags;


spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, 0, key);
spin_unlock_irqrestore(&q->lock, flags);
}
typedef struct __wait_queue_head wait_queue_head_t;
struct __wait_queue_head {
spinlock_t lock;          //资源访问锁
struct list_head task_list; //队列链表前后指针
};
struct list_head {
struct list_head *next, *prev;
};


//同步唤醒等待队列中处于特定状态的进程
void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
{
__wake_up_sync_key(q, mode, nr_exclusive, NULL);
}


//同上
void __wake_up_sync_key(wait_queue_head_t *q, unsigned int mode,
            int nr_exclusive    , void *key)
{
unsigned long flags;
int wake_flags = 1; /* XXX WF_SYNC */


if (unlikely(!q))
return;


if (unlikely(nr_exclusive != 1))
wake_flags = 0;


spin_lock_irqsave(&q->lock, flags);
__wake_up_common(q, mode, nr_exclusive, wake_flags, key);
spin_unlock_irqrestore(&q->lock, flags);
}


//更改当前进程的状态,将当前进程置于 TASK_RUNNING 态
typedef struct __wait_queue wait_queue_t;
struct __wait_queue {
unsigned int flags;     //优先级高低标志
void     *private;  //指向某一个进程的进程描述符
wait_queue_func_t func;      //进程唤醒函数指针
struct list_head task_list; //等待队列链表,指前指后
};
void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
              unsigned int mode   , void *key)
{
unsigned long flags;


__set_current_state(TASK_RUNNING);
spin_lock_irqsave(&q->lock, flags);
if (!list_empty(&wait->task_list))
list_del_init(&wait->task_list);
else if (waitqueue_active(q))
__wake_up_locked_key(q, mode, key);
spin_unlock_irqrestore(&q->lock, flags);
}

猜你喜欢

转载自blog.csdn.net/dummkopfer/article/details/80418045