当前位置:文档之家› 第6章 linux进程控制开发及多线程编程

第6章 linux进程控制开发及多线程编程

linux进程控制 实验报告

长安大学 操作系统实验报告 实验课程:操作系统 实验名称:linux进程控制 学院:信息学院 专业:软件工程 学号:2406090106 姓名:刘建 日期:2012-5-09

一、实验目的 熟悉进程的创建过程,了解系统调用函数fork() 和execl()。 二、实验内容 1、阅读实例代码fork1,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握系统调用fork( )的用法,返回值的意义。 2、阅读实例代码fork2,并编辑、编译、运行,记录程序的运行结果,尝试给出合理的解释,查阅有关资料,掌握在程序中运行一个操作系统命令和运行一个程序的方法。 3、修改fork2,使之能把运行的命令和程序作为参数传给fork2。 三、设计思想 1、程序框架

pid = -1 pid = 0pid> 0 2、用到的文件系统调用函数 fork() 和execl() 四、调试过程 1、测试数据设计 (1)fork1 命名程序1: 编写程序1:

编译程序1: 运行程序1: (2)fork2

编写程序2: 运行程序2:

(3)修改fork2 编写修改程序2: 修改后的运行结果: 2、测试结果分析 (1)对于程序1:因为系统调用fork()函数是一次调用两次返回值,而且先生成子进程还是父进程是不确定的,所以第一次执行生成子进程的时候返回的pid = 0,判断pid!=-1,所以输出了I’m the child. I’m the parent. 第二次,执行父进程的时候,返回的是子进程的进程号pid> 0,即pid的值仍然不为-1,所以又输出了一次I’m the child. I’m the parent。 (2)对于程序2:第一次调用fork()函数时,由于执行的是子进程还是父进程是随机的,所以第一次对父进程返回的是子进程的进程号(大于0),即pid> 0,所以输出I’m the parent. Program end.当第二次执行子进程时返回值是0,即pid = 0,所以输出I’m the child. 并调用了execl()函数,查看了指定路径中的文件。

linux系统进程调度

Linux系统进程调度 姓名: 班级: 学号: 摘要 Linux 自出现以来以惊人的速度在服务器和桌面系统中获得了成功。本文介绍了现代操作系统常见进程调度算法以及linux2.6.32中进程调度的策略并根据具体例子对Linux进程调度过程进行了具体分析。 一、最常用的操作系统调度算法有以下几种; 1.先来先服务调度算法 调度程序按照进程在就绪队列中的提交顺序或变为就绪状态的先后进行调度,是一种最普遍和最简单的方法,所需的系统开销最小。该算法对所有的进程一视同仁,不能反映对实时进程或特殊要求的进程的特殊处理,在实际操作系统中,很少单独使用该算法,而是和其它一些算法配合起来使用。 2.高优先权优先调度算法 1 优先权类型。 1)静态优先权,他是在创建进程时确定的,且在进程的整个运行期间保持不变。 2)动态优先权,他是在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。 2优先权调度算法的类型。 1)非抢占式优先权算法。在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。 2)抢占式优先权调度算法。这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。 3.时间片的轮转调度算法 时间片轮转法一般用于进程调度,每次调度,把CPU分配队首进程,并令其执行一

linux实验项目 进程控制操作

重庆电力高等专科学校 实 验 报 告 书 实验名称:Linux文件命令学院:信息工程学院 指导老师:黄泽伟 班级:软件1311 学号:201303100243 姓名:周贵波

实验项目进程控制操作 一、实验目的 1.了解进程的概念。 2.熟悉Linux的前台与后台进程控制操作。 3.掌握利用进程监控工具来维护系统的正常运行。 二、实验环境 安装了Red Hat Linux9.0和windows虚拟机系统的计算机一台。 三、实验内容 1.Linux的前台与后台进程控制操作。 2.系统监视器(system monitor)的使用和系统维护。 四、实验步骤 1.进程的前台工作方式 1)yes ok ←┘ 终端窗口显示___ok___,此时键盘能否输入其它命令____不能___,为什么? 2)按键:Ctrl+Z,暂停一个前台进程的运行,并转为挂起进程。 3)jobs ←┘记录下看到的结果_____yes ok_________________。 4)fg %1 ←┘作用:把挂起进程转为前台进程执行; 5)再按键:Ctrl+Z 作用与2)相同; 6)jobs ←┘记录下看到的结果________yes ok______________。 7)bg %1 ←┘作用:重新运行挂起进程,但以后台方式运行; 8)此时能否再按键:Ctrl+Z暂停一个后台进程的运行?____不能__,

键盘能否输入其它命令__不能_____,为什么? 9)用鼠标点击,关闭终端窗口。 2.进程的后台工作方式 除上面把前台进程转到后台进程的过程外,一般在shell提示符下,输入的命令后加上&,即以后台方式运行命令。再次进入终端方式。 1)xclock & ←┘后台进程1,记录其时钟的时间___16:40____ xcalc & ←┘后台进程2 find / -name ?*.jpg‘–print > templist & ←┘后台进程3 2)jobs ←┘有几个后台进程:__2______,记录显示结果: xclock xcalc & ps ←┘记录下看到的结果: 4036 pts/0 00:00:00 bash 4061 pts/0 00:00:00 xcalc 4063 pts/0 00:00:00 ps 3)fg %1 ←┘将时钟进程转到前台运行。 4)按键:Ctrl+Z, 将时钟进程挂起,记录时钟的时间___16:50______。 jobs ←┘观察显示结果____xcalc &________________。 回顾上述操作,经过二~三分钟后,看图形时钟有走动吗?____否___。 5)bg %1 ←┘ 将挂起的时钟进程转到后运行,现在再观察时钟是否会有变化,为什么? 有后台继续运行 jobs ←┘ kill %2 ←┘杀死计算器进程,看计算器是否消失__否______。 6)ps ←┘ 观察屏幕显示,记录时钟(xclock)进程的进程号pid=__________。 7)kill ←┘ pid为xclock的进程号,作用__newline____________。 试比较与上述步骤5)中的kill命令的区别。 8)ls –l ←┘是否有templist文件? ____否____。 9)rm templist ←┘删除临时文件。

2011180021-Linux操作系统-课程设计报告-基于Linux的进程调度模拟程序

河南中医学院 《linux操作系统》课程设计报告 题目:基于Linux的进程调度模拟程序 所在院系:信息技术学院 专业年级:2011级计算机科学与技术完成学生:2011180021 郭姗 指导教师:阮晓龙 完成日期:201X 年06 月22 日 目录 1. 课程设计题目概述3 2. 研究内容与目的4 3. 研究方法5 4. 研究报告6 5. 测试报告/实验报告7 6. 课题研究结论8 7. 总结9

1、课程设计题目概述 随着Linux系统的逐渐推广,它被越来越多的计算机用户所了解和应用. Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为"进程调度(process scheduling)"的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。本文就是对进程调度进行研究、实验的。 本文首先对Linux系统进行了简要的介绍, 然后介绍了进程管理的相关理论知识。其次,又介绍最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法的相关知识,并对进程调度进行最高优先数优先的调度算法和先来先服务算法模拟实验,并对比分析两种算法的优缺点,从而加深对进程概念和进程调度过程/算法的理解 设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。使得系统中的进程能够有条不紊的运行,同时提高处理机的利用率以及系统的性能。所以设计模拟进程调度算法(最高优先数优先的调度算法、先来先服务算法),以巩固和加深处理进程的概念,并且分析这两种算法的优缺点。关键词:linux 进程调度调度算法

Linux程序设计上机指导书3:Linux进程控制

上机三:Linux进程控制 1.目的 (1)掌握系统调用fork(),exex(),exit()等实现进程创建; (2)掌握进程的终止方式(return、exit、_exit、abort); (3)掌握僵尸进程的产生和避免,以及wait,waitpid的使用; (4)了解守护进程的创建。 2.内容 主要上机分析代码文件。 systemtest.c 6-3.c 6-4.c 6-8.c 6-9.c 其他略。 3.步骤 1)Linux进程的创建 创建进程可以采用几种方式。可以执行一个程序(这会导致新进程的创建),也可以在程序内调用一个fork 或exec来创建新进程。fork 调用会导致创建一个子进程,而exec 调用则会用新程序代替当前进程上下文。exec系列函数并不创建新进程,调用exec前后的进程ID是相同的。

