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