下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程6 p6 R2 {: T/ L7 z+ T4 g" M2 {
要求:1 用c语言编写1 c% d- g/ b# K: q; o( h
         2 程序+PCB(ID的内外优先权,申请资源)
6 D7 L2 T8 }) i& S4 S" L8 P只需做进程中”产生“这一步。
  I9 g2 b# p6 V0 L" b- f7 ?以下是做了3分之1的范例:/ j; W2 S% g# ]! ?" E. ?8 g6 |
#include "stdio.h" ( S" b$ o$ X# N& y; i4 M- D8 [' W
#define running 1 /*用running 表示进程处于运行态*/ ( {( g  ^2 a2 ^& s  Y# N2 b3 J
#define aready 2 /*用aready表示进程处于就绪态*/ , {! `1 d- P$ d: \6 q$ C# R+ P
#define blocking 3 /*用blocking表示进程处于等待态*/ 5 {# N6 |0 D; B, p2 R( {
#define sometime 5 /*用sometime 表示时间片大小*/
& [6 a! \/ O: y, r1 @7 k#define n 10 /* 假定系统允许进程个数为10 */ ; J- ~& Q6 t) R

! h$ `! k7 ?( \( T- gstruct
* a* V9 P! `3 x& m3 z0 U' m{ 5 b0 _. b8 V, E- [
int name; /*进程标识符*/ , z! Y2 e: y  W$ l  V
int status; /*进程状态*/ # G* }( J* v; @; Q
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ & C/ \4 N& g3 ^; u) @
int pc; /*进程现场信息,程序计数器内容*/ : K) _7 F4 s9 i1 ?+ {* i
int psw; /*进程现场信息,程序状态字寄存器内容*/ ' Y1 n% r4 M$ y( s8 Q% a
int next; /*下一个进程控制块的位置*/ 5 H2 S; P. S/ ]' r) F! m+ m8 y1 i
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ ! f$ ^2 x8 E3 I7 F- T1 n" y
- j+ C5 X3 e4 A5 b* M4 D( |
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
$ g. }9 \! x1 G6 b. x! Y- D3 P
' W, s5 _9 Y$ h% L! Xint run; /*定义指向正在运行进程的进程控制块的指针*/ - E: B1 ~2 G5 z) N& s1 b
struct
& I! b- T, z0 }1 ?- U# E{ 0 D  h/ R( |1 m5 V+ T
int head;
# t4 L: Q' Y- ~: Z8 ~2 Kint tail;
. ^: r  D7 o3 Z}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ ' p) y! W! l0 r7 A
int block; /*定义指向等待队列的指针*/
# I! s% x" E$ {6 Qint pfree; /*定义指向空闲进程控制块队列的指针*/
9 @5 K4 k9 ]' b- B& j
8 t( S# ~$ W* {麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    ; b& u7 A' @* @$ k3 @麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。' z& v# v7 }6 c. \$ i
    /* the main site file */
    " r* T/ F; B* ]1 @7 rCreatePro(&ID){
    $ ]% z& b, [; U8 B) R$ o. N  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    1 r1 c  |/ a  B' L1 j/ J8 C4 ^5 ~  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);: h+ y3 O% c# y* k- ?; \. s
    /*初始化参数*/
    ; I4 q2 S+ W" E7 h/ i   CallName(&ID);   //命名进程的外部名
    0 `# b& G5 B% S3 D  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、2 E1 y' R5 q3 a! w/ p  a8 s- T* i
      SetFL();  //优先级数、( K$ N. y5 |* M1 H+ f
      SetHeap();  //进程起始地址、
    0 \: J2 ?0 P3 O. S# ]2 l8 b$ L2 c6 A  _SetSelfStat();  //设置进程的状态为就绪态
    , V9 v6 k! U. c5 P; K  AddStat_Read(); //将该进程加入到就绪队列中。
    " Q& d4 X9 @5 B, l3 }.
    2 K, U4 Z! m% \. P! ~& Z3 X$ J# Z.
    ' l' a" s+ V5 L, `9 x* \# O8 Y.+ _. P& V( {4 k
    .
    - D, `" v* f6 t' R}: O1 a. P5 ]7 f( ^
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思2 a) i* k4 V. _# ]. d' _  v, r6 k
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    2 Z1 B, n9 s5 a# H, q谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢3 [& X' ?" D8 g0 ]0 ]! z* m% Y 4 I" o/ R& t) {$ }/ l" \. [, [#include ( p* _. W @1 l$ h#include + U# u: ~3 y8 f5 w# r, S: T( s#include 5 g- x; ]( a: M, S1 Y: ]( `3 r#include8 i) Q. x# F' _ #define running 1 /*用running 表示进程处于运行态*/& A$ w5 ~* M1 w5 B/ q/ H8 h( | #define aready 2 /*用aready表示进程处于就绪态*/ - `" Z7 W0 J4 l& z+ n: R#define blocking 3 /*用blocking表示进程处于等待态*/; Y/ H& a1 |4 t) b1 i, { #define sometime 5 /*用sometime 表示时间片大小*// V5 D# U' E# g$ V, Q6 G& c #define n 10 /* 假定系统允许进程个数为10 */ 3 D5 N0 x2 L/ Jstruct ! X7 Q, Q9 t6 f/ |* _{ r( [7 L3 V) C' e8 Z& H; B, h int name; /*进程标识符*/ 2 b1 C7 \$ N. ^ x; z% fint status; /*进程状态*/ 5 T [4 z+ e; `) J3 E6 R7 D6 Tint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ * b: `5 [: T, g% pint pc; /*进程现场信息,程序计数器内容*/& |7 l* W1 C" y: }5 C- h* S0 F# ` int psw; /*进程现场信息,程序状态字寄存器内容*/ % N; E b3 V! K$ R- q7 [int next; /*下一个进程控制块的位置*/ & b% w5 V5 V7 q" N}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ + }# k. E8 E- x+ O9 v- pint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ 8 S. j0 L: @! @4 n& j: g# _int run; /*定义指向正在运行进程的进程控制块的指针*/5 O) V7 v+ f2 y- } struct. g( o- `9 l0 _! H" f# Y {8 c' B! `3 j, o3 q int head;/ h4 B- r8 D, O; R2 D int tail; * t+ f( H9 k$ l7 \4 Q}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ $ u. R) x& R6 }. w( E( pint block; /*定义指向等待队列的指针*/: Z7 [* a# c5 l; ?5 {' M int pfree; /*定义指向空闲进程控制块队列的指针*/ 4 E( B* ?6 F" t8 z! _! U, bmain() 4 w" _- o. t8 [/ B. G{ int gdriver=DETECT,gmode; + [: g: Y& e7 Z% S. J; f int i,x,y;4 A9 T, V9 B0 Z9 ?# a/ Q0 N for(i=1;i<=n;i++) O0 Z1 W# N2 i0 G {ready.head=pcbarea.next;} ) |9 e! Z1 I8 Z. i initgraph(&gdriver,&gmode,""); ; Q; ?" l! |" s; p- t% M setcolor(YELLOW);' b! y& f: }' p% E5 [- k& r for(i=1;i<=4;i++) . L: m( i8 M# X; N9 {. u { setfillstyle(8,i); 5 e0 B2 }$ P; Z2 @+ E, k1 \! ] circle(284+13*i,190,6); 4 n+ P. D- f1 Z% q/ B( L5 i floodfill(284+13*i,190,YELLOW);( j5 X1 X8 c( r8 _* L! S }0 I n$ \+ X3 b2 n" w9 r setlinestyle(0,0,3); + M; }7 ~( w3 C% J" P% N; D7 T circle(316,190,25);2 Z3 {& x1 Q' x setcolor(5); 1 u4 V9 a3 P: Q1 E" ^& a settextstyle(3,0,4); $ S" A) k; A3 s# O% u. `0 \ outtextxy(35,311,"press any key to create objects!"); : \, u$ f/ d! R' L& f( t4 R k6 O getch();& M8 v$ D0 O5 B) {; R* G: D setcolor(YELLOW); ! c& N! H% D& @9 ^$ t$ \ line(300,215,290,235);- J* j! [% V1 t: a# d2 V) ? line(323,215,333,235); 6 H, N) d) `/ b2 | delay(50000);% A" a1 [% W2 e/ W setlinestyle(0,0,1);9 q. ]0 y' t7 a% Q, Q for(x=1;x<=2;x++)$ ^5 r! J3 R; h( w5 a {setfillstyle(8,x);) |( Q, g5 p o. C circle(267+13*x,246,6); ( H" x9 k* P! o5 m floodfill(267+13*x,246,YELLOW); 1 \# C; L3 Z: k+ D3 w3 M } & s2 f. U: m6 M+ T+ S% d, X for(y=3;y<=4;y++)) b7 X9 v8 i- ]; b$ g& ]; T2 J+ H {setfillstyle(8,y); ) r( t) _3 u# o8 a: w circle(285+13*y,246,6);8 @ ^& b' ?4 u floodfill(285+13*y,246,YELLOW);" A T5 `5 {& m z; \$ h( D" |/ A } 9 }3 _3 |# f" T' f2 N; S setlinestyle(0,0,3); . @$ @, x0 ~+ N; k' r, I8 S( y+ _5 N circle(287,246,14);+ ?* `; J. h. i+ m! o setlinestyle(0,0,3);( r; [! z6 k/ G1 G1 _) X9 X0 d circle(330,246,14);7 J9 t5 I! T0 W, v+ Q% c0 x' H delay(50000);6 o% x4 @9 N5 f* n' }% G line(281,260,281,280);4 o' o3 l8 ~' g; A2 l% g line(293,260,293,280);9 P. A' C$ _5 B& N2 s line(322,260,322,280); n0 g) B% g2 J! ~8 X line(333,260,333,280); / J; x; |+ A' S( X2 X0 S# k delay(50000); 3 t. _2 ]% f8 f: i. s" H setlinestyle(0,0,1); ! O- n( d. [: m0 U% z setfillstyle(8,1); 0 i# |' `( Y5 Z" [( P* d circle(281,286,6); 1 z; H# L% ]8 m8 t! U0 ]$ z floodfill(281,286,YELLOW);. U( A! r0 h' ^ setfillstyle(8,2); " X, L' w7 n( S+ `0 n' B$ V circle(293,286,6); $ d+ I" Y7 B& D5 K1 t: }7 Q* l2 c% y5 q floodfill(293,286,YELLOW); , _; b6 z4 t2 K, ?9 U0 ]; N+ v0 ~) Z: E setfillstyle(8,3); 0 r9 B4 A$ h7 i! e. P circle(322,286,6); 6 M+ A2 `. f% | floodfill(322,286,YELLOW);8 r( p, _2 m& x5 A0 k' z setfillstyle(8,4);6 G+ |# c! V* @7 s circle(333,286,6);6 l3 i9 |* x9 V floodfill(333,286,YELLOW); j' b% N! b: l2 m getch();9 _5 [+ U0 `2 i5 {6 N closegraph(); 1 R9 D& f) w$ H- g# A w} ' r$ F7 Y0 j* @' `" {1 X* _0 B0 R* H 5 W% D) G& t0 c& W6 c
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??) {% F0 h1 I+ |$ o1 [. F: t
    难道不是《操作系统》的‘进程’那一章进程创建??
    , ]) f+ @; R0 b1 B# [- o到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    * B1 v+ M/ G, Z4 ^/ D2 A& T0 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 | 只看该作者
    做了一半的半成品望斑竹指点!!: i7 o8 y; r3 s ! c5 o" |; K Z, s int timecount=0;& ~. I+ D* Z' M) Y char far *indos_ptr=0; ) u3 ?: }0 Y1 l k' Gchar far *crit_err_ptr=0; ( ^" _/ \* X w7 }7 j/ lint num=0,current=0,i;+ }, Y- T# X) i( } void over(); + ^+ l$ U4 w/ ]4 Z9 k1 Mtypedef int (far*codeptr)(void);1 ?. }) h; n- |) }) ]* E int create(char *name ,codeptr code ,int stacklen)- d' W, B. [: v( z9 M4 d { 9 w+ d" m9 J5 ?& x; F$ [9 v: C5 {unsigned int * s;/ m1 v- l; _7 ?) w8 a num++; & B' y2 O( R2 ?2 ~7 B# b' ~tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));5 E- s; \4 A) s3 d M9 b& G6 Q4 b tcb[num].state = READY; 1 X. W- c) i- ^* y/ a1 s' h4 S* b1 b1 G strcpy( tcb[num].name ,name); * K9 D1 a. S% \- v6 U; u tcb[num].ss = FP_SEG(tcb[num].stack); ) u: e% a. t$ \" G+ @7 o tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); % o; ?3 A/ B: q3 L2 _8 c *(tcb[num].stack+stacklen-1) = FP_SEG(over);1 l# I( ]" q V7 H" f *(tcb[num].stack+stacklen-2) = FP_OFF(over);4 e9 [, M1 E3 n2 `; a *(tcb[num].stack+stacklen-3) = 0x200; 2 v+ K* H6 n" H2 ]0 ^2 H *(tcb[num].stack+stacklen-4) = FP_SEG(code);! f- C9 J8 ], n+ q) j) j: A *(tcb[num].stack+stacklen-5) = FP_OFF(code); ; i& v, T5 I; E- Q; t ?% e! f6 A# S *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);8 i/ a$ O! y( X4 s! T( F *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);$ ~ p/ s1 R* E# F6 x4 C, d' z return num; 8 g/ `3 D! K/ G6 F; n" F0 t4 [} ; , |! L% p2 L7 I7 l. nvoid interrupt (* old_int8)(void); / Y: m/ J% m! U1 }( i% T$ `9 H void interrupt new_int8(void)4 _- T- \( d+ A! r { . a6 g( I+ W1 b4 H (*old_int8)(); : F; N& ?% X: T5 r* f8 m: } timecount++; & D- Q! I( J1 |7 c. {+ o7 v if(timecount>=TL); 4 K+ v' a T% o6 X5 r8 D# s if(!DosBusy())6 _ o9 X3 F+ W( a: I# n* c {& \8 D6 H2 L5 h% c( U disable(); 5 W6 J N/ Z4 K, W tcb[current].ss=_SS; 4 p! X9 N4 s% ]* [% g7 @ tcb[current].sp=_SP;2 w+ T' |) P- E# @ if(tcb[current].state==RUNNING); z4 V1 ]2 Y3 C8 v. f' u tcb[current].state=READY; 2 s4 f* H- f5 v- M" X& B current=3-current; & z `5 u4 `7 k0 v( _if(tcb[current].state==READY) 8 b. w! F1 z8 d9 a" L |{ _SS=tcb[current].ss; / s* v: L# s: ~, O9 D6 Z! G _SP=tcb[current].sp;) e' y* h0 E, _# U7 P tcb[current].state=RUNNING;0 b8 B$ f4 a- v) F) Q timecount=0; # E6 C$ h3 a5 d: t* m/ g9 T2 h enable();* x u3 a* o8 x } 8 g) C/ x: [! o# Y8 g% O}: a0 O2 y1 O& p9 z) ]. J+ m( n };) z, o. r) q8 ?3 y9 M$ x void tcb_state()1 b! j, I ?1 G { 4 M% I8 j6 L8 t6 O$ W9 i) m int i;" N# Z# \8 [( Z* f: }& T+ R: }9 l for(i=1;i<=num;i++)9 L; S! O' S0 s1 {1 j% ~ printf("Thread %s is %d ",tcb.name,tcb.state); 5 o4 {) U1 I$ w& D1 W& Y};# a3 t: j, b' A int all_finished()% \$ B' e8 |' t H) A3 ?/ s {5 n8 ^& Y+ _$ z/ b1 S int i; 1 D/ r1 K4 t& K& i9 i8 m for(i=1;i<=num;i++) * G. E' ~, _, ?1 H h0 X if (tcb.state!=FINISHED) 4 Q3 n3 \8 _; ]8 Y return 0;9 H$ `) {% W; e return 1; : ^( {3 O6 Z. U5 |: Y/ E, G2 d3 l2 G5 M8 X. L5 J! H }; ) ?8 H& D, M( x8 P: ^/ B1 kvoid interrupt swtch(void) & n2 M' O2 a& m! O1 t4 C{$ C6 w- n& b9 H( j/ ?1 Q int i;, ~7 R2 S4 m l6 X/ u- P6 } disable();% H- p6 p3 n* p, I) K tcb[current].ss=_SS;" p" F2 M( v( M8 f+ u) w tcb[current].sp=_SP;6 Z3 d8 X) L% Z2 k: R2 D5 w P if(tcb[current].state==RUNNING) B/ r8 |- m4 C- N tcb[current].state=READY; + q! L' c7 L* M' u. ?2 \9 h9 O- o4 a for( i= current+1 ; i <= num;i++) $ G( t! O1 Y6 f1 Q9 K- Z- N6 C { if(tcb.state == READY ) 8 p+ T% _9 I% g0 r& n6 W goto excute;. B9 b s% N; r4 o" K+ [6 ? } 2 j4 B* l' f& B! n% l* { for( i = 1 ; i <= current ; i++) ; }% M0 `8 V. L$ @ { if(tcb.state == READY)# A( |% g" `+ y }2 [. l goto excute;3 r9 S, c) C1 V } # A; r* P3 @1 ^! ]! ]1 F1 T# l i = 0 ; $ P3 i w. g0 [; F- [5 S excute: ! h/ Q* B; V% [$ K _SS = tcb.ss;2 m* A/ ~5 c/ V$ t- _ _SP = tcb.sp;7 Q8 I/ t0 z/ N/ i% N' T8 d tcb.state = RUNNING; & B- u& P+ }+ N ?$ ^ current = i;, Q' V5 E/ i0 B0 v enable(); ; [- ?# M x3 n5 e& b}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    # L' S. Z, |( O5 v% u给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    - |& x- x0 e- \* X3 f搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!/ J0 V! N0 E9 K0 c8 M3 U
    别占着茅坑不拉屎!" L+ I+ ~3 ]& `: \/ H6 o
  • 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 | 只看该作者
    完成了你们看吧!; H* r% d4 n3 ~% V3 K- x7 n 4 s# R$ n* I, |! x# f8 x #include 2 M1 [% a# p; e" y- t7 P #include 1 T4 I7 d& Z! O0 Y. j1 I- C#include : o+ ?( B& t e #define GET_INDOS 0x34 0 y& k' X i! C+ p9 q* x#define GET_CRIT_ERR 0x5d069 I; U3 z- t. b+ ` #define FINISHED 0 ; D" F# i: b7 S4 T+ J5 h" H" R#define RUNNING 13 \" Y Q9 d! p #define READY 2; ]0 \) y/ I/ q4 \( X #define BLOCKED 3* J; _) \& p- J #define Ntcb 88 r# p v( Y, U2 d# M #define TL 1- m: V* M$ u9 X% W struct tcb{9 S! l0 H/ f5 g! Q- K6 c1 _4 r: }5 d unsigned int * stack;/*堆栈的起始地址*/ 5 s7 L% W5 w, u unsigned ss; /*堆栈段址*/ - @, h( h4 A6 ` R; X% U; a unsigned sp; /*堆栈指针址*/; f4 ^# v1 ^% B# D( W char state; /*进程状态*/ ( Q, c0 h- z4 O9 ] char name[10];/*线程的外部标识符*/ ; Q! A( n( ]$ _' T- V% c }tcb[Ntcb]; /* 系统允许最多的任务数 */; ~! T' P0 v- ~* M int timecount=0; , X' k& }$ @' q: z* c* tchar far *indos_ptr=0; * m3 R" c [- _* a9 I5 _. `2 tchar far *crit_err_ptr=0; 5 w5 K; X( j/ Aint num=0,current=0,i; g# z O0 u6 c9 P5 ^ void over();& U' U. ]0 m. ]8 j5 t7 W- H. S typedef int (far*codeptr)(void); $ M& Q4 I8 u1 E z) fint create(char *name ,codeptr code ,int stacklen) k) n/ [, y- o0 s{ , f3 v0 E- N* Dunsigned int * s;* T; f: y* }) y6 s num++; * k# G( S* N M& s3 ~" \tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); % r" m$ B r5 H, r, b/ w6 T: r tcb[num].state = READY; ; d/ w0 k8 c" G; T; H& R& N strcpy( tcb[num].name ,name); + c/ C! R* l& d6 l# h/ ^% l tcb[num].ss = FP_SEG(tcb[num].stack); * M1 p l; {9 k z) t% d* `) K tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);5 ?5 _& E O) u! L9 o' t+ ? *(tcb[num].stack+stacklen-1) = FP_SEG(over); : x6 I8 X6 i- q$ ~ *(tcb[num].stack+stacklen-2) = FP_OFF(over); " O$ q! X2 O' \) J1 ~ *(tcb[num].stack+stacklen-3) = 0x200;3 _0 j* r: X7 G: {- } *(tcb[num].stack+stacklen-4) = FP_SEG(code); / E$ z+ y% t: u- a/ z *(tcb[num].stack+stacklen-5) = FP_OFF(code);& i2 ]& J+ H, l1 _% {5 K9 l/ I2 y5 y *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);& P4 S0 b0 q# ~ *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); K5 R: u3 ^/ B+ i8 {$ S# S- H3 n return num; 1 u3 }. W- _. ^- j! R} ; . }* D2 V0 c9 p( }8 @void interrupt (* old_int8)(void); 4 j/ E$ a# o6 A/ o3 W void interrupt new_int8(void) & w- t& d( o% m8 p{0 e' N; b4 o e' l5 d (*old_int8)(); 1 A1 c* Q$ P$ S& Q timecount++;3 W" U# w0 ?6 Q8 c! W6 k0 h if(timecount>=TL);1 X/ t0 Q5 n& D2 Z6 K if(!DosBusy()), g$ R) z) @/ \6 N" T2 C { ' A( m' j) n% R$ e9 o b8 ^/ U7 y% M disable();( H3 W2 N3 b8 a tcb[current].ss=_SS;* }* e; s& l3 r. \ p5 \: t2 f tcb[current].sp=_SP;% N2 J( M6 Y% ? g if(tcb[current].state==RUNNING) 7 \: X. `5 ?6 c ^ tcb[current].state=READY;) I1 |- C/ Z; N6 O* b1 x" V current=3-current;; ?$ W( ^! ?# B% L9 |# u if(tcb[current].state==READY)3 `: b7 W. `) q) ^ { _SS=tcb[current].ss; U6 y8 _2 S5 S {. ?8 h( S$ C _SP=tcb[current].sp;; _4 K; _2 H p6 x4 g% M, _- }: e tcb[current].state=RUNNING;7 R4 J3 ^4 D U2 _! b' \0 o; e timecount=0;) _1 A- } J7 w! i j enable();# k# R+ b2 ^: T; g" ~' _' w: U } 0 ]4 q4 q$ R3 }: p} 7 ^. J: P) S& r" L& H};) A V6 f3 s( m( g. y void tcb_state()" d1 g0 {, w( j" k* ? { , T9 F" ^) e6 n. S9 X/ O# Y2 ? int i; ) _/ n4 ^, N$ x- f5 R for(i=1;i<=num;i++)) u9 S: W0 t! v! U0 t printf("Thread %s is %d ",tcb.name,tcb.state); H% c# o! m; o! V* j y( Q }; 1 A; x/ O3 ?, j! x6 J3 u& P. a8 x2 Hint all_finished() 1 T, M. \0 l. \% s' K3 a! y{ 5 v1 g- w/ u+ `8 I8 C int i; 2 @" U$ A$ L9 K7 L$ B for(i=1;i<=num;i++)% Q, s* O1 Z2 l* E if (tcb.state!=FINISHED)) i# `8 e& e+ E1 d return 0;" J ?# H* |: V \ return 1; & E# I5 o2 K8 o- N+ p a0 x- F4 _: R3 I0 n) k8 x$ P7 G };# `7 e* @5 s4 m3 Z7 H void interrupt swtch(void)/ [5 z6 v Z; z6 ~8 ~% n% Z7 _! N5 { { ! z" v9 X$ Z' l) i" Mint i; 9 ]4 j; W& m) H* v( f( [ disable(); , G1 Z% I3 v6 A* v; o( G2 Q tcb[current].ss=_SS;7 K5 x' s' t0 y) Q J5 E7 m2 O: j tcb[current].sp=_SP; + @0 z# c% [# S# Y if(tcb[current].state==RUNNING)+ H& I# K* E3 i2 D' j! z& h tcb[current].state=READY;5 p6 d. u% l4 n' z2 e5 Z for( i= current+1 ; i <= num;i++) : ]8 ^) [4 A$ l! y* r { if(tcb.state == READY ) - {4 `5 x( c: w goto excute; s5 C! w" y7 e& z( n' m- v+ m } 9 H8 z, P; \4 p0 x" O& T& B* X for( i = 1 ; i <= current ; i++)8 g" C7 v5 W1 r1 _$ P" k9 I" X; M { if(tcb.state == READY)+ }' x( ^& ]1 X& M: M goto excute;4 M! J* ~1 r# E6 Y# P }4 f# J% g( l$ Y9 r2 E7 e# c& W: J i = 0 ; 5 j4 j% o3 f) O6 U: b5 \ excute: % s+ d) C3 `3 a0 _9 b5 I _SS = tcb.ss;8 J$ Z% P9 F6 |6 ` _SP = tcb.sp;* H3 t4 }) U) L* f- ^ tcb.state = RUNNING;2 U( o% X9 \5 t current = i;" c0 V4 A3 n9 c enable();" B. f7 C" q( y+ w) L" I! l2 \ }& U- D8 [2 R4 s. f2 t2 { /*-------------------------------------------------------------------------*// b1 D. E9 n. V9 r: V/ t void over()8 q" T* p2 S1 W4 u# x% m U% k { 2 }6 {2 w) j; c int i=current; 8 {( U, ]" C s& y# d T( @# I1 X+ P /*strcpy(tcb[current].name,'\0');*/% L9 N, J3 E ]( l tcb[current].state=FINISHED;3 ^$ X& k# Y3 G* ? swtch();7 k5 u* ^; S4 D free(tcb.stack);2 h0 o5 y n% } };0 B+ {& K+ s' h% D" I: M /*---------------------------------------------------*/ 5 Z; }. _% { s4 N, F- \ G( m6 vvoid InitInDos(void) $ u2 A& L; Y0 v{ 5 n( G7 v4 z5 p, k+ t% U* m# G: ? union REGS regs;; m. q$ X( Z8 I1 i& C struct SREGS segregs; ) a. ]0 A: \/ c* o- ?3 g( O /* get the address to INDOS flag*/, k# r) J6 Z% T3 b* M regs.h.ah=GET_INDOS; / Y7 M W% t9 ]% w+ @ intdosx(®s,®s,&segregs);/ n( D6 I3 \: V+ ^3 Z indos_ptr=MK_FP(segregs.es,regs.x.bx);/ p8 I) i" a; o2 _8 u1 Q /*get the address to CRIT_ERR flag*/8 w# l. ^+ s( L: u* S if(_osmajor<3)' t2 P5 O4 n+ G7 s+ d crit_err_ptr=indos_ptr+1;& l: z; h9 a r$ E/ y% p6 l" w else if (_osmajor==3&&_osminor==0) ; _1 i! b6 r" Q* D3 A. z3 O8 f crit_err_ptr=indos_ptr-1; ' _3 K$ K/ F7 T. E8 l else 2 g* d6 A }9 t( A8 M) x) n* p {' S8 Y( Q- ?- C6 S7 W4 f8 g regs.x.ax=GET_CRIT_ERR;4 J' i% m/ \/ J& {: m intdosx(®s,®s,&segregs);+ a; X* }8 F& I2 ] crit_err_ptr=MK_FP(segregs.ds,regs.x.si);4 t% _* q" A$ Z& X$ z) S } 0 D/ c: ~( G" }8 B7 x};# ?! @' P' T; a0 Y5 i8 D- o8 x3 E6 b$ {& u int DosBusy(void)7 q* c, r5 C2 A2 u- g {* R( \1 M. F5 {6 B3 I5 ^$ S if(indos_ptr&&crit_err_ptr) . s' e' R4 j& e return(*indos_ptr&&*crit_err_ptr); + }# E, M, }& |& k else ! \6 _/ ?3 {, q2 z( Q return( -1);4 `8 J4 x# C- b# k9 O };8 m! G) M& t% b7 f. N7 p) l void f1(void)1 e3 e5 J: m4 e& I" _ {# @: z0 m* @ O7 h int i,j,k; $ A, f) O( J) I. h$ L3 |9 _8 m# p for(i=0;i<40;i++). ~9 V( ]* }% G K5 q+ c {/ S' Y7 L" e2 G8 a" ^; ` putchar('a');, q7 m$ ~3 s& u ; @5 u$ T: H2 q- E( S for(j=0;j<1000;j++) 5 R L0 k; w2 `" J5 i for(k=0;k<100;k++)0 V; y" A# J- A ; 4 K0 T# a/ |6 ~" G3 S } . p, u" Z/ l% ~! r8 O0 B4 i}; 8 T! }" z1 R7 X( [void f2(void) ' ?6 `& {( e# C6 A% @/ n9 c; l* N{ " Z- L/ T$ z1 v int i,j,k;! \! @6 w4 c8 D5 T6 {9 R# N4 W for(i=0;i<30;i++) 0 ?; B# y) Y: \- S) W7 X# L { 8 v3 g# t9 I- b2 W0 v4 W putchar('b');* t) j( S5 D5 P1 @ |8 r, {& X for(j=0;j<1000;j++) * g- W1 }8 W: o- g for(k=0;k<50;k++): {3 d6 f3 x. p/ T$ | ;6 T% p/ ]) \ E8 c7 U$ Y2 l" s } + e- M* `# `; f! C}; & s% V8 { }$ c6 ]% h/*------------------------------------------*/ " C8 _2 | x5 n' i/ t5 g2 }main() ! |$ J# h% q) b% n( W. ?6 A{ # c, b9 o4 s2 E: w! L: P9 ] InitInDos();3 w q5 O! u4 u' T2 i8 W old_int8=getvect(8); 6 ~7 p+ {$ m8 G, Y strcpy(tcb[0].name,"main");5 B1 \! o+ F3 D: N9 n tcb[0].state=RUNNING;- ~1 v8 P5 Y& k" P current=0; : @, P( A" I3 J% W4 C b( u create("f1",(codeptr) f1,1024); 7 l' D+ M- n' S; l3 E! c create("f2",(codeptr) f2,1024); / _: C$ X& v* a8 z tcb_state();$ B; z* P J9 ]/ M setvect(8,new_int8);- C2 N. v, u$ h& ^4 ~" `$ `) T swtch(); ) o# [ K7 u- b, p, t# c6 R while(!all_finished()); & ?# B' X( g) f4 P% c. c( t& Y strcpy(tcb[0].name,'\0'); 6 j2 U( w$ h/ K& t4 F, _6 w tcb[0].state=FINISHED; m7 R* A9 `2 {& t5 E2 r* z setvect(8,old_int8); r6 B5 B; X" ^7 H, f tcb_state();# P% E9 k: s: E: n- M printf("\n Multi_task system terminanted.\n");, J$ E7 j$ g3 | };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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