exec函数的主要工作是清除父进程的可执行代码映像,用新程序的代码覆盖调用exec 的进程代码。如果exec执行成功,进程将从新程序的main函数入口开始执行。调用exec 后,除进程ID保持不变外,还有下列进程属性也保持不变。 (1)进程的父进程ID。 (2)实际用户ID和实际用户组ID。 (3)进程组ID、会话ID和控制终端。 (4)定时器的剩余时间。 (5)当前工作目录及根目录。 (6)文件创建掩码UMASK。 (7)进程的信号掩码。 与exec系统调用不同,system将外部可执行程序加载执行完毕后继续返回调用进程。 【例6.3】设计一个程序,用fork函数创建一个子进程,在子进程中,要求显示子进程号与父进程号,然后显示当前目录下的文件信息,在父进程中同样显示子进程号与父进程号。

计算机操作系统小论文-Linux进程调度

Linux进程调度 一、概述 自1991年Linux操作系统出现以来,Linux操作系统以令人惊异的速度迅速在服务器和桌面系统中获得了成功。它已经被业界认为是未来最有前途的操作系统之一,并且在嵌入式领域,由于Linux操作系统具有开放源代码、良好的可移植性、丰富的代码资源以及异常的健壮,使得它获得越来越多的关注。[1]本文分析了Linux操作系统中几种常用的调度算法。 二、高级、中级和低级调度 在操作系统中,存在很多种调度,如用户提交作业的调度、运行进程的调度、I/O 请求的调度、存储空间切换的调度等。在不同的操作系统中所采用的调度方式不完全相同,在执行调度时所采用的调度算法也可能不同。因此,可从不同的角度对调度进行分类。常用的一种分类方法是按调度的层次,把调度分为高级调度、中级调度和低级调度。 (1)高级调度 高级调度通常也称作业调度,用于决定把外存上处于后备队列中的哪些作业调入内存,准备执行。系统接纳一个作业后,将它变为一个或者多个进程,为它们分配除了处理机之外的必要的系统资源后,将其排入就绪队列,准备执行。值得注意的是,在批处理系统中,作业进入系统后,是先驻留在外存上的,因此,需要有作业调度,以将它们分批装入内存;在分时系统中,为了能及时响应,用户通过键盘输入的命令或数据等,都是直接送入内存,因而无须配置作业调度;类似地,在实时系统中,通常也不需要作业调度。 (2)中级调度 中级调度大多针对于分时系统,是按一定的算法在内存和外存之间进行进程对换,目的在于缓和内存的紧张。为此,应使那些暂时不具备执行条件的进程不再占用宝贵的内存空间,将它们挂起并调至外存上等待,称此时进程的状态为挂起状态。当这些进程重新又具备执行条件,且内存已空闲时,再由中级调度决定,将外存上哪些已具备执行条件的进程解除挂起后重新调入内存,排在进程就绪队列上,等待进程调度。 由此可见,中级调度实质上是决定允许哪些进程有资格参与竞争处理机资

LINUX进程调度算法的分析

LINUX进程调度算法的分析 何 翔,顾 新 (西安电子科技大学,陕西西安 710071) 摘 要进程调度对一个操作系统来说是至关重要的,它起着非常关键的作用。本文针对Linux操作系统中的普通进程调度算法进行了分析,对以进程为CPU时间分配单位和以用户为CPU时间分配单位的两种算法进行了分析和对比。对它们在不同环境下对进程调度效率和公平性的影响进行了探讨,并总结出它们各自适用的环境。 最后为了进一步提高进程调度的效率和公平性,提出了混合算法的思想。 关键词进程调度;普通进程;动态优先级 中图分类号 TP316 1 前 言 在Linux操作系统中,有两种常用的普通进程 调度算法。它们分别以进程和用户为调度单位来进 行CPU时间的分配。这两种算法分别体现了多进程 环境下系统运行的高效性和多用户环境下的公平 性。但是这两种算法都有各自的适用环境,因此它 们各自都有优缺点。本文从多用户的公平性和多进 程的高效性出发对这两种算法进行了分析和比较, 最后提出了混合算法的思想,使进程调度更加高效 和公平。 2 进程调度 进程调度要满足高效率,公平性,响应时间快,周转时间短和吞吐量大等要求。Linux操作系统的内核根据进程响应时间的情况把进程分为3大类:交互进程;批处理进程;实时进程。内核在此基础上实现了3种不同的调度策略:SCHED_ FIFO(即先进现出策略);SCHED_RR(即轮转策略);SCHED_OTHER(适合交互分时的程序)。 进程调度时机,即调度器何时开始启动。可以在以下几个时刻进行进程调度: (1)进程状态转换的时刻; (2)可运行队列中新增加一个进程时; (3)当前进程的时间片用完时; (4)进程从系统返回到用户态时; (5)内核处理完中断后,进程返回到用户态时。 在以上几种情况下进程调度可以解释为在下面几 个状态中进行切换。 进程调度的流程如图1所示。 图1 进程调度的流程图 图1的转换条件如下: (1)调度;(2)时间片用完;(3)跟踪并调度; (4)退出;(5)收到信号并醒来;(6)等待资源 到位再调度;(7)等待资源到位再调度;(8)等待 资源到位;(9)资源到位或收到信号。 3 普通进程调度算法的分析 3.1 按进程调度的算法分析 Schedulue()是按进程调度算法的主要函数, 是系统的核心函数。它的核心代码如下: next=idle_task(this_cpu); 电子科技 2005年第9期(总第192期) 21

