《进程控制开发》PPT课件.ppt

上传人:sh****n 文档编号:6840810 上传时间:2020-03-06 格式:PPT 页数:68 大小:1,007KB
返回 下载 相关 举报
《进程控制开发》PPT课件.ppt_第1页
第1页 / 共68页
《进程控制开发》PPT课件.ppt_第2页
第2页 / 共68页
《进程控制开发》PPT课件.ppt_第3页
第3页 / 共68页
点击查看更多>>
资源描述
第7章进程控制 Linux进程概述Linux进程控制编程Linux守护进程实验 进程的定义 进程的参考定义有如下几种 1 进程是程序的一次执行过程 2 进程 PCB 程序 数据 3 进程是一个可拥有资源的独立实体 同时又是一个可以独立调度的基本单位 进程与程序的区别 动态性与静态进程由 创建 而产生 由 调度 而执行 由得不到资源而阻塞 由撤消而消亡 而程序是静态的 是完成某个特定功能的指令的有序序列 我们把程序看成是一个菜谱 而进程则是按照菜谱进行烹调的过程 结构特征从结构上看 每个进程是由程序段 数据段和进程控制块三部分组成 总称 进程映像 程序无控制块 进程与程序的区别 并发性多个进程实体 同存于内存中 能在一段时间内同时执行 程序是不能并发执行的 只有建立了进程 才能并发执行 独立性 进程是系统进行资源分配和调度的一个独立单位 程序则不是 进程具有创建其它进程的功能 小结 进程的状态 进程通常有3种状态 执行态 该进程正在运行 即进程正在占用CPU 就绪态 进程已经具备执行的一切条件 正在等待分配CPU的处理时间片 等待态 进程不能使用CPU 若等待事件发生 等待的资源分配到 则可将其唤醒 Linux进程状态 Linux进程状态及转换 fork TASK RUNNING 就绪 TASK INTERRUPTIBLE 浅度睡眠 TASK UNINTERRUPTIBLE 深度睡眠 TASK STOPPED 暂停 TASK ZOMBIE 僵死 占有 CPU 运行 do exit schedule ptrace schedule 时间片耗尽 等待资源到位 sleep on schedule 等待资源到位 interruptible sleep on schedule 资源到位 wake up interruptible 或收到信号 wake up 资源到位 wake up 收到信号 SIGCONT wake up TASK RUNNING 进程控制块 进程控制块是进程存在的标志 每一进程都有一进程控制块 Linux中用数据结构task struct表示 并将指向每个进程控制块的指针保存在一个数组task中 数组下标的最大值为512 表明Linux允许的进程数最多可有512个 Linux进程控制块也叫进程描述符 ProcessDescriptor 进程控制块信息分类 状态信息 描述进程状态的变化 链接信息 描述进程的父 子关系 各种标识符 用简单数字对进程进行标识 进程间通信信息 描述多个进程在同一任务上协作工作 时间和定时器信息 描述进程在生存周期内使用CPU时间的统计 计费等信息 调度信息 描述进程优先级 调度策略等信息 文件系统信息 对进程使用文件情况进行记录 虚拟内存信息 描述每个进程拥有的地址空间 处理器环境信息 描述进程的执行环境 处理器的寄存器及堆栈等 structtask struct volatilelongstate structthread info thread info atomic tusage unsignedlongflags unsignedlongptrace intlock depth ifdefined CONFIG SMP Linux进程控制块数据结构 unsignedlonglongtimestamp last ran unsignedlonglongsched time intactivated unsignedlongpolicy cpumask tcpus allowed unsignedinttime slice first time slice ifdefCONFIG SCHEDSTATSstructsched infosched info endifstructlist headtasks structlist headptrace children structlist headptrace list structmm struct mm active mm structlinux binfmt binfmt Linux进程控制块数据结构 longexit state intexit code exit signal intpdeath signal unsignedlongpersonality unsigneddid exec 1 pid tpid pid ttgid structtask struct real parent structtask struct parent structlist headchildren structlist headsibling structtask struct group leader Linux进程控制块数据结构 structpidpids PIDTYPE MAX structcompletion vfork done int user set child tid int user clear child tid unsignedlongrt priority cputime tutime stime unsignedlongnvcsw nivcsw structtimespecstart time unsignedlongmin flt maj flt cputime tit prof expires it virt expires unsignedlonglongit sched expires structlist headcpu timers 3 uid tuid euid suid fsuid gid tgid egid sgid fsgid structgroup info group info Linux进程控制块数据结构 kernel cap tcap effective cap inheritable cap permitted unsignedkeep capabilities 1 structuser struct user ifdefCONFIG KEYSstructkey thread keyring unsignedcharjit keyring endifintoomkilladj charcomm TASK COMM LEN intlink count total link count structsysv semsysvsem structthread structthread structfs struct fs Linux进程控制块数据结构 structfiles struct files structnamespace namespace structsignal struct signal structsighand struct sighand sigset tblocked real blocked structsigpendingpending unsignedlongsas ss sp size tsas ss size int notifier void priv void notifier data sigset t notifier mask void security structaudit context audit context seccomp tseccomp u32parent exec id u32self exec id Linux进程控制块数据结构 spinlock talloc lock spinlock tproc lock void journal info structreclaim state reclaim state structdentry proc dentry structbacking dev info backing dev info structio context io context unsignedlongptrace message siginfo t last siginfo wait queue t io wait u64rchar wchar syscr syscw Linux进程控制块数据结构 ifdefined CONFIG BSD PROCESS ACCT u64acct rss mem1 u64acct vm mem1 clock tacct stimexpd endif ifdefCONFIG NUMAstructmempolicy mempolicy shortil next endif ifdefCONFIG CPUSETSstructcpuset cpuset nodemask tmems allowed intcpuset mems generation endifatomic tfs excl Linux进程控制块数据结构 每个进程都有一个唯一的标识符PID 内核通过这个标识符来识别不同的进程 用户程序通过PID对进程发号施令 PID是32位的无符号整数 它被顺序编号 1 2 32767每个进程都属于某个用户组 task struct结构中还定义有用户标识符UID UserIdentifier 和组标识符GID GroupIdentifier 这两种标识符用于系统的安全控制 系统通过这两种标识符控制进程对系统中文件和设备的访问 进程标识符PID Linux下进程地址空间 Linux系统是一个多进程的系统 每个进程都是一个独立的运行单位 运行在独立的虚拟地址空间 即使一个进程发生异常 它也不会影响到系统中的其他进程 Linux下进程地址空间包含3个段 分别为 数据段 代码段 和 堆栈段 数据段 存放全局变量 常数以及动态分配的数据 数据段又可以再分成普通数据段 包括可读可写 只读数据段 存放静态初始化的全局变量或常量 BSS数据段 存放未初始化的全局变量 以及堆 存放动态分配的数据 代码段 存放程序代码 堆栈段 存放子程序的返回地址 参数以及程序的局部变量等 Linux下进程地址空间 Linux下进程的运特模式 在Linux系统中 进程的执行模式划分为用户模式和内核模式用户模式 若进程执行的是用户程序 应用程序或者内核之外的系统程序 则处在该模式下 也称为用户态内核模式 用户程序执行中出现系统调用或者发生中断事件 就要运行核心程序 进程模式就转变为内核模式 也称进入核心态内核模式下运行的进程可以执行机器的特权指令 访问受操作系统保护的资源 第7章进程控制 Linux进程概述Linux进程控制编程Linux守护进程实验 创建进程 fork fork1 c include include includeintmain pid tpid char message intn printf forkprogramstarting n pid fork switch pid case 1 perror forkfailed exit 1 case0 message Thisisthechild n 5 break default message Thisistheparent n 3 break for n 0 n puts message sleep 1 exit 0 示例补1 fork1forkprogramstartingThisistheparentThisisthechildThisistheparentThisisthechildThisistheparentThisisthechild ThisisthechildThisisthechild fork 从已存在的进程中创建一个称为子进程的新进程 而原进程称为父进程 fork 使用 写时复制 技术产生新进程 即只复制父进程的控制块 内核栈与页表并作必要修改即产生一个新 子进程 让子进程共享父进程的地址空间 包括代码段 进程堆栈 内存信息 打开的文件描述符 资源限制和控制终端等 当父 子进程中有一个要写入时才进行复制 增加一个拷贝 如果子进程产生后立即调用exec 函数 就可避免写时拷贝的额外开销 父子两个进程运行同一个程序 与创建进程的初衷相左 因此需要用一种方式来区分它们 并使它们运行不同的程序 否则 这两个进程不可能做不同的事 什么方式 条件或分支指令exec 函数 进程结构 进程创建 代码 数据 mm struct task struct vm area struct mm vmmap 进程地址空间 pdg 页表 物理内存 父进程 写时复制 让子进程先运行 其可能会执行exec 读入其代码执行 进程创建 mm struct vm area struct vmmap pdg 页表 fork 进程结构 进程创建 代码 数据 mm struct task struct vm area struct mm vmmap 进程地址空间 pdg 页表 物理内存 task struct mm 父进程 子进程 vfork exec函数族 1 exec函数族提供了一个在进程中启动另一个程序运行的方法 它可以根据指定的文件名或目录名找到可执行文件 并用它来取代原调用进程的数据段 代码段和堆栈段 在执行完之后 原调用进程的内容除了进程号外 其他全部被新的进程替换了 另外 这里的可执行文件既可以是二进制文件 也可以是Linux下任何可执行的脚本文件 使用exec函数族主要有两种情况 当进程认为自己不能再为系统和用户做出任何贡献时 就可以调用exec函数族中的任意一个函数让自己重生 如果一个进程想执行另一个程序 那么它就可以调用fork 函数新建一个进程 然后调用exec函数族中的任意一个函数 这样看起来就像通过执行应用程序而产生了一个新进程 这种情况非常普遍 exec函数族 2 exec函数族对应位的含义 exec函数族中各位的含义 示例 阅读并运行示例7 2 2 1阅读并运行示例7 2 2 2阅读并运行示例7 2 2 3阅读并运行示例7 2 2 4 execlp c include include includeintmain intret if ret fork 0 调用execlp函数 这里相当于调用了 ps ef 命令 if ret execlp ps ps ef NULL 0 printf Execlperror n returnret execl c include include includeintmain intret if ret fork 0 调用execl函数 注意这里要给出ps程序所在的完整路径 if ret execl bin ps ps ef NULL 0 printf Execlerror n returnret execle c include include includeintmain 命令参数列表 必须以NULL结尾 char envp PATH tmp USER david NULL if fork 0 调用execle函数 注意这里也要指出env的完整路径 if execle usr bin env env NULL envp 0 printf Execleerror n execlePATH tmpUSER david evecve c include include includeintmain 命令参数列表 必须以NULL结尾 char arg env NULL char envp PATH tmp USER david NULL if fork 0 if execve usr bin env arg envp 0 printf Execveerror n execlePATH tmpUSER david exit 和 exit 1 exit 和 exit 函数都是用来终止进程的 exit 函数的作用是直接调用exit系统调用使进程停止运行 清除其使用的内存空间 并清除其在内核中的各种数据结构 exit 函数在执行退出之前还要多做一些工作 即在调用exit系统之前要检查文件的打开情况 把文件缓冲区中的内容写回文件 就是图中的 清理I O缓冲 一项 由于在Linux的标准函数库中 有一种被称作 缓冲I O bufferedI O 操作 其特征就是对应每一个打开的文件 在内存中都有一片缓冲区 每次读文件时 会连续读出若干条记录 这样在下次读文件时就可以直接从内存的缓冲区中读取 同样 每次写文件的时候 也仅仅是写入内存中的缓冲区 等满足了一定的条件 如达到一定数量或遇到特定字符等 再将缓冲区中的内容一次性写入文件 exit 和 exit 2 这种技术大大增加了文件读写的速度 但也为编程带来了一些麻烦 比如有些数据 认为已经被写入到文件中 实际上因为没有满足特定的条件 它们还只是被保存在缓冲区内 这时用 exit 函数直接将进程关闭 缓冲区中的数据就会丢失 因此 若想保证数据的完整性 就一定要使用exit 函数 exit c include includeintmain printf Usingexit n printf Thisisthecontentinbuffer exit 0 exit c include includeintmain printf Using exit n printf Thisisthecontentinbuffer exit 0 exitUsingexit Thisisthecontentinbuffer exitUsingexit 示例7 2 3 Printf 缓冲I O方式 遇到 n 时自动从缓中区中将数据读出 教材关于exit 的小知识不正确 调用exit 后 进程处于僵死状态 TASK ZOMBIE 释放除内核栈与控制块task struct外的所有资源 直到父进程调用wait 后才释放全部资源 wait 和waitpid 1 wait 函数是用于使父进程 也就是调用wait 的进程 阻塞 直到一个子进程结束或者接到了一个指定的信号为止 如果该父进程没有子进程或者他的子进程已经结束 则wait 就会立即返回 waitpid 的作用和wait 一样 但它并不一定要等待第一个子进程的终止 可以通过选项设置它的行为 如可提供一个非阻塞版本的wait 功能 实际上wait 函数只是waitpid 函数的一个特例 在Linux内部实现wait 函数时直接调用的就是waitpid 函数 wait 和waitpid 2 wait c include include include includeintmain pid tpid char message intn intexit code printf forkprogramstarting n pid fork switch pid case 1 perror forkfailed exit 1 case0 message Thisisthechild n 5 exit code 37 break default message Thisistheparent n 3 exit code 0 break for n 0 n puts message sleep 1 exit 0 示例补 被取代 fork1forkprogramstartingThisistheparentThisisthechildThisistheparentThisisthechildThisistheparentThisisthechild ThisisthechildThisisthechild waitforkprogramstartingThisisthechildThisistheparentThisistheparentThisisthechildThisistheparentThisisthechildThisisthechildThisisthechildChildhasfinished PID 1582Childexitedwithcode37 示例 阅读并执行示例7 2 4 waitpid c intmain pid tpc pr pc fork if pc 0 printf Errorfork n elseif pc 0 子进程 子进程暂停5s sleep 5 子进程正常退出 exit 0 else 父进程 循环测试子进程是否退出 do pr waitpid pc NULL WNOHANG 父进程不阻塞 if pr 0 若子进程还未退出 则父进程暂停1s printf Thechildprocesshasnotexited n sleep 1 while pr 0 if pr pc printf Getchildexitcode d n pr else printf Someerroroccured n ThechildprocesshasnotexitedThechildprocesshasnotexitedThechildprocesshasnotexitedThechildprocesshasnotexitedThechildprocesshasnotexitedGetchildexitcode 75 当pr waitpid pc NULL 0 orpr wait NULL 时 输出 第7章进程控制 Linux进程概述Linux进程控制编程Linux守护进程实验 Linux守护进程 守护进程 后台服务进程 Daemon进程 是一个生存期较长的进程 通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件 守护进程常常在系统引导载入时启动 在系统关闭时终止 Linux有很多系统服务 大多数服务都是通过守护进程实现的 如第二章讲到多种系统服务都是守护进程 守护进程还能完成许多系统任务 例如 作业规划进程crond 打印进程lqd等也都是守护进程 Linux中每一个系统与用户进行交流的界面称为终端 每一个从此终端开始运行的进程都会依附于这个终端 这个终端就称为这些进程的控制终端 当控制终端被关闭时 相应的进程都会自动关闭 但是守护进程却能够突破这种限制 它从被执行开始运转 直到整个系统关闭时才会退出 如果想让某个进程不因为用户 终端或者其他的变化而受到影响 那么就必须把这个进程变成一个守护进程 守护进程的编写流程 会话期是一个或多个进程组的集合 一个会话始于用户登录 止于用户退出 此期间该用户运行的所有进程都属于这个会话期 1 2 3 4 5 dameon c创建守护进程实例 intmain pid tpid inti fd char buf ThisisaDaemon n pid fork 第一步 if pid0 exit 0 父进程推出 setsid 第二步 chdir 第三步 umask 0 第四步 for i 0 i getdtablesize i 第五步 close i 这时创建完守护进程 以下开始正式进入守护进程工作 while 1 if fd open tmp daemon log O CREAT O WRONLY O APPEND 0600 0 printf Openfileerror n exit 1 write fd buf strlen buf 1 close fd sleep 10 exit 0 tail f tmp dawmon logThisisaDaemonThisisaDaemonThisisaDaemonThisisaDaemon ps ef grepdaemon76root1272S daemon85root1520Sgrepdaemon 守护进程的出错处理 由于守护进程完全脱离了控制终端 因此 不能像其他普通进程一样将错误信息输出到控制终端来通知程序员 守护进程的一种通用的办法是使用syslog服务 将程序中的出错信息输入到系统日志文件中 从而可以直观地看到程序的问题所在 syslog是Linux中的系统日志管理服务 通过守护进程syslogd来维护 该守护进程在启动时会读一个配置文件 etc syslog conf 该文件决定了不同种类的消息会发送向何处 例如 紧急消息可被送向系统管理员并在控制台上显示 而警告消息则可被记录到一个文件中 守护进程的出错处理 openlog 函数用于打开系统日志服务的一个连接 syslog 函数是用于向日志文件中写入消息 在这里可以规定消息的优先级 消息输出格式等 closelog 函数是用于关闭系统日志服务的连接 第7章进程控制 Linux进程概述Linux进程控制编程Linux守护进程实验 第7章进程控制 要求 掌握进程相关的基本概念掌握Linux下的进程结构掌握Linux下进程创建及进程管理掌握Linux下进程创建相关的系统调用掌握守护进程的概念掌握守护进程的输出及建立方法学会编写多进程程序学会编写守护进程 实验1 多进程程序 1 1 实验目的通过编写多进程程序 使读者熟练掌握fork exec wait 和waitpid 等函数的使用 进一步理解在Linux中多进程编程的步骤 2 实验内容该实验有3个进程 其中一个为父进程 其余两个是该父进程创建的子进程 其中一个子进程运行 ls l 指令 另一个子进程在暂停5s之后异常退出 父进程先用阻塞方式等待第一个子进程的结束 然后用非阻塞方式等待另一个子进程的退出 待收集到第二个子进程结束的信息 父进程就返回 实验1 多进程程序 2 实验2 守护进程 1 1 实验目的通过编写一个完整的守护进程 使读者掌握守护进程编写和调试的方法 并且进一步熟悉如何编写多进程程序 2 实验内容在该实验中 读者首先建立起一个守护进程 然后在该守护进程中新建一个子进程 该子进程暂停10s 然后自动退出 并由守护进程收集子进程退出的消息 在这里 子进程和守护进程的退出消息都在系统日志文件 例如 var log messages 日志文件的全路径名因版本的不同可能会有所不同 中输出 子进程退出后 守护进程循环暂停 其间隔时间为10s 实验2 守护进程 2
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!