注册 登录
编程论坛 C图形专区

[原创]DOS下多线程的实现(Demo程序)

RockCarry 发布于 2007-07-07 19:07, 5302 次点击
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 https://www.bc-cn.net
*/ 作者: RockCarry
*/ 时间: 2007-7-7 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------

在 DOS 下如何实现多线程,这程序将会告诉你怎么做。

本程序在 Turbo C 2.0 下调试通过,采用了最简单的时间片轮转法,实现了多线程的系统,程序尽量采用了最简洁的技术来实现多任务的系统,主要使用到了C标准库中的setjmp和longjmp两个函数,程序绝大部分都是采用C语言书写,但是仍然不可避免的采用了三句内嵌汇编,来进行线程堆栈的切换。
我可以向你保证,这绝对是一个可靠的多线程实现方式,但是需要指出的是,由于DOS下的系统调用,都是不可重入的,所以尽管我的多线程实现已经很可靠了,但是当你在多个线程中同时调用了DOS的系统调用,仍然会出现问题。

整个系统,是使用时钟中断处理程序,来完成任务的调度,程序的代码很简单,但是却很难被看懂。毕竟,涉及到任务调度的一些原理,没有一定的基础,和理解能力是不行的。

我个人一直都在思考多任务的实现原理这方面的问题,最近终于想通了。这个东西不复杂,但是确实很难理解。要花很多时间去思考和领悟。网上和教科书上,所给出的东西讲得都太过简单,根本不具备指导性的价值,并且也没有给出具体的实现方法和具体的代码。
在这里,我给出一个,我自己实现的多线程系统,供大家参考。代码很简单,没有实现复杂的任务调度,仅仅是一个时间片轮转的调度算法,但是足以说明问题。有机会,可以进一步完善,更复杂的调度,线程之间的同步等等。
其实我也有看过ucos的代码,当时也希望认真阅读,不过到最后发现自己真的看不懂(不知道是他的代码太烂还是我的理解能力太差)。后来索性自己去思考,今天总算成功了。

今天先把代码给出来,以后有时间,再写一篇文档详细讲讲这个。

下载地址:http://www.freewebs.com/chenkai/download/thread.rar
只有本站会员才能查看附件,请 登录



RockCarry
2007-7-7




20 回复
#2
一笔苍穹2007-07-08 11:27
看了,很不错,任务队列,时间片分配轮询,现场的保护和恢复……
还可以加上对时间片的修改以调整优先级,加上类似WIN API的Sleep函数,让以前简单的延时变成交出运行时间给其他线程等。而且printf也是通过DOS中断实现的,不宜反复调用。
#3
RockCarry2007-07-08 12:56
目前只是一个Demo,重在示出原理
DOS调用不可重入的问题的确很麻烦,导致许多库函数都不能对这个多线程系统进行很好的支持,比如说,如果两个线程里面都同时有printf函数,很有可能就会导致程序异常。一开始我在调试时打算在两个线程里面都用printf函数,结果怎么都不行,还以为是自己在多线程系统上的设计和实现有问题。后来才想到DOS功能调用不可重入的问题。因此,目前这个多线程系统的线程函数中都不能有DOS调用,这也限制了其使用范围。
这个系统的可靠性还需要进一步验证,后面这个特性也将会加入到我设计的库中。其实这个代码的精妙之处,真是用言语难以表达的,大家认真体会吧。
#4
ba_wang_mao2007-07-09 08:46
"嵌入式实时操作系统μCOS-II(韶贝贝)"讲解如何在祼机上编写实时操作系统的好书。可以针对PC机,也可以针对单片机。
#5
ba_wang_mao2007-07-09 09:42
"嵌入式实时操作系统μCOS-II(韶贝贝)"详细讲解了如何在祼机上编写操作系统,其实本书主要是针对在单片机(在ROM只有8K-128K的时候实现操作系统)。
 1、多任务
 2、调度
 3、不可剥夺型内核
 4、可剥夺型内核
 5、可重入函数
 6、时间片轮番调度法
 7、死锁
 8、任务间通讯
 9、消息队列
10、消息邮箱
 等等。