【IT专家】Linux中进程的几种状态

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Linux中进程的几种状态 2015/03/29 4411 1R (task_running) :可执行状态 ?只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 ?很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为TASK_RUNNING状态。 ? 2S (task_interruptible):可中断的睡眠状态 ?处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 ?通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于task_interruptible状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。 ? 3D (task_uninterrupible)不可中断的睡眠状态 ?与task_interruptible状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。但是uninterruptible sleep状态的进程不接受外来的任何信号,因此无法用kill杀掉这些处于D状态的进程,无论是”kill”, “kill -9″还是”kill -15″,这种情况下,一个可选的方法就是reboot。

Linux进程调度器基础讲解

1.1 进程 ?从教科书上,我们都能知道:进程是资源分配的最小单位,而线程是CPU 调度的的最小单位。 ?进程不仅包括可执行程序的代码段,还包括一系列的资源,比如:打开的文件、内存、CPU时间、信号量、多个执行线程流等等。而线程可以共享进程内的资源空间。 ?在Linux内核中,进程和线程都使用struct task_struct结构来进行抽象描述。 ?进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,没有用户虚拟地址空间的进程称为内核线程。 Linux内核使用task_struct结构来抽象,该结构包含了进程的各类信息及所拥有的资源,比如进程的状态、打开的文件、地址空间信息、信号资源等等。task_struct结构很复杂,下边只针对与调度相关的某些字段进行介绍。 struct task_struct { /* ... */ /* 进程状态*/ volatile long state; /* 调度优先级相关,策略相关*/ int prio; int static_prio; int normal_prio; unsigned int rt_priority; unsigned int policy; /* 调度类,调度实体相关,任务组相关等*/ const struct sched_class *sched_class; struct sched_entity se; struct sched_rt_entity rt; #ifdef CONFIG_CGROUP_SCHED struct task_group *sched_task_group;

Linux课程设计进程控制

课程设计报告 课程名称Linux操作系统课程设计 指导教师张玲 起止日期2014-03-01 至2014-06-13 实验项目实验二进程控制 学院信息与通信工程学院 专业电子信息工程 学生姓名 班级/学号 成绩 指导老师签字

1. 课程设计概述 本次课设意在利用进程控制相关的系统调用编程进行进程控制实验,观察进程从创建、运行到终止的控制过程,加深对进程概念的理解。 1.1 课程设计的目的 本实验的目的是掌握进程的概念,理解进程的创建、执行、等待、终止的过程。熟悉有关进程控制的命令和系统调用,理解Shell 的工作原理。 1.2 课程设计的内容 1) 进程控制命令 ● 使用进程控制命令ps ,kill 监视和控制进程的活动 2) 编程部分 ● 用fork ,wait ,exec 系统调用编程实现进程控制; ● 编写一个简单的shell 。 1.3 设计原理 进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。 构建的文件构架如图: 图1 实验目录树的结构 2012010948 exp2 exp1 exp3 vis vis2

