Linux的进程管理(一)课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Linux的进程管理(一)课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 进程 管理 课件
- 资源描述:
-
1、21. 进程、线程和轻量级进程的概念2. 进程描述符3. 进程状态4. 如何标识一个进程5. 进程内核栈6. 进程间的关系7. 与进程创建相关的系统调用31. 进程是程序执行的一个实例,是有限状态机的一次迁移过程。2. 进程和程序的区别:动态与静止;多对一3. 进程是资源分配的实体,这些资源包括:PID、task_struct、独立的内存地址空间、打开的文件描述符、信号处理函数对应表、挂起的信号等。4. 线程是进程内一个独立的执行线路,是CPU调度的实体。5. 线程共享所属进程的资源,但也有私有资源:栈、CPU寄存器状态、CPU时间片、优先级、线程局部存储TLS6. 在Linux下,线程是利用
2、轻量级进程机制实现的。7. 多个轻量级进程共享同一套资源(同一内存空间),但具有不同的栈和CPU寄存器状态。41. 进程描述符与进程一一对应,记录了与进程相关的所有信息2. 进程描述符一般较大,(32位机1.7KB)3. 创建进程描述符时使用了SLAB分配器5Linux2.6进程的状态进程的状态include/linux/sched.h2022-4-25Linux操作系统分析操作系统分析7/65进程状态转换图进程状态转换图EXIT_ZOMBIE或者或者EXIT_DEAD或者或者TASK_DEAD如何如何标识一个进程标识一个进程使用进程描述符地址进程和进程描述符之间有非常严格的一一对应关系,使得
3、用32位进程描述符地址标识进程非常方便使用PID (Process ID,PID)每个进程的PID都存放在进程描述符的pid域中进程的进程的PID进程的pid字段Pid最大值,参见最大值,参见kernel/pid.c顺序使用顺序使用&循环使用循环使用include/linux/types.hinclude/asm-XXX/posix_typesYYY.hinclude/linux/threads.h101. 32位机上,PID最大为327672. 为了循环使用PID编号,内核定义了一个pidmap_array位图, pidmap_array包含32768个位,刚好放到一个页框中。3. allo
4、c_pid是如何实现的?(last_pid变量)111. 如何实现find_task_by_pid(nr)?2. pidhash table(固定数组,一般占4个页框,2048个表项)12struct pid_link int nr; / pid的数值 struct hlist_node pid_chain; struct list_head pid_list;struct task_struct struct pid_link pids4; 1314/65进程和进程的进程和进程的内核内核堆栈堆栈Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_
5、info进程的内核态堆栈进程处于内核态时使用,不同于用户态堆栈内核控制路径内核控制路径所用的堆栈很少,因此对栈和Thread_info来说,8KB足够了 Thread_info 151. 用户态和内核态的区别?2. 从用户态切换到内核态的3种方式: 系统调用:int 80 或 sysinter 中断 异常3. 从用户态切换到内核态后:进程上下文(主要指页表)不切换CPU自动切换到当前进程对应的内核态堆栈工作CPU自动将用户态的寄存器状态和返回地址存放到内核栈Thread_unionC语言允许用如下的一个union结构来方便的表示这样的一个混合体thread_info由体系结构相关部分定义由体系
6、结构相关部分定义阅读阅读include/asm-x86/thread_info.h 以及以及include/asm-x86/thread_info_32.hinclude/linux/sched.hCurrent宏的使用宏的使用Current宏可以看成当前进程的进程描述符指针,在内核中直接使用举例:比如current-pid返回在CPU上正在执行的进程的PIDcurrent宏的实现:#define get_current() (current_thread_info()-task)#define current get_current()current_thread_info的汇编代码是:mo
7、vl $-THREAD_SIZE, %eax; andl %esp, %eax其中#define THREAD_SIZE (2*PAGE_SIZE)内核栈内核栈thread_infotask_struct*taskvoid* stacktask_struct211. 父子关系:parent,real_parent,children2. 兄弟关系:sibling3. 线程组关系:tgid, group_leader, thread_group4. 进程组关系: signal-pgrp5. 会话组关系: signal-session6. 被调试关系:ptrace_children, ptrace_
8、list7. 系统中所有进程的task_struct被串成一个双向循环链表22手工启动手工启动p前台启动:前台启动:shellshell中输入命令:中输入命令:programprogramp后台启动:后台启动:shellshell中输入命令:中输入命令:program&program&调度启动调度启动p利用利用atat命令在指定时刻启动命令在指定时刻启动p利用利用croncron命令定期启动命令定期启动进程的创建和执行:进程的创建和执行: Linux中进程的创建进程被分解到两个单独的函数中取执行:fork()和exec函数族。首先,fork()通过拷贝当前进程创建一个子进程,子进程与父进程的区
9、别仅仅在于不同的PID、PPID和某些资源及统计量。exec函数族负责读取可执行文件并将其载入地址空间开始运行。进程的终止:进程的终止: 进程终结也需要做很多繁琐的收尾工作,系统必须保证进程所占用的资源回收,并通知父进程。Linux首先把终止的进程设置为僵尸状态,这个时候,进程无法投入运行了,它的存在只为父进程提供信息,申请死亡。父进程得到信息后,开始调用wait函数族,最终赐死子进程,子进程占用的所有资源被全部释放。 fork() fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。 使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承
10、了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。 fork()函数语法:函数语法: forkfork的另一个例子的另一个例子int main()int var;pid_t pid;var = 88;if(pid = fork() 0) printf(fork errorn);else if (pid = 0) var+;else sleep(2);printf(pid = %d, var = %dn, getpid(), var
11、);return 0;连续调用连续调用3 3次次forkfork,共可产生多少个进程?,共可产生多少个进程?下面的程序一共输出多少个下面的程序一共输出多少个“-”-”?#include #include #include int main(void) int i; for(i=0; i2; i+) fork(); printf(-); return 0; 用户用户ID、用户组、用户组ID、进程组、进程组ID、会话、会话ID 当前工作目录、根目录、环境变量当前工作目录、根目录、环境变量 文件访问权限、资源访问权限文件访问权限、资源访问权限 信号屏蔽位信号屏蔽位 打开的文件描述符打开的文件描述符
12、进程地址空间(数据段、代码段、堆栈段)进程地址空间(数据段、代码段、堆栈段) int main(). / 遇到遇到两两个需要并行执行的任务:个需要并行执行的任务:和和pid = fork(); / 分身术分身术if (pid = 0) / 子进程处理任务子进程处理任务1else / 父进程处理任务父进程处理任务2return 0;int main() int fd1 = open(“data_file1”, ); int fd2 = open(“data_file2”, ); pid_t pid; if(pid = fork() =0) close(fd2); read(fd1, buffer
展开阅读全文