2012年(17)
分类: 虚拟化
2012-07-18 14:27:55
主框架通常是用中文编写,自然、简单。Socket线程,非阻塞式线程调度,阻塞式线程调度都是内核实现的,无需用户编写;我会陆续给出它们的源码。我的意见是有志于智能系统领域的兴趣者都应学习简单的汇编语言及CPU的结构。不要在C语言,高级语言上浪费时间,对于熟识硬件毫无帮助。汇编语言的熟识可以玩下MSP430单片机或ARM的CortexM3。不要去了解IN*,AM*那些垃圾CPU。更不要去试图了解WINDOWS,LINUX的内核;那会把你弄得晕头转向!LINUX虽然是公开源代码,但给你1000万行;你有时间?
网络应用程序通常是使用非阻塞式线程调度;非阻塞意思是在进程的时间片内,如果线程的执行时间是比较长,甚至在时间片内都无法完成一个线程。就不应等一个线程执行完毕才运行下一个线程。应公平分配各个线程的执行时间片,让每个线程在进程的时间片内都可能有机会执行。即是说一个线程不应阻塞另一个线程;每个线程按优先级都论一遍后再从头按优先级轮转。
入口:入口在进程的初始化中实现。非阻塞线程的条件限制在应用程序中的线程实现。通常处理x包数据后先让位,下次轮到后再接着继续。
R2 = 网络应用程序数据段.线程位图地址;
R1 = 网络应用程序数据段.非阻塞线程位图地址;
R3 = 网络应用程序数据段.线程数;
R4 = 线程入口表地址;
非阻塞线程调度{ // 这是内核类库中的非阻塞式线程调度宏代码
Mp1;
MOV( *R1,*R2,R3 ); // 复制线程位图到非阻塞线程位图,长度R3。
SS1( R0,*R2,R3 ); // 搜索线程位图最高位为1的高优先级中断号送R0。
BTB1 Z, 内核开始; // 到达尾部结束跳,无线程任务将时间片交回给内核。
Mp2;
SS1N( R0,*R1,R3 );// 搜索非阻塞线程位图高位为1的线程号送R0,并置位为0。
BTB1 Z, Mp1; // 到达尾部结束,所有需运行的线程已经执行一遍跳新一次循环。
TBH( R4,R0 ); // 查表跳转指令; 运行相应线程。
JMP Mp2; // 继续,将所有需运行的线程执行一遍。
}
网络应用程序主框架。
main{ // 代码根节点,JDMUF根节点(进程)描述符由内核定义。
非阻塞线程调度; // 编译器会自动替换该节点为内核类库中相应的宏代码。
线程入口表地址; // 线程接口,标号要顶格写。
初始化函数; // 包含线程初始化代码,Socket系统调用。
SNP对象通信线程; // 1号消息处理线程。
鼠标键盘消息处理线程; // 2号消息处理线程。
定时器消息处理线程; // 如需要处理定时器消息则增加这一个线程。
中断消息处理线程; // 如需要处理中断则增加这一个线程。
Socket线程; // 该线程代码在类库
用户线程6; // 6号用户处理线程。如需要则增加,一切随意。
。。。。。。。。。
}