2.实验步骤 2.1操作 2.1.1进程控制命令(在此终端窗口的操作截图见图1) 1.执行ps命令,查看bash进程的PID: PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收。 2.在后台运行一个yes进程: yes > /dev/null & 3.用ps -f命令观察yes进程的pid和ppid,用ps u命令观察yes进程的状态。 yes进程的父进程是哪个进程?通过查看yes程序的PPID可知其父进程为bash 4.根据命令名搜索特定的进程: ps-ef|grep yes: 5.用kill命令杀掉yes进程: kill 【PID】: 图1 进程控制命令

Linux 进程管理实验

Linux 进程管理实验 一、实验内容: 1. 利用bochs观测linux0.11下的PCB进程控制结构。 2. 利用bochs观测linux0.11下的fork.c源代码文件,简单分析其中的重要函数。 3. 在fork.c适当位置添加代码,以验证fork函数的工作原理。 二、Linux进程管理机制分析 Linux有两类进程:一类是普通用户进程,一类是系统进程,它既可以在用户空间运行,又可以通过系统调用进入内核空间,并在内核空间运行;另一类叫做内核进程,这种进程只能在内核空间运行。在以i386为平台的Linux系统中,进程由进程控制块,系统堆栈,用户堆栈,程序代码及数据段组成。Linux系统中的每一个用户进程有两个堆栈:一个叫做用户堆栈,它是进程运行在用户空间时使用的堆栈;另一个叫做系统堆栈,它是用户进程运行在系统空间时使用的堆栈。 1.Linux进程的状态: Linux进程用进程控制块的state域记录了进程的当前状态,一个Linux 进程在它的生存期中,可以有下面6种状态。 1.就绪状态(TASK_RUNNING):在此状态下,进程已挂入就绪队列,进入准备运行状态。 2.运行状态(TASK_RUNNING):当进程正在运行时,它的state域中的值不改变。但是Linux会用一个专门指针(current)指向当前运行的

任务。 3.可中断等待状态(TASK_INTERRUPTIBLE):进程由于未获得它所申请的资源而处在等待状态。不管是资源有效或者中断唤醒信号都能使等待的进程脱离等待而进入就绪状态。即”浅睡眠状态”。 4.不可中断等待状态(TASK_UNINTERRUPTIBLE):这个等待状态与上面等待状态的区别在于只有当它申请的资源有效时才能被唤醒,而其它信号不能。即“深睡眠状态”。 5.停止状态(TASK_STOPPED):当进程收到一个SIGSTOP信号后就由运行状态进入停止状态,当收到一个SINCONT信号时,又会恢复运行状态。挂起状态。 6.终止状态(TASK_ZOMBIE):进程因某种原因终止运行,但进程控制块尚未注销。即“僵死状态”。 状态图如下所示: 2.Linux进程控制块:

linux和UNIX调度算法比较分析

Linux与UNIX进程调度策略的比较分析 崔洪星 (华中科技大学机械科学与工程学院 M201170270) 摘要:文章先是阐述了进程调度策略的引入、概念、分类和原则,接着就Linux和UNIX不同操作系统的进程策略进行了描述,最后比较得出结论。 1.进程调度概述 当计算机是多道程序设计系统时,通常会有多个进程竞争CPU。当多个处于就绪态而只有一个CPU时,操作系统就必须决定运行哪一个进程。操作系统中做出这种决定的部分称为调度器。它使用的算法称为调度算法。通常进程调度的功能应由以下3部分组成: (1)确定调度时机 (2)执行调度算法(确定调度策略、计算优先级),即选择哪些 进程运行。 (3)完成调度过程的具体操作,主要是原来运行的进程退出CPU,保护退出进程的运行现场,选中进程占用CPU,恢复选中进程的运行现场。 进程调度分为两大类:一类是抢占式(剥夺式),系统中出现优先权高的可运行进程,立即让它执行;另一类是非抢占式(非剥夺式),系统中即使出现优先权高的可运行进程,也要等到调度时机出现时,才让它运行。 非抢占式的进程调度时机分为两种情况:进程自动放弃CPU和进程由核心态转入用户态。 (1)进程自动放弃CPU有以下几种情况: ●进程已完成(虽然时间片未用完); ●进程等待某事件(如I/0,等待资源,……); ●时间片用完; ●进程需要与其他进程保持同步; ●……

