下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
* _% d8 E/ a: d要求:1 用c语言编写" s0 d( B  w* {3 d/ T0 x
         2 程序+PCB(ID的内外优先权,申请资源)
* U# d" C; g; l' D+ h只需做进程中”产生“这一步。
- U  H/ e$ i7 H3 [1 Z* p以下是做了3分之1的范例:
, v  U6 ~, B+ Y1 ]#include "stdio.h"
: y7 X- x/ r0 u/ k& }* {, ?#define running 1 /*用running 表示进程处于运行态*/
) M7 \" B) o$ E: W#define aready 2 /*用aready表示进程处于就绪态*/
6 }) L' O" z( A/ N* h1 F#define blocking 3 /*用blocking表示进程处于等待态*/ / Q7 ~, [! `$ Y5 _7 ~
#define sometime 5 /*用sometime 表示时间片大小*/
3 i9 J; M* N8 U#define n 10 /* 假定系统允许进程个数为10 */
# e& e! N' k6 m5 U+ S4 H# E5 F7 a3 [/ r9 U8 x6 A. `
struct
8 T0 k2 F% s0 n& t{ 7 i. ]* U2 P) `, R4 x
int name; /*进程标识符*/ 3 E: z; n2 y. ]2 o% o* ^  O
int status; /*进程状态*/
) t. ]1 k  O9 ]: k. u5 {. @int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
: C: H5 J! ]  p( G$ Z1 T2 zint pc; /*进程现场信息,程序计数器内容*/
3 A' k3 [0 e; N- V- V# I  H2 yint psw; /*进程现场信息,程序状态字寄存器内容*/ 1 T  n" g; Q( v2 g. X) u' m+ N
int next; /*下一个进程控制块的位置*/ & t: r4 U% N6 M, K- J
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
" v2 p1 c8 A) P- U% U- Z% U
% ~! w6 Z/ t) n. nint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ / C3 V: B' r: z9 `- L

