下沙论坛

 找回密码
 注册论坛(EC通行证)

用新浪微博连接

一步搞定

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 6117|回复: 27
打印 上一主题 下一主题

菜鸟请教个为位高手一个关于进程代码的编写!

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
8 p' K% V# G/ L0 O+ c5 V1 g7 U要求:1 用c语言编写, m" N+ Q" {0 ?% R" O
         2 程序+PCB(ID的内外优先权,申请资源)
6 P7 @5 K8 K" D# g; P% W3 [8 k只需做进程中”产生“这一步。) k* V% l/ q  }" ^: f1 t
以下是做了3分之1的范例:. W- _1 w- U& T4 b6 W* m( @
#include "stdio.h"
4 W% ], ^: A0 h5 p" t#define running 1 /*用running 表示进程处于运行态*/ . R! a/ P+ K& j5 B
#define aready 2 /*用aready表示进程处于就绪态*/ 6 @4 P" [9 u$ {  h# [
#define blocking 3 /*用blocking表示进程处于等待态*/
" C8 O, ~, ?2 @#define sometime 5 /*用sometime 表示时间片大小*/
* [: H+ N# _9 D$ j. a#define n 10 /* 假定系统允许进程个数为10 */
# I- Z; w) v! ]; q8 t5 \+ o4 B: b3 X* O& d! k
struct
8 e$ N& s8 v6 \6 X# ~{ 6 G6 F5 z3 a7 H* R
int name; /*进程标识符*/ 7 G" {$ W5 P, r1 q4 I) Q+ \
int status; /*进程状态*/ - t6 ?! M' L  W. d& H0 ^, O3 p
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
8 C, |* m6 _" Vint pc; /*进程现场信息,程序计数器内容*/
' k% J7 ^* h# d' e6 m' S( y5 P  Yint psw; /*进程现场信息,程序状态字寄存器内容*/ : C7 u+ e* O% Z6 t: i) a& W; L
int next; /*下一个进程控制块的位置*/ 3 s( [+ h; P) S
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
2 F' }5 [# i1 S3 r5 O9 Q4 \8 v
/ f, v9 c" k. |) K* xint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ 4 P% n% A+ f: c+ \
3 H* \# R# W: W! T8 W
int run; /*定义指向正在运行进程的进程控制块的指针*/ # `$ W* d' \) R1 n2 k
struct
/ X. X$ v/ s  z" X- \3 y3 t2 p. D5 K{
( ~% D; P! e$ A/ I& V: ?int head;
% L' {4 s0 o2 lint tail; , `' U8 @  ~. e8 [! ^& Q7 Z
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
( G. o- V$ o* C$ A* ]2 q' d: g% zint block; /*定义指向等待队列的指针*/
. c& a4 ]$ ^0 j! D) mint pfree; /*定义指向空闲进程控制块队列的指针*/% t: Q# v" B* u$ B# G( c. C

$ m$ w# N' ^$ i, D3 l7 m麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![em00]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    2
    发表于 2003-10-20 18:20:00 | 只看该作者
    这个问题也太麻烦了,回答这个问题要自己去写调试花费时间太浪费了,你还是参考书上的吧
    towny 该用户已被删除
    3
     楼主| 发表于 2003-10-20 20:54:00 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?% X, _$ G# z# N1 H8 K6 y
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    . g% p( u" Z# |/* the main site file */: p* M2 h+ i/ ]3 F
    CreatePro(&ID){
    ! A" a. x. Q/ c7 Y5 P  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;' _' x/ a% N- N' _
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    : C- y, U( U1 `# @8 ]$ n; a  C/*初始化参数*/
    % ]0 r: y) i; w2 X/ J, K   CallName(&ID);   //命名进程的外部名
    5 [1 `, I: `# p1 b( l8 _) z  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、4 F% }* G+ I3 g$ }# m" G
      SetFL();  //优先级数、0 w! h1 y' `% z; p. P
      SetHeap();  //进程起始地址、
    & T2 }# F+ m; j0 O, o1 x  _SetSelfStat();  //设置进程的状态为就绪态( e( u5 H' B9 @# a& \. w
      AddStat_Read(); //将该进程加入到就绪队列中。! R) }8 X" N9 U- U+ D8 z7 W
    .- A6 ~, w  m7 O# Q4 t, s
    .% W2 h; W; E. x/ K' D. u* W
    .& P7 v) B: ^& S
    ./ F; |/ j1 v( j# K7 W" e1 I
    }
    $ h7 y9 ~/ `9 g8 w) I, ]我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思& J* m9 d% `) ~. L
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    : m% Q7 |6 h- x. z. G谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢1 q6 Y+ t9 k4 O0 @3 \ & w3 z. ?! f% Z( J0 [9 n#include , S; U2 D( P# u5 z5 `#include3 w/ A3 P& T2 P! Y3 O #include ; Y/ J, A" I6 ]2 Z5 l9 C1 Q' L: Y#include 8 ?. b6 W. y- }. L* t#define running 1 /*用running 表示进程处于运行态*/3 @1 M8 ^. B5 r* S& ~ L #define aready 2 /*用aready表示进程处于就绪态*/ 4 [: X% [4 _" F- ?#define blocking 3 /*用blocking表示进程处于等待态*/. F% j7 P- {- p #define sometime 5 /*用sometime 表示时间片大小*/, b" Y% W' E7 R# S/ ?+ c #define n 10 /* 假定系统允许进程个数为10 */ ( A8 g: H W" Z& u: R: {. gstruct - I* B' r8 f2 c& F# S* z& g8 F{) w; p, B1 M9 G! Q% E& i! m int name; /*进程标识符*/; P4 _9 i: f: t. } int status; /*进程状态*/! ~. g2 o4 Q: U4 m int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ ' D v7 T, r. q: y& bint pc; /*进程现场信息,程序计数器内容*/ . Y0 u/ u2 X+ l% J* Lint psw; /*进程现场信息,程序状态字寄存器内容*/ ' f1 e( f+ l+ uint next; /*下一个进程控制块的位置*/8 ]& ?0 Q$ B* R" v0 A }pcbarea[n]; /*定义模拟进程控制块区域的数组*/" ]. q- D% o: b# I int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/8 Y) j4 r8 O2 s int run; /*定义指向正在运行进程的进程控制块的指针*/: }# y& x" S2 f$ {4 T5 U" c struct6 q) B- B8 {6 ?- Q {1 R; S0 c9 \7 z* W int head; 4 F' n; i- Z0 Wint tail;) c& I+ @3 N- H$ O' _ v/ E$ j }ready; /*定义指向就绪队列的头指针head和尾指针tail*/3 O' W' m' P/ F$ c9 U, A. D, \ int block; /*定义指向等待队列的指针*/3 \3 c- d n: q& E" @$ O int pfree; /*定义指向空闲进程控制块队列的指针*/ " j \6 H4 w6 cmain() ' r: J/ ]5 Y4 l ?{ int gdriver=DETECT,gmode; 0 m' V' W7 [6 d) G: Q int i,x,y; 2 {, J( Q! t2 X2 a: r$ @ for(i=1;i<=n;i++). N6 J% P6 U2 A) D1 z {ready.head=pcbarea.next;}+ K% u) Y* G8 v& Z initgraph(&gdriver,&gmode,"");8 m& U& }7 L0 j# y! h setcolor(YELLOW);+ {- Y S T4 |6 w for(i=1;i<=4;i++)7 s9 f. P: m5 c- ? { setfillstyle(8,i); 5 z$ I( `; m Z6 N( P) W2 [" Q: Y4 F circle(284+13*i,190,6);) k" f% F M- T9 ]+ j: ~ floodfill(284+13*i,190,YELLOW); 6 I( y" q8 }* Q s; W ?" c$ w }3 H% M& Z, j4 z# m setlinestyle(0,0,3); : Y' M' M5 c8 P, m# r- M1 B circle(316,190,25);; r# J5 a; }% Z) P setcolor(5); $ [- K, A& E2 ] settextstyle(3,0,4); 9 k* @4 y& `/ ^: v outtextxy(35,311,"press any key to create objects!"); $ q0 u2 z& n, ]# r& D getch();, `1 y! x- |6 y" t$ o* q4 c3 N+ O setcolor(YELLOW);# T# o! F1 T9 i2 k3 U line(300,215,290,235); . q& S6 ~6 K3 _) } J) q line(323,215,333,235);) \' z6 R# {* U/ G( X* I delay(50000);7 N1 G' @& p+ s( } setlinestyle(0,0,1);) {4 n1 `% q! u& s# u$ ~% c8 D, c for(x=1;x<=2;x++)# u8 v7 D) O$ u) w% @' V4 { {setfillstyle(8,x);8 n8 q0 Y/ E( D6 G circle(267+13*x,246,6); " t6 V2 N, g. `4 t t floodfill(267+13*x,246,YELLOW); 2 [0 y' J/ `( q6 r: Y f } : h4 }" J( {' L; m# [0 z# U$ I( y* Y4 u" ]% n for(y=3;y<=4;y++)6 G" ?4 Q8 Q, s5 Z1 ?( i {setfillstyle(8,y);. e; ~9 B0 L& _) Y circle(285+13*y,246,6); , r4 _* Z1 N- z" J floodfill(285+13*y,246,YELLOW); 6 z4 `3 [0 ^1 J4 o% X }/ w6 }0 J& m% s# e8 s setlinestyle(0,0,3); * ]3 @0 T1 q# j, h circle(287,246,14); $ \4 T& Y+ n$ U! [+ N setlinestyle(0,0,3); q3 Z* o4 M( [: J6 a) L circle(330,246,14); 3 \8 P; v& d) U! Y0 x* C delay(50000); $ P; t: E9 ]' [. O* O% q line(281,260,281,280);9 Y$ K/ H2 C8 V line(293,260,293,280); ! |5 q2 i: c0 I6 W; ? line(322,260,322,280);) S2 M' j! q/ f+ L0 } line(333,260,333,280); $ f( @3 V2 N2 B7 J1 \( k$ D delay(50000);+ o* a$ G$ [/ p) X setlinestyle(0,0,1); : H$ j% m5 n3 T( X4 D setfillstyle(8,1);6 ^, |+ D4 p! z/ S circle(281,286,6); 5 L" |, k; |) U4 y/ a" @+ E floodfill(281,286,YELLOW); # |% V& A6 U$ e" m setfillstyle(8,2);( ?! H3 A. f( n$ ^- O' l; o% P circle(293,286,6); " [6 O ~: P1 l& Y floodfill(293,286,YELLOW);, N) I, p$ N% \9 o. u2 R) m% p setfillstyle(8,3); " z7 o# t! V! g9 e0 y/ d" X circle(322,286,6);8 U% ?) V7 i. p) @0 R/ k: B8 T floodfill(322,286,YELLOW); 9 T0 T Y( r( b. B/ d setfillstyle(8,4); c! r: i0 f% E circle(333,286,6); # O3 h' Z) ^7 `7 R% L/ G floodfill(333,286,YELLOW);* m5 r# c8 e1 `7 _ getch(); 1 h$ A" t8 T2 g, Y% I) [1 n: o; ] closegraph(); I3 e# z0 l! Z}. g; I. _# D7 R! _: D6 m 0 u' `% W" j; P, @6 Y- P' s/ h+ e" q- R 
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    * F& S* p- H& k/ P$ W难道不是《操作系统》的‘进程’那一章进程创建??
    ( Z; R. F. H8 ~* v' D到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    $ ~' \9 [0 _: V不好意思!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2003-10-21 21:54:00 | 只看该作者
    我倒
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    10
    发表于 2003-10-22 21:09:00 | 只看该作者
    狂晕,这个手误也太离谱了。
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    11
    发表于 2003-10-22 21:09:00 | 只看该作者
    等待楼主的高见。
    towny 该用户已被删除
    12
     楼主| 发表于 2003-10-23 23:08:00 | 只看该作者
    做了一半的半成品望斑竹指点!!2 d0 \& H8 u5 T& F- r # |/ {% R! v2 a" uint timecount=0;9 b8 k- ~2 v6 S* B char far *indos_ptr=0;! K8 L4 g( i. S/ S$ r3 H! q2 T char far *crit_err_ptr=0; $ i @! J8 C4 U3 t: Wint num=0,current=0,i; 0 p3 i# B9 P' k1 Y- U: D7 W: j; Tvoid over(); + Z* e6 T5 n6 y' @, V, f) Dtypedef int (far*codeptr)(void);, I1 K7 ~- a0 ^! D9 d int create(char *name ,codeptr code ,int stacklen) V- A' y, J- E0 S. a, o { 6 \! k: `4 m7 ]% g- U' a7 Funsigned int * s;0 w/ {/ e, X3 n num++;2 h* p+ t9 ]( @. X tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); " x. q. O: d$ w, H8 T) j tcb[num].state = READY; 5 p( \: P' |( I9 H- T9 ? strcpy( tcb[num].name ,name); 6 ?: r# b7 H; B; }1 S6 I% S7 _ tcb[num].ss = FP_SEG(tcb[num].stack); 7 ]* ]2 x' J+ a: o0 B" q' x8 d tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); 1 B1 ?3 |" p- D6 x# @* h' R: N# J *(tcb[num].stack+stacklen-1) = FP_SEG(over); . e4 Z" C Q, a& k$ k3 N *(tcb[num].stack+stacklen-2) = FP_OFF(over);0 b' h. o5 g/ N6 p0 S *(tcb[num].stack+stacklen-3) = 0x200;( N5 a$ q" r L" r8 }9 @, m *(tcb[num].stack+stacklen-4) = FP_SEG(code); 9 k$ l% `: I, s( N *(tcb[num].stack+stacklen-5) = FP_OFF(code);* ~4 ^! Z& ]" J% @ _( n *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 3 b& ~4 N5 O- E *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);0 e1 a: \3 R. U6 u# T0 S return num;" f2 D8 c; X4 w6 N0 F8 Q } ;# C7 U& ]1 I! q. A Q void interrupt (* old_int8)(void); $ L0 y( w5 ]7 v. D3 S5 {$ K void interrupt new_int8(void) ( i* k6 L8 D/ s9 T, L! @3 K5 X4 m* e{5 y; W# X7 V' e9 u& n7 M0 o (*old_int8)();: X2 a: n9 T5 L7 W @: ^4 ?% g% a timecount++;, K9 h/ K$ _, {; G if(timecount>=TL); + W* Q# I Z. P- q# `* | if(!DosBusy()) : v* R! O- g; S* o {( X" c4 V+ D3 w7 e1 ~ disable(); ; w/ K3 \) D! S tcb[current].ss=_SS; . v6 W, u- h3 e. \8 T g! a tcb[current].sp=_SP; * o& O6 ?, ~ d) Z: I) A8 r9 J if(tcb[current].state==RUNNING) 0 |; d$ L5 \3 k- [0 N F. X" ` tcb[current].state=READY; $ `) T, g1 C5 x$ V current=3-current; ; o N. R h, Y `' fif(tcb[current].state==READY) ( b; p! f) X5 F" T{ _SS=tcb[current].ss; / c D% x, G1 O: \: i9 K8 _ _SP=tcb[current].sp; $ `1 ^2 X+ ?, ~) v/ j+ c tcb[current].state=RUNNING; 7 i: g: A. S% z3 v& I! T& v timecount=0;, C, E& g5 {# U6 B( W7 X( p4 z enable(); 3 C. d+ Y5 R1 M+ c) H" ^! i} . @! }9 d8 q& H% w} 1 J4 l# q V' [8 [9 T" P+ D}; ?% Z& e9 D; o( {void tcb_state() 9 W( I. v w$ o- Y$ p4 g& Z c' x{ / @, o. ?& y/ k, N& v int i;$ e3 R: {" r0 A: S8 Y& l. T for(i=1;i<=num;i++)1 {( }9 X" n" p7 n! u8 i5 a printf("Thread %s is %d ",tcb.name,tcb.state);1 O" {% f3 N7 R+ z8 k" m/ R };+ x, d, E3 K+ s$ h8 B int all_finished()5 ^8 O, J. |- |% r+ a# b {$ }6 } w3 M4 u& O$ o4 H2 x( i int i; - ~7 \+ L1 k# ~, z5 U& w: h- b* i, M for(i=1;i<=num;i++) % N3 l# |3 ~- s if (tcb.state!=FINISHED)+ ~6 W* {1 u4 r return 0;6 W" w6 P$ `# { return 1; 6 l# ~/ |2 C. i( Y7 M8 q6 l7 l3 q, s* A4 T0 Y% A }; 5 }3 J' Z1 k3 l+ Xvoid interrupt swtch(void) 9 a. G; M: L" Y{ |% g1 z, O$ p% X6 x3 Pint i; 6 K' u) b3 ~0 [, h; H- y3 a disable(); ; _ t, Z' N) |! f# | tcb[current].ss=_SS;0 o4 P; G+ Y# h1 c tcb[current].sp=_SP; - r: ?$ ~. D0 G V if(tcb[current].state==RUNNING) 0 G" O8 d' V/ V( ~9 ~+ O tcb[current].state=READY;) u6 I* D) y- T, M for( i= current+1 ; i <= num;i++)( Q0 C i2 p& ^2 m# G! ] { if(tcb.state == READY )/ p) g$ p( I3 a2 T3 Q! L: r- m3 d goto excute; % h8 Z" H7 F9 M3 Z% l0 y } 8 N* K' ~7 X. t9 u. Q | for( i = 1 ; i <= current ; i++) 9 H: t: m: N6 K r { if(tcb.state == READY) k$ c# F* \7 h9 B5 ], }" q# x0 f goto excute; * {7 p: @: [( G* @ } } 8 t: P% i) n2 ~. l7 l i = 0 ;" m% i6 C+ `8 Z excute:9 d% O' }/ _+ @; U: S4 _# r' S _SS = tcb.ss; 4 r1 A' S0 T; e' i+ J _SP = tcb.sp;3 E) ?% V1 c$ @1 f3 @" V tcb.state = RUNNING; ! Y9 x9 K/ P! _1 k* p2 z current = i;" K$ v# M$ z# @; @3 X+ g w enable(); 5 F f1 k; U3 S0 H; K# [}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    % N7 @# s$ a" g, w9 L" M; R9 y; ]给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    " T6 E4 t  a" b& o3 S, H搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    ' |; f3 s0 K6 {3 U/ r$ ]" M0 C' \别占着茅坑不拉屎!
      Y9 q# u) g( U2 H, ~* Z
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    16
    发表于 2003-10-25 16:39:00 | 只看该作者
    您来,我让位
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    17
    发表于 2003-10-25 16:47:00 | 只看该作者
    我一直都等待强人的参与,十分欢迎。我没有权限加你为斑竹,‘煎饼’ 看到请满足他。
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    18
    发表于 2003-10-27 10:57:00 | 只看该作者
    感觉楼主有踢馆的味道哦。HOHO,还是希望楼主先把自己写过的代码全贴出来吧,不然我们就怀疑楼主是不是弄懂了操作系统的进程原理呢,而怀疑楼主是不是随便到网络上拷一段牛头不对马嘴的代码过来,要我们怎么看?因为从上面的代码看,没有完整的代码数据结构都搞不零清啊,况且为你解答不是我们必尽的义务,也希望态度好一点,如果是希望斑竹退位,哈哈……,随便啦。
    towny 该用户已被删除
    19
     楼主| 发表于 2003-10-27 11:56:00 | 只看该作者
    完成了你们看吧! + ^& ^' M1 O [+ Y" x+ m0 U , j9 g. x3 f/ A3 E# g#include - h/ N' _9 b- E' w& G" R #include 1 ?! D" q; v: Z #include 6 D6 |* z+ m1 t2 O' y #define GET_INDOS 0x34( }- c3 y% A+ o* z# o3 V #define GET_CRIT_ERR 0x5d06 7 {% u8 |5 J- p+ w2 K#define FINISHED 01 {' d7 ~# ~ C# b7 i# E$ A. c e #define RUNNING 1 6 o D! {1 r% {0 ^3 C1 v% M5 ^#define READY 2 3 }9 g4 C/ [! j+ B! u% K' ?#define BLOCKED 3: U& Y- {+ a1 ` #define Ntcb 8 2 h( f6 b% j" f#define TL 1 ) A7 h, Q. ]/ S, Rstruct tcb{7 X7 P2 f7 e# Y unsigned int * stack;/*堆栈的起始地址*/& |6 ?* ]$ x. ?" T unsigned ss; /*堆栈段址*/ 5 e) x- b5 |& A% t q; o! r unsigned sp; /*堆栈指针址*/) \0 M, a. G, h+ s' U6 T, m char state; /*进程状态*/ . g( ~3 ^+ u/ i6 H; k char name[10];/*线程的外部标识符*/0 Y. S" S7 B% |' f; ?6 L" M }tcb[Ntcb]; /* 系统允许最多的任务数 */ B; X! `) e* a" o' ]7 F1 Jint timecount=0; - D" s( B$ C4 j n7 B/ f% fchar far *indos_ptr=0; . y3 X8 E& [. b" ~8 ~char far *crit_err_ptr=0; 4 p4 y/ z4 ]7 iint num=0,current=0,i;% b( {7 X4 X b3 P3 ?% G void over(); 0 J) A X: F2 Mtypedef int (far*codeptr)(void);( l2 g6 V8 y3 K int create(char *name ,codeptr code ,int stacklen) 6 @( Z- x& t$ o; z9 ?! X{( z9 p$ B2 n* r0 j) D, l unsigned int * s; z' @: G' I9 ?" q% I2 h; Dnum++; M% ]+ @ h4 Itcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));. g+ }( E: \1 m* S" w" S tcb[num].state = READY; 1 V2 B* J, h5 d. z% D$ Y; X strcpy( tcb[num].name ,name);& K" c' P# Y4 k G1 q# L0 i tcb[num].ss = FP_SEG(tcb[num].stack); 4 k$ M+ N7 }; U" Y5 z tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); 8 q4 y) j" ^4 k% N; ^ *(tcb[num].stack+stacklen-1) = FP_SEG(over);$ F" N) C3 B N K& r7 j *(tcb[num].stack+stacklen-2) = FP_OFF(over);! g& C$ G# W$ S *(tcb[num].stack+stacklen-3) = 0x200;; |3 ^) A8 t5 y2 l+ w! `, | *(tcb[num].stack+stacklen-4) = FP_SEG(code);: S, `0 I* t+ }+ F Q; I *(tcb[num].stack+stacklen-5) = FP_OFF(code); " N# R) {/ Y, b8 j. \ *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 2 `9 G: b& z1 S5 y. p3 g1 M *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);( h! `5 L! ?* u return num;. \& u W/ O y5 {+ l } ; 1 U' m5 J2 U0 E8 t6 v2 ]void interrupt (* old_int8)(void); ( w0 a" B5 M4 H, o5 v* I6 dvoid interrupt new_int8(void)& c, o% W+ ?; [! c# R2 s {5 @9 \" u% ? [, B0 I2 g4 D. N& d! G (*old_int8)();' f: I' K) U, Z4 e: M timecount++;# A: Y. V1 {4 {. C- B: ^ if(timecount>=TL); : J/ T6 }/ U0 F# W5 | if(!DosBusy()), P1 \( y" ], m0 P8 v {" h) H4 O0 Q0 Z0 k$ g4 Y! m2 ] C disable();. }2 M: {7 @! m+ E2 K( L% h tcb[current].ss=_SS; 2 v. B; N0 g$ y* R4 d+ Q tcb[current].sp=_SP; , _3 [$ ?6 M! L' U( Q$ O F if(tcb[current].state==RUNNING); K* ~" k4 P C( S. D1 J tcb[current].state=READY;9 L3 b9 M% l0 ~4 @' J R3 E. @ current=3-current;. X; Z& E+ J; ? if(tcb[current].state==READY)5 \: s. s. J) d7 ~7 b { _SS=tcb[current].ss; ( s7 _/ [5 c2 @+ Y6 n _SP=tcb[current].sp;) J) B. J) z4 ? Q tcb[current].state=RUNNING;: {' @! l6 S) W6 s timecount=0;, X2 Q4 M/ v6 W% N2 j H, v1 a" E enable(); 8 }* _& d7 L! g4 Y} ; j6 I7 ?4 r: o3 A9 A( A$ d1 y} ; Z: X$ c0 E k# B8 O k% X}; ' L& ^- P# Y1 j/ S) z& Z" e1 bvoid tcb_state() 1 v1 C7 |, Y" M8 C/ }{" Y+ y, E: D( O/ ^2 t9 E( V; W int i; / }8 _1 T. \1 W' Z: z7 r for(i=1;i<=num;i++)/ r8 B; t$ A2 z5 g printf("Thread %s is %d ",tcb.name,tcb.state); 4 w9 j0 U* S% n( \! \9 k. u};8 i8 ^" M- Z1 G( C* k int all_finished() # [$ E/ _& l+ J2 Z* O{0 \; v/ Z, u9 H7 T3 u( z7 f int i;3 h6 \: y9 r' A for(i=1;i<=num;i++) . f8 j4 r( e x* V* W6 l/ B if (tcb.state!=FINISHED) / b5 t! `# x, a return 0;- |$ ~; f3 @& S! v return 1; 9 A. k1 b; ~. W' {8 F3 V( b& i2 b$ Q4 f7 v };6 j+ j# R- D, F6 z, E void interrupt swtch(void) 6 |7 B% h! `& p' z: k8 ?6 Z3 c% P{ 2 n& d! V9 ^, a% Pint i; $ x/ m, D3 U; \7 m% w disable();! L) z! n* ?) a0 e T; v, h$ {& T tcb[current].ss=_SS; ; \% g! h( O' C, O tcb[current].sp=_SP; x. |! {7 K9 p4 Y I$ y/ E if(tcb[current].state==RUNNING) 4 n' b4 p0 k- q6 M& [( F4 u tcb[current].state=READY;) U; f: R$ D8 P* I$ u& ? for( i= current+1 ; i <= num;i++) * d/ `. ]: `4 n* N9 v { if(tcb.state == READY ) 4 c4 s- r# D/ ]7 i7 g$ w/ R goto excute;0 b0 h' p7 I1 ]" w } 8 d% K9 y2 T/ I b2 p. s: E for( i = 1 ; i <= current ; i++) , k/ L x n! J r { if(tcb.state == READY) ' a6 b9 c7 t6 T- \1 l goto excute; $ p4 F4 ?* d- n! O0 _ } # J" Z5 ?7 p! E6 { i = 0 ; " f1 U- P1 f1 Z* f- U: I excute: , g8 s: M) ~5 _; \- @3 _8 f _SS = tcb.ss; 1 t4 z% k7 E2 a( K _SP = tcb.sp;& W! |5 @, R' e, e tcb.state = RUNNING; ! \8 A \7 w! \) i9 J& y current = i;' A6 D; F. n- M4 u enable(); 0 H: }3 Y; Z8 p/ e \}: i0 N/ R; \" e! m- ` /*-------------------------------------------------------------------------*/ 9 @( r' m# U* u! |void over() & H7 @8 K# x- h{ 3 a4 `" i4 E+ `- y int i=current; + z0 w2 O: b S, }8 B /*strcpy(tcb[current].name,'\0');*/ 2 I! _0 Q1 n% P, y8 l* ?) j' v& R tcb[current].state=FINISHED;; C* s; a& y' v' Y) s swtch(); o' ]) [ d, q b$ e) O9 u) `' r9 \ free(tcb.stack); + U9 e( z. g/ m6 V( M! t}; , q1 _( y% a0 S/*---------------------------------------------------*// z- k1 l j5 ]4 @. K& K, q( t' |4 `' B void InitInDos(void)0 ] b' }2 q, u- A: Z$ G {( b: @% j z0 R union REGS regs; * Y( x2 s8 ~, z. {8 }# U% P/ @6 ` struct SREGS segregs;2 [. b0 @" i% p! O% W/ g m; j /* get the address to INDOS flag*/ 4 v: N+ D" h: ~5 z5 ?$ y regs.h.ah=GET_INDOS; % ~4 [4 N. P0 \% T6 v intdosx(®s,®s,&segregs);, {! x p6 v, [3 O1 r! V- O indos_ptr=MK_FP(segregs.es,regs.x.bx); 7 l. l4 z2 L4 k2 E% @ /*get the address to CRIT_ERR flag*/ * y% n: u9 J# |) y8 z( }' A if(_osmajor<3) ) k Q4 { m3 C1 {' ^! Q* X7 A crit_err_ptr=indos_ptr+1; & S& t5 y$ g, x( Z6 e' H$ s else if (_osmajor==3&&_osminor==0) ' P k7 L7 U% S& O( f+ V! f: @ crit_err_ptr=indos_ptr-1;) c1 i1 s. X1 G4 _! z) |5 M0 h* h: i else ' E, \' i( M3 b2 l8 R4 G, N { 7 e6 D) }& G# X* W0 l, I. W regs.x.ax=GET_CRIT_ERR; 5 _2 }' h0 V( i o intdosx(®s,®s,&segregs);4 E4 D" X9 i% l9 W- i crit_err_ptr=MK_FP(segregs.ds,regs.x.si);2 S' \3 |$ G1 l% ?8 F, E } * N& [+ N* y8 ?6 }: o ]- z/ a};- E) e5 i6 _' W8 }9 m8 s0 ^ int DosBusy(void)8 a; Y9 j. d P4 F( L$ a {, W. f6 }* }! S5 ?4 Q; x if(indos_ptr&&crit_err_ptr)# R m8 \! p' v8 M/ k return(*indos_ptr&&*crit_err_ptr); 9 W, V+ |5 |7 I( s* G else! o8 O6 B1 |# a- B1 [0 v return( -1); # ~( {2 k) y' F' e+ F}; a S4 ?1 Z8 W4 ?6 }' N; U, r0 q void f1(void)" z% L$ T! y C8 u$ g { 4 f" ^2 U4 x+ h$ s int i,j,k;: ^! g5 A, d" ^6 n2 K" h% m for(i=0;i<40;i++); ]9 d" |4 ~7 V: C { 5 ` Y2 U+ F' v3 Y6 w putchar('a');; s) a* V* X4 w7 a+ y1 X4 V * `6 o- k2 |2 { e for(j=0;j<1000;j++). ]( H2 r. ?: w0 L4 b6 z for(k=0;k<100;k++) $ H, B" D3 H( J- n9 u ; , S" @# t& f9 m7 w }5 J% T2 y& M2 a: @ e }; ' z4 ~3 [5 ]: n' h3 \9 N' |2 D8 q3 ivoid f2(void) 9 p; ^% M! S4 X2 M9 E4 i9 e{2 w/ Y V* u1 c g$ C' n/ q int i,j,k;) s. I% G; O" f for(i=0;i<30;i++)( I9 U5 o+ k$ y3 m3 c; ~1 c { % ^9 v y |5 i, d putchar('b');' n& I& o" b6 o- R0 z for(j=0;j<1000;j++)0 w6 A6 c" _. M4 n* l for(k=0;k<50;k++) - ^. {; t% j5 L ;7 _2 H) _" F* S: v" I# i' h } ; b* q Y# m/ y! c; ]}; + w1 L9 {2 q1 _. J& X9 S/ r/*------------------------------------------*/- \4 _4 ?$ C+ X+ `/ f main()/ U& s9 Q& |( Q W; n1 A) E% f {- [6 R1 ?* t5 i9 n! t, z InitInDos(); 7 r8 G8 r7 o5 H6 F9 G. l& `& V7 D0 O" t old_int8=getvect(8);( F& O5 l Q1 l' Q) n strcpy(tcb[0].name,"main"); Y5 j7 Z5 Z9 c% X% k% A) |8 x# {- U& \ tcb[0].state=RUNNING; ; R4 p R$ S8 y: w current=0; 2 l6 l* ` A9 e create("f1",(codeptr) f1,1024); u3 q; M5 R) Q2 N create("f2",(codeptr) f2,1024); . n/ H' p7 G2 J% e; e tcb_state();) Y' b* w3 \# t, Z, I setvect(8,new_int8);4 o3 W% p& Q0 z! ^" K swtch();& W! y8 j: H. _+ v+ a while(!all_finished());: I: k# b% }* @4 @5 ? strcpy(tcb[0].name,'\0');+ C7 j$ m; P& \+ }, ^0 y$ N% r; \2 | tcb[0].state=FINISHED;$ d, y. j" A o/ P% r setvect(8,old_int8);$ O" `& e) y2 ]' t) U: x tcb_state(); 5 e! S, X3 \2 i6 p2 y6 L printf("\n Multi_task system terminanted.\n"); 8 p* p$ }# U/ Z" M: ?};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表