(2)进程由核心态转入用户态时系统产生一次调度,将最高优先权的就绪进程投入运行。 不同的环境需要不同的调度算法,这是因为不同的应用领域有不同的目标。换句话说,在不同的系统中,调度器的优化目标是不同的。为了设计一个调度算法,应当首先明确一个好的调度算法必须做什么。一些目标是根据环境(批处理、交互式或实时)设定的,而另外一些目标是在各种情况下都使用的。公平在所有的情况下,都是非常重要的,相对于处于同等地位的进程而言,给予一个进程更多的CPU时间是不公平的。当然,不同种类的进程应该得到不同的处理。 下面将对Linux和UNIX进程的调度原理分别进行讨论。 2.Linux 进程调度原理 调度程序运行时,要在所有可运行状态的进程中选择最值得运行的进程投入运行。选择进程的依据是什么呢?在每个进程的task_struct 结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程的依据。其中,policy是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级;counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于可运行状态的进程值得运行的程度goodness时起重要作用,因此,counter 也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。 Linux用函数goodness()来衡量一个处于可运行状态的进程值得运行的程度。该函数综合了以上提到的四项,还结合了一些其他的因素,给每个处于可运行状态的进程赋予一个权值(weight),调度程序以这个权值作为选择进程的唯一依据。关于goodness()的情况在后面将会详细分析。

linux操作系统课程设计—进程调度优先数法与简单轮转法

《操作系统原理》课程设计报告 姓名:吴沛儒 班级:BX0907 学号:9 指导老师:胡静 二〇一一年十二月十二日

目录 一、《操作系统原理》课程设计的目的与要求.......................................... 错误!未定义书签。 1、目的.................................................................................................. 错误!未定义书签。 2、要求.................................................................................................. 错误!未定义书签。 二、简述课程设计内容、主要功能和实现环境 ...................................... 错误!未定义书签。 1.课程设计内容...................................................................................... 错误!未定义书签。 三、任务的分析、设计、实现和讨论...................................................... 错误!未定义书签。 1、任务的分析...................................................................................... 错误!未定义书签。 2、任务的设计与实现.......................................................................... 错误!未定义书签。 五、附录...................................................................................................... 错误!未定义书签。

linux中用信号进行进程时延控制

Linux下使用信号进行进程的运行控制 1linux的信号 信号全称为软中断信号,也有人称作软中断,是Linux系统中的最古老的进程间通讯方式。它们用来向一个或多个进程发送异步事件信号。信号可以从键盘中断中产生,另外进程对虚拟内存的非法存取等系统错误环境下也会有信号产生。信号还被shell程序用来向其子进程发送任务控制命令。 2系统调用介绍 2.1 alarm系统调用 #include unsigned int alarm(unsigned int seconds); alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。 2.2Signal #include typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); signal系统调用用来说明对信号的处理方法。Signum参数用来指定信号,handler可以 如果是信号处理函数,则signal会在收到信号后调用该函数,我们可以形象的称为信号注册处理函数。 2.3kill系统调用 #include #include int kill(pid_t pid,int sig); kill函数用于给进程组或进程发送信号。pid为目标进程号,sig为要被发送的信号。发送信号的进程必须和目标进程在同一个进程组,或者发送i信号的进程的拥有者是一个超级用户,另外,进程可以向自己发送信号。 2.4pause系统调用 #include int pause(void); pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR,所以pause只有出错的返回值。错误码EINTR表示“被信号中断”。 3进程自身时延控制 进程可以利用信号机制来实现对自身运行状态的控制。以下示例程序就是利用alarm()系统调用来时间程序对自身运行时间的控制。 #include #include #include

实验三 Linux进程的创建与控制

