Linux的进程 嵌入式系统实验室 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FOR ADVANCED STUDY OF USTC
Linux的进程
主要内容 进程描述符 冬进程切换 进程的创建和删除 大 必进程调度 1958 orvare of Science and Technolo 2023/7/14 嵌入式系统实验室 Linux操作系统分析 4/65 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 Linux操作系统分析 4/65 主要内容 ❖进程描述符 ❖进程切换 ❖进程的创建和删除 ❖进程调度
进程和线程 多道程序对操作系统的需求)进程 ·进一步提高并发度,对操作系统的需求 )线程 冬进程是执行程序的一个实例 冬进程和程序的区别 >几个进程可以并发的执行一个程序 >一个进程可以顺序的执行几个程序 冬线程和进程的区别 Liuⅸ2.4内核以及之前的版本都不支持线程 >2.6内核中有thread,但仍不是线程 Liux中的线程是在用户态实现的,不是本课程的内容 但Linux内核对用户态线程有一定的辅助支持 嵌入式系统实验室 2023/7/14 Linux操作系统分析 5/65 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 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 01031: unsigned int ptrace;
2023/7/14 Linux操作系统分析 6/65 进程描述符 ❖为了管理进程,内核必须对每个进程进行清晰的 描述。 ❖进程描述符提供了内核所需了解的进程信息 ➢源码include/linux/sched.h定义 struct task_struct ➢数据结构很庞大 ⚫基本信息 ⚫管理信息 ⚫控制信息
state flags need resched counter nike = next task prev task -。-一 run_list 中中=于m中✉ ttystruct p_optr 444a=4 tty assocloted with the process P_pptr 一 作struct Corent directory 当。= tty ■} ACLAASEL8 files struct ointers t加fe descnptors mmstruct thread Pant超s to memory wreds descnotors fs signal struct files mm Signais received sigmask_lock sig 室 JRY
2023/7/14 Linux操作系统分析 7/65
Linux2.6进程的状态 00163: 00164: Task state bitmask.NOTE!These bits are also 00165: 米 encoded in fs/proc/array.c:get_task_state(). 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:#defineTASK_STOPPED 4 00177: #define TASK_TRACED 8 00178:/in tsk->exit state 00179:#define EXIT ZOMBIE 16d 00180:#define EXIT DEAD 32 简单过一下,与状态相关的一些宏 00181: /in tsk->state again 米 1)组合状态 00182: #define TASK DEAD 64 2)状态判断 00183:#define TASK WAKEKILL 128 3)状态设置 嵌入式系统实验室 2023/7/14 Linux操作系统分析 8/65 EMBEDDED SYSTEM LABORATORY 5uE料DUAN0 ITUTE FOR AOVANCED5 FUOY OF U百TC
2023/7/14 Linux操作系统分析 8/65 Linux2.6进程的状态 简单过一下,与状态相关的一些宏 1)组合状态 2)状态判断 3)状态设置 include/linux/sched.h
进程状态转换图 一个既在的 EXIT ZOMBIE 进程调用fork 或者 来创建一个 EXIT_DEAD 或者 新进程 TASK_DEAD 调度器选择一个task: schedule()call Task context switch 进程调用do_exit( forks 终止执行 TASK RUNNING TASK RUNNING 〔就绪,但是没 (正在运行) 有在运行) 进程被高优先级的 进程抢占 进程睡眠在等待特定事件 或是资源的等待队列上 TASK INTERRUP TIBLE 事件发生或资源可用,进 ox 程被唤醒并被放到运行 TASK UNINTERRUP TIBLE 队列上 (等待中)
2023/7/14 Linux操作系统分析 9/65 进程状态转换图 EXIT_ZOMBIE 或者 EXIT_DEAD 或者 TASK_DEAD
标识一个进程 。使用进程描述符地址 >进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便 使用PID(Process ID,PID) >每个进程的PID都存放在进程描述符的pid域中 ersity of Science and technolooy 嵌入式系统实验室 2023/7/14 Linux操作系统分析 10/65 EMBEDDED SYSTEM LABORATORY 5uE料DUN0 ITUTE FOR AOVANCED5 FUOY OF U百TD
2023/7/14 Linux操作系统分析 10/65 标识一个进程 ❖使用进程描述符地址 ➢进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便 ❖使用PID (Process ID,PID) ➢每个进程的PID都存放在进程描述符的pid域中
进程的PID 冬进程的pid字段 01095: pid_t pid; 01096: pid_t tgid; 00024: typedefkernel_pid_t pid_t; include/linux/types.h 00014: typedef int kernel_pid_t; include/asm-XXX/posix_typesYYY.h Pid最大值,参见kernel/pid.c 00045: int pid_max PID MAX DEFAULT; 顺序使用 && 00024: 循环使用 00025: This controls the default maximum pid allocated to a process 00026: */ include/linux/threads.h 00027: #define PID_MAX_DEFAULT (CONFIG_BASE_SMALL 0x1000 0x8000) 嵌入式系统实验室 2023/7/14 Linux操作系统分析 11/65 EMBEDDED SYSTEM LABORATORY SUZHOU INSTITUTE FON ADVANCED STUDY OF USTC
2023/7/14 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/linux/pid.h中 >What is struct pid?” struct upid /Try to keep pid chain in the same cacheline as nr for find pid int nr; struct pid_namespace *ns; struct hlist node pid chain; }; struct pid atomic_t count; /lists of tasks that use this pid * struct hlist_head tasks [PIDTYPE_MAX]; struct rcu head rcu; unsigned int level; struct upid numbers[1]; static inline pid_t pid_nr(struct pid *pid) Cience an pid t nr =0; if (pid) nr pid->numbers[0].nr; 2023/7/14 Linux操作系统分析 return nr;
2023/7/14 Linux操作系统分析 12/65 stuct pid ❖阅读include/linux/pid.h中 ➢“What is struct pid?