Linux进程管理一
Linux进程管理一
10
如何由PID获得对应的进程描述符
1. 如何实现find_task_by_pid(nr)? 2. pidhash table(固定数组,一般占4个页框,2048个表项)
Linux进程管理一
11
struct pid
struct pid_link { int nr; // pid的数值 struct hlist_node pid_chain; struct list_head pid_list;
Linux进程管理一
3
进程描述符task_struct
1. 进程描述符与进程一一对应,记录了与进程相关的所有信息 2. 进程描述符一般较大,(32位机1.7KB) 3. 创建进程描述符时使用了SLAB分配器
Linux进程管理一
4
进程描述符task_struct
Linux进程管理一
5
Linux2.6进程的状态
❖使用PID (Process ID,PID)
➢ 每个进程的PID都存放在进程描述符的pid域中
Linux进程管理一
进程的PID
❖进程的pid字段
include/linux/types.h
Pid最大值,参见kernel/pid.c
include/asm-XXX/posix_typesYYY.h
顺序使用 && 循环使用
❖举例:
➢ 比如current->pid返回在CPU上正在执行的进程的PID
Linux进程管理一
current宏的实现: #define get_current() (current_thread_info()->task) #define current get_current() current_thread_info的汇编代码是: movl $-THREAD_SIZE, %eax; andl %esp, %eax 其中#define THREAD_SIZE (2*PAGE_SIZE)
}
struct task_struct { … struct pid_link pids[4]; …
}
Linux进程管理一
12
如何由PID获得对应的进程描述符
Linux进程管理一
13
进程和进程的内核堆栈
❖Linux为每个进程分配一个8KB大小的内存区域 ,用于存放该进程两个不同的数据结构:
➢ Thread_info ➢ 进程的内核态堆栈
3. 从用户态切换到内核态后:
• 进程上下文(主要指页表)不切换 • CPU自动切换到当前进程对应的内核态堆栈工作 • CPU自动将用户态的寄存器状态和返回地址存放到内核栈
Linux进程管理一
15
Thread_union
❖C语言允许用如下的一个union结构来方便的表示 这样的一个混合体
include/linux/sched.h
Linux进程管理一
21
进程间的关系
Linux进程管理一
22
thread_info由体系结构相关部分定义 阅读include/asm-x86/thread_info.h
以及include/asm-x86/thread_info_32.h
Linux进程管理一
Linux进程管理一
Current宏的使用
❖Current宏可以看成当前进程的进程描述符指针 ,在内核中直接使用
include/linux/sched.h
Linux进程管理一
进程状态转换图
EXIT_ZOMBIE 或者 EXIT_DEAD 或者 TASK_DEAD
2021/3/16
Linux进程管理一
7
如何标识一个进程
❖使用进程描述符地址
➢ 进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便
include/linux/threads.h
Linux进程管理一
如何获得一个空闲的PID
1. 32位机上,PID最大为32767 2. 为了循环使用PID编号,内核定义了一个pidmap_array位图,
pidmap_array包含32768个位,刚好放到一个页框中。 3. alloc_pid是如何实现的?(last_pid变量)
进程处于内核态时使用, 不同于用户态堆栈
内核控制路径所用的堆栈 很少,因此对栈和Thread_info 来说,8KB足够了
Linux进程管理一
Thread_info
14
用户态到内核态的切换
1. 用户态和内核态的区别? 2. 从用户态切换到内核态的3种方式:
• 系统调用:int 80 或 sysinter • 中断 • 异常
Linux进程控制
Linux进程管理一
主要内容
1. 进程、线程和轻量级进程的概念 2. 进程描述符 3. 进程状态 4. 如何标识一个进程 5. 进程内核栈 6. 进程间的关系 7. 与进程创建相关的系统调用
Linux进程管理一
2
进程、线程和轻量级进程
1. 进程是程序执行的一个实例,是有限状态机的一次迁移过程。 2. 进程和程序的区别:动态与静止;多对一 3. 进程是资源分配的实体,这些资源包括:PID、task_struct、
独立的内存地址空间、打开的文件描述符、信号处理函数对 应表、挂起的信号等。 4. 线程是进程内一个独立的执行线路,是CPU调度的实体。 5. 线程共享所属进程的资源,但也有私有资源:栈、CPU寄存 器状态、CPU时间片、优先级、线程局部存储TLS 6. 在Linux下,线程是利用轻量级进程机制实现的。 7. 多个轻量级进程共享同一套资源(同一内存空间),但具有 不同的栈和CPU寄存器状态。
Linux进程管理一
内核栈
thread_info
task_struct *task
void* stack
பைடு நூலகம்
task_struct
Linux进程管理一
进程间的关系
1. 父子关系:parent,real_parent,children 2. 兄弟关系:sibling 3. 线程组关系:tgid, group_leader, thread_group 4. 进程组关系: signal->pgrp 5. 会话组关系: signal->session 6. 被调试关系:ptrace_children, ptrace_list 7. 系统中所有进程的task_struct被串成一个双向循环链表