下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程1 \, s3 K3 a' {( p+ J% q" d6 v
要求:1 用c语言编写' W2 w3 u: U2 G4 f$ V5 z
         2 程序+PCB(ID的内外优先权,申请资源)
# A, `/ M& q* g+ k/ w只需做进程中”产生“这一步。/ X# W) ^: k& `
以下是做了3分之1的范例:
& |* h4 L$ G# Y7 M; L% r#include "stdio.h" - f. d4 V8 B& g
#define running 1 /*用running 表示进程处于运行态*/ 8 c+ k8 l4 a5 x6 f% J2 a
#define aready 2 /*用aready表示进程处于就绪态*/ + \: i! X' X+ `$ k/ S1 v3 y0 _
#define blocking 3 /*用blocking表示进程处于等待态*/
& E# V, x8 }7 ]8 p#define sometime 5 /*用sometime 表示时间片大小*/
* ^. T) z8 ?6 ?8 b#define n 10 /* 假定系统允许进程个数为10 */
1 w. L6 h1 D! N) ?: |# h3 Y* L- Q) h6 c
struct ' s0 U0 z0 ^4 z6 T6 B; J8 k/ D0 L. ~, j
{
# w1 i  F! S* [. C5 Kint name; /*进程标识符*/
* X1 S0 m% O$ x8 J4 Z2 m4 Vint status; /*进程状态*/
% W( x/ {; r2 P" kint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ ; N! ~- r: [% B% @! h: y
int pc; /*进程现场信息,程序计数器内容*/ 9 _! G/ G8 s; x$ b
int psw; /*进程现场信息,程序状态字寄存器内容*/ ! ]0 a, G" S& t  |9 |
int next; /*下一个进程控制块的位置*/ . ^& e' {, T" {4 A
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ 5 t0 z: F, ?3 W* V- O
, Y% f- |& ~3 C: r
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
) |7 ]6 U0 F8 I- G" l4 f8 u# `+ C3 {0 `. a  w
int run; /*定义指向正在运行进程的进程控制块的指针*/
( T( c+ [8 Z  u6 U: R9 Hstruct
6 e" Q# j6 D  F{
: f# a9 j& o8 jint head;
7 z3 m! c- ~  u1 B' p8 q8 Gint tail;
  t5 h+ k8 _& ^' Z6 l5 [  ?1 H0 b9 g}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
1 K' [3 ?* R4 X1 v- Cint block; /*定义指向等待队列的指针*/ ; v9 q' {4 t) e% I$ M- z$ x
int pfree; /*定义指向空闲进程控制块队列的指针*/7 l; ]2 d0 H7 }  Q8 B% p8 e
3 D  M) Q2 p3 n8 R
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?* d9 F0 p* @% ?7 P
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    ; E% a( x. ?6 Q7 v/ u  V/* the main site file */
    " z! ?+ x' A+ @+ \CreatePro(&ID){+ F0 D' @+ _. C# }
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;3 z8 w9 R+ h( g/ Y. E7 a# u; X
      InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    5 I" f5 x) K- T, N/*初始化参数*/
    9 f3 Q( _! ^# A& d/ b3 N   CallName(&ID);   //命名进程的外部名
    " m" I" L0 `9 ^1 x) d  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、* S* _3 Q, b+ f, R( f6 u
      SetFL();  //优先级数、
    : m3 `  P1 Z# P& A! |3 q5 i  SetHeap();  //进程起始地址、
    1 Z2 M7 F" v0 d; }5 D4 }  _SetSelfStat();  //设置进程的状态为就绪态6 T1 Q2 X7 h& c0 c( h+ i0 ^
      AddStat_Read(); //将该进程加入到就绪队列中。( m! Z# b( K) z9 a7 G) [* r/ f) U
    .) ?6 b/ N# D' e
    .4 G8 p& H/ I& J5 o% r' {
    .% t: S/ J. ~1 J# f, D  l: `5 m
    .
    + |$ w: ~5 h  u) H" j3 J}
    % X' v! Y" U1 C我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思3 \0 V$ n1 J" U  ^- h$ E
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    1 q2 N0 z, e  R& w谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢) a9 ~4 H7 D+ m 5 n. o I- q$ p6 S3 z7 y #include! b% E* _8 U" z #include 2 g: N9 ^- Y$ u; A#include- ?7 k' \6 g1 U" x6 T #include 3 U: W v- @3 P#define running 1 /*用running 表示进程处于运行态*/1 e$ N( Y; ?4 V. ] #define aready 2 /*用aready表示进程处于就绪态*/ 6 Q5 i0 `5 B5 Q, R#define blocking 3 /*用blocking表示进程处于等待态*/ % @ u* A, L( ^+ ~#define sometime 5 /*用sometime 表示时间片大小*/ - M9 V+ K5 c; e#define n 10 /* 假定系统允许进程个数为10 */ : s; T$ l( E- |* }9 i& O% {4 g) Sstruct1 F+ g/ E! ^ X$ A# a' F. { {0 Z9 p. ?2 @9 C% v8 A int name; /*进程标识符*/ 5 ^4 l M$ }0 Oint status; /*进程状态*/ # ^1 C" W' \% I8 l& Oint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/: T. x5 R* L( A$ F( x int pc; /*进程现场信息,程序计数器内容*/- q8 w. t6 k6 h+ ~( o8 B int psw; /*进程现场信息,程序状态字寄存器内容*/5 s H' s, p6 B+ j/ m# z! T9 Z$ _ int next; /*下一个进程控制块的位置*/6 c W4 [$ }' u6 ] z/ G }pcbarea[n]; /*定义模拟进程控制块区域的数组*/ " [& W! }& s% [3 ?0 w5 l7 P) hint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/, W9 T' x6 F3 x* f$ W( `& F, y int run; /*定义指向正在运行进程的进程控制块的指针*/9 v0 ]: v# v5 P& }$ T' D, U struct & {$ G; q4 ]0 ~9 x Q/ m4 a9 q{5 }8 T" c" F' ^9 ?3 ?/ v1 \ int head;3 b+ x `6 h: H k int tail;# E! z E! w7 n9 O* p2 d }ready; /*定义指向就绪队列的头指针head和尾指针tail*/8 e2 m6 B/ ?! X; t' U- y+ `5 o int block; /*定义指向等待队列的指针*/ ! A+ q9 V9 a, fint pfree; /*定义指向空闲进程控制块队列的指针*/ $ e4 A2 D8 K& V; r9 g9 ]main(); z2 k8 u D! B3 e! ^# K p! X { int gdriver=DETECT,gmode; 6 D5 N8 F. n% A* s int i,x,y;3 @& Z- u6 d& g6 u+ @ for(i=1;i<=n;i++) 5 p+ J! B7 P, Y8 f( W {ready.head=pcbarea.next;}7 b$ L: h6 y$ ` initgraph(&gdriver,&gmode,"");' b* h3 G* H1 K; c8 U setcolor(YELLOW); + y5 L0 }( y" H; |6 S. h9 g for(i=1;i<=4;i++) / g# e/ y; q& G$ y { setfillstyle(8,i); : S+ h# F1 s$ M0 F4 T3 C. w circle(284+13*i,190,6);' N" Q% S4 `2 z! T floodfill(284+13*i,190,YELLOW);0 o/ F+ ?, i% f }8 F- @2 [- U9 W* V) J setlinestyle(0,0,3); 0 e6 N. i) E% D: B6 x) P Y4 ~' J" T% u circle(316,190,25);6 D1 X% Z5 m1 l- H8 a setcolor(5); 6 n% |: t, t- N9 z9 ~2 c9 P8 u% l* V settextstyle(3,0,4); 2 ^$ s. w0 A& I8 x8 l outtextxy(35,311,"press any key to create objects!"); Y3 J# X/ L e getch();. J/ X% s7 @, Q3 B% w setcolor(YELLOW);8 c7 w+ }6 c. }) w, \9 h* d line(300,215,290,235); ' V3 @7 H3 W5 z5 Z' _+ [5 E/ j line(323,215,333,235);$ u4 T: V/ m' ?5 X' y0 D5 N( f delay(50000);4 K1 H. a% V8 m% K3 s setlinestyle(0,0,1); + i+ u9 _, [3 V+ H7 S. V% J for(x=1;x<=2;x++) ]4 n t) J6 z, N# Q- C( U' T {setfillstyle(8,x); * r: E4 j' d2 H# Y circle(267+13*x,246,6); * P' ~+ ]; t: g) b: f2 r# u0 R floodfill(267+13*x,246,YELLOW); - Q1 h+ Q# p& Q* [3 f7 q3 Q } 4 {. j x5 P/ T; p# P; x" Z for(y=3;y<=4;y++) & w, U! V) M6 P3 G Y3 z0 J {setfillstyle(8,y);1 |) P: M$ @8 `& w) e$ P% s- c circle(285+13*y,246,6); ) r$ j8 Z9 S8 i2 h3 D' y floodfill(285+13*y,246,YELLOW); . B5 f4 g2 b! [' s3 p y }/ `% u* }1 v# }1 a( Q) V _ setlinestyle(0,0,3); 8 a: r6 v2 [$ D6 D& J8 c6 b circle(287,246,14);& E. R& u. j1 Z3 p setlinestyle(0,0,3);/ {1 z# @) ~5 U4 [& K7 M$ T2 t# P# o8 ~ M- q circle(330,246,14);. I. @" p5 q3 g delay(50000); ' T; I1 F$ L- _/ c4 P( Q# f) [ line(281,260,281,280); % C3 v. e5 X- C5 V' T' E; k( l: r line(293,260,293,280);3 g$ k. `; S5 E2 P8 K6 [& Z line(322,260,322,280); 5 |. P. L2 _/ K; ^5 y# y& B line(333,260,333,280); & }. l5 s$ ?( L) F' M% j: D delay(50000); # p) k0 s8 B; b6 W7 b setlinestyle(0,0,1);$ T) p* Q0 A! c3 l setfillstyle(8,1);) s6 O4 H) S. h0 L- R8 v circle(281,286,6); . w* M4 x) ~% J- l1 z floodfill(281,286,YELLOW);3 Y1 N( i/ s# ` setfillstyle(8,2); 3 F4 C: d4 Q% a. ^" R+ r circle(293,286,6); ( n; j% v# G) X: A' T floodfill(293,286,YELLOW); : d( y" T3 m; f9 f# g8 C5 a setfillstyle(8,3); - R: {0 [+ u# N {' L+ {8 G circle(322,286,6); # g/ h( G* v7 x3 l, A3 [" O# T floodfill(322,286,YELLOW); ' b4 i8 |! T1 H5 j( x$ s setfillstyle(8,4); * J! {$ i, ], q4 ^* T circle(333,286,6); & G; M0 l- h, D7 q6 e$ P# h' j floodfill(333,286,YELLOW);" h x; w# ?; @ getch(); * ~. n; b! z( h0 O closegraph(); y: w l4 y. c( O7 [' a }( c6 X" M. V0 [+ X& l* _; E * m% f8 o0 K7 | 9 w% i i$ { _0 ~
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??0 E& o% r2 i+ ?7 T9 u- t9 _
    难道不是《操作系统》的‘进程’那一章进程创建??
    ) Q- a& \+ i3 }5 z6 h到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    5 X5 H3 @* `1 g5 c% N不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!!4 g% ` {, O7 h) L7 w* S( X2 {2 a6 } $ t) \9 g" D; |3 P# ^int timecount=0;4 {& X1 z, e1 u0 y g n$ G char far *indos_ptr=0; 3 |& f4 C- V3 N" f: g- x1 E! ? uchar far *crit_err_ptr=0;" K @# g' M$ n. ? int num=0,current=0,i; - C+ G m; {- T& zvoid over(); - V! F" l; p) R% Qtypedef int (far*codeptr)(void); 0 h% v9 ^2 g; Y- w7 m9 J( }int create(char *name ,codeptr code ,int stacklen) - ?; i: ^: ~: @{ 6 i5 z' r( B9 o* l8 e- d \* Ounsigned int * s;' b+ B, j$ ?7 E num++; + A# [+ p& H5 C8 o, |tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));5 F" g/ i& f7 F0 G6 e1 L) a- ? tcb[num].state = READY;7 K* j6 i7 v% B& E! l! e. W+ A1 j strcpy( tcb[num].name ,name);# C: m% Z7 f) G1 D+ O tcb[num].ss = FP_SEG(tcb[num].stack); 5 Q% m! }, O% t4 j5 i/ H6 [ tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); $ C3 h1 ?+ v- s2 `; D: | *(tcb[num].stack+stacklen-1) = FP_SEG(over); 0 Z* G, F2 Y2 T5 Y5 U* \ *(tcb[num].stack+stacklen-2) = FP_OFF(over); 6 m+ r9 q! m% H, s- V1 z7 f; b: f3 g *(tcb[num].stack+stacklen-3) = 0x200;7 X4 `8 x" F& q# R* O Z *(tcb[num].stack+stacklen-4) = FP_SEG(code); 5 I: V4 h( i: H *(tcb[num].stack+stacklen-5) = FP_OFF(code); . e# t+ D7 d9 N4 X0 b: W0 X *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); ) X3 m; Y. B3 {: Y7 T' k# a6 Q5 h *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);2 C! K. q" a h; J& Q/ c return num; & C. z( R$ g8 `4 R$ ^5 k- j} ; s& B! I' u! }4 @9 [9 j4 r5 Bvoid interrupt (* old_int8)(void); 0 Z+ `1 x7 `3 mvoid interrupt new_int8(void) . ?- c0 T6 W" n; Y! N{1 O) B5 `0 p) i W7 b5 @, s8 o (*old_int8)();* a! X3 l1 ]) a9 c$ N# n timecount++; $ k2 L+ z& _/ l+ p8 S if(timecount>=TL); ( K8 a# K, D6 a& D. w. y T if(!DosBusy()) 9 f3 K C- }" z% W- e {, r, a& ~2 O1 {9 a/ F disable();# C0 z$ T& ^5 F' p+ F tcb[current].ss=_SS; 0 z/ E( O' y6 [7 N- d4 Y tcb[current].sp=_SP; ! _7 h: T) |: Y6 h- R if(tcb[current].state==RUNNING)) P% F( {. A8 p- k1 H V. `& G/ p* S tcb[current].state=READY; % e/ T( i( N3 R. q current=3-current; 2 u; z" V* m- I3 ^ _! {. Qif(tcb[current].state==READY) * M" ~- t$ C$ N. j6 {! v4 |{ _SS=tcb[current].ss;/ A5 p; ~- D4 ?9 S" D* w: F( D& { _SP=tcb[current].sp;5 o1 D+ F$ H: F/ k2 ~% B1 P ` tcb[current].state=RUNNING;- K: w% P% p6 W" C0 G timecount=0; , n& W8 y; i7 S7 w+ w% w' D | enable(); # U1 u" Z+ }6 Z9 ^0 `/ U" B} : [3 \$ Z' ^7 S' J}# r* W3 [* e. s4 d* N! ^% Q: T+ S }; . ~$ c6 s5 T: W9 X6 Jvoid tcb_state() 8 ]! R6 ^" f I/ H/ D6 T9 P{ - p" B7 N" t; Z int i; & k' F2 n9 H& t5 W# n for(i=1;i<=num;i++) . y5 u9 K# U# ~# M1 o( q printf("Thread %s is %d ",tcb.name,tcb.state); 8 z: Q9 k! X! w" q; X};. b& u# x/ p' q2 s/ I int all_finished() & k! ^3 `- W2 m! r! Z' E' z{ ) T" `4 h# V5 x- R9 f- g) [7 i7 o int i; " D6 I' B [1 ^4 }! Y( V for(i=1;i<=num;i++) : C2 Q" k6 w& t9 y if (tcb.state!=FINISHED)3 Z7 a5 U" F/ g m return 0; & [0 c9 _4 i7 m3 G8 K return 1;0 n$ h' C' o1 |: _/ g w8 ^ - F; `: p( v% a& ]3 ?2 Y g, U% R };" P6 P0 K; ?, l2 X& { L void interrupt swtch(void)" r9 j5 u; n W" `3 n {/ k- K& [9 e# h- u! A int i;/ J* X) C4 K: u disable();! b8 K, B6 R, J3 \; h4 |& y tcb[current].ss=_SS;0 V/ Z% ^+ @) V6 V$ G6 Y8 l5 _" ` tcb[current].sp=_SP; ! F6 {* s( N" j- g if(tcb[current].state==RUNNING) - ]4 d8 |0 q3 Z. \* { Q: w tcb[current].state=READY;' V% z- u/ m1 C" e6 Z2 i for( i= current+1 ; i <= num;i++); r5 b# {2 C5 ]# Q7 Z { if(tcb.state == READY ) " q+ J& y! t5 i goto excute; 8 _6 M! B3 C/ ] G5 @+ P; P- ^* V8 x } - p( ~7 m3 \/ |, R# `4 V* s for( i = 1 ; i <= current ; i++) ( [9 O9 B h1 C: }$ e { if(tcb.state == READY)6 ~8 x# [% T e3 f goto excute;4 R7 l& z/ V& X$ r9 H- _: l } , G% E: m/ Q) ~. l i = 0 ; # x* J: R6 I$ ^5 \2 } excute:: L I% Z/ I1 b3 ~ _SS = tcb.ss;3 [4 M7 ^$ s6 ?. D _SP = tcb.sp;) ]- P+ c. I/ K1 G% l tcb.state = RUNNING; 5 Z ~* O: U) Y# }. m6 K current = i;5 F9 S4 z+ D" @. n' e0 W5 w enable(); 3 ^% z+ u n2 o}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    3 T2 q- e, F( ?; n$ U4 G给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!( J2 G/ i- B0 g' n$ f$ o
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!% ~  a5 s' F: P) u  V1 V0 M( V+ @5 ?
    别占着茅坑不拉屎!$ l* \  H6 l6 E" o3 W
  • 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 | 只看该作者
    完成了你们看吧!- U# y8 U" H& q+ ~ s% t3 J4 A 8 J' x- T% M! P6 O, n3 o, g! ~' y #include . f0 m" |# J; ~+ U( J% b#include 8 x! G$ S! z" p( N9 O* n' J) T2 K#include 3 o2 X$ i9 R' L) L* P# f #define GET_INDOS 0x344 r' L9 V. x h2 W3 ?7 {6 Z #define GET_CRIT_ERR 0x5d066 A5 o1 [8 E- Z) ^" L5 O- Z0 |# f #define FINISHED 0 6 \% S+ W! b4 y) {# k) q#define RUNNING 1% [6 b" Q |: S+ i* e5 L& D0 @ #define READY 2 + b/ R0 u; {5 W- Z7 X#define BLOCKED 3( W8 f( x' y# p0 r; d3 U #define Ntcb 83 z4 P, B8 X! L% L #define TL 1 7 H* @! K- y. g4 b. jstruct tcb{ , c; j8 E4 Z3 Y3 j. s) A* `. B unsigned int * stack;/*堆栈的起始地址*/1 N* X6 z6 Y2 z unsigned ss; /*堆栈段址*/, [: N7 F& L9 r unsigned sp; /*堆栈指针址*/' _7 o j! B. R+ A! D' G. \ char state; /*进程状态*/ j( P9 h) T9 M! S i char name[10];/*线程的外部标识符*/ 6 P* C x+ \2 L# D1 B4 t7 A }tcb[Ntcb]; /* 系统允许最多的任务数 */ & O! F- t$ N( p, K+ k" yint timecount=0;' R- v! R, T" H. C9 Z4 h char far *indos_ptr=0;# W+ R9 B' s5 k0 v, _ char far *crit_err_ptr=0; 3 Y' x' Z0 ]( i) u% Wint num=0,current=0,i;- o; k' [( J: n5 b5 w5 C- } void over();5 y& ?) V( Z9 O! ?; ?& x typedef int (far*codeptr)(void);) A' h8 w) v9 a) ^: b int create(char *name ,codeptr code ,int stacklen)6 H% J( I0 |% b( L3 n+ c { : j; i7 Y: s: H6 c; _9 j$ ]unsigned int * s; 8 T) b- e# `* ?) wnum++; $ f l2 ]) y# p$ r& n; z4 `' u7 h) Qtcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); W; a$ E- x+ H$ d* E: m1 Y tcb[num].state = READY; * Q4 \( p2 b0 j) j- C, V strcpy( tcb[num].name ,name); 1 q! a/ f: t2 H) l- o tcb[num].ss = FP_SEG(tcb[num].stack); 8 X7 m3 G& x# I' | tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);& V2 n; |( c9 h9 F *(tcb[num].stack+stacklen-1) = FP_SEG(over);8 e4 I6 L9 q3 c f$ J8 [+ e *(tcb[num].stack+stacklen-2) = FP_OFF(over);' L+ {9 u6 f( H1 s* I0 D; p *(tcb[num].stack+stacklen-3) = 0x200;: C/ \' v$ J7 C& z8 E( @ *(tcb[num].stack+stacklen-4) = FP_SEG(code);) }: h* j! x6 T% M( g/ I3 q5 s5 I *(tcb[num].stack+stacklen-5) = FP_OFF(code);( K! V3 `( J& \8 i# \- B% U *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 3 Y7 W* i# A3 G M. T *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); $ X3 z/ i/ e7 v) N return num; 8 t) p3 O0 I# E+ B: Z} ;6 r5 r( E0 h' b$ R, ~( S& _ void interrupt (* old_int8)(void); 4 L2 S& {0 M) f. W( Z, Y- Q; \# cvoid interrupt new_int8(void) 2 \ F! X7 ?& j x* V{1 a$ G- Q, r; ]' e+ H, p# E. @3 ^0 Y (*old_int8)();5 \. _' L" [0 H8 s$ K1 y timecount++; + D* w$ H; G5 ^$ R if(timecount>=TL);7 I3 d. G4 }) J if(!DosBusy()) 0 c( F$ b) U; X0 M {9 w/ [2 a7 I1 O disable(); 8 Z1 [. L6 [( p d( E! T! ?7 D' j tcb[current].ss=_SS; $ |: S9 Y% i; u2 H7 @3 s tcb[current].sp=_SP;3 T/ \$ e. ~0 |" z if(tcb[current].state==RUNNING) & C! H6 Z( Q L8 X tcb[current].state=READY; 2 H% N7 Y7 n& f% G6 q+ l current=3-current;- s% L/ s. t2 ^2 S if(tcb[current].state==READY) 4 J6 v7 h/ g4 C8 u S" B{ _SS=tcb[current].ss; - `+ ]9 @' A# F" T' q _SP=tcb[current].sp; ( }6 Z/ U& P! x, { tcb[current].state=RUNNING; n' h8 W- w6 }) }& K9 n) ^7 P timecount=0;6 c2 B6 e! [( u0 ~0 L enable(); , Z8 N6 O, ? Z- o9 _}2 {' E" B9 X, [# g6 C5 @0 C$ f! o }2 \& X- C( M/ w |% g) ~; e( B) j }; , v$ }6 ^' f9 s2 S# Q# wvoid tcb_state()& a* P3 K/ {/ b; _+ ~( ~ {7 Q* b i- S9 m int i;* p6 G& Y* K$ J* B7 I for(i=1;i<=num;i++)5 F( z' {1 G( X% ]/ } printf("Thread %s is %d ",tcb.name,tcb.state);2 R; e, s" z# G5 I }; 5 Z( F# y/ I. I, \7 E8 E3 `int all_finished() # n) G0 [' U2 Y! L$ h3 [8 T{+ C1 N1 x2 C0 a9 y int i;% S& n$ W; V! `; [1 l for(i=1;i<=num;i++) 5 U6 t+ c, ?- x( @/ o4 ^% Y( j if (tcb.state!=FINISHED)3 ?4 u1 c5 r j7 x" J return 0;9 T3 w! b$ g5 `. ~/ o* y" H return 1;/ P1 j! ` z {- \0 y ! l" s3 Z- P5 u6 [# T5 _' \};4 e3 D" E8 o# p void interrupt swtch(void)4 W& Y. N1 u" M' a' A { # {# q9 J# g2 q4 bint i;6 Z! U9 T( y' ~: ?; p4 H disable(); $ k% f/ I c8 Y# T! X: @ tcb[current].ss=_SS; Q" M n! f( g6 c tcb[current].sp=_SP; 9 G: e7 p2 Q5 r. z- m* o if(tcb[current].state==RUNNING)7 V1 N! D( v" l- d& i' a# k' Q4 Y tcb[current].state=READY;$ \# g0 s. t9 c4 e/ v for( i= current+1 ; i <= num;i++) 7 V" | o; t$ b: D9 A4 [, J( h { if(tcb.state == READY ) 6 h" W! i2 \( d1 O: Z goto excute;* Y. b0 o* z& [6 h# P( U, q }% {& ] X4 Q, x* o for( i = 1 ; i <= current ; i++) & x. s0 [3 J% S+ n. Z { if(tcb.state == READY)1 k8 G) [. _, k4 i% g9 c8 d8 m/ D goto excute;# j2 ~6 t( S y/ h4 d }! R4 w) t! j7 d i = 0 ;4 ?1 \2 U- l! A excute: ) t: w# z( m; J9 F) r u _SS = tcb.ss;, z0 x( C( Q/ C; \' a: q9 p _SP = tcb.sp;* _ I' W K" A% h b0 g# A$ t tcb.state = RUNNING; s0 c3 R# C9 k# ? current = i; 6 T' U5 E+ ^5 s; u! Y) a- @( n enable();# M/ \0 W% e. f6 z" g }" L5 I. ]9 W" Y8 o1 e& E5 r /*-------------------------------------------------------------------------*/ 7 o9 b9 _, w" q' f, C4 `void over() # e0 }6 D9 f' Q{ 2 U$ L' d- s% V: w8 _8 a' d int i=current; 8 o5 w9 g+ g+ i: X* y$ } /*strcpy(tcb[current].name,'\0');*/. i% u( i, h! z: h tcb[current].state=FINISHED; + `% F* P0 W$ e swtch(); ) Y1 w% X& v$ R. M: m free(tcb.stack);2 O1 ~* s: s+ s7 c: N7 g }; * i$ W" T/ ]3 F% U/ e6 r; {" L/*---------------------------------------------------*/( a- I( M2 W1 @3 T4 j void InitInDos(void), I1 G* W |3 A {/ u9 a8 O! E* D union REGS regs;! U* u \9 Y/ R9 G struct SREGS segregs; 9 l3 n1 c; X$ s1 M /* get the address to INDOS flag*// a' t- G) C, k5 M3 B* P regs.h.ah=GET_INDOS;$ b( d/ K6 p: z, n7 h& a- O8 Y intdosx(®s,®s,&segregs);$ ]$ t2 Y# Z; k1 N+ X5 N# P; Y6 S: V indos_ptr=MK_FP(segregs.es,regs.x.bx); : I3 C6 @* y1 E% V7 C$ m( W /*get the address to CRIT_ERR flag*/ : V# J( p) k6 f- Y$ S/ a if(_osmajor<3)0 D' H: \5 C7 {0 K4 r8 t" } crit_err_ptr=indos_ptr+1; 6 K; l( o+ L% N' ~; ^ else if (_osmajor==3&&_osminor==0)6 {8 W/ ?6 \% v/ o( d# \0 h; |! ] crit_err_ptr=indos_ptr-1;6 Q6 N+ \7 Q3 w0 @5 r else- B ^* k0 [, D9 A {* Y! h0 j u" I1 L* ^0 P, V0 G regs.x.ax=GET_CRIT_ERR; 3 i# q' R8 e2 W9 b! c intdosx(®s,®s,&segregs); 4 u6 [, G/ E! u: y' y' L( S; b$ ? crit_err_ptr=MK_FP(segregs.ds,regs.x.si); ) c1 j; E% z1 \& k } 0 K' Y7 {2 ?9 ^& ]. O% B6 c. C};( B& j0 j1 G0 g7 |* ? Y int DosBusy(void) 7 I, V6 w2 \9 L8 r( G{2 a( g) o- Q' e1 V if(indos_ptr&&crit_err_ptr) - F M: i) x) Z! _, I. o, N return(*indos_ptr&&*crit_err_ptr);5 B+ l- \) \ n: k9 t1 `) V else 6 P: [% y& F. e3 Q2 S return( -1); . K* B( g! M# Q8 J. k- O, N0 M}; ) G- L+ ~2 n$ l1 }void f1(void)( J) J L5 E7 R9 a9 G7 R { 4 }0 p) f4 R% m- D) d int i,j,k; : C' A5 S! W7 f! N for(i=0;i<40;i++) 1 J* u& B% E. Q, ] { ' ^/ |- x2 p4 a# c% {* q: { putchar('a'); [# R5 W+ }' h7 h % {2 r8 b3 b+ y9 n% S7 { for(j=0;j<1000;j++)* O! [$ X0 D. @ for(k=0;k<100;k++) ( K6 ~& r& ?8 i( M ;: S& d1 Y, C6 B0 p+ J" g } : }+ J) V0 h. i' s. v}; 1 Z! d! V7 N* V; O. rvoid f2(void) 4 k- C r1 Y; s- t, l, i{ , M$ V- x! H1 ?2 ~/ `6 d+ P4 i$ { int i,j,k;/ N; p# {$ Y" s# k- a, }2 N0 U for(i=0;i<30;i++) ! r, i% ^7 U- x5 d1 k n9 v { % }1 @" f4 i* \- l putchar('b'); ) j7 I6 S1 G# y; ~' q for(j=0;j<1000;j++)4 u/ A- {) t+ _+ ?0 o for(k=0;k<50;k++)6 V' f* K/ ~% |- d- H! t5 z9 f ;' G" ` l9 y: f- p2 Y }3 E3 @7 W& t- d6 [4 {* v }; 9 {, i0 h9 q0 @* `5 G3 {7 [* S; o* u/*------------------------------------------*/; T% G; F4 g9 L7 t& Q3 G main()- }1 C( x% Z& p" M; ]: w8 r# r { , s. }, |$ |( y9 ~& Z2 { InitInDos();% f* q1 ^. ]' q; E; x5 ?% _8 r' C old_int8=getvect(8);/ I2 }( I5 M* @- {2 x# X* `- W5 Q strcpy(tcb[0].name,"main"); ' a# p* L5 Z/ `8 J: Y tcb[0].state=RUNNING; , ]$ M- V+ u, g( E; [ current=0;: B1 @& J) Z8 i5 g5 ? create("f1",(codeptr) f1,1024); 8 F# B4 `- R$ ^9 K# [% c! c create("f2",(codeptr) f2,1024); 7 h& X& ]6 G. A! R: J tcb_state(); 0 R3 I% B" }* ~; B setvect(8,new_int8);$ h$ x. d3 R2 d swtch();$ K: h4 [ r9 Q. j, S while(!all_finished());' |" ^ f+ @) w: b4 ^8 P strcpy(tcb[0].name,'\0'); 5 q7 f0 s% l L, O tcb[0].state=FINISHED;% o- d$ }, h9 `; @; y0 E setvect(8,old_int8); . N1 x: s# O/ v2 P( F tcb_state();$ M6 M: b/ h" D printf("\n Multi_task system terminanted.\n"); 3 h+ R8 C8 A4 h# w3 p7 _};
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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