进程与线程.ppt
Linux系统分析系统分析 第 2讲 进程 与线程 叶保留 yebl@nju.edu.cn 南京大学计算机科学与技术系 教学目标 v理解进程 /线程基本概念 v理解 Linux中进程 /线程描述机制 v理解 Linux内核通用链表结构 v理解 Linux进程的内核管理机制 v理解 Linux进程 /线程创建与实现机制 v掌握 Linux线程编程技术 2 3 主要内容 v进程与线程基本概念 vLinux进程的描述与管理 vLinux内核通用链表 vLinux进程的实现机制 vLinux线程的实现机制 vLinux线程编程技术 进程与线程基本概念进程与线程基本概念 4 进程及线程 基本定义 v进程( process) Ø 处于执行期的 程序 及其所包含 资源 的总称 ü程序:可执行程序代码 ü资源 :打开文件 、 挂起信号、地址空间 、数据段等 v线程( thread) Ø 进程中活动的对象 ü有独立的程序计数器、进程栈及一组进程 寄存器 ü节省主存、减少管理开销、快速切换 进程与线程基本概念 5 进程与线程的区别 v从形态角度 Ø 一个进程 可包含 一个或多个线程 v从调度角度 Ø 进程是 资源分配 的 基本单位 Ø 线程是 处理器 调度 的 独立单位 v从虚拟化角度 Ø 进程提供两种虚拟 机制 ü虚拟处理器 :进程独享处理器的假象 ü虚拟内存 :进程拥有系统内所有内存资源的假象 Ø 线程之间 可共享 虚拟内存, 但各自拥有独立虚拟处理器 对对 Linux系统而言,线程只是一种特殊的进程!系统而言,线程只是一种特殊的进程! 进程与线程基本概念 6 进程构成要素 v正文段 Ø 存放 进程运行的代码,描述进程需完成 的 功能 v进程 数据段(地址空间) Ø 存放正文段在 执行期间所需的 数据和 工作区 ü包括 全局变量 、动态分配 的空间(调用 malloc函数 ) Ø 用户 栈也在该数据段开辟 ,存放函数 调用 时的栈 帧、局 部变量 等 v系统堆栈 Ø 每个进程捆绑一个,进程在 内核态 下工作时 使用 Ø 保存 中断 现场、执行 函数调用 时的参数 和返回地址 等 Ø 其中 最重要的数据结构 是 进程控制块 ( PCB) 进程与线程基本概念 7 进程运行环境状态 v背景 Ø 现代 CPU都有几种 不同的指令执行级别(特权等级) üintel x86 CPU分成 0 ~ 3四种不同执行级别 ü对 Linux系统而言 Ø 只使用其中 0级和 3级,分别表示 内核态 和 用户态 v运行环境状态分类 Ø 内核 态(亦称 核心态 或 系统态 ) ü可执行 特权指令 ,访问任意物理地址 (包括系统空间 ) Ø 用户 态 ü只能在对应级别允许的范围内活动 (用户空间) v分类作用 Ø 禁止用户直接修改操作系统数据或直接调用操作系统内 部函数 Ø 禁止用户程序直接和底层硬件打交道 进程与线程基本概念 8 进程运行环境状态的区分 vCS寄存器 最低 两 位 显示当前 代码的特权级 Ø CPU每条指令的读取都是通过 cs:eip这两个寄存器 ücs是代码段选择寄存器 üeip是偏移量寄存器 Ø 上述判断由硬件 完成 进程与线程基本概念 9 进程虚拟地址 v用户空间 Ø 可执行映象 :用户 进程本身的程序和 数据 Ø 进程堆栈 :进程 运行用户程序时使用的 堆栈 Ø 进程控制 /管理信息 :如 进程控制块 等 v系统空间 Ø 内核被映射到所有进程的系统空间 中 Ø 只允许进程在核心态下 访问 Ø 进程只能通过 系统调用 转换为核心态后,才能访问系统 空间 进程与线程基本概念 10 进程虚拟地址结构 v以 Linux系统为例(共 4G空间) Ø 用户空间 (0x 0000 0000 ~ 0x bfff ffff) ü可执行映象 ü进程运行时堆栈 ü进程控制信息,如进程控制块 Ø 内核空间 (0x c000 0000以上 ) ü内核被映射进程内核空间 ü只允许进程在核心态下访问 进程与线程基本概念 11 进程执行状态和 上下文环境 v进程上下文 Ø 系统提供给进程处于动态变化的运行环境 v系统上下文 Ø 系统完成自身任务时的运行环境,内核在系统上下文中 执行时不会阻塞 进程与线程基本概念 12 主要内容 v进程与线程基本概念 vLinux进程的描述与管理 vLinux内核通用链表 vLinux进程的实现机制 vLinux线程的实现机制 vLinux线程编程技术 13 Linux进程描述符 v进程描述符 Ø 数据结构: struct task_struct Ø 定义位置: include/linux/sched.h v进程描述符向量结构 Ø 数据结构: task[NR_TASKS] Ø 定义位置: include/linux/sched.h Ø 定义格式 struct task_struct *task[NR_TASKS] = {&init_task} #define NR_TASKS 512 Ø 说明 ü全局变量 NR_TASKS记录系统可容纳进程数,默认大 小是 512 Linux 的进程描述与管理 Linux进程描述符的信息组成 v进程状态信息 (state, flags, ptrace) v调度信息 (static_prio, normal_proi, run_list, array, policy) v内存管理 (mm, active_mm) v进程状态位信息 (binfmt, exit_state, exit_code, exit_signal) v身份信息 (pid, tgid, uid, suid, fsuid, gid, egid, sgid, fsgid) v家族信息 (real_parent, parent, children, sibling) v进程耗间信息 (realtime, utime, stime, starttime) v时钟信息 (it_prof_expires, it_virt_expires, it_sched_expires) v文件系统信息 (link_count, fs, files) vIPC信息 (sysvsem, signal, sighand, blocked, sigmask, pending) 14 Linux 的进程描述与管理 15 Linux进程 描述符与进程资源相关的信息 Linux 的进程描述与管理 Linux系统进程系统堆栈结构 v每个进程都要单独分配一个 系统堆栈 v结构组成 Ø 内核态的进程堆栈 Ø 进程描述符信息 (task_struct) v结构特点 Ø 8192( 213 )字节,两个页框 Ø 占据 连续 两个页框,且第一个页框起始地址为 213的倍数 16 Linux 的进程描述与管理 17 Linux 2.4进程系统堆栈结构 vLinux系统进程个数限制 Ø 所有进程 的 PCB及系统堆栈 占用空间 ≤1/2的物理内存 总和 两个连续物理页面两个连续物理页面 (( 8K)) 内核堆栈内核堆栈 进程描述符(约进程描述符(约 1K)) Linux 的进程描述与管理 18 Linux 2.4进程系统 堆栈数据结构定义 v结构定义 (/include/linux/sched.h) v进程 描述符管理 Ø 分配: alloc_task_struct() Ø 回收: free_task_struct() Ø 访问: get_task_struct() 2048 #define INIT_TASK_SIZE 2048*sizeof(long)Linux 的进程描述与管理 19 Linux 2.4 当前运行进程描述符的获取 v由 current来获取当前进程的进程 描述符 Ø 说明 üesp寄存器是 CPU栈指针, %esp 指向内核堆栈,存放 栈顶单元地址 ü~8191UL表示最低 13位为 0,其余 位全为 1 ü屏蔽 掉 % esp最低 13位后 ,得到 “两个连续的物理页面 ” 的 开头(基地址),从而得到指向 task_struct的 指针 8191=8192-1=0x2000-1=0x1fff 取反: 0xffffe000(最后 13位为 0) Linux 的进程描述与管理 current在内核堆栈的结构 20 Linux 的进程描述与管理 21 两个连续物理页面两个连续物理页面 (约(约 8K)) 内核堆栈内核堆栈 进程描述符(约进程描述符(约 52字节)字节) Linux 2.6进程系统堆栈结构 v进程描述符由 slab分配器动态生成 v栈底用新结构 struct thread_info,指向进程描述符Linux 的进程描述与管理 22 vthread_info结构定义 [include/asm-x86/thread_info_32.h] Ø thread_info( 52个 字节) Linux 2.6进程系统 堆栈数据结构定义 Linux 的进程描述与管理 23 vthread_uion定义 [/include/linux/sched.h] vTHREAD_SIZE定义 [include/asm-x86/thread_info_32.h] Linux 2.6进程系统堆栈数据结构定义 (续 ) Linux 的进程描述与管理 24 Linux 2.6 当前运行进程描述符的获取 v由 current来获取当前进程的进程描述符 Ø 根据 THREAD_SIZE大小,分别屏蔽掉内核栈的 12-bit LSB(4K)或 13-bit LSB(8K),从而获得内核栈的起始 位置 Ø 对应汇编指令 ümovl $0xfffe000, %ecx üandl %esp, %ecx ümovl %ecx, p Linux 的进程描述与管理 25 进程 标识 v成员名 : pid_t pid v功能 Ø 内核 通过 pid标识每个 进程 Ø pid与进程描述符之间 有严格 的一一对应关系 v数据类型说明 Ø pid_t实际上 是一个 int类型 Ø 取值范围: 0 ~ 32767 Ø 最大值修改: /proc/sys/kernel/pid_max Ø 生成新 pid: get_pid() Ø 获取进程 pid üps命令 ü访问 /proc/pid ügetpid()sys_getpid() Linux 的进程描述与管理 通过 ps命令获取进程信息 v功能 Ø 查看系统中正在运行的进程 v语法 Ø ps [-ef][-n name][-t ttys][-p pids][-u users][-groups] 26 运行的命令 用户 ID 进程占用 CPU的百分比 启动进程的终端号 进程开始的时 间和日期父进程号进程号 进程已占用的时间 Linux 的进程描述与管理 /proc目录下的进程信息 v在 /proc/pid下 Ø status :进程状态信息 Ø ctl :进程控制文件 Ø psinfo:进程 ps 信息 Ø as:进程地址空间 Ø map:进程映射信息 Ø object:进程对象信息 Ø sigact:进程信号量操作 Ø sysent:进程系统调用信息 Ø lwp/tid:进程核心线程标识符目录 Ø lwp/tid/lwpstatus:核心线程状态 Ø lwp/tid/lwpctl:核心线程控制文件 Ø lwp/tid/lwpsinfo:核心线程 ps 信息 27 Linux 的进程描述与管理 28 进程 组标识 v成员名 : pid_t tgid v功能 Ø 标识 进程是否属于同组,组 ID是第一个组内线程(父进 程)的 ID Ø 线程组中的所有线程共享相同的 PID v组 ID赋值相关操作 Ø 单 线程 进程: tgid和 pid相等 Ø 多 线程 进程:组内所有线程 tgid都 相等,且 等于父 进程 pid Linux 的进程描述与管理 29 用户相关的进程标识信息 v功能:控制用户对系统资源的访问权限 v分类 Ø 用户 标识 uid及组标识 gid ü 通常是进程创建者的 uid和 gid Ø 有效 用户标识 euid及有效组标识 egid ü 有时 系统会赋予一般用户暂时拥有 root的 uid和 gid(作为用 户进程的 euid和 egid),以便于进行 运作 Ø 备份用户标识 suid及备份组标识 sgid ü 让本来没有相应权限的用户运行这个程序时,可以访问没 有权限访问的资源 ü 如果被设置 SUID或 SGID位,分别表现在所有者或同组用户权限 的可执行位上,例如 Ø -rwsr-xr-x : SUID和所有者权限中可执行位被设置 Ø -rwSr--r--: SUID被设置,但所有者权限中可执行位未被设置 Ø -rwxr-sr-x: SGID和同组用户权限中可执行位被设置 Ø -rw-r-Sr--: SGID被设置,但同组用户权限可执行位 未 被设置 Linux 的进程描述与管理 30 用户相关的进程标识 信息(续) v功能:控制用户对系统资源的访问权限 v分类 Ø 文件系统 标识 fsuid及文件系统组标识 fsgid ü 检查 对文件系统访问 权限时使用,通常 与 euid及 egid相等 ü 构建一个类似文件服务器那样供任意用户操作的程序(如 NFS服务器),在保持 root权限的同时,在以普通用户身份 存取文件前只需要改变 fsuid和 fsgid,而不改变 euid及 egid, 可避免受恶意攻击 Linux 的进程描述与管理