| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 1712 人关注过本帖
标题:[原创]DOS下多线程的实现(Demo程序)
收藏  订阅  推荐  打印
RockCarry
Rank: 12Rank: 12Rank: 12
等级:版主
帖子:401
积分:5566
注册:2005-8-5
[原创]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



RockCarry
2007-7-7




附件: 只有本站会员才能下载或查看附件,请您 登录注册
搜索更多相关主题的帖子: Demo  线程  DOS  
2007-7-7 19:07
一笔苍穹
Rank: 4
等级:高级会员
帖子:641
积分:6736
注册:2006-5-25

看了,很不错,任务队列,时间片分配轮询,现场的保护和恢复……
还可以加上对时间片的修改以调整优先级,加上类似WIN API的Sleep函数,让以前简单的延时变成交出运行时间给其他线程等。而且printf也是通过DOS中断实现的,不宜反复调用。
2007-7-8 11:27
RockCarry
Rank: 12Rank: 12Rank: 12
等级:版主
帖子:401
积分:5566
注册:2005-8-5

目前只是一个Demo,重在示出原理
DOS调用不可重入的问题的确很麻烦,导致许多库函数都不能对这个多线程系统进行很好的支持,比如说,如果两个线程里面都同时有printf函数,很有可能就会导致程序异常。一开始我在调试时打算在两个线程里面都用printf函数,结果怎么都不行,还以为是自己在多线程系统上的设计和实现有问题。后来才想到DOS功能调用不可重入的问题。因此,目前这个多线程系统的线程函数中都不能有DOS调用,这也限制了其使用范围。
这个系统的可靠性还需要进一步验证,后面这个特性也将会加入到我设计的库中。其实这个代码的精妙之处,真是用言语难以表达的,大家认真体会吧。
2007-7-8 12:56
ba_wang_mao
Rank: 3Rank: 3
来自:成都理工大学
等级:中级会员
帖子:282
积分:3028
注册:2006-11-7

"嵌入式实时操作系统μCOS-II(韶贝贝)"讲解如何在祼机上编写实时操作系统的好书。可以针对PC机,也可以针对单片机。

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2007-7-9 08:46
ba_wang_mao
Rank: 3Rank: 3
来自:成都理工大学
等级:中级会员
帖子:282
积分:3028
注册:2006-11-7

"嵌入式实时操作系统μCOS-II(韶贝贝)"详细讲解了如何在祼机上编写操作系统,其实本书主要是针对在单片机(在ROM只有8K-128K的时候实现操作系统)。
 1、多任务
 2、调度
 3、不可剥夺型内核
 4、可剥夺型内核
 5、可重入函数
 6、时间片轮番调度法
 7、死锁
 8、任务间通讯
 9、消息队列
10、消息邮箱
 等等。
目前好多嵌入式工程师已经根据该本书实现了在MSC51、AVR、CF8051单片机上实现简单的操作系统(ROM只有8K)。

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

RockCarry:

你好!很兴奋地发现你选择还在研究dos下的多任务实现,不管结果如何,先景仰一下。好像您还是女性,更加仰慕! :)
请教一个问题,能否同时在1000MB的空间里实现网络通讯、寻路算法和磁盘读写等任务?
此致
dillon
dillony@gmail.com
2007-8-7 22:34
一笔苍穹
Rank: 4
等级:高级会员
帖子:641
积分:6736
注册:2006-5-25

呵呵,我可以肯定他不是女性
2007-8-8 08:37
anlogo
Rank: 3Rank: 3
等级:中级会员
威望:1
帖子:237
积分:2470
注册:2007-7-20


学习VC++中!
2007-8-8 10:08
anlogo
Rank: 3Rank: 3
等级:中级会员
威望:1
帖子:237
积分:2470
注册:2007-7-20

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


学习VC++中!
2007-8-8 10:30
hotcls
Rank: 1
等级:新手上路
帖子:18
积分:280
注册:2007-7-31

lz是谁?

http://user.qzone.qq.com/526044268
2007-8-8 19:26
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.078485 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved