linux进程管理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系 统
unsigned short unsigned short unsigned short unsigned short
3.进程的族亲关系 .
计 算 机 操 作 系 统
数据类型 struct task_struct struct task_struct struct task_struct struct task_struct
环形双向链表
计 算 机 操 作 系 统
计 算 机 操 作 系 统
符号常量和全局变量
符号常量NR_TASKS决定了数组 决定了数组 的大小, 符号常量 决定了数组task的大小,它的默 的大小 认值为512: 认值为 : #define NR_TASKS 512 为了记录系统中实际存在的进程数目, 为了记录系统中 实际存在的进程数目,系统定义了一 实际存在的进程数目 个全局变量nr_tasks, 个全局变量 nr_tasks, 其值随系统中存在的进程数目 而变化: 而变化: int nr_tasks =1; 创建进程时, 创建进程时, nr_tasks加1,撤销进程时 加 ,撤销进程时nr_tasks减1 减 遍历所有进程结构体: 遍历所有进程结构体: #define for_each_task(p) for(p=&init_task; (p=p->next_task)!=&init_task;)
struct task_struct
名称 *p_opptr *p_pptr *p_cptr *p_ysptr *p_osptr
功能及作用 指向祖先进程任务结构体 的指针 指向父进程任务结构体的 指针 指向子进程任务结构体的 指针 指向弟进程任务结构体的 指针 指向兄进程任务结构体的 指针
计 算 机 操 作 系 统
机 操 作 系 统
long long unsigned long unsigned long
计 算 机 操 作
Байду номын сангаас
6.进程的时间信息 .
数据类型 long long long long
名称 start_time utime stime cutime cstime timeout
功能及作用 进程创建的时间 进程在用户态下耗费的时间 进程在核心态下耗费的时间 所有子进程在用户态下耗费的 时间 所有子进程在核心态下耗费的 时间 进程申请延时
struct task_struct struct task_struct
*next_run *prev_run
计 算
5.进程的调度信息 进程的调度信息
数据类型
名称 counter priority rt_priority policy
功能及作用 时间片计数器 进程优先级 实时进程的优先级 进程调度策略
功能及作用 进程接收到的信号 阻塞信号的掩码 信号处理函数表的指针 进程终止的信号 进程要释放的信号量 与信号量操作相关的等待队列
机 操 作 系 统
unsigned long unsigned long struct signal_struct int struct sem_undo struct sem_queue
系统堆栈, 系统堆栈,约7KB
Task_struct,约 , 1KB
计 算 机 操 作 系 统
2. Task_struct的主要内容
大小: 大小:100B 位置: 位置:include/linux/sched.h
struct task_struct {
计 算 机 操
/* * offsets of these are hardcoded elsewhere - touch with care */ volatile long state; unsigned long flags; int sigpending; mm_segment_t addr_limit; /* thread address space: 0-0xBFFFFFFF for user-thead 0-0xFFFFFFFF for kernel-thread */ struct exec_domain *exec_domain; volatile long need_resched; unsigned long ptrace; int lock_depth; …… /* journalling filesystem info */ void *journal_info; /* Lock depth */ /* -1 unrunnable, 0 runnable, >0 stopped */ /* per process flags, defined below */
计
进程控制块PCB
task_struct结构 任务结构体 结构(任务结构体 结构 任务结构体) 描述, 机 描述,
进程存在的标志, 进程存在的标志,采用 算
操 作 系 统
Linux为task_struct结构 Linux为task_struct结构 分配存储空间时,分配2 分配存储空间时,分配2 个页面(8192). 个页面(8192). 上部为系 统栈,下部为task_struct 统栈,下部为task_struct task_struct包含进程的所 task_struct包含进程的所 有管理信息
4.进程间的链接信息 .
数据类型 struct task_struct struct task_struct
名称 *next_task *prev_task
功能及作用 指向下一个任务结构体的指针 指向上一个任务结构体的指针 指向可运行队列的下一个任务 结构体的指针 指向可运行队列的上一个任务 结构体的指针
unsigned long
计 算 机 操 作 系 统
8.进程的文件信息 .
数据类型 struct fs_struct struct files_struct *fs
名称
功能及作用 进程的可执行映象所在的文 件系统 进程打开的文件
*files
计 算
9.与进程间通信有关的信息 .
数据类型
名称 signal blocked *sig exit_signal semundo *semsleeping
系 统
long unsigned long
计 算 机
7.进程的虚存信息 .
数据类型
名称 *mm *ldt saved_kernel_stack kernel_stack_page
功能及作用 进程的虚存信息 进程的局部描述符表指针 核心态下堆栈的指针 核心态下堆栈的页表指针
操struct mm_struct 作struct desc_struct 系unsigned long 统
计 算 机 操 作 系 统
3. 任务结构体的管理
Linux把系统中所有进程的 任务结构体集中进行管理 把系统中所有进程的任务结构体集中进行管理 把系统中所有进程的 任务结构体集中进行管理, 并根据需要把它们组织成各种不同的链表 队列) 组织成各种不同的链表( 并根据需要把它们 组织成各种不同的链表 ( 队列 ) 。 一个主要的链表结构是把所有进程的任务结构体相互 链接成一个环行双向链表 使用指针: 环行双向链表.使用指针 链接成一个环行双向链表.使用指针: struct task_struct *next_task; struct task_struct *prev_task; ; 链表首结点就是初始化进程 的任务结构体init_task, 链表首结点就是初始化进程 首结点就是初始化进程init的任务结构体 的任务结构体 , 系统还在的内核空间设置了一个指针数组 系统还在的内核空间设置了一个指针数组task[ ],该 指针数组 , 数组的每个元素指向一个任务结构体 struct task_struct *task[NR_TASKS]={&init_task};
计 算
Linux可执行程序的结构: 可执行程序的结构:
代码段(指令)
机 可执行程序 操
(可执行映象) 可执行映象) 数据段 (变量与数据结构) 采用虚拟存储 虚拟存储 器技术:只有 器技术 当前执行最近 需要的代码和 数据加载到内 存
作 系 统
装载程序 内存
计
ELF可执行文件格式
ELF header(ELF头部 头部) 头部 Program header table(程序头表 程序头表
算 ELF文件的总体布 机 操 作 系 统
Segment1(段1) ( ) Segment2(段2) ( ) ………
Sengmentn(段n) ( ) Setion header table(节头表,可选 节头表, 节头表 可选)
ELF头部
计
typedef struct{
算 机 操 作 系 统
unsigned char e_ident[EI_NIDENT]; /* 魔数和相关信息 */ Elf32_Half e_type; /* 目标文件类型 */ Elf32_Half Elf32_Word Elf32_Addr Elf32_Off Elf32_Off Elf32_Word Elf32_Half Elf32_Half Elf32_Half Elf32_Half Elf32_Half Elf32_Half e_machine; /* 硬件体系 */ e_version; /* 目标文件版本 */ e_entry; /* 程序进入点 */ e_phoff; /* 程序头部偏移量 */ e_shoff; /* 节头部偏移量 */ e_flags; /* 处理器特定标志 */ e_ehsize; /* ELF头部长度 */ 头部长度 e_phentsize; /* 程序头部中一个条目的长度 */ e_phnum; /* 程序头部条目个数 e_shnum; /* 节头部条目个数 */ e_shstrndx; /* 节头部字符表索引 */ */ e_shentsize; /* 节头部中一个条目的长度 */
计 算 机 操 作 系 统
第4章
Linux进程管理 Linux进程管理
计 算 机 操 作 系 统
进程组成:程序、数据、 进程组成:程序、数据、进程控制块
计 算 机 操 作 系 统
4.1 Linux进程概述
Linux可执行文件的形成: 可执行文件的形成:
源程序(.c) 编译 汇编语言程序(.S) 汇编 目标代码(.o) 链接 可执行程序(.exe) ……. 源程序(.c) 编译 汇编语言程序(.S) 汇编 目标代码(.o)
} Elf32_Ehdr;
程序头表
计 算 机 操 作 系 统
*/ } Elf32_Phdr; typedef struct { Elf32_Word Elf32_Off 处的偏移量 */ Elf32_Addr Elf32_Addr Elf32_Word Elf32_Word Elf32_Word Elf32_Word p_type; p_offset; p_vaddr; p_paddr; /* 段类型 */ /* 段位置相对于文件开始 /* 段在内存中的地址 */ /* 段的物理地址 */ /* 段在内存中的长度 */ /* 段的标记 */ /* 段在内存中对齐标记
作 系 统
};
Task_struct结构体成员
计 进程的状态和标志 1. . 算 机
数据类型 volatile long unsigned long 名称 state flags 功能及作用 进程的状态 进程的标志
操 进程的标识 2. . 作
int 数据类型 pid uid, gid euid, egid suid, sgid fsuid, fsgid 名称 功能及作用 进程标识号 用户标识号, 用户标识号,组标识号 用户有效标识号, 用户有效标识号 , 组有效标 识号 用户备份标识号, 用户备份标识号 , 组备份标 识号 用户文件标识号, 用户文件标识号 , 组文件标 识号
p_filesz; /* 段在文件中的长度 */ p_memsz; p_flags; p_align;
计 算 机 操 作 系 统
节头表
段由若干个节(Section)构成,节头表对每一个节 的信息有相关描述
计 算 机 操 作 系 统
1. 进程组成
Linux进程是由 进程是由: 进程是由 •正文段(text): 可执行程序的代码 正文段(text): •用户数据段 (user segment): 可执行程序的 用户数据段(user segment): 数据、 数据、堆栈 •系统数据段(system segment): 进程控制信 系统数据段(system segment): PCB、系统堆栈) 息(PCB、系统堆栈) 组成的一个动态实体。 组成的一个动态实体。