djyos吧 关注:45贴子:133
  • 3回复贴,共1

何为事件调度

只看楼主收藏回复

计算机处理的是现实世界中的具体任务,有因才有果,现实生活中的任务不会无缘无故地产生,人们做某一件事肯定是因为发生了某种事件。计算机中的事件与现实生活中的事件是一致的,CPU不会无缘无故地执行某一段代码,就算是一段包含在一个if语句里的代码被执行,肯定是因为发生了使该条件成立的事件。人走到沙发前是一个事件,智能沙发上的计算机发现这个事件后才会处理这个事件,处理结果是执行调整坐垫到合适位置的操作;人转身面对电视机是一个事件,智能电视机里的计算机发现这个事件才会处理这个事件,处理结果是执行打开电视机的操作;人躺在床上并闭上眼睛,智能家居的计算机发现这个事件才会处理这个事件,处理的结果是执行关灯的操作。以上所述的事件,就是djyos操作系统中“事件”的原型。所有这些原型中,都有一个“发现”(或称“检测”)事件和执行一定操作以处理事件的过程,现实系统中,这两个过程可能非常复杂,甚至处于两个不同的学科,其软件实现模块可能会由两个不同专业方向的程序员编写。djyos软件模型是:由一个软件模块专门用于监测人的行为,另外一些模块执行开关灯、开关电视机、调整沙发坐垫的操作。检测模块发现人靠近沙发的事件后,不是去调整沙发坐垫,而是把“事件”报告给操作系统了事。操作系统收到该事件后,把该事件记录在调度队列中,根据调度算法,决定要处理该事件时,就分配或创建用于处理该类型事件的线程虚拟机,并启动线程虚拟机,再由这个线程去执行调整沙发坐垫的操作。这样,就使“检测”和“执行”相互独立开来。进程、线程之类的东西只是操作系统内部的秘密,线程虚拟机作为一个资源,是创建新资源还是使用现有资源来处理事件,完全由操作系统自动完成,应用程序的程序员不知道也不需要关心这些。
djyos的调度是基于事件的,这是djyos与传统操作系统最大的区别。传统的基于线程(进程)的调度模式下,用户只知道哪个线程(进程)正在占有CPU,却不能知道该线程(进程)在干什么,操作系统调度器也只能针对线程(进程)分配CPU,不能针对计算机所处理的具体事务分配CPU。因此,传统操作系统下,程序员必须熟练掌握有关线程(进程)的知识,必须自己为程序需要处理的事务创建线程(进程),清楚在任何状态下哪些线程(进程)正在运行。而事件调度则不同,用户可能根本不知道线程(进程)的存在,以及谁正在运行,谁正在等待,实际上,程序员根本不需要关心这些。djyos系统中,程序员只知道哪个事件正在被处理,哪些事件已经处理完成,哪些事件正在队列中等待处理。定义一个一个的事件类型并登记到系统中,为每类事件编写处理函数,便是编程的全部工作。当系统中存在多个事件类型而具有不同的优先级的事件时,在传统操作系统下,要么为每一种可能的优先级建立一个线程(进程)来实现,要么在执行中动态改变线程(进程)的优先级,不管哪种方式,程序员都需要花费大量的时间和精力,以确保事件按正确的优先级得到处理。而djyos不同,它先天就是以事件优先级作为调度的基础,只要在产生事件时,直接在事件中做优先级标志就可以了。例如一个串口通信程序,中断函数负责低层接收,当接收到完整数据包后,就发给上层应用程序处理,上层应用程序处理接收到的所有数据包,数据包中有一个命令字域,不同的命令要求的优先级不同,有些命令要求紧急处理,有些命令则可以慢慢来。在传统操作系统下,要么创建一个comm_app线程,在中断函数中把数据传送给该线程的同时根据命令字改变comm_app线程的优先级,这种在中断函数中改变线程优先级的做法,在许多操作系统中是不允许的;另一种方法是,为命令字对应的每一种可能的优先级,均创建一个相同的线程,这些线程除优先级不同外,其它部分完全相同,当中断函数接收到完整数据包时,就根据数据包中的命令字,发消息给相应优先级的线程。这种方法虽然可行,但是会消耗很多CPU资源,且难于在编码阶段枚举所有可能的优先级,一旦命令字发生变化,很可能就需要升级软件。而djyos系统不一样,程序员只需要定义一个事件类型,并为之编写事件处理函数proc_uart(),当中断函数接收到完整数据包时,弹出事件时直接以命令字对应的优先级作为参数就可以,djyos的调度系统自动会根据事件优先级域进行调度。



1楼2011-07-19 22:32回复
    另外,嵌入式系统多是反应性系统,反应性系统的主要任务是对外界的事件做出正确且及时的反应,从这点看,程序员根本就不用知道进程和线程这些东西,为处理外界事件而建立线程(进程)实际上是不得已而为之,传统操作系统下,你必须做这些工作,你的系统才能正确地为你做些事情。基于事件的调度非常适合这种反应性系统,被调度的目标就是反映外部刺激的事件,而不是处理这些外部刺激的线程,符合人们的习惯性思维。即使是非反应性系统,或者是非实时系统,基于事件的调度仍然有其优势,“有事就做,没事就坐”是人们最为习惯的思维方式,以事件为调度单位显然符合这种思维方式,而与人们习惯性思维相同的调度方式,又是避免人为错误,减少软件bug的有效方法。
    现代计算机已经进入“ubiquitous/Pervasive Computing”时代,即普适计算。在普适计算时代,触手可及的计算产品里面也包含着触手可及的计算机程序,这些程序由大量的嵌入式程序员编写,是的,十年前的硬件工程师可以不懂软件,软件工程师可以不懂硬件,而今天的嵌入式技术,除了在一些很特殊的方向如射频设计,已经没有纯粹意义上的软件工程师和硬件工程师了。让这些队伍迅速壮大的、软硬兼施的“普适计算工程师”们去掌握晦涩难懂的进程和线程技术并灵活应用,恐怕要花费不少的人才培养成本,而使用传统的操作系统开发嵌入式产品,不理解这些复杂的概念根本就寸步难行,而人才的匮乏又将限制嵌入式产业的发展。djyos操作系统不要求程序员操纵线程和进程,程序员只需把需要计算机处理的任务划分为一个个事件类型,并为各种不同类型的事件编写独立的事件处理函数,并且把它登记到系统中就可以了。当事件发生时,发现(检测到)该事件的程序员只要告诉操作系统“某类型事件发生了”,操作系统自动地创建或唤醒合适的线程去处理事件,而无须程序员亲自动手。当然, “普适计算工程师” 即使是在djyos系统下编程,深入理解线程和进程技术,对开发工作也是很有帮助的。
    djyos下程序运行的过程,就是新事件不断发生,操作系统不断组织、创建、分配线程、进程以及其他资源去处理事件的过程。每弹出一条事件,djyos操作系统就为它分配一个事件控制块,事件处理完毕后收回事件控制块。未处理完毕的事件就会堆积在队列中,操作系统对队列的容量有一定的限制,当队列中事件数量达到限制数时,操作系统将拒绝接受新事件。port_kernel.h文件中的cn_events_limit常量用于确定队列容量,默认值=100,程序员可以修改它。


    2楼2011-07-19 22:32
    回复
      2025-06-24 07:37:39
      广告
      顶啊!


      3楼2011-08-11 18:31
      回复
        虽然看不大懂。。。但是还是帮顶了。。关注这个新生系统很久了。。


        IP属地:广东来自WindowsPhone客户端4楼2013-01-31 03:44
        回复