进程及其调度管理毕业论文_第1页
进程及其调度管理毕业论文_第2页
进程及其调度管理毕业论文_第3页
进程及其调度管理毕业论文_第4页
进程及其调度管理毕业论文_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

电 子 科 技 大 学UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA学 士 学 位 论 文BACHELOR DISSERTATION论文题目 进程及其调度管理 学生姓名 学号 专业 学院 指导教师 指导单位 年 月 日摘 要随着信息技术的飞速发展,电脑已经在我们的生活中越来越重要。由于网络的普及,它使我们生活越来越离不开计算机。UNIX 是一种动态系统,能够适应不断变化的计算需求。UNIX 计算需求的表现是通过进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,进程及其调度管理一般管理就显得极为重要。在UNIX系统下,我们总是用命令来查看进程的信息,这样就给我们带来了很大的不便。另外,在用户的进程数量的管理上,没有规定每个用户可以创建几个任务,这样给进程的管理带来许多不便。我们要解决的就是使进程管理图形化,并且可以限制用户进程的数量。在基于gtk编程风格的基础上,通过监控/proc这样一个虚拟文件系统,完成进程的实时监控,并通过进程统计来限制进程的数量。通过解决上面提到的问题,使得UNIX下的进程管理监控更加图形化与人性化,被大家所接受,进程管理在现实应用中也得到广泛应用。关键词:UNIX; 进程监控限制; gtk; proc虚拟文件系统ABSTRACTABSTRACTWith the rapid development of information technology, computers have become increasingly important in our lives. Due to the popularity of the network,the computer makes our lives more and more inseparable. UNIX is a dynamic system that can adapt to computing changing needs. UNIX performance computing needs generic abstraction of the process-centric. The process can be short-term (from the command line command), or can be a long-term (a network service). Therefore, the general management of the process and its scheduling management becomes extremely important.On UNIX systems, we always use the command to view process information, so give us a lot of inconvenience. In addition, the number of processes management requires that each user can create several tasks, so that the management of the process will bring a lot of trouble. What we have to solve is the graphical process management, as well as limiting the number of user processes. Based on gtk framework programming style, by monitoring / proc virtual file system, we can real-timely monitor the completion of the process, limit the number of processes with a graphical management. To solve the problems mentioned above, make the UNIX process management and monitoring more graphical and user-friendly, be accepted easily, in the end the process-managed in the reality Applications also obtained widely.Keywords: UNIX; Process control and limit; gtk ; / proc virtual file system目录目 录第一章 引 言11.1 背景11.2 研究现状11.3 主要内容31.4 理论依据4第二章编程软件及开发环境52.1 操作系统ubuntu52.2 基于gtk+的C编程62.3 本章小结9第三章 软件需求103.1 需求分析103.1.1 功能需求103.1.2 安全需求123.2 软件的可行性123.2.1 系统规模和目标123.2.2 研究目前正在使用的系统133.2.3 导出软件模型173.3 软件结构化分析173.4 数据字典183.4.1 主要数据条目183.4.2 进程信息数据条目183.4.3 用户输入信息数据条目193.4 本章小结19第四章 概要设计204.1 总体设计204.1.1 处理流程204.1.2 总体结构和模块外部设计254.2 接口设计264.3 数据结构设计274.4 本章小结27第五章 详细设计与系统实现285.1 底层进程信息处理层设计285.1.1 提取进程信息模块的设计285.1.2 添加、删除、更新进程信息到本地进程数组315.2 显示界面进程信息处理设计335.2.1 用GTK定义进程树的视图335.2.2 进程树试图的基本操作的设计365.3 进程信息更新模块设计375.4 进程数量限制模块设计395.5 界面的设计405.6 本章小结41第六章 软件测试426.1 软件测试基础理论426.2 单元测试446.2.1 创建进程视图和界面测试446.2.2 添加、删除功能测试456.2.3 底层提取进程信息、结束进程功能测试466.3 集成测试486.4 系统测试486.4.1 进程的实时监控486.4.2 结束进程测试526.4.3 限制进程数量测试546.5 本章小结56第七章 结束语57参考文献58致 谢59外文资料原文60外文资料翻译7075第一章 引 言第一章 引 言1.1 背景Linux是一个多任务多用户操作系统,一个任务(task)就是一个进程(process)。每一个进程都具有一定的功能和权限,它们都运行在各自独立的虚拟地址空间。在Linux中,进程是系统资源分配的基本单位,也是使用CPU运行的基本调度单位1。Linux进程是由存放在磁盘上的可执行文件的代码和数据的集合称为可执行映象(Executable Image)组成的。当一个程序装入系统中运行时,它就形成了一个进程。进程是由正文段(text)、用户数据段(user segment)和系统数据段(system segment)组成的一个动态实体。段中存放着进程要执行的指令代码,具有只读的属性,用户数据段是进程在运行过程中处理数据的集合,它们是进程直接进行操作的所有数据,以及进程使用的进程堆栈。系统数据段存放着进程的控制信息。其中包括进程控制块PCB。进程控制块PCB是名字为task_struct的数据结构,它称为任务结构体。任务结构体中容纳了一个进程的所有信息,是系统对进程进行管理和控制的有效手段,是系统实现进程调度的主要依据。当一个进程被创建时,系统就为该进程建立一个task_struct任务结构体。当进程运行结束时,系统撤消该进程的任务结构体2。进程的任务结构体是进程存在的唯一标志。Linux在内存空间中开辟了一个专门的区域存放所有进程的任务结构体。在操作系统的内核空间设置了一个task数组,该数组的每一个元素是一个指向任务结构体的指针,所以task数组又称为task向量3。1.2 研究现状 UNIX 是一种动态系统,能够适应不断变化的计算需求。UNIX 计算需求的表现是以进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程及其调度管理一般管理就显得极为重要。在用户空间,进程是由进程标识符(PID)表示的。从用户的角度来看,一个 PID 是一个数字值,可惟一标识一个进程。一个 PID 在进程的整个生命期间不会更改,但 PID 可以在进程销毁后被重新使用,所以对它们进行缓存并不见得总是理想的4。在用户空间,创建进程可以采用几种方式。可以执行一个程序(这会导致新进程的创建),也可以在程序内,调用一个 fork 或 exec 系统调用。fork 调用会导致创建一个子进程,而 exec 调用则会用新程序代替当前进程上下文。在 Linux 内核内,进程是由相当大的一个称为 task_struct 的结构表示的。此结构包含所有表示此进程所必需的数据,此外,还包含了大量的其他数据用来统计(accounting)和维护与其他进程的关系(父和子)。现在,让我们来看看如何在 Linux 内管理进程。在很多情况下,进程都是动态创建并由一个动态分配的 task_struct 表示。一个例外是 init 进程本身,它总是存在并由一个静态分配的 task_struct 表示。在 ./linux/arch/i386/kernel/init_task.c 内可以找到这样的一个例子5。Linux 内所有进程的分配有两种方式。第一种方式是通过一个哈希表,由 PID 值进行哈希计算得到;第二种方式是通过双链循环表。循环表非常适合于对任务列表进行迭代。由于列表是循环的,没有头或尾;但是由于 init_task 总是存在,所以可以将其用作继续向前迭代的一个锚点。任务列表无法从用户空间访问,但解决方法有很多。可以以模块形式向内核内插入代码,也可以访问/proc文件系统等。 Linux的进程之间清晰的关系。所有的进程都是PID为1的Init进程的子进程。内核在启动过程中最后一步开始执行init进程,接下来,Init进程读取系统initscripts并执行其他的程序,最后完成整个启动过程。系统中的每个进程必有一个父进程,相应的,每个进程有0至多个子进程。同一进程的所有直系子进程称为兄弟。进程之间的关系存储在进程描述符中。每一个task_struct有一个指向父进程task_struct的指针parent,还有一个子进程链表children。因此,获得指定的当前进程的父进程采用如下代码:struct task_struct *my_parent=current-parent;类似的,可以采用下列代码遍历一个进程的子进程:struct task_struct *task;struct list_head *list;list_for_each(list,¤t-children)task=list_entry(list,struct task_struct,sibling);init任务的进程描述符静态的分配为init_task。下面的代码是一个比较好的表示所有进程之间关系的例子:struct task_struct *task;for(task=current;task!=&init_task;task=task-parent)实际上,你可以顺着关系从系统中的任一进程得到另外一个进程。因为任务链表是一个双向循环的链接表,得到给定的任务的下一个任务可以使用下列代码:list_entry(task-tasks.next,struct task_struct,tasks)得到上一个任务list_entry(task-tasks.prev,struct task_struct,tasks)for_each_process(task)宏遍历任务链表中的所有项。每一次循环,task指向了链表中下一个任务:struct task_struct *task;for_each_process(task)printk(%s%dn,m,task-pid);利用上面的方法,加载内核模块可以进行进程的监控。这样的做法速度快,但每次都要加载内核模块,操作复杂,并不能让用户所接受。而监控/proc虚拟文件系统是在用户太的操作,更加安全稳定。这里用的就是这个方法来实现进程的监控的6。1.3 主要内容我们主要的工作有两个,第一个就是对进程的实时监控;第二个就是限制进程的数量。进程监控这方面我们是通过监控/proc虚拟文件系统来实现的。/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。与其他文件系统不同,/proc 存在于内存之中而不是硬盘上7。/proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对 /proc 进行一次 ls -l 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为 /proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层 (VFS) 了。然而,直到当 VFS 调用它,请求文件、目录的 i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。/proc 文件系统可以用于获取运行中的进程的信息。在 /proc 中有一些编号的子目录。每个编号的目录对应一个进程 id (PID)。这样,每一个运行中的进程 /proc 中都有一个用它的 PID 命名的目录。里面包含了进程的一些信息。正是因为这个就可监控进程了。对于限制进程的数量是通过统计当前进程的数量,当进程数量超过上限时进结束刚刚创建的进程。这样做就可以达到限制进程数量的目的8。1.4 理论依据通过上面的讲述,我们已经知道/proc文件系统中有我们想要的进程信息,并且可以达到实时性。通过这个文件系统,我们会很好的完成进程的监控。另外,进程的限制上,我们是在用户太完成的。进程创建后超过进程的数量,那么它将被杀死。在进程创建后就会在/proc文件系统下创建一个目录,并以其进程号命名。当我们捕获这个信息时,首先看进程数量是不是超过上限,如果超过,就通过这个目录名(进程id)杀死这个进程,这样实现进程监控。第二章 编程软件及开发环境第二章编程软件及开发环境2.1 操作系统ubuntuUbuntu(友帮拓)是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。Ubuntu是基于Debian GNU/Linux,支持x86、amd64(即x64)和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造的开源GNU/Linux操作系统。Ubuntu对GNU/Linux的普及特别是桌面普及作出了巨大贡献,由此使更多人共享开源的成果与精彩。Ubuntu由Mark Shuttleworth(马克舍特尔沃斯,亦译为沙特尔沃斯)创立,Ubuntu以DebianGNU/Linux不稳定分支为开发基础,其首个版本于2004年10月20日发布。Debian依赖庞大的社区,而不依赖任何商业性组织和个人。Ubuntu使用Debian大量资源,同时其开发人员作为贡献者也参与Debian社区开发。而且,许多热心人士也参与Ubuntu的开发。Ubuntu的开发人员多称马克舍特尔沃斯为SABDFL(是self-appointed benevolent dictator for life的缩写,即自封的仁慈大君)。在2005年7月8日,马克舍特尔沃斯与Canonical有限公司宣布成立Ubuntu基金会,并对其提供1千万美元作为起始营运资金。成立基金会的目的是为了确保将来Ubuntu得以持续开发与获得支持,但直至2008年,此基金会仍未投入运作。马克舍特尔沃斯形容此基金会是在Canonical有限公司出现财务危机时的紧急营运资金。这里用到的是12.04桌面版。Overlay Scroolbar也将应用于xul(Firefox,Thunderbird)、vcl(Libreoffice)、swing(Java)和nux。Wayland有可能在Ubuntu 12.04中引入,但该任务层次较低,也会有一些工作牵扯到wayland。在Ubuntu 12.04中,Rtythmbox将代替 Banshee 成为默认音乐播放器;Tomboy和Gbrany也将从ISO文件中去除,这意味着Ubuntu 12.04将没有任何Mono应用。Zeitgeist Activity Log Manager有可能被移植到控制中心;PiTiVi 视频编辑器、GNOME Sushi和GNOME 文档在12.04不再为默认。Lubuntu:LightDM在Alpha 1版本中成为默认;添加Lubuntu软件中心,不会移除Synaptic;Viewnior 成为默认图片浏览器。Kubuntu:LightDM将会取代KDM,同时,LightDM会配有精美的Plasma 主题;同时,考虑用KDE-Telepathy取代Kopete;KDE内存使用降低到32%,KDE 启动时间缩短33%。GNOME版本:Ubuntu 12.04将大幅会使用GNOME 3.2应用,同时也将使用GTK 3.4,挑选部分GNOME 3.4 组件,如GNOME 游戏、Gedit等。大部分重要的应用仍使用3.2版本。gconf 和 GTK2亦有可能搭载在CD中9。2.2 基于gtk+的C编程GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。最初,GTK+ 是作为另一个著名的开放源码项目 GNU Image Manipulation Program (GIMP) 的副产品而创建的。在开发早期的 GIMP 版本时,Peter Mattis 和 Spencer Kimball 创建了 GTK(它代表 GIMP Toolkit),作为 Motif 工具包的替代,后者在那个时候不是免费的。(当这个工具包获得了面向对象特性和可扩展性之后,才在名称后面加上了一个加号。)这差不多已经 10 年过去了。今天,在 GTK+ 的最新稳定版本 2.8 版上(3.0测试中),仍然在进行许多活动,同时,GIMP 无疑仍然是使用 GTK+ 的最著名的程序之一,不过它已经不是惟一的使用 GTK+ 的程序了。已经为 GTK+ 编写了成百上千的应用程序,而且至少有两个主要的桌面环境(Xfce和GNOME)用 GTK+ 为用户提供完整的工作环境。GTK+虽然是用C语言写的,但是您可以使用你熟悉的语言来使用GTK+,因为GTK+已经被绑定到几乎所有流行的语言上,如:C+,PHP, Guile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel10。不论开发的需要是什么,GTK+ 可能就是您正在寻找的答案。GTK+ 提供了许多东西:它既现代,而且得到了积极的开发与维护,围绕它有一个充满活力的社区。它提供了广泛的选项,用于把工作扩展到尽可能多的人,其中包括一个针对国际化、本地化和可访问性的完善的框架。它简单易用,对开发人员和用户来说都是这样。它的设计良好、灵活而可扩展。它是自由软件,有一个自由的开放源码许可。它是可移植的,从用户和开发人员的角度都是这样。现代化、更新快GTK+ 是采用软件开发中的最新技术开发的,只要发现缺陷(BUG)(肯定有缺陷,因为没有任何软件是完美的),开发人员就会尽力在下一版本中修补缺陷。使用现代的软件意味着,您不会陷在过时的工作中,而跟不上时代的发展。持续的维护和开发也意味着您拥有影响工具包的未来发展方向的能力。另外,在出现新的发行版时,会引入基于用户反馈的新特性和新功能,而旧的问题则得到修补。国际化、可访问性。在创建要让所有人使用的软件的时候,请记住三个关键字:国际化、本地化和可访问性(通常分别缩写为 i18n、l10n和 a11y)。国际化:是将程序准备为被母语不是开发应用程序所采用的语言的人使用的过程,所以应用程序不依赖于对任何特定语言的任何假设。i18n 远远不只是对程序使用的文本进行翻译。它还意味着要考虑所使用的不同脚本和字母表、不同的编写方向、显示许多语言所需要的特殊处理以及为用户提供输入文本的适当方法。不是每种语言都可以简单地把每个字母映射到键盘上的不同键,而且还必须实现更好的复杂性,例如确保在错误消息中使用正确的复数。本地化:与 i18n 密切相关,因为为国际用户准备应用程序不仅仅是改变语言。程序还必须能够理解并尊重日期、货币显示、数字标注、文本排序所使用的不同习惯,以及许多可能不太注意的细节之处 例如有些符号的使用,在世界的不同地方可能会被认为是不恰当的或无礼的。正像 i18n,正确的l10n要求在代码中添加很多东西,而这些是事后很难轻松加入的。GTK+ 提供了针对 i18n 和l10n的恰当工具,会让代码(和二进制)可以在许多语言和地域上不加修改地运行。切换地域所需要的就是随操作系统(针对l10n)或者一个可独立于实际的程序进行处理和发布的翻译文件(针对 i18n)一起发布的一组数据。带来的灵活性会得到开发人员、翻译者和用户的热爱。可访问性:是让每个人都可以使用您的程序。有些用户的视力不佳,有些人可能不能用键盘或鼠标,而有些人可能只能移动他们的眼睛。要确保每个想使用您的应用程序的用户都能使用,需要做许多工作。幸运的是,GTK+ 提供了一个途径,可以通过一个完善的预先存在的 a11y 框架,立即得到这方面的支持,而您这边几乎什么工作也不需要做。使用这个框架(它是UNIX® 系统上的事实标准),可以把应用程序带给各类用户。您也能享受 a11y 的许多优势 例如执行自动 GUI 测试的能力。通过让特殊需求用户运行的可访问性软件可以使用您的应用程序,您也可以让测试软件可以访问它,例如,检查行为是否正确 这在传统的 GUI 编程中会带来严重的问题。以上三点可能是使用工具包的充足理由 特别是 GTK+,它在这三个领域都有优秀的支持。这个支持绝不完美,但在同类软件中是最好的,而且把这些关键字整合进应用程序的重要性并没有提到应有高度。在今天的世界中,计算机无处不在,用户众多而且独特,所以不能认为一个遗漏一整群用户的应用程序是一个完整的产品。简单易用:这一点应当很明显,但是它实际上含义丰富。工具包对用户应当容易,这样才有可能创建简单的、直觉的和乐于使用的界面,哪怕针对的是新手。创建人机交互的正确模型不是一项简单的任务,GTK+ 正是长时间工作的结果,而且是众多的甚至困难的决策的结果。GTK+ 对于开发人员也易于使用。它允许开发人员用简单的方式说出自己想要的东西,不会用所谓正规方式给开发人员带来负担,这些正规方式是计算机为了弥补它们固有的缺乏想像力的缺陷而施加给人类的负担。设计灵活、可扩展:编写 GTK+ 的方式允许在不扭曲基本设计的情况下,让维护人员添加新功能、让用户利用新功能。工具包也是可扩展的,这意味着可以向其中添加自己的块,并用使用内置块一样的方式使用它们。例如,可以编写自己的控制元素,比如说用于显示应用程序处理的科学数据,并让它正确地遵照用户选择的显示风格,就像 GTK+ 自身的控件那样。更进一步,GTK+ 是可定制的,这样就可以让它适应自己的需求。GTK+ 有一个系统,可以在所有应用程序之间复制设置,包括主题的选择。主题是一组一同发布的定制设置,会影响 GTK+ 使用的基本控件看起来的效果,甚至某种程度上的行为方式。使用主题,可以模拟另一个操作系统的观感。自由、开放:自由软件意味着每个人不仅可以自由地获得和使用这个工具包,还可以在满足某些条件的情况下修改并重新发布它。自由开放源码许可意味着这些条件不是严格限制的,可以得到的自由程度是显著的。最重要的是,GTK+ 采用了 Lesser General Public License (LGPL) 许可,这是 GNU 许可家族中一个不太严格的许可。LGPL 允许自由地获取、修改和发布它覆盖的任何软件,只要对修改也保持自由即可。LGPL 还允许任何人使用该库提供的功能,而不要求用户公开应用程序代码。(这对于许多工业应用来说很重要,因为由于以前的协议或许可,这种场合下一般不希望公开代码或者公开代码是显然不现实的。)使用 LGPL 许可,您既可以是开放源码社区的好伙伴也可以是好公民。可移植:最后(但并不是最不重要),GTK+ 是可移植的。这意味着用户可以在许多平台和系统上运行它。另一方面,开发人员可以把软件提供给众多用户,却只要编写一次程序,还可以使用许多不同的编程和开发平台、工具和编程语言。所有这些都可以理解为更多的潜在用户,您可以利用更好地满足需求的更广泛的技能和工具。所有这些优势组合在一起,让 GTK+ 成为软件开发的坚实基础。有了它,就能够把注意力集中在解决实际问题上,而不必重新发明轮子,而且您也可以确信创建的应用程序会按照用户预期的方式运作、解决他们的问题,而不必创建新的应用程序11。2.3 本章小结我们通过学习,搭建了必要的开发环境。并且为后续的工作做好了充分准备。第三章 需求分析第三章 软件需求3.1 需求分析所谓需求分析,是指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据,要得到什么结果,最后应输出什么。可以说,在软件工程当中的“需求分析”就是确定要计算机“做什么”。下面是对本软件的一个需求分析。3.1.1 功能需求对于进程管理器要完成什么功能,我们在windows下都知道,如果遇到程序未响应或者想要强行终止运行中程序可唤出进程管理器,然后单击所要终止的程序点下面的结束进程即可把你想要终止的进程关掉。还能让你看到系统中正在运行哪些程序(进程),只要你平时多看任务管理器中的进程列表,熟悉系统的基本进程,就可以随时发现可疑进程。而在linux下就是缺少这样的进程管理器。那么这个“UNIX下的进程监控限制系统”,正如我们在window下遇到的情况一样,也应该完成这些功能:查看当前用户进程和结束摸个进程。这个也是大家一下就能想到的。那有人会问我们为什么要限制进程的数量,我们都知道当有太多的进程同时运行在系统上时,系统会花很多时间在进程调度上,也会影响输入输出的速度。调度程序运行时,要在所有可运行状态的进程中选择最值得运行的进程投入运行。选择进程的依据是什么呢?在每个进程的task_struct结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程的依据。其中,policy是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级;counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于可运行状态的进程值得运行的程度goodness时起重要作用,因此,counter也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。Linux用函数goodness()来衡量一个处于可运行状态的进程值得运行的程度。该函数综合了以上提到的四项,还结合了一些其他的因素,给每个处于可运行状态的进程赋予一个权值(weight),调度程序以这个权值作为选择进程的唯一依据。调度方法1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务3,SCHED_RR实时调度策略,时间片轮转进程调度流程如下:将prev和next设置为schedule最感兴趣的两个进程:其中一个是在调用schedule时正在运行的进程(prev),另外一个应该是接着就给予CPU的进程(next)。注意:prev和next可能是相同的-schedule可以重新调度已经获得cpu的进程.中断处理程序运行“下半部分”.内核实时系统部分的实现,循环调度程序(SCHED_RR)通过移动“耗尽的”RR进程-已经用完其时间片的进程-到队列末尾,这样具有相同优先级的其他RR进程就可以获得CPU了。同时,这补充了耗尽进程的时间片。由于代码的其他部分已经决定了进程必须被移进或移出TASK_RUNNING状态,所以会经常使用schedule,例如,如果进程正在等待的硬件条件已经发生,所以如果必要,这个switch会改变进程的状态。如果进程已经处于TASK_RUNNING状态,它就无需处理了。如果它是可以中断的(等待信号),并且信号已经到达了进程,就返回TASK_RUNNING状态。在所以其他情况下(例如,进程已经处于TASK_UNINTERRUPTIBLE状态了),应该从运行队列中将进程移走。将p初始化为运行队列的第一个任务;p会遍历队列中的所有任务。记录了运行队列中所有进程最好的“goodness”-具有最好“goodness”的进程是最易获得CPU的进程。goodness的值越高越好。遍历执行任务链表,跟踪具有最好goodness的进程。这个循环中只考虑了唯一一个可以调度的进程。在SMP模式下,只有任务不在cpu上运行时,即can_schedule宏返回为真时,才会考虑该任务。在UP情况下,can_schedule宏返回恒为真.如果循环结束后,得到c的值为0。说明运行队列中的所有进程的goodness值都为0。goodness的值为0,意味着进程已经用完它的时间片,或者它已经明确说明要释放CPU。在这种情况下,schedule要重新计算进程的counter;新counter的值是原来值的一半加上进程的静态优先级(priortiy),除非进程已经释放CPU,否则原来counter的值为0。因此,schedule通常只是把counter初始化为静态优先级。(中断处理程序和由另一个处理器引起的分支在schedule搜寻goodness最大值时都将增加此循环中的计数器,因此由于这个原因计数器可能不会为0。显然,这很罕见。)在counter的值计算完成后,重新开始执行这个循环,找具有最大goodness的任务。如果schedule已经选择了一个不同于前面正在执行的进程来调度,那么就必须挂起原来的进程并允许新的进程运行。这时调用switch_to来进行切换。通过上面,我们知道进程越多,进程的调度用的时间也会越多,任务在队列里等待的时间也会越多。所以要适当的限制进程的数量。3.1.2 安全需求从安全方面来考虑,如果系统被放了 fork 炸弹,这是非常简单而且很常用的一类恶意程序,原理很简单,就是通过不停的 fork 进程来达到消耗 Linux 系统所有资源的目的,使得系统无法(没有资源)运行其他程序。我们可以通过进程管理器来杀死这个进程,子进程也会被转给init进程并被杀死,而且我们限制了进程的数量,当进程到一定数量的时候就会被杀死了。这样就保证了系统的安全性。另外,也可以通过进程查看来发现一些可疑的进程,比如我们并没有启动某个进程,这个进程也不是系统的进程,那么进程就有可能是危险进程,就可以结束这个进程。3.2 软件的可行性软件可行性分析最根本的任务是对以后的行动方针提出建议。如果问题没有可行的解释,分析员应该建议停止这项开发工程,以避免时间、资源、人力和金钱的浪费;如果问题值得解,分析员应该推荐一个较好的解决方案,并且为工程制定一个初步的计划。3.2.1 系统规模和目标系统的功能很明了,就是来限制和管理UNIX系统下的用户进程,并且用户可以通过参数设置最多的进程数。那么我们要完成的任务就很明确,那么这个软件要完成的规模主要就两个模块,一个就是主要完成进程监控的,另一个就是限制进程模块。规模不会太大,代码应该在1000行以内。对于这个软件,我们要完成的目标有以下几点:第一:实现要求的功能;第二:软件界面要简单明了;第三:可以在不同的UNIX下使用,有一定的兼容性;第四:有自己特别之处;3.2.2 研究目前正在使用的系统UNIX是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用同一个UNIX系统;多任务是指在Linux下可以同时执行多个任务,更详细的说,UNIX采用了分时管理的方法,所有的任务都放在一个队列中,操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片很短,用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系统资源,因此UNIX可以在一个任务还未执行完时,暂时挂起此任务,又去执行另一个任务,过一段时间以后再回来处理这个任务,直到这个任务完成,才从任务队列中去除。这就是多任务的概念。上面说的是单CPU多任务操作系统的情形,在这种环境下,虽然系统可以运行多个任务,但是在某一个时间点,CPU只能执行一个进程,而在多CPU多任务的操作系统下,由于有多个CPU,所以在某个时间点上,可以有多个进程同时运行。进程的的基本定义是:在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。需要注意的是:程序和进程是有区别的,进程虽然有程序产生,但是它并不是程序,程序是一个进程指令的集合,它可以启用一个或多个进程,同时,程序只占用磁盘空间,而不占用系统运行资源,而进程仅仅占用系统内存空间,是动态的、可变的,关闭进程,占用的内存资源随之释放。例如,用户在UNIX上打开一个文件、就会产生一个打开文件的进程,关闭文件,进程也随机关闭。如果在系统上启动一个服务,例如启动tomcat服务,就会产生一个对应的java的进程。而如果启动apache服务,就会产生多个httpd进程。按照进程的功能和运行的程序分类,进程可划分为两大类:系统进程:可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。针对用户进程,又可以分为交互进程、批处理进程和守护进程三类。交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。进程在启动后,不一定马上开始运行,因而进程存在很多种状态。可运行状态:处于这种状态的进程,要么正在运行、要么正准备运可中断的等待状态:这类进程处于阻塞状态,一旦达到某种条件,就会变为运行态。同时该状态的进程也会由于接收到信号而被提前唤醒进入到运行态。不中断的等待状态:与“可中断的等待状态”含义基本类似,唯一不同的是处于这个状态的进程对信号不做响应。僵死状态:也就是僵死进程,每个进程在结束后都会处于僵死状态,等待父进程调用进而释放资源,处于该状态的进程已经结束,但是它的父进程还没有释放其系统资源。暂停状态:表明此时的进程暂时停止,来接收某种特殊处理,进程之间的关系在linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识,它们的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程,因而,这个进程是linux下所有进程的父进程,用PPID表示父进程。相对于父进程,就存在子进程,一般每个进程都必须有一个父进程,父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但是子进程关闭,父进程不一定终止。如果父进程在子进程退出之前就退出,那么所有子进程就变成的一个孤儿进程,如果没有相应的处理机制的话,这些孤儿进程就会一直处于僵死状态,资源无法释放,此时解决的办法是在启动的进程内找一个进程作为这些孤儿进程的父进程,或者直接让init进程作为它们的父进程,进而释放孤儿进程占用的资源。Linux下,监控和管理进程的命令有很多,下面我们以ps、top、pstree、lsof四个最常用的指令介绍如果有效的监控和管理linux下的各种进程。ps是linux下最常用的进程监控命令,关于ps命令的语法和使用选项,我们在第四章已经有了详细的讲解,这里重点讲述如何利用ps指令监控和管理系统进程。UID是用户的ID标识号,PID是进程的标识号,PPID表示父进程,STIME表示进程的启动时间,TTY表示进程所属的终端控制台,TIME表示进程启动后累计使用的CPU总时间,CMD表示正在执行的命令。从中可以清楚的看出,父进程和子进程的对应关系, PPID为26037的所有进程均为子进程,而PID为26037的进程是所有子进程的父进程,子进程由nobody用户启动,而父进程由root用户启动,父进程对应的PPID为1,即父进程同时为init进程的子进程。其中,%CPU表示进程占用的CPU百分比,%MEM表示进程占用内存的百分比,VSZ表示进程虚拟大小,RSS表示进程的实际内存(驻留集)大小(单位是页)。STAT表示进程的状态,进程的状态有很多种:用“R”表示正在运行中的进程,用“S”表示处于休眠状态的进程,用“Z”表示僵死进程,用“”表示优先级高的进程,用“N”表示优先级较低的进程,用“s”表示父进程,用“+”表示位于后台的进程。START表示启动进程的时间。这个例子将进程之间的关系用树形结构形象的表示出来,可以很清楚的看到,第一个进程为父进程,而其它进程均为子进程。同时从这个输出还可以看到每个进程占用CPU、内存的百分比,还有进程所处的状态等等。Pstree清楚的显示了程序和进程之间的关系,如果不指定进程的PID号,或者不指定用户名称,则将以init进程为根进程,显示系统的所有程序和进程信息,若指定用户或PID,则将以用户或PID为根进程,显示用户或PID对应的所有程序和进程。top命令是监控系统进程必不可少的工具,与ps命令相比,top命令动态、实时的显示进程状态,而ps只能显示进程某一时刻的信息,同时,top命令提供了一个交互界面,用户可以根据需要,人性化的定制自己的输出,更清楚的了解进程的实时状态。关于top指令的用法,这里通过几个例子,阐述一下top命令在系统进程监控中的作用和优点。从top命令的输出可知,此系统有java和httpd两个用户进程在运行。进程PID为21115的java进程由root用户启动,优先级(PR)为23,占用的虚拟内存总量(VIRT)为1236M,未被换出的物理内存(RES)为360M,共享内存(SHR)为2384 kb。通过这几个选项可以了解java进程对内存的使用量,有助于系统管理员对系统虚拟内存使用状况的掌控。此刻java进程处于休眠状态(S),从上次更新到现在java占用cpu时间(%CPU)为6%,占用物理内存(%MEM)为4.4%,从进程启动到现在java占用cpu总时间(TIME+)为“382:24.14”,单位是1/100秒。通过了解这些信息,可以使系统管理员掌握java进程对系统CPU、物理内存的使用状况。两个httpd进程由nobody用户启动,优先级都为15,同时都处于休眠状态。除去这两个进程,还有top进程,也就是我们执行top命令产生的进程,从进程状态项可知,此进程处于运行状态,另一个是init进程,即所有系统进程的父进程,对应的PID为1。当然top的输出还有很多进程信息,这里仅

温馨提示

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

评论

0/150

提交评论