目前好多嵌入式工程师已经根据该本书实现了在MSC51、AVR、CF8051单片机上实现简单的操作系统(ROM只有8K)。
#6
gzdillon2007-08-07 22:34
回复:(RockCarry)[原创]DOS下多线程的实现(Demo程...
RockCarry:

你好!很兴奋地发现你选择还在研究dos下的多任务实现,不管结果如何,先景仰一下。好像您还是女性,更加仰慕! :)
请教一个问题,能否同时在1000MB的空间里实现网络通讯、寻路算法和磁盘读写等任务?
此致
dillon
dillony@gmail.com
#7
一笔苍穹2007-08-08 08:37
呵呵,我可以肯定他不是女性
#8
anlogo2007-08-08 10:08
#9
anlogo2007-08-08 10:30

再次景仰一下
请问一下LZ有没有这方面的资料
有的话可以发一份给我,先谢过 lixucan@126.com

#10
hotcls2007-08-08 19:26
lz是谁?
#11
hotcls2007-08-08 19:49
见笑了,lz,楼主也。
#12
RockCarry2007-08-08 19:53

呵呵,不必这么客气
我是boy,这个就不用肯定了
可能是在这个论坛注册的时候填错了信息
to gzdillon, 不知道你说所的“在1000M空间里面实现...”具体指的是什么意思。
网络通讯的话,最好是借助操作系统的 API,如果自己开发工作量会很大,并且不能保证通用性。因此在 DOS 下,就不用考虑网络通讯的问题。
寻路算法,不知道具体指的是什么,似乎在游戏里面有一个寻路的算法。磁盘读写等操作,一般都会借助操作系统的API,因此不用自己写。
如果是想自己全部实现以上的东西,难度确实很大的。

#13
gzdillon2007-08-09 08:12
回复:(RockCarry)呵呵,不必这么客气我是boy,这个...
Carry:

你好!我说的意思是在内存1GB以上的Dos环境里构建一个简单的网络存储环境。所有的功能就是:
1、在网络接口收发网络包。这个在dos下面有很多支持,实现没有问题。
2、在物理内存空间,进行网络包的重组、排序、缓冲、存储等等。这个是私有算法,没有问题。
3、把内存中缓冲的数据写入硬盘,或者相反,这个dos也对大硬盘开始支持,没有问题。
问题在于如何在dos环境里将1、2、3这些任务同时运行!不知道我说清楚了没有。
如果能赐教,不胜感激!
dillon
#14
vfdff2007-08-12 22:19
原来 DOS 系统也可以 用多线程的 !!

不过好像使用
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ChildMain,
(LPVOID)giThreadNumber, dwCreationFlags, &dwThreadId);
语句就可以创建一个线程,这个比较简单
#15
RockCarry2007-08-12 23:00
回复:(gzdillon)回复:(RockCarry)呵呵,不必这么...
在 DOS 下要完成你所说的功能,难度还是很大的,最好还是选用 windows 平台吧。
#16
vfdff2007-08-13 02:56
正在编译...
--------------------------------------------------
错误 temp.c 5: 不能打开包文件 'stdefine.h'
错误 temp.c 6: 不能打开包文件 'thread.h'
错误 temp.c 20: 说明缺少';'
错误 temp.c 22: 说明缺少';'
错误 temp.c 23: 'WORD'的宣告
错误 temp.c 23: 说明缺少';'
错误 temp.c 24: 'WORD'的宣告
错误 temp.c 24: 说明缺少';'
错误 temp.c 26: 说明缺少';'
错误 temp.c 36: 变量列表语法错误
错误 temp.c 40: 说明语法错误
--------------------------------------------------
错误:11 警告:0

我在 TC 下编译出现以上的错误!!
#17
gzdillon2007-08-18 19:28
回复:(RockCarry)回复:(gzdillon)回复:(RockC...
Carry:
你在dwing那里说要坚持开发自己的操作系统,在这里又建议我用windows,好像挺矛盾啊!
#18
RockCarry2007-08-18 20:14
如果是工程上的应用就用windows啦,如果是研究性质的,就最好自己尝试去实现一些底层的东西。
#19
一笔苍穹2007-08-18 23:13
言之有理。
#20
HDUEDU2008-11-05 14:17
非常感谢!
如果可以的话,发我一份,编程过程也讲一下
yu675570271@
现在学操作系统
#21
tco19922011-06-14 22:39
感谢楼主~正学习中
1