Linux进程管理(一)

上传人:x**** 文档编号:127842619 上传时间:2020-04-06 格式:PPT 页数:51 大小:2.15MB
返回 下载 相关 举报
Linux进程管理(一)_第1页
第1页 / 共51页
Linux进程管理(一)_第2页
第2页 / 共51页
Linux进程管理(一)_第3页
第3页 / 共51页
Linux进程管理(一)_第4页
第4页 / 共51页
Linux进程管理(一)_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《Linux进程管理(一)》由会员分享,可在线阅读,更多相关《Linux进程管理(一)(51页珍藏版)》请在金锄头文库上搜索。

1、Linux进程控制 2 主要内容 进程 线程和轻量级进程的概念进程描述符进程状态如何标识一个进程进程内核栈进程间的关系与进程创建相关的系统调用 3 进程 线程和轻量级进程 进程是程序执行的一个实例 是有限状态机的一次迁移过程 进程和程序的区别 动态与静止 多对一进程是资源分配的实体 这些资源包括 PID task struct 独立的内存地址空间 打开的文件描述符 信号处理函数对应表 挂起的信号等 线程是进程内一个独立的执行线路 是CPU调度的实体 线程共享所属进程的资源 但也有私有资源 栈 CPU寄存器状态 CPU时间片 优先级 线程局部存储TLS在Linux下 线程是利用轻量级进程机制实现

2、的 多个轻量级进程共享同一套资源 同一内存空间 但具有不同的栈和CPU寄存器状态 4 进程描述符task struct 进程描述符与进程一一对应 记录了与进程相关的所有信息进程描述符一般较大 32位机1 7KB 创建进程描述符时使用了SLAB分配器 5 进程描述符task struct Linux2 6进程的状态 include linux sched h 2020 4 6 Linux操作系统分析 7 65 进程状态转换图 EXIT ZOMBIE或者EXIT DEAD或者TASK DEAD 如何标识一个进程 使用进程描述符地址进程和进程描述符之间有非常严格的一一对应关系 使得用32位进程描述符

3、地址标识进程非常方便使用PID ProcessID PID 每个进程的PID都存放在进程描述符的pid域中 进程的PID 进程的pid字段 Pid最大值 参见kernel pid c 顺序使用 循环使用 include linux types h include asm XXX posix typesYYY h include linux threads h 10 如何获得一个空闲的PID 32位机上 PID最大为32767为了循环使用PID编号 内核定义了一个pidmap array位图 pidmap array包含32768个位 刚好放到一个页框中 alloc pid是如何实现的 last

4、 pid变量 11 如何由PID获得对应的进程描述符 如何实现find task by pid nr pidhashtable 固定数组 一般占4个页框 2048个表项 12 structpid structpid link intnr pid的数值structhlist nodepid chain structlist headpid list structtask struct structpid linkpids 4 13 如何由PID获得对应的进程描述符 14 65 进程和进程的内核堆栈 Linux为每个进程分配一个8KB大小的内存区域 用于存放该进程两个不同的数据结构 Thread

5、info进程的内核态堆栈进程处于内核态时使用 不同于用户态堆栈内核控制路径所用的堆栈很少 因此对栈和Thread info来说 8KB足够了 Thread info 15 用户态到内核态的切换 用户态和内核态的区别 从用户态切换到内核态的3种方式 系统调用 int80或sysinter中断异常从用户态切换到内核态后 进程上下文 主要指页表 不切换CPU自动切换到当前进程对应的内核态堆栈工作CPU自动将用户态的寄存器状态和返回地址存放到内核栈 Thread union C语言允许用如下的一个union结构来方便的表示这样的一个混合体 thread info由体系结构相关部分定义阅读include

6、 asm x86 thread info h以及include asm x86 thread info 32 h include linux sched h Current宏的使用 Current宏可以看成当前进程的进程描述符指针 在内核中直接使用举例 比如current pid返回在CPU上正在执行的进程的PID current宏的实现 defineget current current thread info task definecurrentget current current thread info的汇编代码是 movl THREAD SIZE eax andl esp eax其中

7、 defineTHREAD SIZE 2 PAGE SIZE 21 进程间的关系 父子关系 parent real parent children兄弟关系 sibling线程组关系 tgid group leader thread group进程组关系 signal pgrp会话组关系 signal session被调试关系 ptrace children ptrace list系统中所有进程的task struct被串成一个双向循环链表 22 进程间的关系 进程启动 23 手工启动前台启动 shell中输入命令 program后台启动 shell中输入命令 program 调度启动利用at命

8、令在指定时刻启动利用cron命令定期启动 进程管理相关命令 24 25 在程序中创建与终止进程 进程的创建和执行 Linux中进程的创建进程被分解到两个单独的函数中取执行 fork 和exec函数族 首先 fork 通过拷贝当前进程创建一个子进程 子进程与父进程的区别仅仅在于不同的PID PPID和某些资源及统计量 exec函数族负责读取可执行文件并将其载入地址空间开始运行 进程的终止 进程终结也需要做很多繁琐的收尾工作 系统必须保证进程所占用的资源回收 并通知父进程 Linux首先把终止的进程设置为僵尸状态 这个时候 进程无法投入运行了 它的存在只为父进程提供信息 申请死亡 父进程得到信息后

