下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程4 w0 U$ J; F" S" {
要求:1 用c语言编写6 ^! p3 d+ Y: L7 u/ P
         2 程序+PCB(ID的内外优先权,申请资源)' i1 i+ f/ K, T+ v/ f% i' G+ t, [0 y
只需做进程中”产生“这一步。
6 ^) ]. t7 v: }$ R7 M/ G- S1 K. k以下是做了3分之1的范例:5 t$ c& K+ z6 ]0 Z$ ?$ Z/ n3 M0 A
#include "stdio.h"
; Q$ g  s5 z% S0 N2 d#define running 1 /*用running 表示进程处于运行态*/ & b/ O8 Q7 T9 m& l1 C- K2 ]% N
#define aready 2 /*用aready表示进程处于就绪态*/ 8 H: K8 c" L+ G- |- s& u( Q
#define blocking 3 /*用blocking表示进程处于等待态*/ " ^+ D, X/ d# C/ L" O4 m& w
#define sometime 5 /*用sometime 表示时间片大小*/
7 k0 q$ Z. O% C. f% N#define n 10 /* 假定系统允许进程个数为10 */
. b8 I8 H- e- ~6 D9 q  N0 |; l* F. n  I
struct 3 S+ u: V6 \( w1 |$ c7 M1 |
{
$ ?, k% H, H" [int name; /*进程标识符*/   D% o* Y0 ~7 s2 [2 ~/ g
int status; /*进程状态*/
* N0 L( J) b9 x# V5 @* M3 pint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
5 d# N4 o8 z/ S9 Q8 [8 T0 \int pc; /*进程现场信息,程序计数器内容*/ * ?3 G$ {' i& g5 e; v
int psw; /*进程现场信息,程序状态字寄存器内容*/
9 g8 ]" {$ N$ j$ aint next; /*下一个进程控制块的位置*/ " v1 a4 v9 |  J6 E
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ 6 [2 ?$ G. {9 z. k. m; }5 Y

- M! U! _" X/ @# A: K' [int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ 5 ?! u  s. m: N; g' Q
4 |, o9 \. A& {- q
int run; /*定义指向正在运行进程的进程控制块的指针*/ . e( `: B1 r& l  }& V
struct
" h  b7 z% ^! ~8 F3 Y' |: Q{ ! g6 r# m) _) |( u
int head; : v  k9 P7 p5 e+ [9 O" Q4 U  x$ j
int tail;
9 P, h/ y# M3 U" V$ l}ready; /*定义指向就绪队列的头指针head和尾指针tail*/   v0 M* Z) x4 u8 H/ T3 K
int block; /*定义指向等待队列的指针*/
$ ]0 R2 E" z0 c. U1 |5 r/ s( Hint pfree; /*定义指向空闲进程控制块队列的指针*/
, m" g& Y; d0 M, ?) ?. D3 |$ B
# V1 k# j; k& }" n麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?! V4 x" b# N9 |' a( X
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    0 D6 q8 N; [) |6 q/* the main site file */
    # }4 ]) U9 N% GCreatePro(&ID){7 G/ ~( S; b6 P
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    # [. K( Z& ^8 a, A  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    7 b- y# R8 i$ h7 s& t$ f/*初始化参数*/
    7 L( z/ u. N5 w1 W) @( |+ E   CallName(&ID);   //命名进程的外部名; t, @$ C* r/ C- _1 c
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    : w7 O8 e0 r8 W; N: J  SetFL();  //优先级数、
    ; p" N" K% E8 q! z' k  SetHeap();  //进程起始地址、% `9 O' e( ~  _! q1 _
      _SetSelfStat();  //设置进程的状态为就绪态' |# v- r' O4 x5 \* f4 I
      AddStat_Read(); //将该进程加入到就绪队列中。7 H- d! D# s) k4 K& X& K
    ." g: d: Y6 b/ m* i, t+ p: V0 H1 i3 m
    .
    8 Z4 I' g' ]4 f1 j2 h! L+ [9 B.. I" ^' ^% M8 ~4 \$ G5 p: ]
    .  @+ [7 M+ e# C" y+ u
    }3 s) h1 I. V+ w6 e/ @* ^
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思6 C+ J' l0 u- P3 a' V% {
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!% s/ q' ]7 t5 t
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢5 u9 i7 E( D# b; s4 R4 Y% @; q $ l: ?) R: ?& l' s #include * N* l5 v* L" ]* i1 _#include ! C, t; V0 B& G/ ?- r& V5 f' n#include : R' j- A; w! }; m6 N* O#include8 S/ m5 r1 m, t #define running 1 /*用running 表示进程处于运行态*/8 g4 M B" t y8 K9 z$ t( R #define aready 2 /*用aready表示进程处于就绪态*/; n% l D* m; }0 h. R- L# d" w# I #define blocking 3 /*用blocking表示进程处于等待态*/: X4 G& k& F$ ?& D4 \ #define sometime 5 /*用sometime 表示时间片大小*/. b, K$ e: m9 o- i- Y% C #define n 10 /* 假定系统允许进程个数为10 */ 5 C/ E* ]' i H! Gstruct" {8 V; E7 K. | {7 Y; @# c( n% _* {# R8 p3 j# O1 \ int name; /*进程标识符*/ 9 |$ _! t# h- Qint status; /*进程状态*/ ) ?/ D7 M- {) h5 p) K! Tint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ % j5 y5 `0 F" \# d9 `8 Sint pc; /*进程现场信息,程序计数器内容*/" {4 O! R6 H- l- ?4 ]2 L int psw; /*进程现场信息,程序状态字寄存器内容*/ 9 n. t i7 b1 p0 mint next; /*下一个进程控制块的位置*/ ' y9 V; e1 [- d9 m- [}pcbarea[n]; /*定义模拟进程控制块区域的数组*/) j) w, N0 N s7 c" S, I int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/9 y4 u& q. F/ P1 {0 R& V' q+ i int run; /*定义指向正在运行进程的进程控制块的指针*/; n+ R5 k& S, h struct 7 U. L; C1 y, Z0 F{ / c+ L7 S8 m; N$ y$ \( _4 Yint head; 2 ^4 }. E% L4 J+ F* v( k; dint tail; , K2 h- ~* @ A- A}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 7 l4 p6 |. A5 c. T0 J1 hint block; /*定义指向等待队列的指针*/$ B6 D2 b: I4 v- b: s int pfree; /*定义指向空闲进程控制块队列的指针*/ N% P! R$ ]6 L ]; D2 g9 zmain() ' j9 V: |9 ^) Z/ r! H* W{ int gdriver=DETECT,gmode;$ N; e/ J* }, L$ |! h int i,x,y; / {' \' N3 y3 N9 r# `3 v% ` for(i=1;i<=n;i++)9 B( x$ s1 ?3 L1 k {ready.head=pcbarea.next;} 0 k# J& c2 i+ `8 \ initgraph(&gdriver,&gmode,"");5 h" V. }" d) d `) _( k setcolor(YELLOW); # M: O/ Q1 M; y& O( q+ @ for(i=1;i<=4;i++) 9 J. ~3 n2 c1 A1 ^: f { setfillstyle(8,i);* l! f0 x5 w+ W2 z* ? circle(284+13*i,190,6); ( o1 T5 y1 h3 p floodfill(284+13*i,190,YELLOW); ' t* I A' z2 ^: N/ Z' g }8 D$ Z" O. G: Z8 a' @ setlinestyle(0,0,3); 3 D0 B' l) x& ]. i. N1 J1 r) n circle(316,190,25); / R2 f6 i" C/ i& l setcolor(5);7 o9 q" F7 d8 F settextstyle(3,0,4); / M3 Z2 ]. J5 d& C! t* e% C outtextxy(35,311,"press any key to create objects!"); $ P+ A/ P* P7 n' d, c" w getch(); ; E8 O3 b: p0 f1 k4 ]" m setcolor(YELLOW); 8 w. F* ]9 \! U& Z( K line(300,215,290,235); : A! n; U' h& N' k3 D2 i) B3 ` line(323,215,333,235);- Q7 J- V2 I& [0 e5 A6 L delay(50000);& I# D3 m/ ~* k% L6 m: ^+ ^ setlinestyle(0,0,1);0 c, S" \0 q' O9 {9 ~( e for(x=1;x<=2;x++) 8 A2 n+ O7 U; g6 e {setfillstyle(8,x);$ ?& s6 I$ n; y g; c circle(267+13*x,246,6);3 i8 F) l$ m% c. q$ ]+ Z' d floodfill(267+13*x,246,YELLOW); . J7 J; q/ v$ d, p' W+ d } 1 T. V9 \$ f* `, l' D G0 z for(y=3;y<=4;y++) % v3 }$ R$ q) h( k0 ]& E& _/ T {setfillstyle(8,y);) \6 q+ f. K8 O circle(285+13*y,246,6);8 G! M( h$ w* t4 j2 h4 Z floodfill(285+13*y,246,YELLOW);+ z7 I+ t4 b/ A6 M5 Q } , R X. I1 \- ^ setlinestyle(0,0,3); " r6 C1 }4 I4 F# \7 e circle(287,246,14);5 v% ^9 C- j, P% o3 f x setlinestyle(0,0,3); , b' T& h: U+ h% c; m3 j circle(330,246,14);, B s# |$ c3 W+ B% o& M! c7 _ delay(50000);8 g. z! }" y, D$ h- m line(281,260,281,280); 3 E5 j+ G/ A& v% b2 C line(293,260,293,280);2 \) k2 P% W3 {& B9 H F line(322,260,322,280); ! n4 m8 L$ v/ v8 [+ u9 T% w line(333,260,333,280);* y* z- p+ d7 [; Z6 d- h delay(50000); ) i+ `" H; r/ m# r6 u1 j setlinestyle(0,0,1); . Q: c, F/ o7 }8 f2 \" g4 k setfillstyle(8,1); + h8 m/ I3 H- s# ?% {. K) [4 k; S+ A circle(281,286,6); D% a$ C: Y6 |" Z floodfill(281,286,YELLOW); . f6 J) E* x5 c6 N+ E7 o setfillstyle(8,2);' {8 t4 c" h; T0 h circle(293,286,6);/ M$ F8 W# ]" J) Y- F floodfill(293,286,YELLOW); ' g) P+ ~; F6 ]$ z/ }/ o setfillstyle(8,3);4 y+ T: C4 {. V2 D' P6 f circle(322,286,6); 1 O! {* X$ P# Q floodfill(322,286,YELLOW);6 Q1 g/ b( E% U setfillstyle(8,4); $ \0 M9 z) S7 w+ h* j9 y4 `( s circle(333,286,6);; p4 r4 R0 \- {) a9 P! t+ p floodfill(333,286,YELLOW); / q6 ?; L7 f0 r+ y. D* I2 a5 V( ?: ` getch(); 1 j* p7 T ^$ E- i closegraph();& B7 O( H$ b( N. b } * Z4 T2 }% M) w+ z$ ^& m 5 c( \/ F9 }7 h( l0 n! E) L 9 N( }& v! {! q/ w8 M Z
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    1 C# ]. ]% ~, O  H2 s: Q7 M9 a( E难道不是《操作系统》的‘进程’那一章进程创建??$ x) g8 V& q) t
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!% \8 X, }! {9 L
    不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!! ! w5 B: [+ j% W& ]1 D5 S8 m 6 l0 e: S2 z/ ?( A6 s) ~int timecount=0; : y4 Y! v7 J! i" L nchar far *indos_ptr=0; " F: ?' C8 e. c; L# f, y7 nchar far *crit_err_ptr=0; 4 v# X5 l5 X5 [- Zint num=0,current=0,i;) T7 o' h N+ T6 R) @3 i! H* F void over();1 A/ f0 ]5 Y5 N4 `# B- B$ a typedef int (far*codeptr)(void); G! Y+ t! i4 S" S: N) n* ~int create(char *name ,codeptr code ,int stacklen)( i: S! J, v# L6 ^8 F* d/ N* c { 4 z& _& j2 N$ {- m, _unsigned int * s;' h- O. I2 E6 }8 f7 l num++;. \2 \4 \: Z0 s9 f tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); ]2 g3 q+ c, @( x- ]7 ~ tcb[num].state = READY; ( f' i6 Z, ?! p' G2 q* ? d strcpy( tcb[num].name ,name);2 G( H. K6 x/ `2 F; _- H- ^ tcb[num].ss = FP_SEG(tcb[num].stack); 4 L$ k; W5 j7 U N; w tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);8 P3 a0 \6 Z. B' J1 X5 a *(tcb[num].stack+stacklen-1) = FP_SEG(over); 2 p* g! d% I$ F9 w* C6 p *(tcb[num].stack+stacklen-2) = FP_OFF(over);9 ?- V1 J z5 F" t2 V% Q *(tcb[num].stack+stacklen-3) = 0x200; & r0 ?$ l1 ~- D *(tcb[num].stack+stacklen-4) = FP_SEG(code);/ x) A7 i4 Y4 r' d6 d5 b *(tcb[num].stack+stacklen-5) = FP_OFF(code); 8 x5 G, [7 w3 c9 c2 W *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);( N" M( a+ R% s" p5 n2 J *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);9 V; `3 r* y( R return num;. ?" z( U4 O6 d H } ;! a3 J$ `- y% d8 u+ N void interrupt (* old_int8)(void); # l* b/ ]3 u/ o. |$ g W4 l void interrupt new_int8(void)" e% t8 R" o B# [7 w1 F& k {) [1 }$ ?" y# G: @; c3 F, {/ i+ i (*old_int8)();: u1 U5 z9 j7 W timecount++; ; R; x b# X( E4 n1 `2 Y2 g, K( v if(timecount>=TL); G" T7 c* r' T/ n0 S2 w9 k if(!DosBusy()). o: I9 _# x. w { % s. c# p0 I3 c+ l3 n. o9 N disable(); & M8 x2 a, F! W+ d' M' Z0 I tcb[current].ss=_SS;% U$ \+ z& g2 a8 m, [ tcb[current].sp=_SP; e6 F' `* H3 N5 }5 u if(tcb[current].state==RUNNING)8 P9 l+ w! |3 P% ^% c; k2 l tcb[current].state=READY; ; O+ R* ] I! s" O' r1 } current=3-current;3 g! A. a$ d7 Q3 T. I if(tcb[current].state==READY)2 h- b( V) b# @/ ]" F { _SS=tcb[current].ss; M: d, ^# h- o3 x) {) z _SP=tcb[current].sp; : \- [1 f0 Z6 N& @6 p; a tcb[current].state=RUNNING;) P: A: N6 j! S2 ]( f timecount=0; 1 o. T2 }* Z& G1 \2 C4 ~ enable();9 B0 H, v- u$ {3 } } 8 f% Z+ P! ]- o; _: K& f& r% ]}1 K# r( Q% l2 C& T$ c }; 4 y0 ~) B# f4 u) Q9 X; ovoid tcb_state() / [; R1 ~, A# Q8 j$ Q7 E# ?{6 ?3 s1 |. i3 M& G3 L" W3 C" J int i; ; h0 U% j+ Q/ A8 m+ P% |0 w% M% } for(i=1;i<=num;i++) : R4 r# c# j4 d5 x8 x. y. L3 ` printf("Thread %s is %d ",tcb.name,tcb.state);5 B1 X. \) z- d0 m8 f }; # G5 {. U* Z9 O+ J9 }1 bint all_finished() , S) Y3 X8 X/ [{- e6 [% d( o+ G, N2 W. N int i;7 \' Y, o/ b1 }3 p for(i=1;i<=num;i++) 7 H0 v% L s: W5 H! w' J if (tcb.state!=FINISHED)9 i! {; P1 q2 A return 0;0 g4 B1 G' s0 Y" _8 m& W. o8 A return 1; - I, w! d6 f# @9 X) O+ [* w/ s- D & s6 M3 g' y4 g; T5 W/ s+ B}; 7 S$ c: I# L F9 Q8 t, `* O, Avoid interrupt swtch(void)) f+ i6 n# o u" X2 s3 ` {8 y" s1 ?# U1 ]9 p# ~ int i;2 I3 d% K* I+ G" h8 c( }/ I$ w disable();& B! @9 c2 Q; }' l v9 K/ w tcb[current].ss=_SS;1 r9 B# p6 F( ?5 ]. E9 i8 C tcb[current].sp=_SP; . G$ b4 d" T- }% g! S" Y' X0 m6 [ if(tcb[current].state==RUNNING)) T* w8 X& o; Z U e9 z8 c tcb[current].state=READY; 7 m5 Q$ _# D# W( J for( i= current+1 ; i <= num;i++)8 L2 x, F# R( X. v# ]# G& C { if(tcb.state == READY )5 i. @8 H& s: \6 n. J" [0 s+ [( K& T goto excute;4 S0 W6 \/ q+ H6 } }9 Z" e+ a' J5 x3 ~! v for( i = 1 ; i <= current ; i++)' ~" _$ y; z- l* X& V8 K1 G { if(tcb.state == READY)9 W; X. _: Z- H8 Z; @ goto excute; : }5 f4 M; N1 F6 X* Z } C! ^8 ~8 P' Q% ?* M i = 0 ; & u1 }8 B+ y7 J: b+ O5 m excute: - ?8 K, G3 t; ]6 ~- P) v0 F1 M _SS = tcb.ss;7 }6 a# Y7 U0 A. |' |- x _SP = tcb.sp; . Z! X& m2 W% r3 }2 a W tcb.state = RUNNING; $ Y6 Z* M- ^: q, b H" E current = i; " @/ P7 [2 k) q# ?# X B6 W3 J5 _ enable();9 Q/ J; n k$ } }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?* @# `. V/ r  l5 F. l
    给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    - f5 J7 I6 v, b4 \8 @$ `搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    & o8 h+ k+ _5 N* i( [  g' h别占着茅坑不拉屎!
    : b2 J; i6 V% a3 U4 p) \
  • 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 | 只看该作者
    完成了你们看吧!" d- K9 S" q! g3 }- A3 J' _ \ , ~% m$ d- T& K* x2 |* Q) U6 ]( y#include ! d& b6 L9 W; t( W% J #include 2 e3 |- i( J, z. ]3 q: K; e#include / W/ Y* _) B9 A( E, @" ]# [ #define GET_INDOS 0x34, C" S* m# w! |5 m% n5 w7 F( F0 b #define GET_CRIT_ERR 0x5d064 [# n! h2 _- `3 W3 Z #define FINISHED 0 ! _7 c& `" V2 P#define RUNNING 1 # p8 b$ ]4 r* T: H) W#define READY 2$ e8 A T7 c6 v5 x #define BLOCKED 3; W7 V* ~# ~* e& D5 S M #define Ntcb 8 , g0 E- a7 W, ^$ Y8 O#define TL 1# S) b$ |: q( s+ @6 Q7 g struct tcb{ 0 L6 O, [: g& f; S) p3 B unsigned int * stack;/*堆栈的起始地址*/* f# D* K( z' T9 }. m8 D$ {7 v unsigned ss; /*堆栈段址*/4 b5 @; b, R% r& A6 x2 ?+ F. O unsigned sp; /*堆栈指针址*/) v- h4 ]# |( _6 ^" _; g" } char state; /*进程状态*/: e( _4 Z7 @- m! l( B char name[10];/*线程的外部标识符*/ . W1 v! y6 q# k) T; E1 e }tcb[Ntcb]; /* 系统允许最多的任务数 */7 @1 P- Y% g4 s; ?- W int timecount=0;9 Q" @+ V; a2 m) ^ char far *indos_ptr=0;! E: O* Q" J8 F char far *crit_err_ptr=0; ( Q3 z) t' J, ^3 P v# Jint num=0,current=0,i; 7 P+ y9 Z# C3 g2 J" X8 bvoid over(); " x$ R H" d3 d6 Z* L; l. T* G3 o3 `typedef int (far*codeptr)(void); 0 F, g( k* L( d4 vint create(char *name ,codeptr code ,int stacklen)- Z7 T. ?: Y: d$ m% o& _1 F3 C {+ I& K5 [! L% J5 g( i5 R! } unsigned int * s;& P; l( k3 x0 N num++; 8 F9 D0 b' ~7 ^2 v2 Qtcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));' f; T8 w/ H. b/ [ tcb[num].state = READY;3 [/ E0 k$ M5 |& @6 m8 ~ strcpy( tcb[num].name ,name); ( c7 O8 t# y: \1 J9 C tcb[num].ss = FP_SEG(tcb[num].stack);5 `; ^% l: Y$ X- @7 L tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);! H9 b8 L6 x3 |3 C. Q, z7 q *(tcb[num].stack+stacklen-1) = FP_SEG(over);6 n% I O: T3 K7 u7 p5 ~/ T *(tcb[num].stack+stacklen-2) = FP_OFF(over);5 D; J4 f9 |9 d2 N *(tcb[num].stack+stacklen-3) = 0x200; # S. o5 Y" r# v- h1 Z# m0 ?2 A0 ~( n *(tcb[num].stack+stacklen-4) = FP_SEG(code);" B& R3 ?% A, j *(tcb[num].stack+stacklen-5) = FP_OFF(code); ( H+ _) q3 i1 h( r0 f/ w! ~! t *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);2 |9 X/ @0 N/ X% G1 }2 I9 W *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); : T d) B0 P" I9 A return num;3 _7 V$ x" R/ k! | } ; 2 a4 Z5 _$ `# Z2 z" [8 Kvoid interrupt (* old_int8)(void); 0 Z* @6 f& B" ^5 @. xvoid interrupt new_int8(void)$ [+ @9 X0 `/ V8 u: q" P4 k {4 E8 o: @/ X0 X7 T* M, H! k (*old_int8)(); & r; `# w6 Z- ~) ~" i% h2 w timecount++; ( } i2 n) Z0 H, D if(timecount>=TL); . K3 v: F& D* p, g. a, I8 a if(!DosBusy()) 8 L8 J4 d9 \" _. c, m% A {. ?+ c8 Y: {" W. { disable();4 ~& o+ Y" d' j# n# ~ tcb[current].ss=_SS; O9 ^# U3 [5 U1 e/ ]" Y tcb[current].sp=_SP; ) ~) S e# k. u: `7 X3 E! X. F8 N1 m if(tcb[current].state==RUNNING)' `' u, k& {/ {0 r tcb[current].state=READY; 2 Q x1 b$ n9 H g% g current=3-current; 0 c0 t! n2 E! r: iif(tcb[current].state==READY)( G3 G! W- f+ ]8 G* j9 E0 l4 { { _SS=tcb[current].ss;6 A1 m0 T1 }! N5 ]+ E) l$ J _SP=tcb[current].sp; % O6 j n$ P$ L; y: V9 t/ J# J tcb[current].state=RUNNING; # A* z, b0 b: ]/ [7 ]' v# I H- f timecount=0; & N3 `8 l3 g" N- c' p enable();& h: h3 k% W2 u }! j& l3 K9 z9 t' Z9 B } 2 [7 e# i4 {% M& M0 \4 r8 E};% Z) l$ x6 d# r void tcb_state() 9 a9 Z, H9 r6 f/ I2 }6 D{7 i1 k, m7 ] c2 s4 ^9 N int i;$ o: |( h% j8 B! e/ N2 L for(i=1;i<=num;i++) ( E! d% K. z4 A printf("Thread %s is %d ",tcb.name,tcb.state); 3 d! r; h$ K( U4 _. q7 S& t1 d+ ]}; & m6 b9 _ f5 e7 M# Qint all_finished() # z& w7 Y% }1 S Y( @ K$ s) x{ ' Z( R- n0 p9 X int i;! ^) S8 [. h2 [# a9 q/ i2 m for(i=1;i<=num;i++)3 P" z6 h" r. q' S5 E Z if (tcb.state!=FINISHED) * M3 j" C3 L- B+ a7 U5 x return 0;- _3 f) @4 c; C% ^+ x/ l4 _* Z return 1; : \2 y5 H- i6 t: ~; v! o3 ~6 W ! [5 k) B( u0 q7 D};; K# U5 b3 N; e% y; \% R" v void interrupt swtch(void). W! P+ b' `# H" _3 Z! q7 p { R( G7 x( B# b) v3 Y; p) R8 W, @int i; 4 Y6 g$ s# f! a disable(); # S9 h2 D3 }6 `9 S. o# U# T9 y tcb[current].ss=_SS;0 I2 L8 d; Y8 N7 Y$ x2 r* U tcb[current].sp=_SP; 6 ~4 @! w. a k- C/ W if(tcb[current].state==RUNNING)& v) d( P. y j, c9 _ tcb[current].state=READY; 1 s/ b; a0 a# _" U+ K for( i= current+1 ; i <= num;i++)& x5 z3 V$ W1 d7 x { if(tcb.state == READY ) & D6 J3 Q9 U( l, o/ n9 x! c goto excute; # F3 T& B: I0 X6 }9 [ } : W3 _2 f8 S! q8 z for( i = 1 ; i <= current ; i++) 3 e! R4 o. k- c: ] { if(tcb.state == READY)5 X/ T. E2 ~3 N& j' I& d- ~* E. x goto excute; " M) U v5 ^6 T0 [6 r# h a& I }! C9 [5 [5 U( I0 [& p- l! P1 g i = 0 ;% k, C4 \% r2 y4 J, Y. |8 l excute:6 {7 W* U+ L5 N6 s) u( F2 P+ i _SS = tcb.ss; $ g4 v7 f& l* M1 ^* {3 v6 c* H( i _SP = tcb.sp; ) j: C% r B, ?) I8 T4 r1 K tcb.state = RUNNING;3 b; v- X' s3 ~+ J3 _ current = i; 8 ?7 n! ^# `1 {$ u9 s5 p; m enable();/ M) }- {) _- e) z# l8 h$ N8 F } 4 E0 T4 {- w( u/ j4 q; T/*-------------------------------------------------------------------------*/ ( O/ f, d4 |5 w( i0 ~, f2 Vvoid over() $ M0 u% c! t1 y6 h$ d- L; j1 d{! O1 r9 t8 p9 ? int i=current;- a* ?' I/ C2 B9 E w" G /*strcpy(tcb[current].name,'\0');*/3 b# x! K' e9 B tcb[current].state=FINISHED; 6 {3 A! v u7 Q$ e9 B# J( Z, c swtch(); - C7 A% c5 a Z. r0 _1 r free(tcb.stack);: j% B% |0 u6 X# T D2 k- H4 X4 Y5 b };0 R' a! S# P4 s. ^/ g /*---------------------------------------------------*/1 y# L% ]4 ?6 b: { void InitInDos(void) 4 U) L& @, N1 k% `3 c{ % z3 }. v7 _" H; x4 G! C8 u$ \ union REGS regs; 4 x. U3 V# g( q6 k c% M. ]8 l5 K+ o8 ? struct SREGS segregs;& O% G0 ?2 C6 ~! A/ l O /* get the address to INDOS flag*/# I9 z( ]' v/ A4 ^9 |$ O6 N8 K) R5 b/ q regs.h.ah=GET_INDOS; ( j, p0 L3 Q3 T1 t intdosx(®s,®s,&segregs);# ^- Z( {8 n9 o$ s7 u+ \5 \ indos_ptr=MK_FP(segregs.es,regs.x.bx);$ b( Y2 \) K. n/ w# N O /*get the address to CRIT_ERR flag*/ ' h, _- ^$ C! N; V) [ if(_osmajor<3)$ U& f: n/ e* y crit_err_ptr=indos_ptr+1;# n; R! X; x4 n; f( u, R! h9 ]# C" E else if (_osmajor==3&&_osminor==0) ( ?. o& A- N. R5 D crit_err_ptr=indos_ptr-1; `6 D9 R2 F0 L% i# |. u: c else3 x+ L1 e% t, L) z { # K; l5 d$ t# w" T0 x. R3 D regs.x.ax=GET_CRIT_ERR; 2 l$ ]- }. D. o6 _0 K. t7 z6 c' { intdosx(®s,®s,&segregs); 0 t+ N+ B5 {* h: b crit_err_ptr=MK_FP(segregs.ds,regs.x.si); 3 V" f6 M6 Q1 p& y7 t! M5 y/ R" @ } ) ^4 ` g# q. l: |}; % V( E0 R' F b, @% W# s3 h" D# Tint DosBusy(void)# Z2 Y$ Y( x0 s% |. V. q' L1 i { * K4 F5 Y m; e( ^! Q if(indos_ptr&&crit_err_ptr) ; F! Y/ [5 l2 z- D# q return(*indos_ptr&&*crit_err_ptr);1 c3 I' u1 a. t- N+ [( e C$ |3 e else 5 J4 L1 l3 |7 X: w% b# a: F' ` return( -1); 1 i1 ]8 H5 U5 O: v3 z9 @}; , B7 a" V$ G& Y' a, Dvoid f1(void) ! m' a0 n2 z0 { }: l. q{ , o/ B2 c8 s4 X) T( B t( W, _' S) c int i,j,k; 3 q* k7 c% E0 I2 @# T1 F8 b: L# l* I for(i=0;i<40;i++) 7 w9 o& A/ Q) I4 `/ Y: q5 e2 c { % J) l" f, t O; b8 W putchar('a'); , K! x$ `/ `/ u% H& w4 v( J- q& a R for(j=0;j<1000;j++) & R+ J ]2 A1 t0 G+ d/ J4 X1 C for(k=0;k<100;k++)% S3 i& f2 K! g+ t ?6 w% h ; 0 D: X `' n- u( e } $ L" c2 ?) P& F# c};+ |5 Z# |4 m3 I/ e. y. d/ }- x void f2(void) ; {2 g2 H' H: ^{ 4 i4 `$ [$ q5 \3 |; x8 P# x int i,j,k; Q. q0 L3 Z! b3 Q& t for(i=0;i<30;i++) ( Z0 U6 {+ ^. R3 A {' M" T, G# g( i, W" u5 v putchar('b'); 5 @0 L9 I! Z6 o( m @( s7 V* c for(j=0;j<1000;j++) $ }) f+ J+ _; K2 Z& x+ U for(k=0;k<50;k++)5 }, y% ^1 _1 p8 v$ m ; + j0 N# e, P4 U, W } |4 `& V/ @ F2 S }; + {4 [- B) n+ I! `" @, b/*------------------------------------------*/- `: q# \* j3 v/ K main() , f+ {! S- v3 p. a% r2 p{# ]7 \- A, J/ m$ N' [ InitInDos();( r X8 b2 O: G( m& m* r old_int8=getvect(8); . a5 Z4 J1 T8 ~" N! g strcpy(tcb[0].name,"main"); 0 p @; [/ C3 Q( k1 J9 b tcb[0].state=RUNNING;) {8 X7 q' G4 T" V6 V% A" q current=0;2 _# F* f/ c5 H* P% |. s create("f1",(codeptr) f1,1024); 6 S# f9 L6 X. q+ r# s; F8 o create("f2",(codeptr) f2,1024); p7 [& t( y& p) `: n tcb_state();8 v) s# n5 [/ H P: I6 ?. e8 f+ H; H setvect(8,new_int8);3 ]$ d) N0 {/ i4 b0 n- ?5 \ swtch(); 9 U2 j W% \ f% x" N; n while(!all_finished()); , }" N6 P3 z5 z strcpy(tcb[0].name,'\0'); $ t% B6 S: |5 P2 c0 \9 h7 }: I( Q/ b tcb[0].state=FINISHED;# }9 i/ S5 H4 t: a4 ~! N: | setvect(8,old_int8);4 K9 W& U5 L- S I* ?& z2 t; @ tcb_state(); 7 T, u# i% ?3 ^9 m, N- C$ C C j$ A printf("\n Multi_task system terminanted.\n");/ ^" D2 H* A8 M% ~ };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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