下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程
. v; `! b& c6 f$ \5 ^要求:1 用c语言编写
2 J5 I; n) m' j# i* E3 t- l" z         2 程序+PCB(ID的内外优先权,申请资源)
4 H) u$ x6 G, [$ A只需做进程中”产生“这一步。
! M2 j# }$ W2 f以下是做了3分之1的范例:1 R% ~% Y: B, t
#include "stdio.h"
/ \) e5 Z! |0 M1 R#define running 1 /*用running 表示进程处于运行态*/
; _# k! P+ \5 V#define aready 2 /*用aready表示进程处于就绪态*/ # _% k8 e) j7 R0 g0 v, B. P
#define blocking 3 /*用blocking表示进程处于等待态*/ ! G) c7 ^; h8 J: K) P& E
#define sometime 5 /*用sometime 表示时间片大小*/
6 R5 v: r1 Q% N, |5 `! L#define n 10 /* 假定系统允许进程个数为10 */
+ s  d# O! l( f6 L
2 K! v5 r. P( Xstruct
, v& P5 S4 }+ s! z5 U{
1 v9 E3 S. v1 J  o, S$ X) sint name; /*进程标识符*/
- ^5 v5 |6 l! b- jint status; /*进程状态*/ " y, J/ u: v* f' A2 ?) a
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ 7 w1 P0 Y8 v) R
int pc; /*进程现场信息,程序计数器内容*/
9 T1 S; f6 J2 X: p+ ]# c6 I/ Qint psw; /*进程现场信息,程序状态字寄存器内容*/
( l, D# _. Y8 Z+ x4 W* n0 n' Cint next; /*下一个进程控制块的位置*/
: C! Z2 u$ F# t3 b/ f4 r5 U! E7 x- h}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ 3 z- D+ j9 e% d, U0 y2 T

* C: p. I/ @" w( j0 Q" f! n1 R- D$ lint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ : }, P. h) J5 C  v! R
4 c" @) i0 ]% F
int run; /*定义指向正在运行进程的进程控制块的指针*/ : R9 b/ N, B' H  T9 N
struct 9 ?0 w; e# O7 C" ~1 `( g/ Z
{ 3 d0 e& B; M7 G
int head;
- H  C( J, E# F; t- ^: Nint tail; 9 f. i! w3 i4 ^& Z1 c
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ 3 O" V' l. J6 ~# G2 i  i% M
int block; /*定义指向等待队列的指针*/
( V# _; m1 q8 eint pfree; /*定义指向空闲进程控制块队列的指针*/% T* F4 Q: ?; ~9 N9 }1 p; @1 p
6 @& ^3 h+ s1 n4 x
麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 W9 l" z3 R2 c3 @9 m9 x( R
    麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。
    % S' t0 c+ k- ]' D0 O0 F* v/* the main site file */1 g; ^) g# Q9 K* p
    CreatePro(&ID){3 |/ c1 d' S" j% W3 l5 v' W# i5 ?+ r$ g7 i
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    ! Z* Q, {2 B/ K$ {* H  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    ! r* w; i& i" F7 P) c/*初始化参数*/
    ) {" e% e3 M3 R   CallName(&ID);   //命名进程的外部名
    0 L; M) m6 |1 C. K7 w3 z- i1 c, d" v  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、# a. c. x0 U0 \, e* @
      SetFL();  //优先级数、
    3 V  ]. ~2 N* Z! h0 \. ~  SetHeap();  //进程起始地址、( B% F  _7 u8 _$ z
      _SetSelfStat();  //设置进程的状态为就绪态
    " p4 @5 g$ [5 H- r4 q  AddStat_Read(); //将该进程加入到就绪队列中。
    7 T2 k4 ?- `* b. K& W- a.
    $ c* L8 E1 {! ^2 V& x. h9 w.5 G: P7 u( d3 n1 L$ p% ^, t
    .
    3 W# H/ m/ e1 Q& M7 R: a: X' w.- A  r, F3 z0 e$ \& m
    }7 h! W# }4 V  F6 Z
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    ( d3 v  Z3 _/ ], M5 v3 e
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!7 f9 [( h# |, }1 I2 ~: g
    谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢 1 i7 i- l& y) O% H% X ) G/ p6 T: n" Y: a5 R#include % K. d) v4 h7 x! a8 t5 U#include 9 v6 D: t: z3 t$ ?4 p#include / \: F4 r- h4 {" [/ t. T#include ) M d2 Z+ R9 a8 a4 a! x! P& H#define running 1 /*用running 表示进程处于运行态*/ ( B+ D% U) z( f$ |, u9 p#define aready 2 /*用aready表示进程处于就绪态*/ , _. b$ Z3 [9 M( s5 ]+ r% d8 L#define blocking 3 /*用blocking表示进程处于等待态*/ " o1 W0 o' k) O2 }#define sometime 5 /*用sometime 表示时间片大小*/ ( R, d: l* A( I#define n 10 /* 假定系统允许进程个数为10 */! K2 ~( ~9 o! z8 v5 ]: v* D struct , O* N& |1 {4 |, V{" }4 M' i# E& m int name; /*进程标识符*/ ( Q2 \$ n( V1 d, A' K6 ^int status; /*进程状态*/ ! p% r( R( j8 ~8 `/ N/ G5 xint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ ) W$ G7 I5 K* j% X/ cint pc; /*进程现场信息,程序计数器内容*/3 i, u6 y# Z7 R" ~2 A/ | int psw; /*进程现场信息,程序状态字寄存器内容*/ # n% G% Z7 B& w, \7 u! [; R8 fint next; /*下一个进程控制块的位置*/. X5 t& t9 A$ ~& d0 q9 j }pcbarea[n]; /*定义模拟进程控制块区域的数组*/ ! O( X( u) P8 Q1 Dint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ , E1 R* O8 r- Q8 f7 z* ?' Bint run; /*定义指向正在运行进程的进程控制块的指针*/. h' }5 a) g$ t struct 6 l) Y% ~9 ?; g6 s{$ K: L* A# z) M: d: w' c/ b# d1 } int head;, K+ g. U9 s n2 B) Y- J' b: A0 A int tail; 0 r4 ]* x! \9 v0 @2 |# p) u# q! z}ready; /*定义指向就绪队列的头指针head和尾指针tail*/2 s! x9 s# l8 M" U% ^8 D int block; /*定义指向等待队列的指针*/ $ w4 P# k" k4 g4 y; [: Zint pfree; /*定义指向空闲进程控制块队列的指针*/ # \' {; f0 e u# R. ^* P0 ~main() " s$ ~( w! _- ]' ^{ int gdriver=DETECT,gmode;; U0 }- s1 l( o, ]7 F# @0 B3 q5 E# n int i,x,y; ! \0 ? Z, C5 Z# I z for(i=1;i<=n;i++) 7 E. J% ^0 [' g9 b i' i; r {ready.head=pcbarea.next;}5 g% u$ E9 `. A- b- B initgraph(&gdriver,&gmode,""); ( C; v$ E6 A2 e. S setcolor(YELLOW); 7 U' [- o6 {* g2 }% q! g. U; D3 D for(i=1;i<=4;i++) & R1 A- k0 e( @ { setfillstyle(8,i); . F7 F2 e0 X# B( ]4 C circle(284+13*i,190,6);, m9 _2 M; w0 q- U5 ^ ] floodfill(284+13*i,190,YELLOW); 2 ?8 {$ E" q6 z. j, c/ j, W } 2 l3 l# L* [* w/ `8 `$ } setlinestyle(0,0,3);/ m# [% s9 g3 |* E circle(316,190,25);3 {" h$ q' Z r# P& q" g setcolor(5); 1 P: U6 \3 d6 ]8 `9 m7 e( N; o settextstyle(3,0,4);+ ?! |, a; P4 e) w+ o outtextxy(35,311,"press any key to create objects!"); 5 Q9 z+ J* v4 e# Y1 j, S getch();! M0 @2 L3 W8 @, f- S+ `& V setcolor(YELLOW); " r8 @7 q- C: H line(300,215,290,235);3 k# e8 h0 c& O0 F2 r line(323,215,333,235);( D9 F; L3 `5 P delay(50000); & S- E* g) C1 W setlinestyle(0,0,1); % P7 ~' M: q& }. ~5 ~' K( R for(x=1;x<=2;x++)( l2 k" ]4 D O: V {setfillstyle(8,x); y, I A$ J4 G% u# h3 `- J5 { circle(267+13*x,246,6); 8 X. y/ f/ u% V$ t( p) N0 P floodfill(267+13*x,246,YELLOW);/ S) x4 N1 ~& G }5 \- r- z9 Q9 Z* w9 `+ N" J for(y=3;y<=4;y++)7 M; |1 |3 ?9 ?; U {setfillstyle(8,y);9 d j& S& @ `# j circle(285+13*y,246,6);" Z. M% s1 U" c* E floodfill(285+13*y,246,YELLOW); ' K, f( R6 u' d% P } : e4 h6 v3 m& x9 n* w. E4 Y setlinestyle(0,0,3);5 |' _: {4 x+ ^1 ~6 s( G$ Q circle(287,246,14); 6 c0 A4 Y, ~. A& R setlinestyle(0,0,3);$ d- h3 z2 B3 p9 O/ O- E5 D circle(330,246,14); 3 }2 E. _8 S3 N8 M; S; a delay(50000); 9 i. K, v! F% N8 T+ @* K' ^ line(281,260,281,280); ) R f, g7 e& ?: u* `' D' g line(293,260,293,280); 8 b5 O9 x8 [1 b. |) j! Y# @) \ line(322,260,322,280);8 }4 Y" a. `: W0 f- d# _0 ? line(333,260,333,280);) u3 M1 J8 d( N# H$ B1 j) a3 v$ P7 X delay(50000);) B# V n: U7 D# w: y# ~ setlinestyle(0,0,1);% H3 y6 s9 s/ x0 j7 P3 e2 ~ setfillstyle(8,1);- g3 [! l- _ }. {1 s4 G circle(281,286,6); + M% J. M1 x7 h floodfill(281,286,YELLOW);# Q8 A' R" k; F- A1 m+ W5 z$ p$ [ setfillstyle(8,2); 7 y) S8 |8 R5 p& b8 s* y5 W. g circle(293,286,6); $ K S* _ O- n6 ]: r# ? floodfill(293,286,YELLOW); 6 t6 {2 H, z* i. I5 V6 f8 M# R7 { setfillstyle(8,3); 9 o7 b% Q M) {: O! w" t$ x | circle(322,286,6);& Y$ y0 L y9 n0 `3 q! f floodfill(322,286,YELLOW);9 @# X' t; h( q0 m) {% V2 l setfillstyle(8,4);0 h. {/ y8 w1 w& @: e6 y t8 E circle(333,286,6); / v% x% ?* a* m6 V* v floodfill(333,286,YELLOW);) H y: Y: Y; d# g# \ getch();. G7 a" _2 w, N" B closegraph();! L% u: o, ^4 D3 N% k }" P6 g8 q5 p# T4 g2 H+ v 6 j3 y( R4 m5 `( q ) T1 I9 A0 y' q2 r) s
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??
    9 a% [! a' n* a: {# H难道不是《操作系统》的‘进程’那一章进程创建??( j% c3 x% w5 F: v( C# `
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!1 Z; `. d, u! m7 C
    不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!!8 W; @; ?# g/ O# Z7 V/ w/ W( Q: Z * Q9 D, Q2 z# ?. P+ r int timecount=0; + h, H% P- S% c3 N2 ?char far *indos_ptr=0; 4 q, ~; W& Q1 j6 E! Q: O8 Qchar far *crit_err_ptr=0;6 g; u4 X7 U0 t& T2 h8 w* { int num=0,current=0,i; . F3 G" I: M evoid over(); ) I; M3 Z+ P9 Q4 g5 B! @/ Vtypedef int (far*codeptr)(void); 6 Z5 m8 \6 |+ a" Bint create(char *name ,codeptr code ,int stacklen)& W8 t1 j" J8 w) V% ?# K5 o {0 ]+ B! w O+ j. i2 ^9 A- s unsigned int * s; ; {) ~: _# b$ { W knum++;5 G2 C# `* o: B1 |$ L: R tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); ( I( j: D g$ S+ h tcb[num].state = READY; . ]" ~) L ]9 M* m* | strcpy( tcb[num].name ,name); 2 X( U( C% ~ |8 N tcb[num].ss = FP_SEG(tcb[num].stack);5 ?" i1 O# h& v8 G9 K3 B# ] tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); 9 @9 B. D u$ q' F; w *(tcb[num].stack+stacklen-1) = FP_SEG(over); ) J1 ^6 x$ m: v0 M! @ *(tcb[num].stack+stacklen-2) = FP_OFF(over);4 ?5 h+ q7 m: A$ F# j6 ^9 C h *(tcb[num].stack+stacklen-3) = 0x200;+ k J$ g8 @* p *(tcb[num].stack+stacklen-4) = FP_SEG(code); 6 _: W. g' e' b! _# L& p *(tcb[num].stack+stacklen-5) = FP_OFF(code); 6 i( w8 C s8 p2 ?( T5 V *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); J: Y, \# m; L2 r% O *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 8 a0 F5 i: m, N$ B, ~' H" {/ [ return num;8 E+ c5 f0 B" ~; W( x) ? } ; 8 t! \& l/ G, E- d+ V2 Lvoid interrupt (* old_int8)(void); $ @% G$ l& J6 O9 t( ], b% l. G void interrupt new_int8(void)2 L. a$ t+ @5 E7 I& l {3 D/ x1 i# f3 @% X (*old_int8)();6 V, l j7 F* p9 [ timecount++; ' v$ |* c! P- G8 b if(timecount>=TL); # b6 ]6 ?8 c3 B) q8 A9 P if(!DosBusy()) t5 w3 T3 T$ f! l5 V) z' W/ d {+ N3 t9 N, N Z+ @( h* H$ e8 L/ Z/ V disable(); & J& N$ k# @% o7 m6 j9 N tcb[current].ss=_SS;$ ~9 Q8 |0 y6 h/ S$ i tcb[current].sp=_SP; : v7 a: l$ t4 U& a6 C( w$ f1 S if(tcb[current].state==RUNNING)$ T$ c; P. _' [4 K) p tcb[current].state=READY;! r6 K0 N" r9 F1 G9 r current=3-current;0 ~( ?: v: G+ O4 b if(tcb[current].state==READY) " u8 v4 Y% e7 o# G2 S{ _SS=tcb[current].ss; 7 l" [: j$ a. i5 O- K _SP=tcb[current].sp; # N1 ~2 y& d0 ]# K: s8 \" ^; u( j tcb[current].state=RUNNING; 4 m+ s# A" k2 _: X; G timecount=0;( x7 q$ |; z: S2 Z& V enable(); c7 g; }5 N$ a5 a* D. W}3 m- f4 ~" v5 n( T! c5 A6 p" ~ } ! s5 M9 E5 N- h& n" z};5 b- V1 _- v3 ~$ _* F. d- f void tcb_state(); D/ b1 a5 Q, b7 b {0 u2 Y' `5 M$ {& z+ v; y) r5 |# z int i; }4 D9 |3 H% H/ }0 _ for(i=1;i<=num;i++). M F( Z$ ~; a printf("Thread %s is %d ",tcb.name,tcb.state); & Z: Y/ f; a* }$ R0 x6 k}; ( V6 b; q, b+ @ iint all_finished() S$ c; h N" q1 D. K {& L3 r) A3 \% I" {3 a" r int i; - A! G' J7 O5 L/ Y( r6 _* n for(i=1;i<=num;i++) 0 `) t! U' r( L9 P" ]) x+ L if (tcb.state!=FINISHED)6 n" L" e3 Q! @( G; j: E7 {" f return 0; ( G [0 K4 D. A& ?' e return 1;0 g r9 M0 _ z; |: x: z3 a- `" W $ g# M+ W6 E0 o" d# Z }; 3 P4 w4 y( p8 {$ X+ [* b& ]) Lvoid interrupt swtch(void) + V6 U7 o% O* E{ 8 I" Q* p2 \5 j/ M3 K3 D, V/ Nint i; 2 H0 e& \+ r' K' m1 r disable();. S( f/ W/ @. _: W+ S1 c7 j( V tcb[current].ss=_SS;4 ~5 P, M/ }7 f2 N! m3 \! J, C, N) u tcb[current].sp=_SP; 2 h/ [1 v% y5 s6 S3 s( ?+ M+ ? if(tcb[current].state==RUNNING) j1 t8 c8 D# R9 g5 C0 T6 n tcb[current].state=READY;; U3 n u% _- {* i t3 [$ Q for( i= current+1 ; i <= num;i++) , r; g' L( h6 v: b/ X9 M! K- Q { if(tcb.state == READY )7 |1 F; f: K2 }" [7 I9 h. d goto excute;+ z, o X4 x. }0 U }/ N1 W) F N# {5 v. J$ K) O for( i = 1 ; i <= current ; i++) 8 H' ^4 r |* h { if(tcb.state == READY)- b0 b; G+ F R. V goto excute; ' W" D8 }9 r' ?0 W1 v* l } + G3 E) I( ^6 | i = 0 ; 6 e4 c5 A' ]# q5 t excute:8 k0 [6 B, h2 ~ _SS = tcb.ss; ) {7 k) o% W6 j. Z' b _SP = tcb.sp; 4 Q# c2 D4 ` e2 }: f6 E( ^5 y* A tcb.state = RUNNING; 4 S9 k' ]7 O' X9 D1 i ] current = i; . r% _0 X! T; M6 u, B: N: t8 {4 K enable();1 W) g: @/ Y- l3 }" x }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    2 E. |$ o' Q$ b1 T3 ]1 S5 D1 C) {2 s6 }给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!; ~( M3 v: r. E7 h
    搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!$ m; B# Y# @; m
    别占着茅坑不拉屎!; L; v4 G2 B; P: f7 H# W" e2 ?
  • 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 | 只看该作者
    完成了你们看吧!" t; Q2 y, G# H6 p. H* G& o* c 4 L6 P4 O; s# P1 g; ?3 _; G #include # W, O, p) [% }( l0 B #include , j6 O5 ? B: M#include * k; l/ e5 ^, i& H; M#define GET_INDOS 0x34 7 M' }+ N' N* M: J$ ]#define GET_CRIT_ERR 0x5d06 ' o% m& Y! p! X8 ^3 p9 H& ?#define FINISHED 07 C5 y$ m# m' R! U #define RUNNING 1 % R6 k a# g& b$ }( m2 {#define READY 2 2 Z/ K( J- K7 D5 e' _#define BLOCKED 3 8 t R+ d0 |+ a7 R( m& H, M1 \#define Ntcb 82 v8 {7 r8 G4 Z. ]4 `8 B6 I8 K$ {* U# z #define TL 1& f1 F- a2 z8 W' h+ \; S. R struct tcb{ + L; g- R4 W* {3 w$ H" h unsigned int * stack;/*堆栈的起始地址*/- o8 W2 u1 {- z- |1 L; l) C unsigned ss; /*堆栈段址*/ " Z9 ?! k1 W+ ?, Y unsigned sp; /*堆栈指针址*/* }, M# f* J6 p& a$ M char state; /*进程状态*/) \' Z1 C0 t! H8 U9 ? char name[10];/*线程的外部标识符*/6 x, r, |$ c$ G+ J1 [" \ }tcb[Ntcb]; /* 系统允许最多的任务数 */7 M7 `+ B1 A; _, L1 ?( W m% Y int timecount=0;- y- R$ C" p u7 Q* k0 d; [1 E2 [ char far *indos_ptr=0;7 `& h8 y( o3 r8 q char far *crit_err_ptr=0;( F T: Z8 U0 K& k! n3 Q int num=0,current=0,i;+ Y7 @7 B+ u" Q/ h, } void over(); ; R# @0 y! Y7 F; p+ V' }typedef int (far*codeptr)(void);0 C" K, t, N; g. ?/ L/ L4 I int create(char *name ,codeptr code ,int stacklen) ! N( G' q6 m) _* l M9 D{. w! {% R' Q# `; Y( ` unsigned int * s;7 v9 P( B1 S5 t) m- h' x* I" h+ | num++; / n+ N. V% m5 Q& O5 `tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); * g2 h0 s9 V$ W7 ^$ @ tcb[num].state = READY;' c2 v; O& ]( Z5 b strcpy( tcb[num].name ,name); : U+ {* b4 U/ c0 X tcb[num].ss = FP_SEG(tcb[num].stack);6 l4 J& w3 A+ I3 R! p+ ^/ r tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14);3 } N: ]0 J0 R *(tcb[num].stack+stacklen-1) = FP_SEG(over);% K- w3 m: c5 T0 c6 X( V& K *(tcb[num].stack+stacklen-2) = FP_OFF(over);- v- e( e& c& C# y( |# Q8 x6 x *(tcb[num].stack+stacklen-3) = 0x200; ) E) _, Q! a; @5 m: i: @ *(tcb[num].stack+stacklen-4) = FP_SEG(code); * Y& Y+ g- L2 y* A9 v *(tcb[num].stack+stacklen-5) = FP_OFF(code);5 R7 _+ q: [2 r5 n5 P( `$ ]6 v( V *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);) F0 g) O; {" e' Z1 o* d *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); ' s! N: i5 p9 b* \) B% ]! d return num; - R# P/ U; F; x5 d: j+ O+ \8 J8 M} ; ! M: j1 T& j0 l. _4 N" B h+ J$ |void interrupt (* old_int8)(void); 6 r$ {( r4 c( w) k# qvoid interrupt new_int8(void) X$ s6 d8 A7 i# _ m2 C; a{: l: `' \' R8 H (*old_int8)(); & M+ q. X% i' J2 n x" F& [ timecount++; V3 s1 O3 D+ ]5 Z2 b if(timecount>=TL); ; j1 l8 l' ~; l/ M1 k if(!DosBusy())6 p. |! _% K0 P% v6 F# A; c0 E {! W* v" q; `. c- c2 f disable();/ x- u, l0 | D; k" @ tcb[current].ss=_SS;: @; q; C8 `+ ]; g6 J; r# _- D tcb[current].sp=_SP;; E; C1 u0 G3 \: a& M if(tcb[current].state==RUNNING)) {2 V4 K O% q5 {2 G tcb[current].state=READY; 1 Z# A9 A! e G) R current=3-current; 8 v Y2 b. f! _ _; K) Rif(tcb[current].state==READY)2 i6 @7 E3 D \7 z { _SS=tcb[current].ss;5 _& Y! j, U, g1 X/ \# h _SP=tcb[current].sp; z2 R- F$ ?/ p) P! ]( } tcb[current].state=RUNNING;) j) s6 Q. ?# U3 o5 i# z7 B timecount=0;% }( [) [3 u4 U: v; v enable();1 Y( S& j( F; Z1 L D& F } . c6 O8 S" K. J) J; t/ M} 5 u8 s! P& a: }4 E}; ; t3 u; R) }( l& j9 uvoid tcb_state() , `4 J W2 p6 s) z2 f# Q{0 q. m7 F" B; E* G6 w int i;' i& g6 [% D6 ?$ u. x9 I for(i=1;i<=num;i++) - d) j2 O; a, g4 q9 H/ D- a5 K printf("Thread %s is %d ",tcb.name,tcb.state); , C0 k8 |) B3 {1 }& A. g6 w8 C}; : v$ j/ l* Z4 a- u4 Sint all_finished()" @( C2 _, x1 b1 |- |: w, G { " @/ u! w! y6 Y S int i; " q3 X5 W. J$ G* k for(i=1;i<=num;i++)9 H! P& K2 t& t# \7 k if (tcb.state!=FINISHED) ' u, @* A6 b+ Z. n' h' K return 0;6 O" _; n, n; I7 h3 r3 ^( C return 1;3 Q6 u" L, N# _3 u5 | 2 o! G0 U6 U# N; {2 ?& [0 j! t7 x };3 L s1 ^/ D7 Y7 z void interrupt swtch(void)! |% E9 {% B9 G) P: q! Y { ' q4 u% s6 x, W$ T6 m: F t+ U tint i; ! c. `7 Z R( p7 e) E disable(); 9 ?3 k. m' d9 p1 _1 P5 C tcb[current].ss=_SS; ) T( q( v" q2 v. R/ D) {! w6 ~6 X tcb[current].sp=_SP;/ [& }; X1 k3 \. v0 N/ U6 ?) t6 i% }1 J if(tcb[current].state==RUNNING) ) P6 _ l% T1 ?( f9 Z- w0 F' W; W tcb[current].state=READY; 0 F" [$ r1 s9 V1 } for( i= current+1 ; i <= num;i++)" o# a) k* j8 n( P; Y& o$ } { if(tcb.state == READY ) % ~/ ^: t# S' O# ]8 ] goto excute; $ |. N* ]* B }$ \ e }. k. c$ `4 E8 P O for( i = 1 ; i <= current ; i++) 0 Y1 I6 E$ w6 @, p3 O( ~$ C% A { if(tcb.state == READY) ; J# S% B B3 K/ d' V `2 l goto excute; : d0 k4 t2 G! C* x: w" Z9 m } & w3 _6 u0 d3 h1 M, T$ |9 ] i = 0 ;0 U: B3 k$ F8 W/ \( i0 ^. X excute: - V% E! e- ?6 f2 U' { _SS = tcb.ss; 1 I5 A: ~) D$ k* P W6 Y _SP = tcb.sp;2 l& e/ ]9 b/ D2 J tcb.state = RUNNING;' b9 X- `- Z; @5 \3 t; D current = i; 4 l& T, T4 \+ g' G enable(); % u6 H$ D- a3 e% b; d}8 a! C- `- @ W% y w /*-------------------------------------------------------------------------*/ $ s2 P, K6 n) O' G9 Dvoid over()' o* _. j- U, E$ g" ?# E, C {8 F" @; O7 ^: a: x int i=current;0 {- }3 p. }8 ~- h /*strcpy(tcb[current].name,'\0');*/ 8 I, @4 v. q2 D% O! R' a1 Q tcb[current].state=FINISHED;3 H7 w4 K+ p2 u! Q swtch();5 S% \3 ^2 }) H# ~0 c5 Q, n* _' H free(tcb.stack); ) h; u- T6 w& [7 ^/ a7 N};+ f5 ~; X9 A# I, \: F/ i+ Q$ f, c7 j9 a /*---------------------------------------------------*/3 U( O% U- b6 u' A+ M \0 j void InitInDos(void)" o& o( H' @5 Q& p3 }; y {( Q" A$ `; W& i; C union REGS regs; 6 ]+ y& o0 y/ l* r struct SREGS segregs; : W, o; G& x/ j7 T /* get the address to INDOS flag*/ . C4 _/ f8 R& M8 N regs.h.ah=GET_INDOS; 9 @( m1 K3 h- Y: L intdosx(®s,®s,&segregs); ; e8 T4 E9 q v H ^, o* U' u% _ indos_ptr=MK_FP(segregs.es,regs.x.bx);) L6 D+ \6 z; _4 ?, D1 ]- V: N /*get the address to CRIT_ERR flag*/ . N S( Z" f& T! {( B if(_osmajor<3)0 @/ v" m) O8 D% Q" X$ c crit_err_ptr=indos_ptr+1;, ?9 B9 L$ j9 ?/ w else if (_osmajor==3&&_osminor==0) # X. `3 i. v4 w" @* e crit_err_ptr=indos_ptr-1; , a4 b/ t9 E. R2 b4 _/ C: E1 r6 h else$ }. v& \6 h# w. I! n) Z { 4 a& i1 j# `& M regs.x.ax=GET_CRIT_ERR; 4 |0 A0 M; Y* p1 i intdosx(®s,®s,&segregs); : r* B2 k' ~( }- ^" ]3 [" ? crit_err_ptr=MK_FP(segregs.ds,regs.x.si); ! F8 z' c! }7 Y/ @$ f c/ G) ^ } 6 @9 C4 ~5 A8 X9 a};% R+ `6 ~# h J- P& P int DosBusy(void) # y$ I# E4 z9 z2 t% O{ / U- D% W. e- s2 z1 U: o0 y+ T& Q, p if(indos_ptr&&crit_err_ptr)" w* C; z, O$ a return(*indos_ptr&&*crit_err_ptr); * d* B4 L" S3 q/ F* \" B# d: j else8 O5 G1 O+ |8 o8 o8 k1 r( h return( -1); 8 z0 u) H7 B7 a( J, R}; 9 S3 M$ W: t$ d* zvoid f1(void)$ Z2 f! O" ~# R) ?2 n( C {2 C. v. b1 y0 ] int i,j,k;, j4 E# J; v8 m for(i=0;i<40;i++)5 C/ s6 p% [( p8 b% v. } { g" Z2 O/ G# K' W* R1 G putchar('a');4 u" `, {% q: @( A- l2 G: T( N6 [4 r ; j9 O3 F% V$ i for(j=0;j<1000;j++); F/ m3 G$ |; x2 E9 T! I" K1 O- } for(k=0;k<100;k++) $ D" ?* Z& a) A: g ;, i& n% D C9 k1 z- B5 ` }. e/ o4 X9 m! }" s+ T/ d }; 8 u: `2 b- V2 A5 H- S$ xvoid f2(void) * W- h. X% M" Y" q) m* X: B; E) C& }{/ n7 k" J+ l- K int i,j,k;% l+ ?$ i9 ~* Y, X1 r for(i=0;i<30;i++)- ~) S8 p3 w5 p" z, Z( V$ E { ; o* {; C8 z. c% y/ }7 a; i m) Y putchar('b');$ \" b% r2 d" I* Q, K, y for(j=0;j<1000;j++) 4 E% _# K d1 y" H' G* m for(k=0;k<50;k++) 7 G6 s# j1 g! C0 T4 u ; - p, k- v2 a3 O6 r } 5 b6 I- q# l5 V, f}; ! }, q n' |3 } I! k V# `8 i/*------------------------------------------*/ : T" j% J. C5 T7 R& M) Mmain()3 S5 @7 W4 C: O, a {, Y2 Z, M9 ], a& x InitInDos();) }# A9 r1 W/ E7 j: Y) B, D old_int8=getvect(8); J9 m# m7 x! w0 n strcpy(tcb[0].name,"main");1 ]- A" ~8 ?6 W2 t5 h% P w tcb[0].state=RUNNING; ) `. ~" q2 E- S6 g; E6 U current=0; 7 k$ _, ?/ F- Q# n create("f1",(codeptr) f1,1024); P4 P3 u) \& F create("f2",(codeptr) f2,1024);8 j; z3 U1 ?$ z* Q4 x+ M tcb_state(); 0 ]' x. F& E8 ^: [: P0 K1 v* f* T setvect(8,new_int8);$ V: q5 i$ ]! w8 z8 B2 Y& E8 G7 n swtch(); # V) l0 u2 b) W while(!all_finished());; w; U2 l8 C% q strcpy(tcb[0].name,'\0'); 4 E+ |$ @4 P' s- P tcb[0].state=FINISHED; ) X" S5 k$ b5 y0 f% V setvect(8,old_int8); # u) n) ^7 W: Z, W/ f3 H& Z tcb_state(); ( p' c) n1 S4 S9 v printf("\n Multi_task system terminanted.\n");" _$ J# s' l8 x# v };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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