当前位置: 首页 > 工具软件 > djyos > 使用案例 >

计算机事件的定义,DJYOS操作系统中的“事件”概念

寿翰飞
2023-12-01

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

1.1.1 事件计算机处理的是现实世界中的具体任务,有因才有果,现实生活中的任务不会无缘无故地产生,人们做某一件事肯定是因为发生了某种事件使其需要去做这件事情,这就是事件。计算机中的事件与现实生活中的事件是一致的,CPU不会无缘无故地执行某一段代码,就算是一段包含在一个if语句里的代码被执行,肯定是因为发生了使该条件成立的事件。人走到沙发前是一个事件,智能沙发上的计算机发现这个事件后然后处理这个事件,处理结果是执行调整坐垫到合适位置的操作;人转身面对电视机是一个事件,智能电视机里的计算机发现这个事件然后处理这个事件,处理结果是执行打开电视机的操作;人躺在床上并闭上眼睛,智能家居的计算机发现这个事件然后处理这个事件,处理的结果是执行关灯的操作。以上所述的事件,就是DJYOS操作系统中“事件”的原型。所有这些原型中,都有一个“发现”(或称“检测”)事件和执行一定操作以处理事件的过程,现实系统中,这两个过程可能非常复杂,甚至处于两个不同的学科,其软件实现模块可能会由两个不同专业方向的程序员编写。DJYOS软件模型是:由一个软件模块专门用于监测人的行为,另外一些模块执行开关灯、开关电视机、调整沙发坐垫的操作。检测模块发现人靠近沙发的事件后,不是去调整沙发坐垫,而是把“事件”报告给操作系统了事。操作系统收到该事件后,把该事件记录在调度队列中,根据调度算法,决定要处理该事件时,就分配或创建用于处理该类型事件的线程虚拟机,并启动线程虚拟机,再由这个线程去执行调整沙发坐垫的操作。这样,就使“检测”和“执行”相互独立开来。进程、线程之类的东西只是操作系统内部的秘密,线程虚拟机作为一个资源,是创建新资源还是使用现有资源来处理事件,完全由操作系统自动完成,应用程序的程序员不知道也不需要关心这些。 DJYOS的调度是基于事件的,这是DJYOS与传统操作系统最大的区别。左图是从传统操作系统抽象出来的,无论是简单的OS还是复杂OS,其调度都是基于线程的。左图中,无论是初始化创建线程,还是线程执行过程中创建线程,都是在创建线程的时候分配线程所需要的资源,栈是其中的必备件。右图中,无论什么时候弹出事件,除非新事件的优先级足够高,需要立即处理,否则弹出时不会分配或创建线程,直到该事件应该被处理的时候才创建或分配线程。看起来,除了不能从中断处理函数中创建线程外,左右两图有很大的相似性,其实不然,传统OS是不会频繁地在线程执行过程中创建新线程的,为什么呢?因为创建线程的操作可能导致阻塞,而被阻塞的却是当前线程。如果新线程的优先级低于当前线程,那当前线程就冤了,因为一个低优先级的线程,而导致高优先级线程阻塞,这在RTOS中是不允许的;即使不被阻塞,高优先级线程执行过程中,花大量时间用于创建低优先级的线程,也是不合理的。所以,传统OS的线程,总是在初始化阶段创建,极少在运行过程中创建。而DJYOS则没有这个问题,如果新弹出的事件优先级不够高,根本就不会为他创建线程。这使得DJYOS能够更加优化配置计算机的资源,假设有一个产品,有usb口和uart串口,在传统线程模式下,usb通信线程和uart通信线程是在初始化时创建的,即使uart通信线没有连接,uart线程也必定占用内存资源。如果usb通信非常频繁地发生,也只能由初始化时创建的那个线程一点一点来处理,即使你有多个cpu核,其他cpu核也只能干着急。在线程调度模式下优化多核编程,是很复杂的技术,已经成了一门学科,这里不打算探讨。而DJYOS的事件调度呢?如果uart通信线上没有数据,则根本不会弹出该事件,也就不会占用任何资源。如果usb口频繁通信,就会频繁弹出事件,若计算机有多个cpu核,则自然而然地会把事件分散到不同的cpu核上,程序员根本不知道线程为何物,就能进行优化的多核编程。大家都知道vc、cbuilder下编程吧,在桌面上放上一个按钮,然后为按钮点击事件编写处理函数,当用户点击该事件时,处理函数就被执行。这就是事件触发式编程,这是怎么实现的呢?原来,有一个线程一直在后台候着,等待windows发出的消息,一旦收到点击消息,线程便被唤醒执行。我们可以看到,无论该按钮是否被点击,甚至一辈子都不点击,该线程依然要占用系统资源。而DJYOS的方法则不同,只要该事件不发生,则不会占用任何系统资源。VC为什么要实现事件触发式编程呢?是因为现实需要,与传统操作系统需要像VC这样的工具支持才能实现事件触发式编程相比,DJYOS只需要文本编辑器就可以实现。VC这样的工具只能用于较大的系统中,而DJYOS却可以用在单片机中!DJYOS的调度是基于事件的,这是DJYOS与传统操作系统最大的区别。传统的基于线程(进程)的调度模式下,用户只知道哪个线程(进程)正在占有CPU,却不能知道该线程(进程)在干什么,操作系统调度器也只能针对线程(进程)分配CPU,不能针对计算机所处理的具体事务分配CPU。因此,传统操作系统下,程序员必须熟练掌握有关线程(进程)的知识,必须自己为程序需要处理的事务创建线程(进程),清楚在任何状态下哪些线程(进程)正在运行。而事件调度则不同,用户可能根本不知道线程(进程)的存在,以及谁正在运行,谁正在等待,实际上,程序员根本不需要关心这些。

 类似资料: