Linux的进程管理(一)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内核栈
thread_info
task_struct *task
void* stack
task_struct
进程间的关系
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被串成一个双向循环链表
11
struct pid
struct pid_link { int nr; // pid的数值 struct hlist_node pid_chain; struct list_head pid_list;
}
struct task_struct { … struct pid_link pids[4]; …
15
Thread_union
C语言允许用如下的一个union结构来方便的表示 这样的一个混合体
include/linux/sched.h
thread_info由体系结构相关部分定义 阅读include/asm-x86/thread_info.h
以及include/asm-x86/thread_info_32.h
pidmap_array包含32768个位,刚好放到一个页框中。 3. alloc_pid是如何实现的?(last_pid变量)
10
如何由PID获得对应的进程描述符
1. 如何实现find_task_by_pid(nr)? 2. pidhash table(固定数组,一般占4个页框,2048个表项)
Thread_info
14/65
用户态到内核态的切换
1. 用户态和内核态的区别? 2. 从用户态切换到内核态的3种方式:
• 系统调用:int 80 或 sysinter • 中断 • 异常
3. 从用户态切换到内核态后:
• 进程上下文(主要指页表)不切换 • CPU自动切换到当前进程对应的内核态堆栈工作 • CPU自动将用户态的寄存器状态和返回地址存放到内核栈
21
进程间的关系
22
进程启动
手工启动
前台启动:shell中输入命令:program 后台启动:shell中输入命令:program&
调度启动
利用at命令在指定时刻启动 利用cron命令定期启动
23
进程管理相关命令
24
在程序中创建与终止进程
• 进程的创建和执行:
– Linux中进程的创建进程被分解到两个单独的函数中取执行:fork()和 exec函数族。首先,fork()通过拷贝当前进程创建一个子进程,子进 程与父进程的区别仅仅在于不同的PID、PPID和某些资源及统计量 。exec函数族负责读取可执行文件并将其载入地址空间开始运行。
3
进பைடு நூலகம்描述符task_struct
1. 进程描述符与进程一一对应,记录了与进程相关的所有信息 2. 进程描述符一般较大,(32位机1.7KB) 3. 创建进程描述符时使用了SLAB分配器
4
进程描述符task_struct
5
Linux2.6进程的状态
include/linux/sched.h
进程状态转换图
EXIT_ZOMBIE 或者
EXIT_DEAD 或者
TASK_DEAD
2019/4/29
Linux操作系统分析
7/65
如何标识一个进程
使用进程描述符地址
进程和进程描述符之间有非常严格的一一对应关系, 使得用32位进程描述符地址标识进程非常方便
使用PID (Process ID,PID)
每个进程的PID都存放在进程描述符的pid域中
Current宏的使用
Current宏可以看成当前进程的进程描述符指针 ,在内核中直接使用
举例:
比如current->pid返回在CPU上正在执行的进程的PID
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)
进程的PID
进程的pid字段
Pid最大值,参见kernel/pid.c
include/linux/types.h
include/asm-XXX/posix_typesYYY.h
顺序使用 && 循环使用
include/linux/threads.h
如何获得一个空闲的PID
1. 32位机上,PID最大为32767 2. 为了循环使用PID编号,内核定义了一个pidmap_array位图,
独立的内存地址空间、打开的文件描述符、信号处理函数对 应表、挂起的信号等。 4. 线程是进程内一个独立的执行线路,是CPU调度的实体。 5. 线程共享所属进程的资源,但也有私有资源:栈、CPU寄存 器状态、CPU时间片、优先级、线程局部存储TLS 6. 在Linux下,线程是利用轻量级进程机制实现的。 7. 多个轻量级进程共享同一套资源(同一内存空间),但具有 不同的栈和CPU寄存器状态。
}
12
如何由PID获得对应的进程描述符
13
进程和进程的内核堆栈
Linux为每个进程分配一个8KB大小的内存区域 ,用于存放该进程两个不同的数据结构:
Thread_info 进程的内核态堆栈
进程处于内核态时使用, 不同于用户态堆栈
内核控制路径所用的堆栈 很少,因此对栈和Thread_info 来说,8KB足够了
Linux进程控制
主要内容
1. 进程、线程和轻量级进程的概念 2. 进程描述符 3. 进程状态 4. 如何标识一个进程 5. 进程内核栈 6. 进程间的关系 7. 与进程创建相关的系统调用
2
进程、线程和轻量级进程
1. 进程是程序执行的一个实例,是有限状态机的一次迁移过程。 2. 进程和程序的区别:动态与静止;多对一 3. 进程是资源分配的实体,这些资源包括:PID、task_struct、