《进程控制开发》PPT课件.ppt_第1页
《进程控制开发》PPT课件.ppt_第2页
《进程控制开发》PPT课件.ppt_第3页
《进程控制开发》PPT课件.ppt_第4页
《进程控制开发》PPT课件.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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 logThisisaDaemonThisisaDaemonThisisa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论