9、 开始调用wait函数族 最终赐死子进程 子进程占用的所有资源被全部释放 fork函数 fork fork 函数用于从已存在的进程中创建一个新进程 新进程称为子进程 而原进程称为父进程 使用fork 函数得到的子进程是父进程的一个复制品 它从父进程处继承了整个进程的地址空间 包括进程上下文 代码段 进程堆栈 内存信息 打开的文件描述符 信号控制设定 进程优先级 进程组号 当前工作目录 根目录 资源限制和控制终端等 而子进程所独有的只有它的进程号 资源使用和计时器等 fork 函数语法 fork的另一个例子 intmain intvar pid tpid var 88 if pid fork 0

10、 printf forkerror n elseif pid 0 var else sleep 2 printf pid d var d n getpid var return0 关于fork的两个问题 连续调用3次fork 共可产生多少个进程 下面的程序一共输出多少个 include include includeintmain void inti for i 0 i 2 i fork printf return0 子进程复制了父进程的哪些资源 用户ID 用户组ID 进程组ID 会话ID当前工作目录 根目录 环境变量文件访问权限 资源访问权限信号屏蔽位打开的文件描述符进程地址空间 数据段 代

11、码段 堆栈段 Fork函数的应用逻辑 孙悟空逻辑 intmain 遇到两个需要并行执行的任务 任务1和任务2pid fork 分身术if pid 0 子进程处理任务1 else 父进程处理任务2 return0 Fork函数应用例1 intmain intfd1 open data file1 intfd2 open data file2 pid tpid if pid fork 0 close fd2 read fd1 buffer len 处理文件1的数据 else close fd1 read fd2 buffer len 处理文件2的数据 Windows创建进程API CreatePr

12、ocess BOOLCreateProcess LPCTSTRlpApplicationName 新进程将要使用的可执行文件的名字 路径 LPTSTRlpCommandLine 递给新进程的命令行字符串LPSECURITY ATTRIBUTESlpProcessAttributes LPSECURITY ATTRIBUTESlpThreadAttributes BOOLbInheritHandles DWORDdwCreationFlags LPVOIDlpEnvironment LPCTSTRlpCurrentDirectory LPSTARTUPINFOlpStartupInfo LPPR

13、OCESS INFORMATIONlpProcessInformation CreateProcess的应用逻辑 黑社会逻辑 Main exe 主控程序 黑社会BossA exe 专门处理任务A的程序 黑社会小弟B exe 专门处理任务A的程序 黑社会小弟intmain 遇到两个需要并行执行的任务 任务A和任务BCreateProcess A exe 叫个小弟来处理任务ACreateProcess B exe 叫个小弟来处理任务B 自己继续享受生活 exec函数 exec函数用于创建一个新的进程 新进程以另一个可执行程序为执行脚本 exec创建的新进程 占用了 原进程的绝大部分资源 进程地址空

14、间中装入了新的可执行程序 exec执行成功之后 原进程就 消失了 includeintexecl constchar path constchar arg 参数path 可执行文件的路径和名字构成的字符串arg 新程序的命令行参数1execl是一个不定参数函数 还可以传入多个命令行参数 最后一个参数必须是NULL 返回值 1表示出错 exec函数的例子1 includeintmain intargc char argv if execl bin echo echo executedbyexecl NULL 0 perror Erronexecl exec函数的例子2 如果还想保留父进程怎么办

15、includeintmain intargc char argv if fork 0 if execl bin echo echo executedbyexecl NULL 0 perror Erronexecl 父进程做其他事情return0 exec函数族 exec函数族使用区别 exec函数族使用区别查找方式表中的前四个函数的查找方式都是完整的文件目录路径 而最后两个函数 以p结尾的函数 可以只给出文件名 系统就会自动从环境变量 PATH 所指出的路径中进行查找 参数传递方式两种方式 逐个列举 将所有参数整体构造指针数组传递以函数名的第五位字母来区分的 字母为 l list 的表示逐个列

16、举的方式 其语法为char arg 字母为 v vertor 的表示将所有参数整体构造指针数组传递 其语法为 constargv 环境变量exec函数族可以默认系统的环境变量 也可以传入指定的环境变量 这里 以 e Enviromen 结尾的两个函数execle execve就可以在envp 中指定当前进程所使用的环境变量 exec与fork配合使用的效率问题 在Unix时代exec经常与fork配合使用 但这样做了大量的无用功 效率低下 为什么 为了解决该问题 在Unix时代创建了vfork函数与exec配合 vfork函数不复制父进程的资源 而是共享父进程资源 直到碰到exec函数才开始复制父进程的部分资源 不包括进程地址空间 在Linux时代 fork函数实现中引入了 写时拷贝CopyOnWrite 技术 fork exec的配合效率也很高 Linux时代 vfork几乎没有存在的必要 只被用在极少数场合 vfork函数 vfork 其功能类似于fork 但是有以下两点显著的不同 vfork 不同于fork 它没有复制自己的进程地址空间 而是共享父进程的 所以 子进程的改变也会引

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号