下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程- U% k& T, g. ?4 Y8 i$ ]
要求:1 用c语言编写
- u- e$ c# P' m- f         2 程序+PCB(ID的内外优先权,申请资源)
9 O5 K4 A6 p  s6 D' N只需做进程中”产生“这一步。
; t' O) k' x% p( `以下是做了3分之1的范例:; v- E" x! l% q
#include "stdio.h"
& ~7 z( b' K$ k1 n" ~; W+ J#define running 1 /*用running 表示进程处于运行态*/
$ W+ r$ z+ K: f5 u1 }4 ^3 F& l#define aready 2 /*用aready表示进程处于就绪态*/ ) P+ ?0 s. o7 S. ?( K) w
#define blocking 3 /*用blocking表示进程处于等待态*/ . T6 L' S- }% a: P
#define sometime 5 /*用sometime 表示时间片大小*/ 2 C" u( u% j5 |4 n" _% \: k" S
#define n 10 /* 假定系统允许进程个数为10 */
7 A  f- H0 L2 x8 Q4 k# W4 y. Q
: n7 q: [! e! n/ ], u7 f: Estruct + w; r. W  E+ i% e2 T
{
$ A2 Z+ d+ Q0 o3 I/ v: rint name; /*进程标识符*/
! L! T# ?: m$ D2 Aint status; /*进程状态*/
% L( h! L: S3 J0 kint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
  n4 U! x0 ^  h3 T# b' U- [# Oint pc; /*进程现场信息,程序计数器内容*/ & j/ [- B7 ~- y9 F
int psw; /*进程现场信息,程序状态字寄存器内容*/ : O1 f- ^5 _9 ^1 @) D
int next; /*下一个进程控制块的位置*/ - {. |& A& C$ {9 r& ?" _4 T
}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
" u6 g- Q2 P- _! w3 N- b5 h4 [
8 [! R4 t) w1 X! [8 H# bint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
! e* w% j6 F/ K
! t( ^5 b* W- C, X# U& tint run; /*定义指向正在运行进程的进程控制块的指针*/
3 q5 i( t2 r/ R7 hstruct
& g. Z3 J+ P6 F* @1 F0 F" R# ^5 L{
7 U; ^6 k2 K# \% @int head; : ]3 n1 D: o3 Z0 D
int tail; 5 O3 G4 N# ], e4 ]' Y
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
1 S4 L0 g8 \+ j4 g: h, L/ Sint block; /*定义指向等待队列的指针*/
% M% E( J4 I0 T5 m0 Qint pfree; /*定义指向空闲进程控制块队列的指针*/) Y0 K6 p$ N) B
: V4 v+ x4 {2 Y+ X6 O! [
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    / ]2 O7 c* s: {/ v8 U4 N, @% A麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    + Y3 |- F8 M6 o, K  {/* the main site file */
    * h3 q4 M2 |  t+ j' [) ACreatePro(&ID){
    4 K  U9 _  ?2 s# s8 V& W  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    / L/ r1 T( a; u0 j% z3 t3 }; W  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);6 a" K3 e# o# P! u, M- z
    /*初始化参数*/
    ; R; F- @) j" O8 w* Q  m   CallName(&ID);   //命名进程的外部名7 g7 S/ Z7 q) V4 y5 F; V
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    , q0 W8 p8 I4 M  SetFL();  //优先级数、
    : y6 M( T) u& y( U( v- I  SetHeap();  //进程起始地址、' y4 }" C8 z" f, {
      _SetSelfStat();  //设置进程的状态为就绪态' a( Q" H  h) R4 f- b1 a& {9 `
      AddStat_Read(); //将该进程加入到就绪队列中。
    # k' V7 D( h4 n4 A- y.
    9 C) Y9 N; {& z9 O5 ?.' T2 M- @" U! A  a
    .! l6 F2 S4 @4 l8 T$ R4 P
    .
    8 G2 w9 Y+ P( j$ S9 h! a}, s+ v3 G- o7 [) F
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    2 L& I8 d/ E6 L9 T4 |
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!: s  P, \. Q) \! _( O. C: x
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢* s' S/ F, |5 T* p6 s 8 k7 l, f W5 L$ J8 v4 O3 h0 g #include: ?# `+ Z# U5 e, Y$ N4 e #include * a7 j H3 C5 b' w+ f#include& y/ C/ _; I. ?" E' l* e #include * J% y* [2 l5 M. A* b/ i' Z) P#define running 1 /*用running 表示进程处于运行态*/* K7 G! a3 M+ t #define aready 2 /*用aready表示进程处于就绪态*/ ) q. |/ d- _2 P1 V" O8 x, o#define blocking 3 /*用blocking表示进程处于等待态*/ J4 M2 |2 {4 m: X- a' _#define sometime 5 /*用sometime 表示时间片大小*/ # H( z0 |% D7 R5 b. @#define n 10 /* 假定系统允许进程个数为10 */3 I9 \2 \9 `+ ^- X# y8 a struct $ Q( M7 L; U3 i, \7 y( Q: [{ 0 [7 p& V1 C5 oint name; /*进程标识符*/3 D/ H2 x# u5 L5 L) O8 e5 c int status; /*进程状态*/$ |0 F( x7 o1 g# e int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/+ J6 Z" X8 S% M* h# o4 z( a+ L! D int pc; /*进程现场信息,程序计数器内容*/ / h3 @$ |7 g2 g! Y0 tint psw; /*进程现场信息,程序状态字寄存器内容*/- J7 b4 x" P5 E. @! L- H int next; /*下一个进程控制块的位置*/5 t& p; v& |% V) l! _: { }pcbarea[n]; /*定义模拟进程控制块区域的数组*/7 h$ g( c# U' C4 N, w1 C! d int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ ) U& X3 l( l) t+ ?" ]int run; /*定义指向正在运行进程的进程控制块的指针*/% `" u9 L9 y* {( g `) N5 f struct % B: L) \ l: C- g* q1 P{ 7 J& Z+ V. _7 D R$ d' ?int head;3 P# n( F7 L3 }' @ int tail; 9 ^( _% J0 h% T% i. [* R}ready; /*定义指向就绪队列的头指针head和尾指针tail*/; m) C9 H+ i: ^5 d' t' K int block; /*定义指向等待队列的指针*/! F$ U, J# c W* N# ^* a int pfree; /*定义指向空闲进程控制块队列的指针*/ / v5 ?% m, k% @; K1 pmain() 0 F# H9 H; S9 ~# N; X{ int gdriver=DETECT,gmode;4 Y6 A, p; ]) i int i,x,y; " Z! g, b/ F4 i' l for(i=1;i<=n;i++)) O; J! y7 s- w" g' K {ready.head=pcbarea.next;}5 j& @ d: I4 ]" }$ e1 E initgraph(&gdriver,&gmode,"");* x( C9 l1 J8 Q: M) ]6 x setcolor(YELLOW); # U3 L$ P+ l0 `: ?; C: L for(i=1;i<=4;i++) - W9 ?0 j) j5 k: F, u' I9 H { setfillstyle(8,i); ( N; q ^1 |6 ]8 e9 y1 T( [ circle(284+13*i,190,6); % T H: N1 k. O; A- x& Z floodfill(284+13*i,190,YELLOW); 5 l* R/ R# a& k( x- ~ }( Y; g% f9 T" v0 @8 W5 g setlinestyle(0,0,3); & X7 m5 _- s L2 S' u$ a circle(316,190,25); , g: s$ G6 p) p1 l$ x setcolor(5); 2 H5 h5 @' q1 M6 R1 Q9 M settextstyle(3,0,4);2 D f! I r. K$ d, \$ T% x; e outtextxy(35,311,"press any key to create objects!"); + N" G4 J4 {% U/ F% a' b) w getch(); 8 j" i0 ?* Z9 Z4 h( e2 g2 s setcolor(YELLOW); & H4 _! U& C' S9 `3 u% g% C2 [" M line(300,215,290,235); " {. ~! }' }" \. e$ z line(323,215,333,235); # t: X2 g9 B5 a7 W, W delay(50000);# t' K! s& S/ R. Z% v$ ~1 N setlinestyle(0,0,1); * R7 Q2 o L4 @# _$ T9 q- r for(x=1;x<=2;x++)4 x3 L4 p2 m1 z0 B {setfillstyle(8,x); + x% i. N1 k( Z. c% n8 F. z circle(267+13*x,246,6);/ b, x8 S6 ]; w/ T floodfill(267+13*x,246,YELLOW); 5 \/ @. \9 {# t" \% W4 m- o }* {2 M% x! s3 @ for(y=3;y<=4;y++) 9 ?) Q6 K, Q: U( N; Y. X* J$ `7 R {setfillstyle(8,y);6 X, F5 {4 d) ~ circle(285+13*y,246,6);( B4 u% ?' V5 X8 w: w" R5 o, H0 y floodfill(285+13*y,246,YELLOW);0 G. o0 b' _( [- h8 `0 t& H& } } . G: J9 J0 m' E( N setlinestyle(0,0,3);# _, `) e2 X2 P8 j) g! r9 c' O! C circle(287,246,14);& B. @: ]3 i( k1 [: @ setlinestyle(0,0,3); / `+ \ ^ q5 u" Y1 B circle(330,246,14); # ]5 e1 l1 ~& Q delay(50000);7 t9 H1 X* e! n8 E2 L- b" O line(281,260,281,280);6 X. ?" i* I7 o line(293,260,293,280); ; h7 A/ | x2 r) @% ]) r line(322,260,322,280);1 {0 {8 U4 s( r line(333,260,333,280);$ X7 k# k# z0 E3 {0 t% h7 h delay(50000); . v& m( Z3 X$ U setlinestyle(0,0,1);! l1 o& c/ J3 B setfillstyle(8,1); . L8 Q- D! Y; O6 O# w5 z circle(281,286,6); F% n. K1 |/ L' ^1 y floodfill(281,286,YELLOW);/ ]4 z1 j. L6 R* _ setfillstyle(8,2); & L7 K) O8 W5 J3 e2 D! r circle(293,286,6); , h$ a8 Z& G( x& { floodfill(293,286,YELLOW);7 a" Q- P( }9 ? setfillstyle(8,3);* ^( \* L5 I* c) L6 \ circle(322,286,6);/ `8 S, H% T& S9 {3 T* m floodfill(322,286,YELLOW);2 p p A2 P* V' P! `- |1 F setfillstyle(8,4); * s4 Q8 v: T1 S; _ {& d( } circle(333,286,6);7 a5 `- a. n8 a* G floodfill(333,286,YELLOW); : x' z' Q+ b' e getch(); 3 K' P% F2 X- g2 K. C7 t/ x closegraph(); ) ~" `3 r% I) Y} 5 G( ?3 a. A- P) B8 q2 r + ^9 F$ i6 h( Q# ~ c9 h$ e1 T# W! ?! ` 
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    5 h8 V" D5 }& x* w' Y7 o难道不是《操作系统》的‘进程’那一章进程创建??
    : k  _' q0 b" r. v1 i8 z到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    : r7 \2 Z' v$ V$ s; C: f# \5 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 | 只看该作者
    做了一半的半成品望斑竹指点!! I0 j. H: A0 L3 z! e : l1 a5 p; f+ d' Tint timecount=0;5 m0 r% K: |. L9 @ char far *indos_ptr=0; & B0 o' {% I% z& o0 G: Uchar far *crit_err_ptr=0; ; V8 N6 y% s' }( iint num=0,current=0,i;& b4 M) c! b3 J$ i1 ^ void over(); " T- ~* m! }5 ^1 i' Stypedef int (far*codeptr)(void);# Z4 P$ h/ H0 i0 _: p5 q int create(char *name ,codeptr code ,int stacklen) 1 W' A$ ^; ]. k. w5 p{ q9 c& r) Q9 ?. q5 I; n unsigned int * s;7 W2 y1 }" a& j" y num++;6 w: a% U6 s* ` tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));2 ?4 F" p$ G% s" ^5 m5 d& q tcb[num].state = READY;9 K( w7 | L) ^ strcpy( tcb[num].name ,name);8 S* \+ c9 r' _ tcb[num].ss = FP_SEG(tcb[num].stack);6 e* J* L2 r" \ k1 J$ P4 L5 O tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); $ s( X$ y" w+ l6 ~! [; o1 O *(tcb[num].stack+stacklen-1) = FP_SEG(over); 3 V9 C/ H6 I6 n *(tcb[num].stack+stacklen-2) = FP_OFF(over);; S& W' A, s7 ]. k- d+ [7 X *(tcb[num].stack+stacklen-3) = 0x200; # l2 e( d3 u: {/ {- _* p3 W *(tcb[num].stack+stacklen-4) = FP_SEG(code);. D7 O* b& {$ g+ n, e1 e9 ]' v* s! J *(tcb[num].stack+stacklen-5) = FP_OFF(code); ' g, B- t4 I4 K *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 4 A" ?% H7 Z7 n/ k. `$ I *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); o& P$ d- }+ k+ x8 [& X4 O1 R return num; $ y* S/ f2 i1 K# O+ _} ; * Q. w4 @2 p0 ]! G4 x$ Fvoid interrupt (* old_int8)(void); 2 c. g- d0 I5 Uvoid interrupt new_int8(void) 8 x' W; w( ^, }) k, Y9 N{$ I3 j3 e& P$ j0 Z6 o0 t K (*old_int8)(); / l( n. z3 U/ B0 E+ C timecount++; 2 U' y3 V% P: L0 I- K) k if(timecount>=TL);6 o7 p& P8 |6 i" s" H if(!DosBusy()) H6 x8 N% k: n1 `/ C& U7 g {8 q+ M% f. x, W( y# L& Z8 e* F$ p. O disable();+ g/ }, a# A6 A/ ? tcb[current].ss=_SS; 9 m V( {9 A, s* v# x tcb[current].sp=_SP;( z" z4 V, o+ r3 j1 B if(tcb[current].state==RUNNING)* h3 e& w9 B& X# E: t tcb[current].state=READY; 6 Q# K7 V1 L7 z current=3-current; y* U/ D; O( \& z1 p3 `if(tcb[current].state==READY)( N) o, Y+ G; q# G { _SS=tcb[current].ss;# I5 D+ V6 E1 e- ? _SP=tcb[current].sp; 4 Q" _. n# x' u tcb[current].state=RUNNING; / |' I" ]1 }0 A% f timecount=0;( M3 l6 o+ c* _" i+ c( l enable(); 2 K" q0 |% M8 s3 Y5 A# Y2 I1 @} * t6 o( z W+ \) h1 ~2 g% N, e* h}) D t5 V& j( l o( G4 ] }; $ @4 X6 i6 m, Q- S: ^5 }void tcb_state()$ `) t' {# P$ q& B {) O9 f+ s8 I: _, J8 F% [! ^' V int i;, u. m# @7 Q6 ]- f for(i=1;i<=num;i++)4 v+ Q3 K" ?& H% Q7 o6 e. j. _& G printf("Thread %s is %d ",tcb.name,tcb.state);; m' k3 S0 w/ `( r: S9 O) g% V }; k* o$ T. n5 _6 w! e. Y; ^ int all_finished() $ C; N, `! Z8 a, L: {{ 6 `0 g9 a h/ f* K int i; & J3 z' @) |/ \& i$ l for(i=1;i<=num;i++)( s0 t) X" i# I* G2 x if (tcb.state!=FINISHED) 8 [3 q2 |# v: a' w) c return 0; ) I E4 N. s" V0 N' g, t0 { return 1;( T# X+ @; i9 `( A$ U 9 m2 j5 g& k! A};/ |2 {: u( N8 t8 L void interrupt swtch(void) 5 T, B8 R. u) B{ 3 D m3 x; W7 D( g/ {6 m+ Nint i; 7 h; U1 C9 z; |; v, N' h8 z disable();7 f; w- J# O7 V! W8 r" }0 T1 N tcb[current].ss=_SS;8 A5 N1 S2 c+ h$ `' }- T) } tcb[current].sp=_SP; : d6 _: n9 H0 ~! Z5 C2 T9 {& n j if(tcb[current].state==RUNNING)+ |& U! `( t% X) I5 [ tcb[current].state=READY;: i$ S% E6 |/ C! F! H u for( i= current+1 ; i <= num;i++) - u! z* ?* ^+ m6 ]# Y { if(tcb.state == READY ) : |. R4 r( R; H4 W! k) t) f goto excute;) f8 I, M }7 w* G5 P- o }8 E7 f* _7 `- U9 Q* Y2 L; {3 b& p for( i = 1 ; i <= current ; i++)4 h+ j5 S8 |9 ~6 w { if(tcb.state == READY) : _6 T" z4 o# ], ? goto excute; 1 q( x9 T8 U/ b9 V' ~ }' s, d- \) W" B9 Z% Z* e' W5 v i = 0 ;9 Y. N/ x( M2 |4 t excute:3 u& k x) V" v, g$ W0 h. H$ G _SS = tcb.ss;1 K" u% L/ b0 R7 @; }' ` _SP = tcb.sp;+ U8 U$ h1 ]4 s' ^, _( Q j. i tcb.state = RUNNING;5 G @! G4 J. {: n# T2 S/ }6 ?$ j current = i;" D( V; {; Y0 Z8 X% {' k2 S enable(); / G; |+ `/ _+ ]. o; z h}
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    3 o0 [2 t: F4 l; \$ P+ t给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!# `9 H8 o7 i5 y1 g) [5 Z
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!
    & S6 I' A. U0 ^" N9 b' E) m别占着茅坑不拉屎!5 i- ]7 g5 K4 g& f9 J! E* ^
  • 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 | 只看该作者
    完成了你们看吧!9 L7 o$ G) F. H" a+ w7 n, O e0 g . k5 v4 X0 U" b9 f; Q#include * X( o8 U; }0 N3 ^& r #include 9 [, P @* Q" p% J+ z9 h#include ; D3 H8 l6 [. u, `2 R4 Q- _ #define GET_INDOS 0x34 y" I8 {& |/ t, q6 G#define GET_CRIT_ERR 0x5d066 w1 E& [7 Z. w+ e9 R# [ #define FINISHED 0 S0 |' `3 a0 M5 E #define RUNNING 1. T7 P5 `' `" @ #define READY 2 - i8 _* U3 w7 p. l#define BLOCKED 3 - Q% u3 W9 m# w2 F4 p#define Ntcb 8 / Z$ ?! v& Y: e, |: K0 p1 G#define TL 1- B8 a; a- s- F struct tcb{1 c% ` o& ]* K+ h% j( R unsigned int * stack;/*堆栈的起始地址*/9 f% s9 C. `( y7 }% T. D; t unsigned ss; /*堆栈段址*/ C1 k) E* m. X unsigned sp; /*堆栈指针址*/# O0 Z* [8 k0 [9 y7 a; B! |4 @9 t I char state; /*进程状态*/* c1 w& u! d4 r+ u, ~/ T char name[10];/*线程的外部标识符*/: `+ I% K, m; i) G1 y }tcb[Ntcb]; /* 系统允许最多的任务数 */ 0 |$ m7 r; T% Eint timecount=0;' ^6 F& T- x2 `0 q char far *indos_ptr=0; ! {/ e+ t' k% q, j- W; A! i/ M) ], W0 Qchar far *crit_err_ptr=0; 8 x/ ~0 m! L- H+ [% Mint num=0,current=0,i; 0 y X L' q) }7 r0 [5 c# }0 jvoid over(); 7 P! D% @3 }; Gtypedef int (far*codeptr)(void);( q4 I/ h$ j5 R. R int create(char *name ,codeptr code ,int stacklen) 8 B7 a8 t `" [7 i6 G$ ?1 k{: P. k- ~! O& P5 I. j unsigned int * s; : C, N0 \% A/ M, enum++;" k, U D2 S# }4 _6 O S tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); % J) K6 C3 G5 Z tcb[num].state = READY; % s. L/ ^9 K4 [9 I$ o! f strcpy( tcb[num].name ,name);: y }% \' f0 V5 D6 A* g tcb[num].ss = FP_SEG(tcb[num].stack);1 a3 N! L3 n ? tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);( C) U, m5 `$ f *(tcb[num].stack+stacklen-1) = FP_SEG(over); " Q- m$ G+ [6 V$ ? *(tcb[num].stack+stacklen-2) = FP_OFF(over); $ Y! i2 j; b- c+ k1 W) T *(tcb[num].stack+stacklen-3) = 0x200;4 q: o& c/ n- ^& H *(tcb[num].stack+stacklen-4) = FP_SEG(code);# W0 O+ q: S! `- Y1 z# [ *(tcb[num].stack+stacklen-5) = FP_OFF(code);5 P: M7 C7 H5 F. o5 M8 k! v *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);0 K; X% h; I! m) ^; n7 N# r1 r0 Z *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);$ b* y9 | x+ h5 K return num;: b$ \+ u" A# W8 c P3 n } ; 2 G0 G/ X1 e# y. Yvoid interrupt (* old_int8)(void); 7 }' _( }& W/ l. d; k! ? void interrupt new_int8(void), x3 @/ P$ _# d { % R/ l4 P/ X4 t1 q, z (*old_int8)();) }4 S. Z) [" I. Z; a0 l timecount++;7 G5 ]* @# \. l: H( ` if(timecount>=TL);1 K3 r. S. w6 q2 ]1 {. \ if(!DosBusy()) , {, P9 p3 x. Y m( {) S. x { ) O9 w3 Z+ P7 F8 {. | disable(); P% Y0 z' i, A8 i tcb[current].ss=_SS; $ Z( r: L3 b6 c9 ]9 U. ^" O1 k$ @ tcb[current].sp=_SP; - i; } m* K' @9 X6 {, ? if(tcb[current].state==RUNNING) ) I- t. L# H) K8 z$ v tcb[current].state=READY; : x4 q- o) ]- g* O5 t0 E) \- B: [ current=3-current;" Q t/ E* f9 r- u$ K if(tcb[current].state==READY)' \% _8 E) h/ b" R, F! n* T$ ]. t# W { _SS=tcb[current].ss;5 p3 k& J k7 |+ }: Q4 B _SP=tcb[current].sp;& O* l4 s1 E& U tcb[current].state=RUNNING; ! E% k, H: d( T8 C' k timecount=0; ( Q7 g, \2 w* V1 V; m enable();; G1 D) b1 o% j) v2 N0 D ^ E }' i1 a6 @9 S' Z7 D& k7 L" o8 g& D6 G } 6 r3 O- ~4 H( ?- K* f2 e7 {/ N}; Q9 i0 j% e/ L0 X* U& v' i void tcb_state(); O' P. E2 {2 O) Q9 P/ V% a {6 q6 E4 R( Z6 ?0 O: k: d int i;! x E: J0 k8 c) T3 {: { for(i=1;i<=num;i++)/ L `7 k9 x; h2 s( Z! Q( v1 [ printf("Thread %s is %d ",tcb.name,tcb.state);6 V7 \$ `7 K0 h1 H8 f& w };& u% I& l: {$ m2 s$ `# ]$ [ int all_finished()$ K- x' ?6 t& @# ]8 x9 V" h% Z; ~ {( y# E# {6 L* r int i;) \$ ?; M1 ^8 [3 P for(i=1;i<=num;i++) 2 R( u1 I3 a: [' R5 X# J& A S if (tcb.state!=FINISHED) % ? `/ l$ o) p1 C" i return 0;) O P4 B( q7 C0 ?& x9 D* p% Y* P return 1; % ?) N1 ]* H, [! G2 K, B3 K 5 h% o; u4 S* m( V}; - F- V- m" s4 O) j4 _void interrupt swtch(void) 9 f' F/ \5 k# ~ X; C{* t- v) s! L2 F5 j2 ^ int i; , k6 T" ~7 ], E. v6 d3 p disable(); 4 s* B2 V; [9 W# C# L tcb[current].ss=_SS;8 D+ j2 S6 E1 N2 G. w. z" }; h tcb[current].sp=_SP; 8 a' e, N4 x- Q: |' ?+ ] if(tcb[current].state==RUNNING)* _7 @ g7 a4 y5 T& c$ ] tcb[current].state=READY;5 Y7 ~% v; n# b9 e for( i= current+1 ; i <= num;i++) ( j, G4 [9 F9 [" f* s$ L3 B8 w9 ` { if(tcb.state == READY )5 f0 _6 y# ]) x4 L goto excute; % f j% c: \! [) | } ! d' u( V8 b* h' x1 X4 \/ H for( i = 1 ; i <= current ; i++) , g) @9 J# I: ]0 `+ g8 O5 Z, ~ { if(tcb.state == READY)* {( d6 z4 Y1 S1 J goto excute; 8 X1 G7 Y6 v# s% n1 U } . f& D8 ]; k% ~ i = 0 ;! C" D1 Q# [" N$ G3 p excute: % E; a* R( n- d1 L _SS = tcb.ss; , c d& L4 l4 a2 V( ` _SP = tcb.sp;4 R$ h7 C) I3 U; } tcb.state = RUNNING; / W0 T2 B' l. A5 [' W! {$ A. ] current = i;! J" @" t' `0 a9 e4 n6 a7 v enable();3 P) ?; G* F! _3 a; D6 m x: k/ A }! A/ @4 X2 i5 r* O6 ~0 A /*-------------------------------------------------------------------------*/5 f1 l& s [( Y1 H8 \0 V( j) _ void over()* U j- ]( J7 P { ( g, Z/ B# W! J# k# J3 W2 z int i=current;9 B4 E8 p% k- O /*strcpy(tcb[current].name,'\0');*/ * p+ Z7 u2 D5 U" l: W1 F tcb[current].state=FINISHED; a% D2 H/ H6 @: N swtch(); 5 M- G0 {9 q8 m2 v# G% ? free(tcb.stack);% s# P* @4 W$ J7 j# v }; % g/ }% U4 e) J$ `8 q/*---------------------------------------------------*/9 k- i7 x- P# X. O6 K void InitInDos(void)+ N3 V/ T b8 E& `$ V* b {1 Z/ C" o& n5 X5 J+ ]5 R union REGS regs; 3 m T9 u% ^& } struct SREGS segregs; 5 Y4 Z& Q" z" a) h8 o. x /* get the address to INDOS flag*/ & _& N$ H5 |; }2 Z# r regs.h.ah=GET_INDOS; ! X- _& [+ [) o b intdosx(®s,®s,&segregs);6 A9 X) X+ ~* f5 C# f indos_ptr=MK_FP(segregs.es,regs.x.bx); 6 k; b5 S1 Z$ v/ G+ }* X; @ /*get the address to CRIT_ERR flag*/. S/ `% f5 _: ^- j9 b! e if(_osmajor<3)5 z( G: U V0 c! a crit_err_ptr=indos_ptr+1;) _0 c/ k X w8 x( P3 ]0 y+ N: X else if (_osmajor==3&&_osminor==0) 6 X2 e$ |$ G: w; z+ d2 Z3 a3 n crit_err_ptr=indos_ptr-1; $ I, A% \# C! F+ Q# G3 L else 1 X, m% ^- U7 O0 k0 K. R3 q { 0 J$ G5 e) I5 k& D3 d1 D regs.x.ax=GET_CRIT_ERR;- C* i0 ~1 u2 r intdosx(®s,®s,&segregs);# p, C7 X: P3 {8 A- b8 z crit_err_ptr=MK_FP(segregs.ds,regs.x.si);# I4 M0 P( R, X6 q5 L3 c$ T }$ U: h' J: P. A4 Z }; 0 M/ l- I9 e9 N1 J- J( |int DosBusy(void) r: w- [+ c6 X, o: \ { % j8 S/ O% q8 Y: c7 i2 i if(indos_ptr&&crit_err_ptr) ) v! |* B; h6 T return(*indos_ptr&&*crit_err_ptr);, y# ?4 D% I6 U( N else 5 {( c/ @$ N% R return( -1);' p* j. ]' P! j$ J6 E( Q) Z };& j v+ p# o7 s: z+ n* \ void f1(void)" e4 k. k8 o2 d7 J {4 V0 t* [/ V: a; {6 q$ H) S+ C int i,j,k; 5 o& `' B) l' G$ L, L5 o' u8 s d/ p0 ? for(i=0;i<40;i++) 8 @# ]7 J7 q; j: q4 K { * @9 U3 @6 [: s6 C; f5 @$ N putchar('a'); ) e+ y2 v% I/ L/ ^* G Q' T C4 K3 Y" }5 R9 V6 I: y for(j=0;j<1000;j++) ( y% O; z% [- X* ~1 \' W for(k=0;k<100;k++)# r7 f K+ L5 u9 G! T1 q$ s$ s ; ( \* R+ ?4 b4 n } + W' A4 ~, S/ d% N0 g: |( N}; : @ [% W9 c2 p: A% Dvoid f2(void); c9 G' Z- j2 K5 Y3 w4 n: k { . p( e8 \6 H6 d# M$ D' M2 X8 O1 K int i,j,k; " J1 ]$ j- o+ @$ x, ?4 Z# }( s8 y for(i=0;i<30;i++) 3 r/ X: o7 C* { {2 D2 H3 I* k" Z z9 I3 q putchar('b'); @! y" S; @3 A5 ?& i. C for(j=0;j<1000;j++) 2 b+ b2 D0 E. |# e2 `3 P for(k=0;k<50;k++)! H. y2 G, E# V+ v ^ ; ) \4 y% h' _3 F9 U }; E' k+ B/ D4 H) X) F };; i' f1 t. ^- K$ N /*------------------------------------------*/ % O8 E! P9 u, C; y. O8 Q6 Qmain() 6 r) L; m3 {. N- M{ ( S6 ?4 g$ G h% ]/ o InitInDos(); 8 Y y6 n+ G9 D0 H8 F# _) ~: X; g: p old_int8=getvect(8);* D9 V. T- @+ W# X3 l6 ^ strcpy(tcb[0].name,"main");9 f9 {2 X3 d2 L0 S tcb[0].state=RUNNING; 9 m/ A- t4 y* J4 K: U1 S3 @6 R current=0; % t3 @5 I! Y5 s1 o create("f1",(codeptr) f1,1024);; i$ x" b. v- |/ _6 L create("f2",(codeptr) f2,1024); U4 f: e' v) H0 \8 H8 q- \ tcb_state();7 M$ e6 X9 H: N setvect(8,new_int8);- V5 p9 F- \, y ^/ i' z. k$ g swtch(); ; e; R! b' s7 h( k3 Y while(!all_finished()); 9 C2 N/ X9 ~' R# A3 N) ~$ M# @ strcpy(tcb[0].name,'\0');! @# G+ i. w* c9 |: F' H tcb[0].state=FINISHED; ) y9 ?5 D) N* d7 |5 l( y setvect(8,old_int8);$ Q8 ~( n6 D; O$ E/ q tcb_state();' u. v! u8 ~$ e printf("\n Multi_task system terminanted.\n");" G1 M. ]# F* W };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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