实验三 Linux进程的创建与控制 一、实验目的 (1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。 (4)了解Linux系统中进程通信的基本原理。 二、实验预备内容 阅读Linux的fork.c源文件,分析进程的创建过程。 三、实验内容 1. 进程的家族关系 在主程序中用3个fork()调用,最后输出一个字符或字符串,运行此简单的程序,观察并分析运行结果。 2. 进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和字符“c”。观察纪录屏幕上的显示结果,并分析原因。 3. 进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。 如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 四、实验源程序(仅供参考) 1. 用进程的家族关系 main() { fork(); fork(); fork(); printf(“S”); } 查看运行结果并分析进程的创建和调用过程。 2.进程的创建 #include main() { int p1,p2; while((p1=fork())==-1); /创建进程p1,创建成功后退出/ if(p1= =0) /CPU运行p1/ putchar(…b?); /输出字符b/ else { while((p1=fork())==-1); /创建进程p2, 创建成功后退出/ if(p1= =0) putchar(…c?);

Linux进程状态与调度

Linux进程状态与调度 目录 一.进程的状态 1.schedule_timeout 2.wake_up 3.task_struct current 二.内核与用户空间信号传递fasync 一.进程的状态 1.Schedule_timeout 当我们调用schedule_timeout时,有两种情况能打断该定时器,一种为超时,一种为有信号打断。 在该函数的申明中提到 * %TASK_INTERRUPTIBLE - the routine may return early if a signal is * delivered to the current task. In this case the remaining time * in jiffies will be returned, or 0 if the timer expired in time * * The current task state is guaranteed to be TASK_RUNNING when this * routine returns. 配合schedule_timeout,使用__set_currnet_state.对于支持信号打断的schedule_timeout,调用__set_currnet_state设置task state 为 TASK_INTERRUPIBLE,如下, __set_current_state(TASK_INTERRUPTIBLE); Timeout=schedule_timeout(timeout); __set_current_state(TASK_RUNNING); 调用schedule_timeout如果超时之后会自动设置task_state为 TASK_RUNNING,在调用schedule_timeout之后,进程会进入休眠状态,退出进程调度,只有在有关于此进程的事件到来时会被唤醒(各种信号),重新加入进程调度中。 用过msleep都知道所在的task会sleep 相应ms,而实际上其原理就与schedule_timeout和进程状态有关。 当设置current_state为TASK_UNINTERRUPTIBLE时,只能等待超时,signal 无法打断

实验报告四LINUX进程调度与系统监视

实验四LINUX进程调度与系统监视 实验环境:Linux 环境 实验目的: (1)熟练掌握手工启动前后台作业的方法。 (2)熟练掌握进程与作业管理的相关 Shell 命令。 (3)掌握 at 调度和 cron 调度的设置方法。 (4)了解进行系统性能监视的基本方法。 实验内容及操作过程: 1.作业和进程的基本管理 操作要求1: 先在前台启动vi 编辑器并打开f4 文件,然后挂起,最后在后台启动一个查找inittab 文件的find 作业,find 的查找结果保存到f5。 操作过程: (1)以超级用户(root)身份登录到 RHEL Server 5 字符界面。 (2)输入命令“vi f4”,在前台启动 vi 文本编辑器并打开 f4 文件。 (3)按下 Ctrl+Z 组合键,暂时挂起“vi f4”作业,屏幕显示该作业的作业号。 (4)输入命令“find / -name inittab > f5 &”,启动一个后台作业,如下所示。在显示作业号的同时还显示进程号。 结果: 有截图可以看到f4的作业号是1,启动的后台作业f5可以看到作业号为2,并显示进程号为1662. 操作要求2: 查看当前作业、进程和用户信息,并对作业进行前后台切换。 操作过程:

(1)输入命令“jobs”,查看当前系统中的所有作业。 (2)输入命令“fg 2”,将“find / -name inittab > f5 &”作业切换到前台。屏幕显示出“find / -name inittab > f5”命令,并执行此命令。稍等片刻,作业完成后屏幕 再次出现命令提示符。 (3)输入命令“cat f5”,查看“find / -name inittab > f5”命令的执行结果。 (4)再次输入命令“jobs”,可发现当前系统中的只有一个已停止的作业“vi f4”。(5)输入命令“kill -9 %1”,终止“vi f4”作业。 (6)稍等片刻,输入命令“jobs”,查看到当前没有任何作业。 (7)输入命令“ps –l”,查看进程的相关信息。 (8)输入命令“who –H”,查看用户信息。 结果: (1)输入命令“jobs”,查看当前系统中的所有作业。可以看到vi f4作业的作业号为 1,已经停止。“find / -name inittab > f5 &”的作业号为2,已经完成。 作业的作业号为 2,正在运行。 (2)输入命令“cat f5”,可以得到f5的文件目录为/etc/inittab ; (3)输入命令“kill -9 %1”,终止“vi f4”作业。过一会查看jobs时发现当前没有任何作业。 (4)输入命令“ps –l”,查看进程的相关信息,显示出的信息类似如上信息。 主要输出项的含义为: S(State)进程状态,其中 R 表示运行状态;S 表示休眠状态;T 表 示暂停或终止状态;Z 表示僵死状态。 UID(User ID)进程启动者的用户 ID。

2011180016_Linux操作系统_课程设计报告_基于Linux的进程调度模拟程序

河南中医学院《Linux操作系统》课程设计报告 题目:基于Linux的进程调度模拟程序 所在院系:信息技术学院 专业年级: 2011级计算机科学与技术 完成学生: 2011180016 朱晨 指导教师:阮晓龙 完成日期: 2014 年 06 月 22 日

目录 1. 课程设计题目概述 (3) 2. 研究内容与目的 (4) 3. 研究方法 (5) 4. 研究报告 (6) 5. 测试报告/实验报告 (16) 6. 课题研究结论 (17) 7. 总结 (18)

1. 课程设计题目概述 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。 本文将基于linux的进程调度进行研究,包括CPU的利用率评价、进程在就绪队列中的等待时间与执行时间之比等。但是由于进程进入就绪队列的随机模型很难确定,而且进程上下文切换等也将影响进程的执行效率,所以在此我们用进程调度的模拟程序并测试系统响应时间的方法来评价进程调度的性能。 关键词:进程调度,并行执行,优先数优先的调度算法,先来先服务算法,优先数,进程控制块。

2. 研究内容与目的 要求:写出课题的研究内容和研究目的。 2.1 研究内容 2.1.1最高优先数优先的调度算法 对就绪队列中的每个进程采用静态优先数,即首先安某种原则定义一个优先数来表示它,处理机调度时,每次选择就绪队列中优先数最大者(也可规定优先数愈小,其优先权愈高),让它占用处理机运行。且本文研究的是非抢占式的最高优先数优先的调度算法。 2.1.2 先来先服务算法 早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,先来先服务(FCFS: first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU 周期的长短及其他因素。 2.1.3 两种调度算法的对比分析 通过C语言编写分别编写最高优先数优先的调度算法和先来先服务算法的程序,在CactiFans系统下进行分别执行两个程序,然后对执行结果进行分析。 2.2 研究目的 通过对两种调度算法的执行,实现对进程调度进行模拟实验,并对比分析出两种算法的优缺点。

Linux系统中的进程控制块

在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork() 时, 系统会为我们产生一个task_struct结构。然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理。因此了解 task_struct的结构对于我们理解任务调度(在linux 中任务和进程是同一概念)的关键。 在进行剖析task_struct的定义之前,我们先按照我们的理论推一下它的结构: 1、进程状态,将纪录进程在等待,运行,或死锁 2、调度信息, 由哪个调度函数调度,怎样调度等 3、进程的通讯状况 4、因为要插入进程树,必须有联系父子兄弟的指针, 当然是task_struct型 5、时间信息, 比如计算好执行的时间, 以便cpu 分配 6、标号,决定改进程归属 7、可以读写打开的一些文件信息 8、进程上下文和内核上下文 9、处理器上下文 10、内存信息 因为每一个PCB都是这样的, 只有这些结构, 才能满足一个进程的所有要求。打开/include/linux/sched.h可以找到task_struct 的定义 struct task_struct { volatile long state; /*说明了该进程是否可以执行,还是可中断等信息*/ unsigned long flags; /*Flage 是进程号,在调用fork()时给出*/ int sigpending; /*进程上是否有待处理的信号*/ mm_segment_t addr_limit; /**********************************************************/ /**进程地址空间,区分内核进程与普通进程在内存存放的位置不同*/ /****0-0xBFFFFFFF for user-thead ***********************/ /****0-0xFFFFFFFF for kernel-thread ***********************/ /**********************************************************/ volatile long need_resched; /**********************************************************/ /**********调度标志,表示该进程是否需要重新调度,************/ /**********若非0,则当从内核态返回到用户态,会发生调度*******/ /**********************************************************/ int lock_depth; /*********************锁深度***************/ long nice; /*************进程的基本时间片******************/ unsigned long policy; /**********************************************************/

相关主题
文本预览
相关文档 最新文档