- 内核把进程存放在叫做任务队列的双向循环链表中。链表中的每一项都是类型为task_struct称为进程描述符的结构
- 通过current宏查找到当前正在运行进程的进程描述符
- 每个进程必然处于五种状态中的一种:
- TASK_RUNNING(运行)。正在执行或者在运行队列中等在执行
- TASK_INTERRUPTIBLE(可中断)。进程正在睡眠,等待某些条件达成,可变为运行状态
- TASK_UNINTERRUPTIBLE(不可中断)。不会因为接收到信号而被唤醒进入运行状态,其他与可中断状态一样。
- TASK_ZOMBIE(僵死)。进程已经结束,但保留描述符,等待父进程调用wait获取消息。
- TASK_STOPPED(停止)。进程没有投入运行也不能投入运行,通常发生在接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号的时候。
- 每个task_struct都包含一个指向其父进程叫做parent的指针,还包含一个称为children的子进程链表。
- for_each_process宏提供了依次访问整个任务队列的能力
- 内核把所有的线程都当做进程来实现。线程仅仅被视为一个与其他进程共享某些资源的进程
- 内核线程和普通的进程间的区别在于内核线程没有独立的地址空间。它们只在内核空间运行,从来不切换到用户空间。