下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
- X: [; t2 `- \2 l要求:1 用c语言编写' B, X) x0 a# [& |" P; a9 w
         2 程序+PCB(ID的内外优先权,申请资源)
: ?4 A4 U6 _+ N8 k只需做进程中”产生“这一步。
4 K$ w0 _* D* T* i以下是做了3分之1的范例:
" q, @8 c! P, \* M7 _0 [6 d# A& E#include "stdio.h" & O4 o; g; p- i* A6 @4 c& a+ W) J7 ]* T
#define running 1 /*用running 表示进程处于运行态*/ % ?  T4 R% r4 Y0 K2 M
#define aready 2 /*用aready表示进程处于就绪态*/ 8 Q3 u+ }2 y) P/ ^3 L5 m% ~5 {( u
#define blocking 3 /*用blocking表示进程处于等待态*/ ! V) O* O  R. J0 ?7 w0 @
#define sometime 5 /*用sometime 表示时间片大小*/ 3 n( ?# J( K, j. W/ y
#define n 10 /* 假定系统允许进程个数为10 */
- S. U- |0 S. q* D4 k. }. N
& h) R1 d% F) ?struct 5 a- [. e2 G/ k* ~! ~) z1 h- Y' k
{ ( @- L5 T/ X% ]+ u( X
int name; /*进程标识符*/ " a/ t5 e; ^' u3 `" n2 {5 G: w; c
int status; /*进程状态*/
& u& {' y1 @* \1 D) G+ Vint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
. c6 i( I& o* `. {% h' Qint pc; /*进程现场信息,程序计数器内容*/
. z2 b( [/ }5 F& b, Rint psw; /*进程现场信息,程序状态字寄存器内容*/ 5 o  ~2 u  ]3 `+ p7 o8 B
int next; /*下一个进程控制块的位置*/
. j/ a; D, {* ~3 m+ R}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ . b4 E* m$ B9 J) Z' B4 {
- k; v; d5 b$ R2 S! R% I( f/ r
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
! w% {$ v  k3 V' y( m* ?* T1 _) q* U. I6 f
int run; /*定义指向正在运行进程的进程控制块的指针*/ ' v9 p% p3 N* p/ {
struct - ]: j3 i  o4 Q! [1 `
{ * Z6 ?/ C* {  s3 L
int head; 9 B- t1 J9 m1 y4 s1 I: Z+ v$ `7 [
int tail;
- V, }4 e+ u! s' ?8 K}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ : I# u$ }4 w; |& w) n4 U( T
int block; /*定义指向等待队列的指针*/ " m  Y. ^1 W- ]* a
int pfree; /*定义指向空闲进程控制块队列的指针*/
# _" f3 }- D+ K2 K2 @$ X% O% j
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?1 E0 g% ^5 O; u6 a
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。( h1 `2 p. q; b# Y/ k: w3 B4 {
    /* the main site file */
    5 f7 k' y1 M  UCreatePro(&ID){
    1 M, F: c( E8 ?5 u  GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    ! H9 m/ B, E8 R' e, D# t: n# n( [  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    * I0 X. L: _$ }% q- U4 P/*初始化参数*/1 X6 c' Y: h& I- G
       CallName(&ID);   //命名进程的外部名1 U5 U: V" p  t( a1 l) o- `0 e
      SetParProStat(&ID);  //记录父进程的ID和CPU的状态、! ?+ W+ P" y! \& ~' \% ?
      SetFL();  //优先级数、* ^+ |+ q' P$ j* j2 k- E. H
      SetHeap();  //进程起始地址、! k9 [, e6 v9 E6 i: o8 p
      _SetSelfStat();  //设置进程的状态为就绪态
    2 I( l5 `' ^7 ]3 J4 Y  AddStat_Read(); //将该进程加入到就绪队列中。" w2 k6 o% q: T& g/ k
    .
    4 |: u+ Z% _5 B# h.
    4 h- ]9 ]2 o. ?# n: y" u! I$ j* X5 Y/ O' Z.
    " i# c3 K8 z2 ~: F5 ], a7 b) |.& l0 d9 |0 m$ p
    }* Z( e: p$ v3 y
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思. v8 l4 y; F2 M5 z; r3 h' a$ t5 L+ `
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    / V6 e4 x# E4 i, A谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 5 L" }5 j; x) c2 o2 m" k & O! E5 Y; ?( r9 g3 D+ ^# }1 e#include , |. _2 c' f0 E* Q* d#include " I& E+ [) O: ^$ L, g9 l6 O1 Q#include ' b' R5 m9 I7 z# _; N9 @7 V#include 4 O a9 h" B- q. s: h#define running 1 /*用running 表示进程处于运行态*/1 G8 U% m. F3 u# Q5 K9 v #define aready 2 /*用aready表示进程处于就绪态*/! U+ x1 y( f. u6 K4 j; _% b #define blocking 3 /*用blocking表示进程处于等待态*/* L, m8 k V/ d$ F' Y" Q) H [2 d' b #define sometime 5 /*用sometime 表示时间片大小*/ * I: u) N" _* d/ l* N#define n 10 /* 假定系统允许进程个数为10 */$ r: s4 D4 Y6 k3 O) y' w, c struct: b1 G6 ~8 S: U* C! ^" C {* F! `) O9 I$ q1 n int name; /*进程标识符*/ 7 [4 D! U. @! q9 r+ P- gint status; /*进程状态*/ 1 K D f5 x5 P1 U4 Hint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/% s% z: @- C& u/ S( [: X% Y$ G& J int pc; /*进程现场信息,程序计数器内容*/ + }& O, t& `" ]2 e* I) O$ wint psw; /*进程现场信息,程序状态字寄存器内容*/ " G1 s1 s2 w0 j6 Wint next; /*下一个进程控制块的位置*/ : {4 \# w! O6 e1 I: S) J}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ - l0 @/ D. t8 p# c6 c. g% v2 tint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/% H E6 q. j2 d8 _6 C5 A6 z int run; /*定义指向正在运行进程的进程控制块的指针*/ 1 m4 S4 \- ~' |5 lstruct! v. M6 Z0 T3 c1 C. D5 T! P {& t9 `. S& L& d* M9 X6 h5 Y int head; & v2 t( y& `8 hint tail;9 m, L# @( l6 m r+ f }ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 7 g5 M" S3 ~! U7 A: @int block; /*定义指向等待队列的指针*/ & ^: a) J7 [! k2 `3 n# @+ C8 r7 jint pfree; /*定义指向空闲进程控制块队列的指针*/( ^' q3 n- e0 Q4 ~) j# o main() 9 F2 n! a. G( ^& k7 m S{ int gdriver=DETECT,gmode;/ Q Z7 r- \! z5 W8 ]+ c2 U int i,x,y;' n4 _, R$ c# l4 m) z for(i=1;i<=n;i++) / g0 {' l- m: |. s8 g; y+ Z7 M; i {ready.head=pcbarea.next;} 8 S# K( S) N5 b8 m1 [! T) F initgraph(&gdriver,&gmode,""); , r4 S5 u- @5 Y- G3 D3 d setcolor(YELLOW);& V' M4 }$ {- }* n: o; i. K for(i=1;i<=4;i++)( x) I+ X' z- A$ a4 u { setfillstyle(8,i);% F9 k' m1 l/ G7 @# M circle(284+13*i,190,6); 6 o: V% a; }5 L floodfill(284+13*i,190,YELLOW); ) b5 g% M A% v1 S }& N! Y: S% P; C setlinestyle(0,0,3);$ e3 b& U+ D/ h8 [1 Y* f circle(316,190,25); 1 S& u1 V0 V0 Y: f setcolor(5); 8 A1 N9 S3 b% s2 E4 Y3 Q# j settextstyle(3,0,4);* ]; k: v1 _' r3 Y# }) i Z# p3 \ outtextxy(35,311,"press any key to create objects!"); : t) O: Z4 X- v getch();9 Z- W7 b% M, U* _0 |4 t+ i' r setcolor(YELLOW);: x, s/ j) y& |! w* } line(300,215,290,235);* q$ s( |0 l: G+ h6 h% \ i0 P+ a line(323,215,333,235);! Q; `1 l9 c2 C. d delay(50000); 6 N" f) p# P- ?2 o setlinestyle(0,0,1); ' W/ ~& x2 J% j( k7 X for(x=1;x<=2;x++)5 x* q) M- ]; A1 c- r" \3 L {setfillstyle(8,x);" V( V2 z' Z, g. A6 R circle(267+13*x,246,6); + `) T: a' x; H3 d floodfill(267+13*x,246,YELLOW);: Q3 ?7 }7 L, @; T; i+ U }$ S* |# U g9 w& i. F- { W for(y=3;y<=4;y++) 4 m5 N- g/ X4 s( g7 T' I: d. ? {setfillstyle(8,y); $ o% [& v3 P8 d) e3 L4 Z" } circle(285+13*y,246,6); ' `4 S$ J0 W# u7 h g floodfill(285+13*y,246,YELLOW);0 E- M6 @0 o1 } y; F } , o' R/ d/ _; D2 t/ A setlinestyle(0,0,3); 1 l3 N9 o( S1 n. x1 q0 U" W circle(287,246,14); $ g" r6 ?# K( M7 L) ? setlinestyle(0,0,3); 8 V4 }3 H% d! V1 N: @1 | circle(330,246,14); & g, D+ E$ O7 m- P delay(50000); $ o/ t @. W7 K* U line(281,260,281,280); ; T( M* a- _& Z5 Y line(293,260,293,280); ) O) r n1 N& ^4 o line(322,260,322,280); . Y$ R2 t/ b% r u) o4 u line(333,260,333,280); ; r1 y3 I) A# f9 _( E" N- @6 i delay(50000);1 ~4 x1 O' |, S% E1 U4 g+ t& H setlinestyle(0,0,1); E; S A! A2 U0 ]0 a setfillstyle(8,1); . |6 C @7 R' l+ }! Y* J circle(281,286,6); F& h- I: M* a4 N6 Q floodfill(281,286,YELLOW);5 M$ K& W0 C- r( W! x1 b setfillstyle(8,2);8 q: w8 K# P: O I+ u5 H circle(293,286,6);5 @. B1 T9 f4 w, ~ floodfill(293,286,YELLOW);/ [' @- L& r3 w setfillstyle(8,3);' u8 a1 n H, t circle(322,286,6);, f1 I" @* U* u. d floodfill(322,286,YELLOW);' y% y4 `* b' h1 s$ b setfillstyle(8,4); ' a& B: v* W% @" G# ]2 g circle(333,286,6);$ [( `: H- _3 Q E" Y floodfill(333,286,YELLOW);' e' @8 O' T. f5 j# l getch(); d! M6 A; e: _% S4 L closegraph();6 @" V% v! n d( |( W z$ h. P3 s } / I# V/ y! t( @' S/ m + s: c& f$ ]. Y/ {$ L0 q, x, y. C. X( T 
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    3 h/ C) x1 u/ z1 C: m+ B- ~: r难道不是《操作系统》的‘进程’那一章进程创建??8 R  l6 O' ^8 H: D6 a
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    5 q  t" v  p# L4 i  ^不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!! 9 m# B: \% S" X" Y; b9 j! T5 |6 d$ m2 k6 N int timecount=0;4 f: H6 R9 ]) {- V2 ] char far *indos_ptr=0;7 `+ z& M/ o& l& C( f8 ^ char far *crit_err_ptr=0;* B5 W' ?$ E$ a4 T \" H int num=0,current=0,i;+ N8 F/ [6 z/ y! [+ M; P void over();& C# ]9 V! {6 ]8 M. z typedef int (far*codeptr)(void);7 Z0 K& O r8 o: p" C* G: g int create(char *name ,codeptr code ,int stacklen)4 k* s8 H6 s4 V# Z- j& B {- z6 S4 x0 D( L6 M7 f! ^ unsigned int * s;9 \3 x, S: v: W$ Y4 H num++;0 e0 i4 h- H5 G N tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); . ?: P7 |1 z) _ tcb[num].state = READY;) B& H# k! y/ o: N strcpy( tcb[num].name ,name);% V) F( i( O m( [# C+ U; | tcb[num].ss = FP_SEG(tcb[num].stack); : i% t8 T& |9 H0 E tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); ' d: o. x: r2 p" ~, \2 Z- b: i *(tcb[num].stack+stacklen-1) = FP_SEG(over);8 U+ B% O- _5 v6 d0 v9 Q! X/ N *(tcb[num].stack+stacklen-2) = FP_OFF(over); 5 P3 u' ~: b, d4 X *(tcb[num].stack+stacklen-3) = 0x200;2 W, \4 ?% \: }6 ?/ \ *(tcb[num].stack+stacklen-4) = FP_SEG(code); / M1 s# v0 ]- `3 e *(tcb[num].stack+stacklen-5) = FP_OFF(code); 6 U' l; W2 }; }( Y) ^4 L/ Z *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); 7 R$ U' ^8 d7 r |! I *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 4 z6 x' x& |( l6 f7 Y+ o# C return num; 5 f1 M1 M+ q( H5 \* p6 i; n} ; & G' N1 ?1 s. M. Z' f3 Fvoid interrupt (* old_int8)(void); : i' L2 l; ~8 B: [$ c ? void interrupt new_int8(void) " G& a; B- N$ D- e7 k0 L1 a{0 o2 \6 m: a/ W4 U+ r5 }9 z (*old_int8)();- {. U3 ^; a1 m8 U timecount++;( `% b$ A+ n2 R l+ `, ~! ~ if(timecount>=TL); : z! t- R1 K9 d/ ]0 i if(!DosBusy())/ f/ q7 G. t, U3 C6 r* I/ s {6 s- t( }0 {2 B; X6 Y) X disable(); 0 |% N. J" a3 h3 V& \ tcb[current].ss=_SS; . Q4 D, Z2 Z( Z+ L7 G: p tcb[current].sp=_SP; # }; z4 ^ H3 r; H$ N! { if(tcb[current].state==RUNNING)9 P0 W3 H+ b$ B tcb[current].state=READY; 8 M, A# I, S: d' J current=3-current; I. f/ x8 W2 F0 N, j/ r9 z if(tcb[current].state==READY) " f; a7 z" |& @3 Z: @) [{ _SS=tcb[current].ss; 6 I2 W' v5 v5 n3 R6 O! S9 j _SP=tcb[current].sp;. w4 h& `( q( R tcb[current].state=RUNNING; ( [) e2 a( V+ N$ ?7 D7 t timecount=0;, U0 W( `9 i* U5 \% y" r/ V1 c) B enable();/ `$ p6 B K+ N! D8 I/ v }/ C: B H; _* W& W } 7 W+ ?# ~5 C% M/ o: {7 L& u}; ( s2 K" _7 U5 ~8 o! V( G, Vvoid tcb_state()0 Y `( S8 h+ Q6 _& Z$ \! P {2 s8 N: w8 u3 q8 d int i; * `# q2 U8 G; Z for(i=1;i<=num;i++) 0 J7 \' P8 F0 D4 m. S printf("Thread %s is %d ",tcb.name,tcb.state); 9 H2 r/ m& K) ^+ C5 P};9 \9 H5 E' N) q: _ int all_finished() " X9 t) E# N' X; U$ y; u7 W{: Q/ q& j5 M/ H$ s int i;7 C( t9 h0 ]7 r" t$ {1 s% G8 K$ i for(i=1;i<=num;i++)) D0 y' r, G& W9 c& L/ H7 {) f+ D1 g( D if (tcb.state!=FINISHED) 2 P8 i# B5 j+ E: n* _+ L2 C: T return 0; - @$ Z5 B3 r/ D, @7 @) N8 w3 H return 1; ' k/ | R0 D2 W6 m9 t * Q. L7 @. ~' ^4 p' x# v7 ^}; ( g% [% S2 N) Z1 |1 W1 g' Kvoid interrupt swtch(void) 1 a/ c) M7 Z6 c3 k' a1 o- R, }{) W3 T7 m7 n, ^ |3 U$ L int i; 0 \6 W) A+ ]$ i disable(); ) x/ F6 d# r2 a f F8 x tcb[current].ss=_SS;; Y# l- o; M1 L9 f2 C# w1 ` tcb[current].sp=_SP; 6 l% x1 ~- a: w) ^1 U! D. ?( f if(tcb[current].state==RUNNING)- h* \: y8 x/ m tcb[current].state=READY;) E- t( D6 {/ H4 L& U* T for( i= current+1 ; i <= num;i++)- {& ^8 s8 `- E# D { if(tcb.state == READY ) 3 k# T1 _7 m3 |4 t" X s goto excute; , _$ i) o( z/ k5 x } ) E) m7 M. h5 A6 c9 Y/ @( Y6 r, ~( } for( i = 1 ; i <= current ; i++)" o, K3 D7 q2 @8 @4 b8 [) g9 k { if(tcb.state == READY)" M" ]. j- @5 y- T( z8 e. T goto excute;$ m' D& i1 t/ Y7 u } 7 l T5 \ f3 Y9 ~. x5 _ i = 0 ;0 K' L# P8 c& t- f excute: 3 \. U/ j4 g* E1 P _SS = tcb.ss;1 e7 h4 f' i: r" w4 ?9 w9 @ _SP = tcb.sp; 1 g8 b$ O- K. w tcb.state = RUNNING;5 |+ K. g5 u# w& S' t. V current = i;' `3 t7 H. ]5 |+ | enable();6 o d1 F8 u' ]1 p5 P( F9 L0 P% y2 ` }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    " i: q( m* b$ @! w$ u给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!; e5 F. w9 t( ~- H  e% Y0 f, B
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!2 ^; F) U# v7 N1 ~& X
    别占着茅坑不拉屎!
    # P3 e# ^% P. h# s( M( L
  • 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 | 只看该作者
    完成了你们看吧! 8 J% T; |5 a, N) m3 L 9 G4 x1 k8 T' P#include + [* V' Z' U# M# d #include m% f3 ^ E# O: ?; ^3 E#include $ \9 i' |' b: C: x #define GET_INDOS 0x34 . u' q- x3 E3 q0 W* D#define GET_CRIT_ERR 0x5d06 ; |8 o- o- r! F#define FINISHED 0# n: q. t! ]9 c) a9 A #define RUNNING 18 Q6 d5 @% Y; S' b/ b% Y: V #define READY 2 # q9 O) S* T8 m" |' ~# P+ P; Q#define BLOCKED 3 . c* r/ s: b! C" {1 i& S0 g6 {' u#define Ntcb 8! q" L2 E, F% @3 B #define TL 1 " a8 h" ]: \7 `9 P6 {2 F: Vstruct tcb{' \3 E* J; f7 a) d, h unsigned int * stack;/*堆栈的起始地址*/2 p6 B0 _: ?/ J0 g1 _2 v) W0 a unsigned ss; /*堆栈段址*/* E( g# h" d9 h' R D unsigned sp; /*堆栈指针址*/; J9 g, m3 Z! l; } char state; /*进程状态*/: t; u+ [+ u' H8 c1 W char name[10];/*线程的外部标识符*/% P& a4 n/ z8 d( B. D% V; [ }tcb[Ntcb]; /* 系统允许最多的任务数 */ 7 C; Q7 o" `, I1 g/ |* rint timecount=0; 0 ^% j) F) K: J0 x9 xchar far *indos_ptr=0;9 `/ H1 S: ^ p9 m7 {( k$ b char far *crit_err_ptr=0;! B W. u1 ?1 m int num=0,current=0,i; ' Z5 t" C: ]2 T0 h, v- M: yvoid over(); / z3 X* e* f5 K( f) d: [" utypedef int (far*codeptr)(void);: W4 N I+ C9 v int create(char *name ,codeptr code ,int stacklen), B! H9 V1 e8 q' F. I E4 j {; g0 d& {$ r1 P unsigned int * s;' i V- g6 F5 u1 _ `- \ g num++; ! R; R- P. s6 U7 z: c) d: k( ]tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); O2 l0 f$ j$ Z( w: E. _ tcb[num].state = READY;* ]8 a0 x; \& B5 p4 V0 Y strcpy( tcb[num].name ,name);6 `8 N0 Y. @ W9 J- d tcb[num].ss = FP_SEG(tcb[num].stack);" I$ J( Q+ a1 ]9 Z. e tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);7 E* V- Q; l2 k. K- Q1 W *(tcb[num].stack+stacklen-1) = FP_SEG(over);, X) N* g1 j* Z4 D) Q5 A. }% |# K: J *(tcb[num].stack+stacklen-2) = FP_OFF(over);4 x: ]1 R' @9 V *(tcb[num].stack+stacklen-3) = 0x200;3 R7 @ F6 p' a% u; ~3 F h *(tcb[num].stack+stacklen-4) = FP_SEG(code); 7 N6 N* r i- c' K+ z *(tcb[num].stack+stacklen-5) = FP_OFF(code);1 y& g+ o- R, [' h: O, X( ^ *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);2 y5 h3 k3 s/ o2 j0 I *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); : O: W/ q/ x: l( a return num;. v% v) M1 d D" p* j( I } ;! x; }0 Y4 p9 t4 G void interrupt (* old_int8)(void); $ t* N( O/ c* r void interrupt new_int8(void) & n7 w/ u6 r' v: c4 @& y( h{ $ L4 |" ? ]4 G: Z3 L7 ^& L B* X) N (*old_int8)(); ; W0 D p1 I6 y: l timecount++; ' `7 `6 K, ]7 n" e/ ^5 F1 a; |. `. I if(timecount>=TL); $ e! i( \' M# A, L+ |: w: D+ j if(!DosBusy())0 p3 p* A. m. U8 q$ r { # s( L9 p) z1 I$ h \ disable(); : d1 \3 K. q4 _0 X" ]9 F tcb[current].ss=_SS; ; p0 N5 p$ P% o7 u3 v tcb[current].sp=_SP; 7 u+ o }/ I) n( p$ L if(tcb[current].state==RUNNING) . d4 b5 ^2 O" l tcb[current].state=READY;1 L3 r% A0 R6 V3 w: f2 f current=3-current;: W- ^% o/ i. d0 ?( D if(tcb[current].state==READY)! A& \; C+ B6 n1 o% Z { _SS=tcb[current].ss; ; k" u6 n( j. [ s: Q _SP=tcb[current].sp;# A* G& k- b; k# | tcb[current].state=RUNNING; 5 V3 l0 f- F( r& o- l. S) T1 T timecount=0;; B, X0 a! {& H enable(); ) n* }3 W# y$ I6 X- C. K} 1 }7 t1 s, D6 `7 R5 }9 t} 9 {+ |5 }+ y6 D) a8 ]}; + g4 B+ C# U7 k4 |void tcb_state() , q- J7 f0 }+ g1 G- ]9 c' a: Q0 k2 q{ & O; T- @- v: Q* G int i; 1 X$ D2 [" m0 ^6 E- R7 T for(i=1;i<=num;i++)' D$ I2 J2 }4 x: a% a printf("Thread %s is %d ",tcb.name,tcb.state);! [4 l( |$ m5 Y }; 4 b4 L0 W% j! |9 @# u' M2 m2 [int all_finished() ) C0 o N) ~, w9 i6 R{- s, s. x w2 D, s2 S' t& C, [$ N int i; 7 x& S/ I2 l1 ?, z4 } for(i=1;i<=num;i++) 6 W! w- R- r2 y& e/ v0 b if (tcb.state!=FINISHED) / u# S i, { e8 w. s& Q return 0; 5 _' t( b; g1 l: L8 ~' b return 1;: f7 S0 n* A4 ~+ k# B 0 V/ Q2 a" [$ b9 y9 A( n5 \ }; 1 P( |4 v U$ w9 I" w4 Z* C8 Svoid interrupt swtch(void)/ {# u% q% A5 l0 \* T { 5 O7 g- V; S8 n; }8 k" Z: v& gint i;- B1 Y2 N$ f% U) J disable();, k& c3 L7 {+ t2 p! P tcb[current].ss=_SS; 6 w* ~* R' E5 |, c, i7 a$ G tcb[current].sp=_SP; h0 ]. h+ r! s& ]- K$ ~/ t; B if(tcb[current].state==RUNNING)! K+ X6 {* D: k, s" w, ^: B tcb[current].state=READY; s L1 ^- q; f" _8 Z ` for( i= current+1 ; i <= num;i++) " P R8 e6 x! D' R { if(tcb.state == READY ) / G; t. R* \0 L, \8 \6 G i goto excute; 2 j, h9 A/ j1 \5 ?: W+ \ } $ j- C/ i8 l* ]9 `/ Q' ~ for( i = 1 ; i <= current ; i++) ; K ^6 v! P8 h/ l { if(tcb.state == READY) 2 Z/ }$ @4 A9 f goto excute; / |0 |8 a: }$ {0 J2 L4 B } ; o& [2 @& H9 I9 F' [/ p7 X i = 0 ;2 G2 i. V& M- g7 ?" D4 L excute: % M2 w8 u' f) [: C9 b& y _SS = tcb.ss;8 E* G/ P! l; ~2 W. l _SP = tcb.sp;: f& n2 O6 t1 u' U: L9 o& n: Z2 v tcb.state = RUNNING;! [8 e5 Q% `; a( y5 ^) ~) B, X5 n F current = i;, ^: Y; s9 P" i1 J enable();1 A- S; B: T5 t% i* x& D } 1 {. f r( P1 f" X4 d4 r/*-------------------------------------------------------------------------*/! J. r* ]5 d8 S% g void over()& @' W! v1 t, l) W/ i: o4 n- n { ) h7 e. ^* f% G# v9 N int i=current; ) R+ F" |0 a% r5 W2 a /*strcpy(tcb[current].name,'\0');*/; a8 Z5 b& L% J- _; @6 s' D$ A: \# z tcb[current].state=FINISHED;! h7 F4 N& ?. c( M swtch(); ' t4 r# N3 G' l1 ]: v free(tcb.stack);' ^5 g/ ]: g6 Z# a; N };4 G$ H' a% h" N* q. V# \ /*---------------------------------------------------*/, J" M$ n' A2 r/ f; F- H void InitInDos(void) 4 I( M4 Z) U# |6 c' {/ S& t6 F{* K9 x# I2 W$ [" d! U5 V union REGS regs;8 y$ U ^( H0 G struct SREGS segregs; 8 L; V) O* G( f4 |7 ]) U& V /* get the address to INDOS flag*/) N$ e b: q: X& Z$ i6 M: o; K regs.h.ah=GET_INDOS; 9 F' k9 M O/ l4 R; _/ _7 h) G( Z intdosx(®s,®s,&segregs); k! B, ~* y" [1 L5 j5 B indos_ptr=MK_FP(segregs.es,regs.x.bx);$ b6 W1 J: [: Z /*get the address to CRIT_ERR flag*/+ P: z& N% }) c3 o* {3 I if(_osmajor<3)8 c! W/ T. _' ^ crit_err_ptr=indos_ptr+1; ' G J0 b# K9 D8 B6 V$ O* @ else if (_osmajor==3&&_osminor==0) 6 i5 ~7 R- F- g- Z, m crit_err_ptr=indos_ptr-1; }% w3 ?2 A/ ^! Q/ P0 G else / Y! b! b/ C* b0 Q { 9 v5 S* W3 }0 {# |" W3 {6 }: } regs.x.ax=GET_CRIT_ERR;- [1 E6 P2 |8 S! ~' e$ a4 Z, n- K intdosx(®s,®s,&segregs);' u! T) M& Z8 T8 d+ r% u2 Y7 c crit_err_ptr=MK_FP(segregs.ds,regs.x.si); u1 g+ x$ _) D# \! R- Q; D } $ F! ?& f; ]; \2 m' k}; . m8 _ {9 E$ kint DosBusy(void)" ?" w8 h+ H( N/ C4 f {0 D0 o* Z+ X) p if(indos_ptr&&crit_err_ptr)4 F' M+ n- O) B* { return(*indos_ptr&&*crit_err_ptr); 1 v) t, [" W8 U2 Q7 `9 S4 |8 l# C7 J& V else : D' W9 i- G: D return( -1);9 X( W' @% L! N+ ^ };7 F w3 c$ N l* p% J void f1(void) . n2 Z$ ^* a3 G# F6 k B{ {5 g& p5 Q7 O6 Y d7 c o int i,j,k; $ I9 ], j5 @ `6 z for(i=0;i<40;i++)% L# L9 |; Q9 H9 V6 ^ { * R4 ]' {; W; f" L0 D3 a putchar('a');. S4 v4 J) C% y3 m* @4 h 0 |0 K1 s6 i1 R for(j=0;j<1000;j++)' E: s0 a9 o! I# h. [ for(k=0;k<100;k++) ( [4 G! E% d. {( _1 o$ T. S ; . x2 G1 e, v4 [0 W8 Z, J( h1 G }3 D3 ~8 c6 X. A! h% p }; 7 a* |/ O" E- M, lvoid f2(void) 1 r. t' H/ M! |1 F& Z{ 7 v; r$ ^8 |$ _' a9 M: c! L4 n- y int i,j,k; . k% j6 h% m7 k& D; e- |' I5 b for(i=0;i<30;i++) , g$ c3 h! v V- g) G2 y {1 W. _3 O- c3 Y0 ?$ F% F putchar('b'); 0 M* E+ K8 }! d3 @# _6 A, z+ I, I$ E for(j=0;j<1000;j++) ( H2 T* U( e4 k- T% w for(k=0;k<50;k++) 8 M: f9 Z. q7 m% B6 Q9 W ;5 ^! _7 z N! X& e2 ~' h3 y }6 \3 T$ r- V8 C- a% l };% a3 p) [8 |% P9 l5 X* {& i /*------------------------------------------*/ 8 c# f$ b" U0 s: P% Jmain() 5 x8 c2 z) T' k' U5 y{ 9 k, o) F# e3 Y3 K InitInDos(); " B% p" z/ z4 {9 u7 Q! r old_int8=getvect(8); - F1 @* h! ?, |# u1 j* ? strcpy(tcb[0].name,"main");$ r0 x. O3 ^, O$ i) ~ tcb[0].state=RUNNING;( o2 }$ R x8 n, T r: N current=0;) m; Y' k% G" P6 T create("f1",(codeptr) f1,1024); 8 ?0 D; S; n O& p9 k! W0 ~0 ~3 c' f create("f2",(codeptr) f2,1024);( n/ C* m9 f( i tcb_state();8 G2 y( j, f. s' \8 c5 y setvect(8,new_int8); ) Y3 _7 s- L7 ?* z1 e swtch(); n/ {5 m5 z! |% [6 F- n9 h while(!all_finished());3 r7 l# _1 v% x: w/ @ strcpy(tcb[0].name,'\0'); f- }$ G% D$ \% }8 f: b' p Q tcb[0].state=FINISHED;% p# a% b$ d: Y! w0 M setvect(8,old_int8); 5 N5 [, q- g* E' I% r+ u6 S) r, c tcb_state();4 p4 b2 l' v7 ~/ ]9 ^ printf("\n Multi_task system terminanted.\n");: g* h- V) H! Z6 M1 Y: | };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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