主要内容 令进程描述符 令进程切换 令进程的创建和删除 令进程调度 1958 2021/2/6 Linux操作系统分析 65 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
2021/2/6 Linux操作系统分析 3/65 主要内容 ❖进程描述符 ❖进程切换 ❖进程的创建和删除 ❖进程调度
进程和线程 ◇多道程序对操作系统的需求→进程 ◆进一步提高并发度,对操作系统的需求 →线程 ◆进程是执行程序的一个实例 进程和程序的区别 几个进程可以并发的执行一个程序 个进程可以顺序的执行几个程序 ◆线程和进程的区别 Linux24内核以及之前的版本都不支持线程 >2.6内核中有 thread,但仍不是线程 Linux中的线程是在用户态实现的,不是本课程的内容 ◆但 Linux内核对用户态线程有一定的辅助支持 2021/2/6 Linux操作系统分析 嵌入式系统实验室 5/65 EM日 EDDED SYSTEM LA日口 RATORY
2021/2/6 Linux操作系统分析 5/65 进程和线程 ❖ 多道程序对操作系统的需求➔进程 ❖ 进一步提高并发度,对操作系统的需求 ➔线程 ❖ 进程是执行程序的一个实例 ❖ 进程和程序的区别 ➢ 几个进程可以并发的执行一个程序 ➢ 一个进程可以顺序的执行几个程序 ❖ 线程和进程的区别 ❖ Linux 2.4内核以及之前的版本都不支持线程 ➢ 2.6内核中有thread,但仍不是线程 ❖ Linux中的线程是在用户态实现的,不是本课程的内容 ❖ 但Linux内核对用户态线程有一定的辅助支持
进程描述符 令为了管理进程,内核必须对每个进程进行清晰的 描述。 令进程描述符提供了内核所需了解的进程信息 源码 include/linux/sched.h定义 struct task struct 1958 数据结构很庞大 ●基本信息 ●管理信息 控制信息 01026: struct task struct 01027: volatile long state;/*-1 unrunnable, 0 runnable, >0 stopped * 01028: void *stack 01029: atomic_t usage 01030 unsigned int flags;/* per process flags, defined below unsigned int ptrace snDTtUIL I
2021/2/6 Linux操作系统分析 6/65 进程描述符 ❖为了管理进程,内核必须对每个进程进行清晰的 描述。 ❖进程描述符提供了内核所需了解的进程信息 ➢源码include/linux/sched.h定义 struct task_struct ➢数据结构很庞大 ⚫基本信息 ⚫管理信息 ⚫控制信息
stat ed resched counter IKE tty struct tty associated wirh the process P_pptr t struct 4.1 files struct Pointers to le descriptors mm strun thread Fainters to memory fs signal_struct files sigmask_lock 室
2021/2/6 Linux操作系统分析 7/65
Linux26进程的状态 00163 00164: Task state bitmask, note! these bits are also 00165: *encoded in fs/ proc/array c: get task stateo 00166 00167: * We have two separate sets of flags: task->state 00168: is about runnability while task ->exit state are 00169: about the task exiting Confusing, but this way 00170: modifying one set can t modify the other one by 00171:* mistake 00172: include/ linux/sched. h 00173: #define TASK RUNNING 0 00174: *define TASK INTERRUPtIble 1 00175: *define TASK UNINTERRUPTIBLE 2 00176: #define TASK STOPPED 00177: #define TASK TRACED 8 00178:/* in tsk->exit state k 00179: #define EXIT ZOMBIE 1 00180: #define EXIT DEAD 32 简单过一下,与状态相关的一些宏 00181:/ in tsk->state again 1)组合状态 00182: #define taSK dead 2)状态判断 00183:# define TAsK WAKEKILL1283)状态设置 2021/2/6 Linux操作系统分析 8/65 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
2021/2/6 Linux操作系统分析 8/65 Linux2.6进程的状态 简单过一下,与状态相关的一些宏 1)组合状态 2)状态判断 3)状态设置 include/linux/sched.h
进程状态转换图 一个既在的 EXIT ZOMBIE 进程调用fork 或者 来创建一个 EXIT DEAD 或者 新井程 TASK DEAD 调度器选择一个tsk: schedule call Task context switch 进程调用 do exit0 forks 终止执行 TASK RU卟G TASK RUNNING 〔就绪,但是没 〔正在运行 有在运行〕 进程被高优先级的 进程抢占 进程睡眠在等待特定事件 TASK INTERRUP TIBLE 或是资源的等待队列上 事件发生或资源可用,进 程被唤醒并被放到运 TASK UNINTERRUP TIBLE 队列上 〔等待中
2021/2/6 Linux操作系统分析 9/65 进程状态转换图 EXIT_ZOMBIE 或者 EXIT_DEAD 或者 TASK_DEAD
标识一个进程 令使用进程描述符地址 ≯进程和进程描述符之间有非常严格的一一对应关系 使得用32位进程描述符地址标识进程非常方便 ☆使用PID( Process id,PID) 每个进程的PID都存放在进程描述符的pid域中 2021/2/6 Linux操作系统分析 10/65 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
2021/2/6 Linux操作系统分析 10/65 标识一个进程 ❖使用进程描述符地址 ➢进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便 ❖使用PID (Process ID,PID) ➢每个进程的PID都存放在进程描述符的pid域中
进程的PID 令进程的pid字段 01095: pid t pid; 01096 pid t tgid 00024: typedef_ kernel_pid_t pid t; include/linux/types. h 00014: typedef int kernel_pid t; includelasm-XXX/posix types YYY. h Pid最大值,参见 kernel/pid.c 0005: int pid max= PID MAX DEFAULT;顺序使用 88 00024:/ 循环使用 00025: This controls the default maximum pid allocated to a process 00026:*/ includellinux/threads. h 00027: #define PID_MAX_DEFAULT(CONFIG_BASE_SMALL 0x1000: 0x8000) 2021/2/6 Linux操作系统分析 1165 嵌入式系统实验室 EM日 EDDED SYSTEM LA日口 RATORY
2021/2/6 Linux操作系统分析 11/65 进程的PID ❖进程的pid字段 Pid最大值,参见kernel/pid.c 顺序使用 && 循环使用 include/linux/types.h include/asm-XXX/posix_typesYYY.h include/linux/threads.h
stuct pid ☆阅读 include/ inux/pid. h中 “ What is struct pid? struct upid t Try to keep pid chain in the same cacheline as nr for find pid * int n struct pid namespace *ns struct hist node pid chain: struct pid a tomic t count k lists of tasks that use this pid */ struct hlist head tasks [PiDtYPE MAX]: struct rcu head rcu unsigned int level struct upid numbers [l]; static inline pid t pid nr(struct pid *pid pid t nr =0 if (pid nr= pid->numbe rs [o].nr; 2021/2/6 Linux操作系统分析 return nri
2021/2/6 Linux操作系统分析 12/65 stuct pid ❖阅读include/linux/pid.h中 ➢“What is struct pid?