( q4 H2 o0 {  Iint run; /*定义指向正在运行进程的进程控制块的指针*/   n2 a/ L5 t7 A1 N: J+ n. G
struct # p5 b! Z8 A% }5 R9 e
{ % u( b% [5 D. m) ?5 |
int head;
( I9 H/ B  A5 @; U( Lint tail; , ~# w! C3 G" J3 d
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 9 v) ^  R! R7 w2 o- B1 l+ u5 w& ]
int block; /*定义指向等待队列的指针*/
5 O: C! Q- L# W% y% L  `3 Gint pfree; /*定义指向空闲进程控制块队列的指针*/# R0 \; p1 \* @6 {5 b8 e
. @8 T/ h! w( t6 G8 ^4 h
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    9 M  n) n+ X: \* i$ \3 M麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。$ Q2 I' H( j: x7 q
    /* the main site file */- o! m$ b8 ~" k6 ]: Y5 N9 ]) w
    CreatePro(&ID){
    # w. C/ C5 ~$ d5 u9 ~# b8 F9 s  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    5 Q2 j$ Q9 _# X2 \1 c- H; d  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);* \  j2 l+ V8 b# ~5 j0 N, P1 t
    /*初始化参数*/
    9 P- i5 \) a8 {   CallName(&ID);   //命名进程的外部名$ c! k5 c0 C# d7 w* a  Z
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    % U! h5 U0 G: a0 y$ s  SetFL();  //优先级数、
    $ _( b! \5 [7 y6 q  SetHeap();  //进程起始地址、
      f* R0 n0 i% G+ K3 x/ W  _SetSelfStat();  //设置进程的状态为就绪态
    ' X, a( G) z. ~5 B; f  H  AddStat_Read(); //将该进程加入到就绪队列中。6 x% U4 S0 I$ i( K2 g# {
    .; }0 _8 k0 l7 w) u* \7 m  I
    .9 s4 [$ L, N; F6 N4 v
    .
    ' _: q4 Y' E: g# d4 k2 L' {; b.$ D3 l) ?( R( a
    }6 @3 }  v9 k% D: g
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    # \* L" I. X. F6 d1 x7 Y7 d* J
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    " E3 n. h! z: V' W2 T& s谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢4 U8 S) g7 I3 q5 c1 |2 K7 R( i ' e) c+ Q& { y+ e9 H8 F# F4 R#include* r5 v' ^8 g; F/ z9 C #include: v5 X9 r- f6 Y( u7 P* y) x# d. o/ N #include( I# a! i$ w1 \- q( d, S3 {1 E #include $ C( G' n/ ` ]% {5 x5 S#define running 1 /*用running 表示进程处于运行态*/ ! x, f" U' A$ U( J#define aready 2 /*用aready表示进程处于就绪态*/+ y# W+ y7 I. P3 k #define blocking 3 /*用blocking表示进程处于等待态*/ # h$ l! {$ F1 \7 m#define sometime 5 /*用sometime 表示时间片大小*/" g Q, h* N+ A3 |2 R #define n 10 /* 假定系统允许进程个数为10 */1 h( Q& O5 O. e struct/ P2 H {1 ~* F' |, [ {7 p# q1 q9 O d, Q; D int name; /*进程标识符*/ ) Y! i- \5 K5 G# ?/ W6 fint status; /*进程状态*/ 1 J. g9 k# o# p6 N! bint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ # v0 h5 ?& k4 A3 j" A/ q+ f6 aint pc; /*进程现场信息,程序计数器内容*/ ( \! {+ j/ N dint psw; /*进程现场信息,程序状态字寄存器内容*/ 3 @3 ^7 @" K& rint next; /*下一个进程控制块的位置*/' z# p1 t! x1 f+ d! h }pcbarea[n]; /*定义模拟进程控制块区域的数组*/6 ?+ j3 b; g: b8 r, B int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ v, D/ K! K# G3 ` C int run; /*定义指向正在运行进程的进程控制块的指针*/ ! Q+ Z6 T+ C1 H- g9 U, Wstruct( t* F4 w t7 g o/ {. \- }. |/ P { " X( }& Z3 f' {int head; $ E9 Q! v9 \9 o; _. o: f, |9 t+ W1 oint tail; ( ^' l5 i% a7 w) H/ z}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ . t4 }% n" r5 G1 g+ Jint block; /*定义指向等待队列的指针*/ 7 h$ H5 S6 H4 u/ P3 Z" ~int pfree; /*定义指向空闲进程控制块队列的指针*/7 k. j" [; `0 N' {6 Z# H main()6 E8 \1 W& o5 c: G* ]3 C" P { int gdriver=DETECT,gmode; ) g+ p# ~7 M9 E int i,x,y; " b$ \& O. Q: y for(i=1;i<=n;i++)6 h# h' m* Z$ t; p( J) n( r {ready.head=pcbarea.next;}& ]$ L- ~, h' W. [! p0 ~ initgraph(&gdriver,&gmode,""); 3 L4 h2 {- i% z3 W setcolor(YELLOW); e4 B2 u1 Z, F, [, h, j! E# D. } for(i=1;i<=4;i++) $ V3 w% V8 e/ l0 p! S) G { setfillstyle(8,i);! B# j8 o1 k8 K: | circle(284+13*i,190,6); 9 W$ x# V+ g7 u- ^3 j) }: j5 O floodfill(284+13*i,190,YELLOW); / l( c- u( w( N$ X* S! N/ d s } 3 J8 f3 Q( j$ a% X' k setlinestyle(0,0,3);2 q( Y5 P# ]8 G# Y' D) X' _# M* J circle(316,190,25);( L* S& S, Q9 q) N& Y# T setcolor(5);. m! y* e0 Y2 b+ B settextstyle(3,0,4); ) ] G, I% y$ F6 S outtextxy(35,311,"press any key to create objects!");+ b9 z2 V4 N+ \0 Z2 c5 |& H getch(); 0 B1 a3 J% j8 l setcolor(YELLOW);: W/ q" L+ e, z6 h line(300,215,290,235); 1 S2 ^3 Q3 }5 c line(323,215,333,235); _0 y' ~# |# C6 P delay(50000);( ^! X+ X9 _7 {" j2 n setlinestyle(0,0,1);; r2 ~* G; @% S$ K% r ? m' t for(x=1;x<=2;x++) $ J: E3 J* m# S" g1 o# l; J5 t0 G/ L {setfillstyle(8,x); 4 B2 {- e" R( h- l+ U& ? circle(267+13*x,246,6);( g" u: p# K; V& s; `/ } floodfill(267+13*x,246,YELLOW);! ~% a I) A. |+ b e' x } + l( E& S, k4 S# Q1 O k7 ` for(y=3;y<=4;y++) 4 a2 D9 x( u9 Y# ^" u {setfillstyle(8,y);0 `9 x8 x, u( U$ ? circle(285+13*y,246,6);1 H4 a. ~) L& A8 M5 l floodfill(285+13*y,246,YELLOW); 0 l( z; N) E0 \# h% m }! o7 E* {" ~% i2 v { setlinestyle(0,0,3);. K4 N/ y* G! }) h% D' }: ~+ O circle(287,246,14);7 s, @% m# `+ b setlinestyle(0,0,3);: i: h9 ^0 U( u1 ~- C" h( v7 L3 i circle(330,246,14);4 H P( s0 G0 S9 L8 T delay(50000);& _( i' z: }' _0 P3 W line(281,260,281,280);. T# J2 j( E( Z+ z line(293,260,293,280);( F6 |' L/ |3 [ line(322,260,322,280);6 N' |/ k4 v2 J/ b3 y& [: K3 l line(333,260,333,280); 1 k' S( @2 R$ ~3 ~4 {; _ delay(50000); ( N2 s2 v0 Y# @5 s4 \! e- ]8 p setlinestyle(0,0,1);, E5 C- P' N2 | D9 e7 d5 O setfillstyle(8,1);1 N- m) ^- P7 ~' ?* H circle(281,286,6); 1 V+ j5 L6 E8 a floodfill(281,286,YELLOW);. Z8 O' L; [. m$ s setfillstyle(8,2); 2 j( p0 _- z- f: p P* H& E circle(293,286,6);! W3 t# f, p+ \' h: i5 A1 P# h floodfill(293,286,YELLOW);; } L& b) ]6 `7 `4 A) N setfillstyle(8,3);& m; i- ^+ @. C0 ?- b* |. b: c circle(322,286,6); ' w5 t7 o, ^; t7 r: ` floodfill(322,286,YELLOW); ) d1 X( {: n: F3 i) P, I setfillstyle(8,4); , g8 f. g7 A: Z5 ] circle(333,286,6);7 C( V( E) f6 M* O4 g floodfill(333,286,YELLOW); m$ }% f& N2 e* U; C getch(); 5 D! M. C7 o- k) _3 P# q% A/ V closegraph();$ v- P; ]( N' L6 ^" z5 p$ Z } % |1 f5 N6 b7 ^2 f) i- H( D7 D: |" o! X; t5 L - `% p2 }1 h. \& d1 F8 g% C( ^ 
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    ; d9 L. Z$ L: k. m难道不是《操作系统》的‘进程’那一章进程创建??
    ( g0 f1 s* L4 F/ F7 Y* o到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    , X; X# j. |5 w1 O1 p) T. o& `不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!!; a0 g& q# S$ \ # k# p% P1 N( c2 M1 O8 Jint timecount=0; 1 t. v. \- b& ^; b. a! Gchar far *indos_ptr=0; 9 h5 C" q' y' X+ j, m6 Z3 M3 V. lchar far *crit_err_ptr=0;6 m5 H( }1 _4 K- K8 y int num=0,current=0,i;0 [& l+ N* g3 ] void over(); 0 g1 D9 i7 T, K" N. Ftypedef int (far*codeptr)(void);3 i% m3 F1 o K+ A( e int create(char *name ,codeptr code ,int stacklen) ; |6 \3 l. l6 d$ S# X{& |# _+ Y+ l/ n% @) p" B# M# T unsigned int * s; 0 l9 W8 w2 \1 h: mnum++; " u8 G. Z: e& gtcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));4 c, W6 S: {" \7 O2 I. D tcb[num].state = READY;# ~% T1 H ^6 P c6 g8 C* [ _9 y strcpy( tcb[num].name ,name); + z; y0 U" x# @/ T+ j- G tcb[num].ss = FP_SEG(tcb[num].stack); + t5 _% a2 J. M* p' E7 n# r tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); 5 f9 I6 o4 V! t9 x! f *(tcb[num].stack+stacklen-1) = FP_SEG(over); . f$ p3 s, Q' i6 ? *(tcb[num].stack+stacklen-2) = FP_OFF(over); ! D' }. F$ B1 a/ T- y& Y5 |0 J *(tcb[num].stack+stacklen-3) = 0x200; / b, i; a" ]/ E# l4 f *(tcb[num].stack+stacklen-4) = FP_SEG(code); $ o7 v1 U2 y6 L *(tcb[num].stack+stacklen-5) = FP_OFF(code); 3 W7 y3 I* F! N5 H) R *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);8 b7 u2 g' ], X. _2 Z% j *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 6 j$ Z% Z. ~* o5 ^ e return num; $ j8 Q# V1 r# R) y9 E} ;3 M/ Y7 o. b$ ~$ r6 u p' B- S0 m void interrupt (* old_int8)(void); / d9 Z8 U/ [8 B2 l8 n- U& w6 x6 ] void interrupt new_int8(void)& j% ]6 I# | [& t7 B6 g# W { 0 b7 Y9 O7 _& _4 i$ j (*old_int8)();9 C" y' a& q$ k2 ~ timecount++;2 B; Q9 \. s3 { if(timecount>=TL); # b1 Q9 x' [2 h7 v* ? if(!DosBusy()) 8 w( H* Y2 e% ]! _ { ; G, k5 w& M3 | disable(); ) ^* q1 F" f3 Z) h tcb[current].ss=_SS; 4 Z2 S% t0 G" C tcb[current].sp=_SP;! S2 {' B3 _( k4 y6 j4 D if(tcb[current].state==RUNNING)' P3 n5 y" }' S5 O0 n tcb[current].state=READY;9 _$ v9 C% [ |& X+ G) e' _* | current=3-current;4 H, L% `( ^, n, |1 F/ D0 E5 A if(tcb[current].state==READY)2 I1 A" R$ m) i5 `- Y) ^( q { _SS=tcb[current].ss; 5 v) K9 G2 i& q5 Y, {+ z _SP=tcb[current].sp;( B( t6 d5 F5 k. U8 N6 W tcb[current].state=RUNNING; $ }) @; L- p& X |0 W+ j timecount=0; 2 c& c4 I8 R) R3 i+ {& b: Y3 _ enable(); " ?. C) \- R) g$ i6 r} : h1 ?' v; x$ |' }. Y} : @1 |/ {) c. `5 }0 z0 a4 b};7 b( E% s+ s) T1 U void tcb_state() : K/ b) l/ S; [! G6 N* l{: c2 R3 _$ Y) ^/ c3 a, C int i; 6 P9 h+ ?0 U1 b# t( n+ V6 R: v for(i=1;i<=num;i++)0 P% |, z K- V" C# m% S0 Q5 Y% M printf("Thread %s is %d ",tcb.name,tcb.state);) I0 L/ B4 o% n7 ?; h) l6 \6 `; R };# a% M& v! q/ b4 f! e9 j- G& j# Q int all_finished() 5 j# q5 \; `% X- S4 W: ~{3 G8 v+ A2 p$ j/ _9 {. o4 h" ? int i; - z) V' Z, O+ n8 }. u* }- \ for(i=1;i<=num;i++) 1 L% q- ^: T/ e* L3 N if (tcb.state!=FINISHED) . R/ S. ^- J8 k return 0;, W2 X: P! e C8 U7 J( [: p return 1;4 p6 C6 O9 [1 T 2 R d: J( s. D# o( _3 W };; `* G1 Z8 z. Z0 g& x& X void interrupt swtch(void) 5 p0 c* n0 |( g; @{ 8 z" K% B4 P$ d0 ^int i; 2 Z n1 o3 r7 G, a; b6 E0 | disable(); 0 a9 I, V7 h. T2 s- I3 X2 j' A" C tcb[current].ss=_SS; , _/ j0 b# j: d3 Q# q! a tcb[current].sp=_SP;6 ]2 |- Y' s+ r$ o- F if(tcb[current].state==RUNNING) ( Q4 j: q. W- C& h tcb[current].state=READY;( n% X' _! X/ d7 ?5 u+ }8 n for( i= current+1 ; i <= num;i++) 9 _# D8 H9 g+ ^1 D* [ { if(tcb.state == READY )8 a6 J8 x$ Y9 ?/ i goto excute; 9 z' M) P7 E4 ]" D9 ] } , V; F$ e$ d2 J% O' b+ S* I for( i = 1 ; i <= current ; i++)! k) o, l! H8 r# x { if(tcb.state == READY)# @" g1 Y% Y6 x8 q8 X, b; }* N% w goto excute; ) b. a+ q' ?- d, O7 L* f" G }/ ~8 T$ W" t$ l" @7 V& | i = 0 ; 0 n9 _/ B" k4 z9 O excute:2 G" I8 p N$ y _SS = tcb.ss;3 x% t5 V! M0 Y8 ^1 j8 E _SP = tcb.sp; 4 j* Z* U+ R1 D9 K% i tcb.state = RUNNING; ! Y" B* s, ?( V8 A" Z! i( v current = i; , k9 x6 Z8 O5 i [6 N enable(); * o9 r" u; c5 Z4 A}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?0 @  [8 X# u( F" t6 K, J- Z$ J
    给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    " y3 j3 R# R. j# o搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    8 E' s4 U4 N4 G7 U% Z别占着茅坑不拉屎!7 T! ~; i% y& ^( j2 B) Q/ X
  • 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 | 只看该作者
    完成了你们看吧!( S5 x# k& b3 G ; [" `6 F2 S6 d7 w7 ]: H) r #include 2 `* w0 P) u( h3 p9 x #include * u/ G7 ~+ F. F#include 9 M& q1 _! j+ ~& ~6 ]#define GET_INDOS 0x34 ) S$ G* e9 K' W. K( `+ I#define GET_CRIT_ERR 0x5d06 6 c2 K( {. e8 d3 \2 Q# ^#define FINISHED 00 G4 B2 p0 J7 X3 t #define RUNNING 1 , u) d2 `! E. N. X' L6 N. E# N#define READY 2; w" L E3 L+ |. g. N; P #define BLOCKED 3 1 d8 v( B# `# v! J# p; |4 P#define Ntcb 8! Q9 E5 I0 @- v7 q9 e" { #define TL 1* l. o0 A5 H4 g struct tcb{" k5 f$ K- z& D { unsigned int * stack;/*堆栈的起始地址*/ + W5 y6 P" g& ]. v unsigned ss; /*堆栈段址*/; z6 `) I8 e; d# `$ l unsigned sp; /*堆栈指针址*/ + Y+ s: K# C, @ char state; /*进程状态*/; u( X7 b; `7 u1 ] char name[10];/*线程的外部标识符*/9 j% m; m8 n. B. b5 A' U* \ }tcb[Ntcb]; /* 系统允许最多的任务数 */0 D, ]' u G) Y+ \3 | int timecount=0; 4 b( N5 o: R) k, S2 B$ a; Y/ L$ ]5 I4 Q9 {- Achar far *indos_ptr=0;8 j( w5 z) p$ N( O: p% x* w: t char far *crit_err_ptr=0; 6 ~0 A/ x* W* t Q' s2 h* Lint num=0,current=0,i; 9 n# N" N- b+ e/ fvoid over();. H" j. N8 f" F2 g typedef int (far*codeptr)(void); 0 V4 X9 y5 ? N# e8 n& {8 G/ Dint create(char *name ,codeptr code ,int stacklen) ) j+ |3 b" S5 [3 _# V: f{ 4 v& U2 S0 A$ g" G# vunsigned int * s; $ S% l0 l( ?2 {6 n; s" bnum++;( }' h* K, Y6 o- o9 F, i9 o: T tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));8 Q& Q5 `5 n' y* u6 K( v) c tcb[num].state = READY;& |3 ^; n8 g6 J) [* y. F+ C strcpy( tcb[num].name ,name); : a4 q6 n# \# u/ x& g tcb[num].ss = FP_SEG(tcb[num].stack);/ h3 d- L6 @8 [3 b% B tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);4 r0 }2 m2 |" I3 s! f& } *(tcb[num].stack+stacklen-1) = FP_SEG(over);0 R i- j( M, D N( Z *(tcb[num].stack+stacklen-2) = FP_OFF(over); . ]1 l# Y5 Y& s( e; j# g *(tcb[num].stack+stacklen-3) = 0x200; / h1 {& A8 @3 m! X7 w1 N *(tcb[num].stack+stacklen-4) = FP_SEG(code);7 C; @6 Y8 N$ ] *(tcb[num].stack+stacklen-5) = FP_OFF(code); ) w( y4 e0 g' f, u" ? S3 `- h4 b *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 8 n( V8 P) x2 k H1 Q% p# d *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);1 W; p$ @) C% I9 d% R6 h return num; 1 L7 o3 X: o, [) E9 p1 d: z} ; " o2 | t5 n/ ~3 @- d0 b' N2 @void interrupt (* old_int8)(void); 8 ^* k4 k$ A8 ^9 y, ovoid interrupt new_int8(void)! g0 q/ Q6 Z& F {- A$ ]2 q8 d* o/ [% B (*old_int8)(); ) M+ Y" j% G/ L! F. G0 \ timecount++; / z' E$ q; l8 }4 `, y7 g5 ?+ j if(timecount>=TL);% b' d, k+ h1 F1 L5 n if(!DosBusy())5 N9 c; A' x! l {/ E" K# H( X8 ~* L; e! c/ } disable(); 0 ?9 u c% `% r tcb[current].ss=_SS; 3 O& t( e7 i, P7 s { k% Q tcb[current].sp=_SP;- F7 `2 U: G- w- y if(tcb[current].state==RUNNING) 0 U- ~" e3 F) D6 h+ { tcb[current].state=READY; 0 m# ^" G5 v7 X: t) R$ b8 c current=3-current;* w, P V+ e" q if(tcb[current].state==READY)2 @7 A/ C! y1 B$ v3 S0 e { _SS=tcb[current].ss;' \1 F5 Z) m3 ]3 c4 u0 l! r8 M. `6 H _SP=tcb[current].sp; 5 y$ N0 |& W# x2 U( c: o tcb[current].state=RUNNING;9 K: f5 z: B5 R5 `$ \) P% e timecount=0; 5 D& Q+ b, Q+ Y& D( L, J enable();' u6 `, d" a4 u' @$ d7 `6 H } " ]1 |3 c5 ]$ l( s6 Y( h} & g. `' m1 Y# p5 o, x$ a};: B! z6 S, A" c. W. ]* r) v. ?& w void tcb_state()( Q( @) S; z: d/ M7 } {# o8 U) v* m5 C2 I; x3 s9 e) R int i;7 v' K+ q7 X4 E9 \ for(i=1;i<=num;i++)) i) b0 T- S/ F# l* U& p1 ] printf("Thread %s is %d ",tcb.name,tcb.state);; n9 ?0 y1 O" V8 |' M* X }; - j+ P% u0 i1 m) i" Y# t7 u0 cint all_finished()) h ]% a A. Q {9 k' G. f* ^2 ]! U, F5 w7 Z9 L1 u int i;$ i6 O/ b+ B( u- Y1 J/ G9 ` for(i=1;i<=num;i++)* P$ ?. B: M k. W5 _7 x+ N0 {$ B if (tcb.state!=FINISHED) 5 M/ _, h( x d0 _7 E return 0; 5 R7 Z0 C8 t/ s$ c( N return 1; 6 X/ x# W: y7 f1 A- c- V 5 i' O6 U) v" V, Z}; + @: I. x% o& E0 N" C' ], n: wvoid interrupt swtch(void) # j: X% s9 Q4 m7 @{ 7 h- U) X( }8 {int i; , l" y$ Q' W6 i- X# I8 m disable();" u8 u) D8 X% f tcb[current].ss=_SS;$ m. l1 z2 r3 v tcb[current].sp=_SP;. d Z9 n% S- p/ k" D2 K! @$ j- J if(tcb[current].state==RUNNING)( Y+ {, S9 z( ~6 P3 o6 s1 v tcb[current].state=READY; 4 L, n5 y* A% z/ B4 p for( i= current+1 ; i <= num;i++) 5 a' Q+ E0 c0 m$ c: u7 X/ M { if(tcb.state == READY )# B6 N( i+ \8 L, Z goto excute;. |; A: V' c, d% M: {7 ~ } ' y( }, K4 G4 G% l/ [# @/ n' ^ for( i = 1 ; i <= current ; i++)9 u7 S( C5 O7 j3 k/ w { if(tcb.state == READY) 0 ~' k4 N$ `2 Q) d @3 E z6 \ goto excute;' m* T, U6 y; Q7 T# ? }. R/ F8 J5 R9 L/ L. u! o, H6 j i = 0 ;, B. j. i3 ^- c2 c' k. k t6 F, } excute: 7 h/ M- X# z4 H5 d6 }( R5 o {- T* n; L _SS = tcb.ss; 8 G/ {+ t# } n/ f3 X _SP = tcb.sp; 1 M+ U6 i$ m: S& p* ^- A tcb.state = RUNNING;( z/ f) H( [7 U* q+ b current = i;- a$ y( Z3 g g( m; H enable();) I% s/ f4 L/ T) j' m; k# G1 O } 2 r; q( @. s* a- X& R/*-------------------------------------------------------------------------*/% W2 s" w$ ~. `; P# ?$ k, a+ Y+ { void over() 6 n3 \+ [4 d/ }- L; Z- s{4 G0 H2 c$ ]2 @* i int i=current;7 H0 i9 _/ ~/ W: J/ r b5 V9 d /*strcpy(tcb[current].name,'\0');*/- ^* H1 {' j7 R$ Y tcb[current].state=FINISHED; . A6 d/ W$ Y/ N3 c swtch();" N* M2 E; s9 y! p free(tcb.stack); : I* Y1 ^- t# n. r; ]}; 9 b( M9 g2 k1 O3 W" g* I1 Y/*---------------------------------------------------*/ ; o8 Q, E M# t# M6 K$ D6 V: ovoid InitInDos(void)) G9 A( F# E1 y+ z9 [ {* c C0 l* H7 a r union REGS regs; ! u' l/ E r- t l9 d" s! k3 F struct SREGS segregs; 0 r% o& i7 u; Q$ [8 E: m /* get the address to INDOS flag*/$ q% p. @' s, I! |0 m l regs.h.ah=GET_INDOS; , }. n& [) Y1 L! F4 k intdosx(®s,®s,&segregs); ) |. ?, N6 m4 E' u indos_ptr=MK_FP(segregs.es,regs.x.bx); . a+ s$ o$ V- Y, C o /*get the address to CRIT_ERR flag*/9 \0 i+ {! W2 r% h if(_osmajor<3) ) _, K' y! d* W F; @, C% M crit_err_ptr=indos_ptr+1;" E; A! u! ~0 f/ j4 ?4 m0 u z: {( l | else if (_osmajor==3&&_osminor==0) " G9 l" n3 g5 ]: I. Y9 b crit_err_ptr=indos_ptr-1;5 H( J" C( F: M2 H! L, ?0 m- a else2 _. T/ E" Z7 ]7 K) y4 k6 N { : w7 y+ t4 @9 L! l7 ~7 u regs.x.ax=GET_CRIT_ERR;! C8 i: S5 w+ j intdosx(®s,®s,&segregs);( N" ]+ q/ Z# [ crit_err_ptr=MK_FP(segregs.ds,regs.x.si); G) @7 F, X* o6 i } ; w3 e* K- F" S0 L& ]2 G};! `9 _8 j! y, ^0 ]; j int DosBusy(void) x' S' x8 H+ R O# S5 G k( o; c {, ?4 M9 ^* S9 F* ?: L, Q if(indos_ptr&&crit_err_ptr) B& o/ ?( _1 W/ X8 s* n& d9 N return(*indos_ptr&&*crit_err_ptr);) D& r% n9 F0 h else3 \/ {0 i, b0 G6 ^. w return( -1); 1 ]& X5 D C* s* T- l};* ^( B6 l1 a& i1 { void f1(void). g1 ?3 V0 k, W+ O$ t {6 w/ ~. B0 x% l int i,j,k; 3 d( P7 ` X( Q8 B! i, d for(i=0;i<40;i++) / c5 x" r% ]9 ?4 n! q) J- v {( k8 L# m; Q9 Z4 x0 T- y. J7 g putchar('a'); ( F% b8 ^* e! h9 E9 o$ T' P! X- x, p( K7 G: o# s9 } for(j=0;j<1000;j++)& b/ e3 b* w# \# |! k8 B; _ for(k=0;k<100;k++)4 h; L; G! Q s2 T6 C ; 9 S L0 l+ @; u } . \' g; N3 G( t7 K' z: X9 J* K}; 3 I/ g& f r8 h7 O8 Gvoid f2(void) ) t8 t. F. b; m3 U f8 M# e8 b{ 7 [- I- j. d. L8 U+ |( b- z int i,j,k; $ J- X( @8 m2 R% W* _3 b for(i=0;i<30;i++)4 a& k0 S" n& d+ }4 N2 W { ; l0 V6 K1 s. v% n5 `# L' Y) x putchar('b');; N$ ?& \. ?& n' p6 }- O for(j=0;j<1000;j++) ' t- X& ?% E$ B6 j( G for(k=0;k<50;k++) 1 [1 O$ J4 V1 U/ K9 _ ; ! ]# W A# d: x" D: z C# O/ `8 P# A5 D }2 l$ Z* O% \$ ~- S3 h$ q }; ) ^( k! m5 i/ n2 \5 v) N+ D/*------------------------------------------*/ ; A4 m% r4 d; T Amain()" d9 T' |5 ?- R0 z/ R) v( p+ g {& p3 `1 l% L* U5 D' r9 i) s& i InitInDos();' X' ~$ A6 V S. \5 j! c% e# |+ B old_int8=getvect(8); & _1 Q( G* ?5 f! o. Y) D+ W& G5 N strcpy(tcb[0].name,"main"); , R, D+ F' p1 H S8 S+ S% q tcb[0].state=RUNNING;! C, V& Z: h$ @* T current=0; 4 c p1 k' T: b$ z; E" P. i0 I create("f1",(codeptr) f1,1024); " Y3 O9 U+ l( G# p! E" D6 x create("f2",(codeptr) f2,1024); " `: d9 i* b6 Q& d/ S. M. X tcb_state();6 }5 O! }# A, o. L! R setvect(8,new_int8); 8 h1 i ~+ G7 J G7 A swtch(); 8 G& [# c; g" \+ J7 n while(!all_finished()); * K& L( \- t' O0 v/ t strcpy(tcb[0].name,'\0'); : M- t1 g a0 {* [; D$ v" e1 l tcb[0].state=FINISHED; # t9 ^$ ^# U& x/ \6 Z$ Q, p setvect(8,old_int8); 4 h9 K5 |% `5 h tcb_state(); * G+ K9 S9 V& e, S- } printf("\n Multi_task system terminanted.\n");( u5 D2 G; _) g) c# j };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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