书签 分享 收藏 举报 版权申诉 / 51
上传文档赚钱

类型Linux的进程管理(一)课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:2491260
  • 上传时间:2022-04-25
  • 格式:PPT
  • 页数:51
  • 大小:2.15MB
  • 【下载声明】
    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

    13、, len); / 处理文件处理文件1的数据的数据 else close(fd1); read(fd2, buffer, len); / 处理文件处理文件2的数据的数据 BOOL CreateProcess( LPCTSTR lpApplicationName, /新进程将要使用的可执行文件的名字新进程将要使用的可执行文件的名字(路径路径) LPTSTR lpCommandLine, /递给新进程的命令行字符串递给新进程的命令行字符串 LPSECURITY_ATTRIBUTES lpProcessAttributes。 LPSECURITY_ATTRIBUTES lpThreadAttribu

    14、tes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);Main.exe :主控程序,黑社会:主控程序,黑社会BossA.exe:专门处理任务:专门处理任务A的程序,黑社会小弟的程序,黑社会小弟B.exe:专门处理任务:专门处理任务A的程序,黑社会小弟的程序,黑社会小弟int main(). / 遇到遇到两两

    15、个需要并行执行的任务:个需要并行执行的任务:和和 CreateProcess(“A.exe”, ); / 叫个小弟来处理任务叫个小弟来处理任务A CreateProcess(“B.exe”, ); / 叫个小弟来处理任务叫个小弟来处理任务B . / 自己继续享受生活自己继续享受生活exec函数用于创建一个新的进程,新进程以另一个可执行程函数用于创建一个新的进程,新进程以另一个可执行程序为执行脚本。序为执行脚本。exec创建的新进程创建的新进程“占用了占用了”原进程的绝大部分资源,进程原进程的绝大部分资源,进程地址空间中装入了新的可执行程序。地址空间中装入了新的可执行程序。exec执行成功之后,

    16、原执行成功之后,原进程就进程就“消失了消失了”。#include int execl(const char *path, const char *arg, .) 参数参数path : 可执行文件的路径和名字构成的字符串可执行文件的路径和名字构成的字符串arg: 新程序的命令行参数新程序的命令行参数1execl是一个不定参数函数,还可以传入多个命令行参数,最是一个不定参数函数,还可以传入多个命令行参数,最后一个参数必须是后一个参数必须是NULL。返回值:返回值:-1 表示出错表示出错#include int main(int argc, char *argv) if(execl(/bin/ech

    17、o, echo, executed by execl, NULL)0)perror(Err on execl);如果还想保留父进程怎么办?如果还想保留父进程怎么办? #include int main(int argc, char *argv) if(fork()=0) if(execl(/bin/echo, echo, executed by execl, NULL)0)perror(Err on execl); / 父进程做其他事情父进程做其他事情 return 0; exec函数族使用区别函数族使用区别 查找方式查找方式 表中的前四个函数的查找方式都是完整的文件目录路径,而最后两个函数(

    18、以p结尾的函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。 参数传递方式参数传递方式 两种方式:逐个列举、将所有参数整体构造指针数组传递 以函数名的第五位字母来区分的,字母为“l”(list)的表示逐个列举的方式,其语法为char *arg;字母为“v”(vertor)的表示将所有参数整体构造指针数组传递,其语法为*const argv 环境变量环境变量 exec函数族可以默认系统的环境变量,也可以传入指定的环境变量。这里,以“e”(Enviromen)结尾的两个函数execle、execve就可以在envp中指定当前进程所使用的环境变量 在在Unix时代时

    19、代exec经常与经常与fork配合使用,但这样做了大配合使用,但这样做了大量的无用功,效率低下(为什么?)。量的无用功,效率低下(为什么?)。 为了解决该问题,在为了解决该问题,在Unix时代创建了时代创建了vfork函数与函数与exec配合。配合。vfork函数不复制父进程的资源,而是共享父函数不复制父进程的资源,而是共享父进程资源,直到碰到进程资源,直到碰到exec函数才开始复制父进程的函数才开始复制父进程的部分资源(不包括进程地址空间)。部分资源(不包括进程地址空间)。 在在Linux时代,时代,fork函数实现中引入了函数实现中引入了“写时拷贝写时拷贝Copy On Write”技术,

    20、技术,fork+exec的配合效率也很高。的配合效率也很高。 Linux时代,时代,vfork几乎没有存在的必要,只被用在极几乎没有存在的必要,只被用在极少数场合。少数场合。 vfork()其功能类似于fork(),但是有以下两点显著的不同: vfork()不同于fork() ,它没有复制自己的进程地址空间,而是共享父进程的,所以,子进程的改变也会引起父进程的改变 vfork()创建后子进程总是立即优先于父进程执行的 ,在子进程exec或者exit后,才会执行父进程。 vfork()函数语法:函数语法: pid_t vfork (void);int clone(int (*fn)(void *

    21、), void *child_stack, int flags, void *arg); clone可以让你有选择性的继承父进程的资源,你可以选择想vfork一样和父进程共享一个虚存空间,从而使创造的是线程,你也可以不和父进程共享,你甚至可以选择创造出来的进程和父进程不再是父子关系,而是兄弟关系。clone还可以为新进程指定EIP的值(令EIP指向fn指向的函数)fork的子进程和父进程不共享任何资源。Vfork = clone(EIP, ESP, CLONE_VFORK|CLONE_VM, 0);CLONE_PARENT 创建的子进程的父进程是调用者的父进程,新进程与创建它创建的子进程的父进

    22、程是调用者的父进程,新进程与创建它的进程成了的进程成了“兄弟兄弟”而不是而不是“父子父子” CLONE_FS 子进程与父进程共享相同的文件系统,包括子进程与父进程共享相同的文件系统,包括root、当前目录、当前目录、umask CLONE_FILES 子进程与父进程共享相同的文件描述符(子进程与父进程共享相同的文件描述符(file descriptor)表)表 CLONE_NEWNS 在新的在新的namespace启动子进程,启动子进程,namespace描述了进程的文件描述了进程的文件hierarchy CLONE_SIGHAND 子进程与父进程共享相同的信号处理(子进程与父进程共享相同的信

    23、号处理(signal handler)表)表 CLONE_PTRACE 若父进程被若父进程被trace,子进程也被,子进程也被trace CLONE_VFORK 父进程被挂起,直至子进程释放虚拟内存资源父进程被挂起,直至子进程释放虚拟内存资源 CLONE_VM 子进程与父进程运行于相同的内存空间子进程与父进程运行于相同的内存空间 CLONE_PID 子进程在创建时子进程在创建时PID与父进程一致与父进程一致 CLONE_THREAD Linux 2.4中增加以支持中增加以支持POSIX线程标准,子进程与父进程共线程标准,子进程与父进程共享相同的线程群享相同的线程群 exit()和和_exit(

    24、) exit()和_exit()函数都是用来终止进程的。当程序执行到exit()或_exit()时,进程会无条件地停止剩下的所有操作,清除包括各种数据结构,并终止本进程的运行。 int atexit(void (*function)(void); function是一个函数指针,指向程序退出时候调用的一个回调函数。利用该函数程序能够在最终关闭之前提供一个或者多个运行的清理函数 atexit用于注册一个或多个退出函数 exit()和和_exit()的执行过程的执行过程 exit()和和_exit()的区别的区别 _exit()函数的作用是直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中

    25、的各种数据结构; exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。 exit()函数与_exit()函数最大的区别就在于exit()函数在终止当前进程之前要检查该进程打开过哪些文件,把文件缓冲区中的内容写回文件,就是图中的“清理I/O缓冲”一项。 “标准文件I/O” exit()和_exit函数语法:僵尸进程产生条件僵尸进程产生条件子进程执行完毕;子进程执行完毕;父进程没有回收其状态;父进程没有回收其状态;子进程退出前会向父进程发送子进程退出前会向父进程发送SIGCHLDSIGCHLD信号信号父进程用父进程用waitwait和和waitpidwaitpid回收回收 wait()和和waitpid() wait()函数是用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。如果该父进程没有子进程或者他的子进程已经结束,则wait()就会立即返回。 waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能。 wait函数语法: wait()和和waitpid() waitpid函数语法:wait()和和waitpid() waitpid实例:

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:Linux的进程管理(一)课件.ppt
    链接地址:https://www.163wenku.com/p-2491260.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库