嵌入式操作系统:第8章 ARM Linux进程与进程调度

举报
资源描述
第第8 8章章ARM LinuxARM Linux进程与进程调度进程与进程调度本章教学目的及要求理解Linux的进程管理了解ARMLinux进程控制相关API了解Linux守护进程进程相关的基本概念v嵌入式操作系统可以分为两种类型:单道程序设计单道程序设计(在操作系统当中,在任何时刻只能有一个程序在运行)多道程序设计多道程序设计(在操作系统当中,允许多个程序同时存在并运行),比较普遍。v同时执行的程序在只有一个CPU的情况下,瞬时只能执行其中的一个程序,由此它们的执行有并发性、宏观性。每一个程序都是走走停停的,操作系统利用外设与CPU可以同时执行这个事实,进行调度,实现程序的并发。进程相关的基本概念v由于在多道系统中,允许有多个程序同时存在,各个程序之间是并发执行的,他们共享系统的资源。vCPU需要在各个运行的程序之间来回切换,这样仅仅依靠静态的“程序”这个概念,要想描述多道并发活动就非常困难。因此,必须提出一种新的概念实体,即“进程(process)”。进程相关的基本概念v进程的概念首先在20世纪60年代初期由MIT的Multics系统和IBM的TSS/360系统中引入的。简单地说,进程就是一个正在运行的程序进程就是一个正在运行的程序。v进程包含了正在运行的一个程序的所有状态信息,一个进程至少应该包括以下几个方面的内容:程序程序CPU上下文上下文:包括程序计数器、程序状态字、寄存器。一组系统资源一组系统资源:包括操作系统用来管理进程的数据结构、进程的内存地址空间、进程正在使用的文件等。v进程和程序有本质的区别:程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整个过程,它是程序它是程序执行和资源管理的最小单位。执行和资源管理的最小单位。一个进程在运行的时候可以启动一个或多个程序。同一个程序也可能由多个进程同时执行,如word程序v进程有三个特性:动态性动态性:进程是一个正在运行的程序,程序的运行状态是在不断变化的。独立性独立性:运行的时候独立于其他的进程。并发性并发性:宏观宏观上,在系统中同时有多个进程存在,他们相互独立的运行。v线程(更小的能独立运行的基本单位)就是进程当中的一条执行流程。CPU上下文和栈两种资源不能与其他线程共享,每个线程必须有自己独立的一份。v在许多嵌入式操作系统中,通常把能独立运行的实体称为“任务”。8.1ARM Linux进程管理8.1.1进程描述符及任务结构进程描述符及任务结构 1进程进程l进程是一个实体。每一个进程都有它自己的地址空间进程是一个实体。每一个进程都有它自己的地址空间,包括包括文本区域、数据区域和堆栈区域。文本区域、数据区域和堆栈区域。l进程是一个“执行中的程序”l进程是由进程控制块、程序段、数据段进程控制块、程序段、数据段组成。l一个进程可以包含若干线程(Thread)l进程处于生存周期里,有三种状态:就绪、执行、阻塞就绪、执行、阻塞。这三种状态之间的切换都由进程调度程序控制。v如果需要I/O操作,就会进入阻塞状态,如果不涉及到I/O操作,那么它就不停地在运行和就绪这两个状态之间来回切换。2.进程描述符Linux系统中包括下面几种类型的进程。交互进程:由shell启动的进程。既可在前台运行,也可在后台运行。批处理进程:这种进程和终端没有联系,它被提交到一个队列中的进程序列。守护进程:又称监控进程,是Linux系统启动时开始执行的进程,在后台运行。2.进程描述符v进程不但包括程序的指令和数据,而且包括程序计数器和CPU的所有寄存器以及存储临时数据的进程堆栈。v内核把进程存放在任务队列(tasklist)的双向循环链表中,其中链表的每一项都是类型为task_struct(就是通常所说的进程控制块PCB),称为进程描述符的结构,该结构定义在中。表 PCB通常包含的内容进程描述信息进程描述信息进程控制和管理信息进程控制和管理信息资源分配清单资源分配清单处理机相关信息处理机相关信息进程标识符(PID)进程当前状态代码段指针通用寄存器值用户标识符(UID)进程优先级数据段指针地址寄存器值代码运行入口地址堆栈段指针控制寄存器值程序的外存地址文件描述符标志寄存器值进入内存时间键盘状态字处理机占用时间鼠标信号量使用进程控制块(进程控制块(PCBPCB)structtask_structunsignedlongstate;/进程的状态unsignedlongpolicy;/描述进程调度策略,判断是实时进程还是非实时进程structtask_struct*parent;/组织进程的层次关系,指向父进程structlist_headtasks;/通过list_head组织成双向链表pid_tpid;/每个进程唯一的标号.;下面详细讲解task_struct结构中最为重要的两个域:state和pid。(1)进程状态(State)Linux中的进程主要有如下状态:运行TASK_RUNNING:正在运行或在就绪队列run-queue中准备运行的进程,实际参与进程调度。可中断TASK_INTERRUPTIBLE(浅度睡眠):处于等待队列中的进程,待资源有效时唤醒,也可由其它进程通过信号(signal)或定时中断唤醒后进入就绪队列run-queue。不可中断TASK_UNINTERRUPTIBLE(深度睡眠):处于等待队列中的进程,待资源有效时唤醒,不可由其它进程通过信号(signal)或定时中断唤醒。僵死TASK_ZOMBIE:表示进程结束但尚未消亡的一种状态(僵死状态)。此时,进程已经结束运行且释放大部分资源,但尚未释放进程控制块。暂停TASK_STOPPED:进程被暂停,通过其它进程的信号才能唤醒。导致这种状态的原因有二,或者是对收到SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU信号的反应,或者是受其它进程的ptrace系统调用的控制而暂时将CPU交给控制进程。(2)进程的调度策略)进程的调度策略policy:进程的调度策略,实时进程和普通进程的调度策略是不同的。三种进程的调度策略:l.SCHED_OTHER:其它调度,适用于:普通调度2.SCHED_FIFO:先来先服务调度,适用于:实时调度3.SCHED_RR:时间片轮转调度只有root用户能通过sched_setscheduler()系统调用来改变调度策略(3)标识符()标识符(Identifiers)Pid:进程标识符Uid、gid:用户标识符、组标识符Euid、egid:有效用户标识符、有效组标识符Suid、sgid:备份用户标识符、备份组标识符Fsuid、fsgid:文件系统用户标识符、文件系统组标识符vLinux内核通过惟一的进程标识值PID来标识每个进程。PID是一个非负数,它实际上是一个短整型数据,也就是说它最大值为32767。可以查看/proc/sys/kernel/pid_max来确定该系统的进程数上限。一般来说,32767对于很多桌面系统已经足够,但是对于大型服务器,就必须修改这个上限。v进程的创建、执行和终止进程的创建、执行和终止v(1)进程的创建和执行许多操作系统都提供的是产生进程的机制,也就是首先在新的地址空间里创建进程、读入可执行文件,最后再开始执行。首先,fork()通过拷贝当前进程的内容创建一个子进程,子进程与父进程的区别仅仅在于不同的PID、PPID和其他一些资源。exec函数负责读取可执行文件并将其载入地址空间开始运行。v进程的创建、执行和终止进程的创建、执行和终止v(2)进程的终止进程终结也需要做很多繁琐的收尾工作,系统必须保证进程所占用的资源回收,并通知父进程。Linux首先把终止的进程设置为僵死状态,这个时候,进程无法投入运行了。它的存在只为父进程提供信息,申请死亡。父进程得到信息后,开始调用wait(),子进程占用的资源被全部释放。8.1.2进程的调度v进程调度是指确定CPU当前执行哪个进程。在多个进程同时去竞争CPU的情况下,即在就绪队列中有两个或多个任务同时处于就绪状态,如果只有一个CPU,而且该CPU已经空闲下来,问题:对于就绪队列中的那些进程,选择哪一个去执行?v负责做出这一选择的那一部分程序就是调度器调度器,而调度器在决策过程中所采用的算法,是调度算法调度算法。v从资源管理的角度看,调度器看成是CPU的管理者。v进程调度要解决的问题?调度发生的时机调度的方式:可抢占式调度和不可抢占式调度8.1.2进程的调度vLinux进程调度策略是以优先级调度优先级调度为基础的,即优先运行优先级最高的进程。v根据优先级的范围,可以把进程分为实时进程实时进程(这里的实时是软实时)和普通进程普通进程。实时进程优先级高于普通进程,并由特定的调度策略来保证它们的(软)实时性。v内核中的默认配置是:进程优先级在0139,其中实时进程占用099,一般进程占用100139。v在调度时,系统总是首先选取具有最高优先级的并且拥有活跃进程的进程组,然后进行相同优先级下的进程调度。8.1.2进程的调度调度程序运行时,要在所有处于可运行状态的进程之中选择最值得运行的进程投入运行。选择进程的依据是什么呢?在每个进程的task_struct结构中有这么四项:policy,priority,counter,rt_priority这四项就是调度程序选择进程的依据。其中,policy是进程的调度策略,用来区分两种进程-实时和普通;priority是进程(实时和普通)的优先级;counter是进程剩余的时间片,它的大小完全由priority决定;rt_priority是实时优先级,这是实时进程所特有的,用于实时进程间的选择。进程的调度策略有以下几种(由进程的调度策略有以下几种(由policypolicy的值决定:的值决定:1SCHED_OTHER:分时调度曾经使用了cpu最少的进程将会得到优先调度当所有任务都采用linux分时调度策略时:(1)创建任务指定采用分时调度策略,并指定优先级nice值(-2019)(静态优先级)。(2)将根据每个任务的nice值确定在cpu上的执行时间counter(进程剩余的时间片,动态优先级)。(3)如果没有等待资源,则将该任务加入到就绪队列中。(4)调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃CPU时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃CPU)中。(5)此时调度程序重复上面计算过程,转第4步。(6)当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。2SCHED_FIFO:实时调度对于实时进程,Linux采用的两种调度策略:FIFO和RR(时间片轮转调度)当所有任务都采用FIFO时(不可抢占调度方式):(1)创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。(2)如果没有等待资源,则将该任务加入到就绪队列中。(3)调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu。(4)调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。(5)如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。3SCHED_RR:时间片轮转调度当所有任务都采用RR调度策略时:每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。(1)创建任务时指定调度参数为RR,并设置任务的实时优先级和ni
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 中学教育 > 初中教育


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号