进程状态 ·可运行状态(TASK RUNNING) ● 可中断的等待状态(TASK INTERRUPTIBLE) ·不可中断的等待状态 (TASK_UNINTERRUPTIBLE) ·暂停状态(TASK STOPPED) ·僵死状态(TASK ZOMBIE) xlanchen@2006.6.8 Embedded Operating Systems 6
xlanchen@2006.6.8 Embedded Operating Systems 6 进程状态 ⚫ 可运行状态(TASK_RUNNING) ⚫ 可中断的等待状态(TASK_INTERRUPTIBLE) ⚫ 不可中断的等待状态 (TASK_UNINTERRUPTIBLE) ⚫ 暂停状态(TASK_STOPPED) ⚫ 僵死状态(TASK_ZOMBIE)
进程状态转换图 ●●● ●●●● 一个既在的 TASK ZOMBIE 进程调用fork 〔进程被终 来创建一个 止) 新进程 调度器选择一个task: schedule()call Task context switch 进程调用do exit forks 终止执行 TASK RUNNING TASK RUNNING 〔就绪,但是没 〔正在运行) 有在运行) 进程被高优先级的 进程抢占 进程睡眠在等待特定事件 或是资源的等待队列上 TASK INTERRUP TIBLE 事件发生或资源可用,进 ox 程被唤醒并被放到运行 TASK UNINTERRUP TIBLE 队列上 (等待中)
xlanchen@2006.6.8 Embedded Operating Systems 7 进程状态转换图
标识一个进程 ●使用进程描述符地址 进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便 ·使用PID(Process ID,PID) 。每个进程的PID都存放在进程描述符的pid域中 xlanchen@2006.6.8 Embedded Operating Systems 8
xlanchen@2006.6.8 Embedded Operating Systems 8 标识一个进程 ⚫ 使用进程描述符地址 ⚫ 进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便 ⚫ 使用PID (Process ID,PID) ⚫ 每个进程的PID都存放在进程描述符的pid域中
进程描述符 ●Linux为每个进程分配一个8KB大小的内存区 域,用于存放该进程两个不同的数据结构: 。进程描述符 。进程的内核堆栈 0x015无f肝 进程处于内核态时使用 STACK 不同于用户态堆栈 内核控制路径所用的堆栈 0x015fb000 很少,因此对栈和描述符 来说,8KB足够了 0x015ha878 0x015h3b PROCESS DESCRIPTOR xlanchen@2006.6.8 Embedded Opera awrent- 0x015fa000
xlanchen@2006.6.8 Embedded Operating Systems 9 进程描述符 ⚫ Linux为每个进程分配一个8KB大小的内存区 域,用于存放该进程两个不同的数据结构: ⚫ 进程描述符 ⚫ 进程的内核堆栈 进程处于内核态时使用 不同于用户态堆栈 内核控制路径所用的堆栈 很少,因此对栈和描述符 来说,8KB足够了
Task union C语言允许用如下的一个union:结构来方便的表 示这样的一个混合体 union task_union{ struct task struct task; unsigned long stack[INIT_TASK_SIZE/sizeof(long)]; }; =2048 xlanchen@2006.6.8 Embedded Operating Systems 10
xlanchen@2006.6.8 Embedded Operating Systems 10 Task_union ⚫ C语言允许用如下的一个union结构来方便的表 示这样的一个混合体 =2048