|
计算机处理的是客观世界的具体任务,我们把它抽象成事件,程序员关注的也是事件,用户关注的也是事件,因此我们需要事件触发式编程。传统上,在VC、VB之类的可视化编程工具支持下,我们可以实现事件触发式编程,比如往桌面上放置一个按钮,我们只需要编写按钮点击事件的处理函数,当点击事件发生后,该函数就自动执行。
传统操作系统,需要在VC之类的工具支持下,才能够做事件触发式编程,究其原因,是因为操作系统是按照线程调度的,必须经过开发工具的包装后,才能转换成事件触发。
图 1传统OS的线程调度图
如图 1,传统的、基于线程调度的OS,无论是简单的ucos还是复杂windows,均可以用该图表示。我们知道,创建线程需要初始化线程并分配线程所需的资源,其中栈是必备的资源。但事实上,传统OS是不会频繁地在线程执行过程中创建新线程的,为什么呢?因为创建线程时必须为线程分配内存,分配内存的操作可能导致阻塞,而被阻塞的却是当前正在执行的线程。大家注意了,是新线程缺乏内存资源,当前线程并不缺乏资源,但被阻塞的却是不缺资源的当前线程,这是不合理的。如果新线程的优先级低于当前线程,那当前线程就冤了,因为一个低优先级的线程,而导致高优先级线程阻塞,这在RTOS中是个灾难;即使不被阻塞,创建线程是一个很费时的操作,高优先级线程执行过程中,花大量时间用于创建低优先级的线程,也是不合理的。所以,传统OS的线程,总是在初始化阶段创建,极少在运行过程中创建。
图 2 传统OS的事件触发式编程
因此,传统操作系统的事件触发式编程,不能在事件发生的时候才创建线程,而是只能在初始化是创建线程并启动,启动后等待事件发生,事件发生将唤醒线程,事件处理完后又进入休眠,如此周而复始,如图 2所示。而无论事件是否会发生,线程肯定会占用资源。
图 3 djyos的事件调度核心
如图 3,djyos是按事件调度的,弹出事件时只是把事件控制块插入时间调度队列中,需要的时间就非常短。如果新弹出的事件的优先级不高于正在处理的事件,根本就不会为他创建线程或分配线程。传统操作系统中,事件发生后,操作系统把事件作为线程的资源交给线程处理,而djyos中正好相反的,事件发生后,操作系统把线程作为处理事件所需要的资源分配给事件。这使得djyos能够更加优化配置计算机的资源,就拿简单的通信程序为例,如果通信线没有连接,传统OS用于处理接收数据的线程依然会占用资源,而djyos则不会;如果频繁通信,传统OS只能由初始化时创建的线程依次处理,即使拥有多核cpu,也只能由一个核处理,其他cpu核只能干着急,在线程调度模式下优化多核编程,是很复杂的技术,已经发展成了一门学科;而djyos则会很自然地把频繁弹出的通信接收事件分散到不同的cpu核上,程序员根本不知道线程为何物,就能进行优化的多核编程。在这里,cpu核实际上也是当作解决事件所需要的资源而存在。
在djyos下编程,程序员不需要知道什么是线程和进程,只需要把需要计算机处理的具体任务分解成一个个的事件类型,并为每个事件类型编写处理函数就可以了。
最后,再举一个简单的例子:公司有宝马和奥迪两台车(两个线程),“老总出行”这个任务分配给宝马执行,“副总出行”任务分配给奥迪执行,但两台车共用一名司机(只有一个cpu核)。传统操作系统下,调度器是决定那台车(线程)先使用司机(cpu),把“人(老总或副总)出行”这件事分配给车(线程)。如果老总要去钓鱼,副总要去赶飞机,但是,按照公司制度(调度策略)宝马线程的优先级高,先开,而副总没有分配给宝马,副总就只能叫飞机等一等。而djyos的调度是按事件进行的,操作系统调度的是那件事先处理,副总的事(赶飞机)优先级高的话,线程(车)和司机(cpu)就先分配“副总赶飞机”这个事件,老总钓鱼就要等一下了。
[ 本帖最后由 djyos 于 2009-11-30 15:34 编辑 ]
|
|