基于Linux的进程管理分析.doc_第1页
基于Linux的进程管理分析.doc_第2页
基于Linux的进程管理分析.doc_第3页
基于Linux的进程管理分析.doc_第4页
全文预览已结束

下载本文档

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

文档简介

基于的进程管理分析Linux崔 峰,蔡 尧,王新梅(西安电子科技大学 ISN 国家重点实验室,陕西 西安 710071)摘要:简要概括了 Linux 进程的一些简单概念,着重讨论了各进程状态间的相互转换关系及转换过程对应的数据在内存中的变化。关键词:Linux; 进程中图分类号: TP316.81文献标识码:A文章编号:1006- 6977(2007)09- 0024- 03Study on pr ocess management based on LinuxCUI Feng, CAI Yao, WANG Xin- mei(State Key Lab of ISN, Xidian university, Xian 710071, China)Abstr act:This article briefly introduces the notion of process,and mainly discusses the transform of pro-cesses in every state.We have given the changes of data architecture happened in memory during the transform.Key wor ds: Linux; processCPU 的系统,在某一时刻只能有一个进程运行。内核通过分时调度各个进程运行。Linux 系统中,一个进程可以在内核态(kernel mode)或用户态(user mode)下执行,因此,在 Linux 下内核堆栈和用户堆栈是分开的。用户堆栈用于进 程在用户态下临时保存调用函数的参数、局部变量 等数据。堆栈区含有程序执行函数调用时的信息。引言进程不是程序,虽然它由程序产生。程序只是 一个静态的指令集合,不占用系统的运行资源;而 进程(process)是一个随时都可能发生变化的、动态 的、使用系统运行资源的程序。一个程序可以启动 多个进程。利用分时技术,在 Linux 操作系统上可同 时运行多个进程。分时技术的基本原理是把 CPU 的 运行时间分成一个个规定长度的时间片。对于具有 单个 CPU 的机器,某一指定时刻只能运行一个进 程。但由于每个进程运行的时间片很短,所以表面 上看起来好像所有进程在同时运行。对于 Linux 系统,除第一个进程是“手工”建立 以外,其余进程都是使用系统调用 fork 创建的,被 创建的进程称为子进程(child process),原进程称为 父进程(parent process)。内核程序使用进程标识号(process id)标识每一个进程。进程由可执行代码、 数据、堆栈组成。进程中的代码和数据部分分别对应执行文件中的代码段和数据段。每个进程只能执 行自己的代码,访问自己的数据及堆栈区。进程间 的通信需要通过系统调用才能实现。对于只有一个1基本数据结构内核程序通过进程表管理进程,每个进程占进 程表中一项。在 Linux 系统中,进程表项是一个 task_struct 任务结构指针。任务数据结构定义在 in- clude/linux/sched.h 中。主要包括进程当前运行的状2态信息、信号、进程号、父进程号、运行累计时间值、正在使用的文件和本任务的局部描述符以及任务状态段信息。struct task_struct/进程标识号/父进程号/父进程组号/ 会话话long pidlong father long pgrp long session图 1 进程间状态转移图/会话首领/用户标识号/有效用户 id/保存的用户 id/组标识号/有效组 id/保存的组 id进程的状态以及堆栈的内容称为该进程的上下文。long leaderunsigned uid unsigned euid unsigned suid unsigned gid unsigned egid unsigned sgid当内核需要切换至另一个进程时,它就需要保存当前进程的所有状态(即当前进程的上下文),以便再 次执行进程时,能够恢复到切换时的状态。当前进 程上下文均保存在进程的任务数据结构中。在发生 中断时,内核在被中断服务结束时恢复执行被中断 的进程。volatitle long state /任务的运行状态:- 1 表示不可运行、0 表示就绪、0 表示已停止long counter/任务运行滴答数long priority/运行优先数。任务初始时 counter=priority进程运行状态及其转换关系一个进程在其生存期内,可处于一组的不同状 态称为进程状态。进程状态保存在进程任务结构的 state 字段中。当进程正在等待系统中的资源而处于 等待状态时,则称其处于睡眠等待状态。Linux 中的 睡眠可分为可中断睡眠和不可中断睡眠。进程间状 态转移图如图 1 所示。3/信号位图。每 bit 代表一种信号long signal/信号执行属性结构struct signaction sigaction32long blocked/进程信号屏蔽码int exit_code /任务执行停止的退出码。由返回给父进程unsigned long start_code /代码段地址unsigned long end_code/代码段长度unsigned long end_data/代码长度+数据长度/总长度unsigned long brkunsigned long start_stack /堆栈段地址/报警定时值(滴答数)/用户态运行时间/系统态运行时间/子进程用户态运行时间/子进程系统态运行时间/ 进程开始运行时刻long alarmlong utime long stime long cutime long cstimelong start_time运行状态当进程正由 CPU 执行,或已准备就绪可随时调 用程序执行,则称该进程被称为处于运行状态(run- ning)。进程可在内核态运行,也可在用户态运行。当 系统资源可用时,唤醒进程使其进入准备运行状 态,该状态则称为准备就绪状态。3.1unsigned short used_math /标志:是否使用协处理器/进程使用 tty 的子设备号。- 1 表示没有int tty使用unsigned umask/文件创建属性屏蔽位可中断睡眠状态当进程处于可中断等待状态时,系统不会调用 该进程执行。当系统产生一个中断或释放了进程正 在等待的资源,或进程收到一个信号,都可以唤醒 进程转换至准备就绪状态。struct m_inode *pwd /当前工作目录struct m_inode *root /根目录 i 节点结构struct m_inode *executable /执行文件 i 节点结构unsigned long close_on_exec/执行时关闭文件句柄位图 标志struct file *filpNR_OPEN /文件结构指针表。表项号即 是文件描述符值struct desc_struct ldt3/任务局部描述符表。0 表示空,1表示代码段,2 表示数据和堆栈段struct tss_struct tss/进程的任务状态段信息结构;当执行一个进程时,CPU 所有寄存器中的值、3.2不可中断睡眠状态该状态与上一状态相似,处于该状态的进程只 有采用 wake_up()函数唤醒时,才能转换至准备就绪 状态。3.4 僵死状态 当进程已停止运行,而其父进程还没有询问其状态时,称为僵死状态。当一个进程的运行时间片3.3程。另外,如果进程在内核执行时需要等待某个资源,此时该进程就会调用 sleep_on () 函数或 sleep_on_interruptible()函数自愿放弃 CPU 的使用权,而 让调度程序执行其他进程,则进程进入睡眠状态。只有当进程从“内核运行态”转换至“睡眠状 态”时,内核才会进行进程切换。在内核态运行的进 程不能被其他进程抢占,而且一个进程不能改变另 一个进程的状态。为了避免进程切换导致内核数据 错误,内核在执行临界区代码时禁止一切中断。任务的 counter。然后重新调用 schedule()函数,重新扫描任务数组中的所有处于运行状态,进行调度。4.4 进程切换 在进程切换之前,switch_to()首先检查要切换的进程是否为当前进程,如果是则直接退出。否则需将内核全局变量 current 置为新任务的指针,然后长跳转到新任务的任务状态段 TSS 组成的地址处,CPU 执行任务切换操作。此时 CPU 会把所有寄存器的状态保存到当前任务寄存器 TR 中 TSS 段选择符 所指向的当前进程任务数据结构的 TSS 结构,然后把新任务状态段选择符所指向的新任务数据结构的 TSS 结构中的寄存器恢复到 CPU,系统就正式开 始运行新切换任务。4.5 进程终止 当一个进程结束运行或中止运行,内核释放该进程所占用的系统资源,包括进程运行时打开的文 件、申请的内存等。用户调用 exit()时,将执行内核函数 do_exit()。该进程的管理进程初始化 引导程序把内核从硬盘加载到内存中,使系统44.1在保护模式下运行,开始执行系统初始化程序 init/main.c。首先确定如何分配使用系统物理内存,然后 调用内核的初始化函数分别对内存管理、中断处理、块设备和字符设备、进程管理以及硬盘、软盘硬 件初始化处理。此后,系统处于可运行状态。程序将其“手工”进程移动到任务 0,并使用 fork()函数,首 次创建进程 1。在进程 1 中,程序将继续进行应用环 境的初始化并执行 shell 登录程序。而原进程 0 则在 系统空闲时被调度执行,任务 0 仅由 pause()系统调用,还会调用调度函数。由于在创建新进程时,需要复制任务 0 的任务数据结构,包括其堆栈指针,因 此要求任务 0 的用户态堆栈在创建任务 1 之前保 持“干净”,以减少内存的不必要的复制,解决内存 短缺问题。4.2 进程创建Linux 系统创建新进程使用 fork()系统调用。所 有进程都是通过复制进程 0 得到的,都是进程 0 的子进程。而创建的子进程还可以继续向下创建自己的子进程,从而形成一个树形结构。4.3 进程调度Linux 进程是抢占式的。被抢占的进程仍然处 于运行状态,只是暂时没有被 CPU 运行。进程的抢占发生在进程用户态执行阶段,在内核态执行时是不能被抢占的。调度函数 schedule()先扫描任务数 组,再通过比较每个准备就绪状态运行时间递减计 数器 counter 的值,确定当前哪个进程运行时间最 少。其值最大者表明运行时间短,则选用该进程,并 使用任务切换宏转换至该进程运行。若处于运行状函数首先释放进程代码段和数据段占用的内存页,关闭进程已打开的所有文件,对进程使用的当前工作目录、根目录和运行程序的 i 节点同步操作。如果 子进程中含有进程,则让 init 进程作为其所有子进 程的父进程。如果进程是一个会话头进程并且有控 制终端,则释放控制终端,并向属于该会话的所有 进程发送 SIGHUP,进行挂断。然后把进程状态置为 僵死状态向其原父进程发送至 SIGCHLD 信号,通 知其某个子进程已经终止。最后 do_exit()调用函数 执行其他进程。在子进程执行时,父进程使用 wait()或 waitpid() 函数等待某个子进程终止。当等待子进程被终止且 处于僵死状态时,父进程就会把子进程运行使用的 时间累加到自己进程中。最终释放已终止的子进程 任务数据结构所占用的内存页,并置空子进程在任 务数组中占用的指针项。结束语进程是 Linux 系统中一个关键概念,对其进行 有效管理也是整个系统运行稳定的关键。了解研究 进程,也有助于理解整个 Linux 系统,为以后对 Lin- ux 系统整体学习奠定坚实基础。可以说,进程的管 理与控制是整个 Linux 系统的灵魂。 (下转第 29 页)5图 3 软件流程图电流。采用 MM908E625 内的时基模块计时,中断时间设为 35 ms,屏蔽时间设置为 210 ms,之后电机稳 定运行,电流也达到稳定。每个 H 桥的低端通道均带有电流反馈,该反馈 电流通过模拟多路复用器连接到 MCU 上的 ADC0 通道,当电机稳定运行后,首先通过 SPI 设置模拟多 路复用器寄存器,选择使用中的 H 桥低端驱动通道,这时对模拟多路复用器的输出进行 A/D 采样,判断电机运行电流的大小,当电流值超过 100 mA时便认为发生了堵转,这时通过 SPI 设置 H 桥寄存 器,关断 H 桥通道,停止电机运行。结束语本文采用飞思卡尔提供的单片智能分布式控 制器 MM908E625 实现后视镜的位置调整和折叠功 能,并具有完整的保护和诊断功能,电路板高度集 成,满足后视镜控制单元安装空间有限的要求和高4度的机械安装可靠性。实验证明,该系统运行良好,后视镜电机的控制是通过 LIN 总线传输指令来实现的,当接收到总线上的新指令时,判断后确 定启动电机还是停止电机。3.2 判断后视镜电机阻转 为了保护后视镜电机,需要在后视镜到达终点时停止电机,这就需要使用 MM908E625 内部 H 桥 提供反馈电流,在电机运行稳定后监测电流,当其大于某一个阈值时便认为后视镜到达终点,发生堵 转,并停止电机运行。在电机开始启动的一段时间内,电机的电流变 化比较大,无法通过

温馨提示

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

评论

0/150

提交评论