标题:[原创]DOS下多线程的实现(Demo程序)
只看楼主
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
结帖率:95.65%
 问题点数:0 回复次数:20 
[原创]DOS下多线程的实现(Demo程序)
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://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
A4S6zOru.rar (10.93 KB) [原创]DOS下多线程的实现(Demo程序)




RockCarry
2007-7-7




搜索更多相关主题的帖子: Demo 线程 DOS 
2007-07-07 19:07
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
看了,很不错,任务队列,时间片分配轮询,现场的保护和恢复……
还可以加上对时间片的修改以调整优先级,加上类似WIN API的Sleep函数,让以前简单的延时变成交出运行时间给其他线程等。而且printf也是通过DOS中断实现的,不宜反复调用。
2007-07-08 11:27
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
目前只是一个Demo,重在示出原理
DOS调用不可重入的问题的确很麻烦,导致许多库函数都不能对这个多线程系统进行很好的支持,比如说,如果两个线程里面都同时有printf函数,很有可能就会导致程序异常。一开始我在调试时打算在两个线程里面都用printf函数,结果怎么都不行,还以为是自己在多线程系统上的设计和实现有问题。后来才想到DOS功能调用不可重入的问题。因此,目前这个多线程系统的线程函数中都不能有DOS调用,这也限制了其使用范围。
这个系统的可靠性还需要进一步验证,后面这个特性也将会加入到我设计的库中。其实这个代码的精妙之处,真是用言语难以表达的,大家认真体会吧。
2007-07-08 12:56
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 
"嵌入式实时操作系统μCOS-II(韶贝贝)"讲解如何在祼机上编写实时操作系统的好书。可以针对PC机,也可以针对单片机。

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-07-09 08:46
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 
"嵌入式实时操作系统μCOS-II(韶贝贝)"详细讲解了如何在祼机上编写操作系统,其实本书主要是针对在单片机(在ROM只有8K-128K的时候实现操作系统)。
 1、多任务
 2、调度
 3、不可剥夺型内核
 4、可剥夺型内核
 5、可重入函数
 6、时间片轮番调度法
 7、死锁
 8、任务间通讯
 9、消息队列
10、消息邮箱
 等等。
目前好多嵌入式工程师已经根据该本书实现了在MSC51、AVR、CF8051单片机上实现简单的操作系统(ROM只有8K)。

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-07-09 09:42
gzdillon
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-8-7
得分:0 
回复:(RockCarry)[原创]DOS下多线程的实现(Demo程...
RockCarry:

你好!很兴奋地发现你选择还在研究dos下的多任务实现,不管结果如何,先景仰一下。好像您还是女性,更加仰慕! :)
请教一个问题,能否同时在1000MB的空间里实现网络通讯、寻路算法和磁盘读写等任务?
此致
dillon
dillony@gmail.com
2007-08-07 22:34
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
呵呵,我可以肯定他不是女性
2007-08-08 08:37
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
得分:0 
2007-08-08 10:08
anlogo
Rank: 2
等 级:论坛游民
威 望:1
帖 子:293
专家分:20
注 册:2007-7-20
得分:0 

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

2007-08-08 10:30
hotcls
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-7-31
得分:0 
lz是谁?

http://user.qzone./526044268
2007-08-08 19:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-153536-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033448 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved