下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
create()  创建一个进程  v& w6 m: n+ g4 u
要求:1 用c语言编写
* a0 v# J8 H# I! h  W; ?5 \         2 程序+PCB(ID的内外优先权,申请资源)
* Z: G  p# H4 r$ U只需做进程中”产生“这一步。, R' {8 I- q3 N$ z
以下是做了3分之1的范例:
) J3 C! t) o$ k5 ?) ]) h#include "stdio.h" % b: `: o; k2 D0 |5 z, |! y/ A
#define running 1 /*用running 表示进程处于运行态*/
! z+ q2 P9 q4 Z( g; ~3 f4 x#define aready 2 /*用aready表示进程处于就绪态*/
8 g, a5 F$ P) W0 ~) B' t; ?#define blocking 3 /*用blocking表示进程处于等待态*/
4 \' s" y3 ?$ u+ M& s* u2 h#define sometime 5 /*用sometime 表示时间片大小*/
+ ^( U" U# L  m#define n 10 /* 假定系统允许进程个数为10 */ 0 I8 y( C# N" a
7 a  [, Q, r5 g" i# v1 X
struct 1 {% I) ^/ A5 y
{
5 l5 {3 U4 ]& i9 w- Yint name; /*进程标识符*/
# \/ B8 Z: P" T1 c) pint status; /*进程状态*/
2 {2 U3 @6 ]& J$ U  p1 o: a/ mint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
$ W- R# ]2 |: d) v- fint pc; /*进程现场信息,程序计数器内容*/ 6 ^/ D" m0 T2 N6 S1 x( w0 U
int psw; /*进程现场信息,程序状态字寄存器内容*/ ! {9 t: U+ ?: Y* K1 b! K; u& Z
int next; /*下一个进程控制块的位置*/
4 t3 Y& J# V. ^0 L* D" k2 I}pcbarea[n]; /*定义模拟进程控制块区域的数组*/
4 J( s8 N9 b% U0 i; V7 V( ~
, C" L1 p7 G3 D# X8 S' P" Jint PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
! y: ?+ T7 l2 I, h( }% _3 ?! g0 b5 d7 D- b% F( Y: G, Y4 S
int run; /*定义指向正在运行进程的进程控制块的指针*/
; x3 ~$ t! [% Y/ h' ]struct
6 v" \5 h$ k7 I: e' j0 P9 @{
0 ~# U! F9 @' C* M0 L1 Pint head; / U  g$ {( x8 S; W6 d9 p, C
int tail; . a3 q! @1 Z8 z$ n- j) {1 N
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ ' _* R! }" c, E) R
int block; /*定义指向等待队列的指针*/ / m& F7 L% _7 G: }3 f5 o
int pfree; /*定义指向空闲进程控制块队列的指针*/
+ r. ?- A8 z  `; _5 k( s/ h7 e
3 W: j; ~# s/ Q; C8 m' W麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![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 | 只看该作者
    我的脑子都快调得暴了,能写个大至的,让我自己调吗?
    . d4 k4 j6 h0 {9 _' r麻烦各位高手了!!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2003-10-20 22:40:00 | 只看该作者
    你给的头部定义的几个队列指针看的出来你是想写一个 链接方式 的进程队列,由于给得太粗糙和简单,我尝试了一下,反而觉得很不好写,想考虑的一些东西你的结构里没有,而考虑进去发现弄的复杂了就写不完了,所以很难办,结果还是没有写下去,给你我开始的一点筐架吧。. _' H. P8 M3 X+ D
    /* the main site file */, |5 U5 C/ |$ \* E2 K& P1 w; g
    CreatePro(&ID){) z9 O' n, H7 m1 a: p
      GetFreePcb(&ID);  //申请一个空闲的PCB,并为其命名一个标识ID;
    $ o3 @! W6 m' ~" C  InitResour(&ID) ;//为该进程分配资源(内存空间和工作区);
    ( Z. \0 ~% h/ W; o/*初始化参数*/6 Z* t7 c3 u1 |* f) P" N
       CallName(&ID);   //命名进程的外部名
    8 d) h. ?. ]$ ], h! i' B  SetParProStat(&ID);  //记录父进程的ID和CPU的状态、
    3 h+ d  k& Y7 \. C# L% G  SetFL();  //优先级数、
      p' m/ ?: `' L& h$ f% E) B  SetHeap();  //进程起始地址、
    2 v7 y% y- V) F4 ^( c9 C' O  _SetSelfStat();  //设置进程的状态为就绪态  W: \5 X; a/ M+ V. h0 I
      AddStat_Read(); //将该进程加入到就绪队列中。4 S; s8 H) f* H( }4 n- J$ V
    .
    7 Q6 {+ v# M( T: W.
    7 M+ a. y' r* ]2 _3 j.
    ; K$ P1 q+ e* N8 ~6 Y.  u. y& B0 ^. x( s; L
    }, f% }9 ~, h/ ?" d+ Q; B
    我觉得上面至少要考虑的,但是实在很懒了,对你也许一点用没有,不好意思
    # C  T5 A9 w/ o& d; ^3 P# c+ l
    towny 该用户已被删除
    5
     楼主| 发表于 2003-10-21 12:04:00 | 只看该作者
    呵呵!!
    & `' j/ c" y8 L( @! F3 J' u* Q谢谢斑竹的高见!!
    towny 该用户已被删除
    6
     楼主| 发表于 2003-10-21 12:18:00 | 只看该作者
    这是我自己做的一个版本,望斑竹给予指点!!!谢谢" E1 B2 {+ n6 W) @5 A $ j% v0 B2 ~: Z0 t#include1 q3 C4 D+ h& U+ R% h N# G! [ #include9 @) s, C+ ^ L& r' c$ c #include! A* @; s( [0 K1 o #include- M( _& J- E9 [ #define running 1 /*用running 表示进程处于运行态*/. R9 d* G9 D' m* t; k( M( r #define aready 2 /*用aready表示进程处于就绪态*/ / V& i1 ^* l/ p0 |0 r9 Y#define blocking 3 /*用blocking表示进程处于等待态*/ ! c3 i& j& J) W7 L1 d#define sometime 5 /*用sometime 表示时间片大小*// h% s8 W8 G5 n# ~1 A #define n 10 /* 假定系统允许进程个数为10 */9 w( C% n) ]+ F i" @ struct ' L! }) }# G Y k( _' \: m{2 o5 F' V1 w5 i5 G1 o! c int name; /*进程标识符*/ % f8 G3 q( A! h0 m$ r$ oint status; /*进程状态*/ ' D! x6 Q7 _- v1 h0 U, c1 U7 Jint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ # ?' C" Z2 s( xint pc; /*进程现场信息,程序计数器内容*/ 0 j! v* @6 ~( R6 y6 l% yint psw; /*进程现场信息,程序状态字寄存器内容*/ 7 Q! D7 }# H9 f: [3 h/ cint next; /*下一个进程控制块的位置*/( b8 A3 V5 E) K- M! j$ f }pcbarea[n]; /*定义模拟进程控制块区域的数组*/+ m, Q- L$ P" O6 O" i int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/ ) [0 ^1 x0 W4 T( z. @; y4 cint run; /*定义指向正在运行进程的进程控制块的指针*/ ) ?( m, t7 I7 {struct" ~/ A; b" g- S( d4 x$ G! [ { + m/ X/ ~# s6 f/ |int head;9 F |- t/ S+ t5 ~ int tail;' e- L8 Z j, e" U" @. @% _" m }ready; /*定义指向就绪队列的头指针head和尾指针tail*// Y6 Y2 r* G2 J& r1 T9 M0 a int block; /*定义指向等待队列的指针*/4 H4 d7 j6 v% K6 `0 Y! `* _& Q int pfree; /*定义指向空闲进程控制块队列的指针*/1 g6 B+ j: @6 f" ~5 z main() 5 M* u8 x# h, g% [8 E6 |{ int gdriver=DETECT,gmode; + Q5 I2 b d8 J6 |, e5 b$ m" X int i,x,y;) d6 `+ T" M4 u# B1 J1 I9 c7 { for(i=1;i<=n;i++) 9 Z. u9 Z# C8 {- g) V( s {ready.head=pcbarea.next;} $ q5 j8 R' `3 d3 D initgraph(&gdriver,&gmode,"");4 E$ {' c1 c; ?8 |, A5 ?6 C0 k) n6 q, m setcolor(YELLOW);; y2 @) B7 Q# g2 N( M0 b for(i=1;i<=4;i++)0 K- }/ n$ P0 Z8 T) w" v { setfillstyle(8,i); % P5 Z8 B1 U% K1 p circle(284+13*i,190,6);4 w- ^; ^: N }) [' h* }! ~ floodfill(284+13*i,190,YELLOW);" L3 p1 M! ~6 { }7 T) p) ?8 ~( z( J9 e4 l6 Q setlinestyle(0,0,3); / u1 S' g7 E7 Y: } circle(316,190,25); , {& H) a% @' A$ ?/ V( P& X setcolor(5);& A- P3 S8 I' U& { settextstyle(3,0,4);" q; m5 b; u7 F: y8 ]* r' Z outtextxy(35,311,"press any key to create objects!");9 T6 P+ p3 ^6 X2 a9 D! s getch(); : h; d$ r- n, e2 G4 o/ [ setcolor(YELLOW);! |! d) w/ v/ P" w" X line(300,215,290,235);+ O3 o0 J5 `' O* g8 | line(323,215,333,235);( ?' U0 n& e: Y7 f- ~ delay(50000); + L; K9 |4 T/ |0 q; @) g( C setlinestyle(0,0,1); 1 {7 _, w& C4 C" @ for(x=1;x<=2;x++) 6 n2 {3 W$ ^# M+ j {setfillstyle(8,x); & i: L+ z7 W8 `. W circle(267+13*x,246,6); ' Y+ N& B% O$ D6 n. Z" @ floodfill(267+13*x,246,YELLOW); 4 o+ o9 D6 i$ i- v5 |+ i y1 n. t9 D }9 d- z, {1 \0 |! a( c" ?3 E8 I for(y=3;y<=4;y++) 8 G+ y' i( E8 [ @# B: h {setfillstyle(8,y); % a, S4 X P: q3 T9 m* q circle(285+13*y,246,6); 5 n$ Q! J3 r9 y; R9 j, }1 b floodfill(285+13*y,246,YELLOW);* j& T! o$ F6 g } 5 q5 p& f) i0 Y& Y setlinestyle(0,0,3); 9 e% Q4 t; h% v d w circle(287,246,14);8 Z7 @5 z6 ?8 s$ f/ B& M setlinestyle(0,0,3); + L T5 k& Z' } circle(330,246,14); ( d, _7 y5 M1 j7 M delay(50000); 5 k/ T+ a6 b8 [" ~5 P' c8 q line(281,260,281,280);) s: N0 X! K) r$ J2 \+ w5 n line(293,260,293,280);" p9 d4 O$ U5 j" x s# i) p line(322,260,322,280); / Z* W4 O, L8 M& y2 W( W) Q* H3 {# ~1 ` line(333,260,333,280); * {# V0 C: Y: g# Z+ ]5 Z delay(50000); 2 \7 {2 ^( R/ d u" |9 m setlinestyle(0,0,1); 8 _$ V% B0 f8 f7 F$ S. X setfillstyle(8,1);+ V+ j e$ y% I; C circle(281,286,6); & {3 p5 Y8 c8 k+ C% W7 g/ O# V0 w floodfill(281,286,YELLOW); 5 V# G8 q) a5 _. n# g setfillstyle(8,2);' W* v1 Y+ X: u3 C" O circle(293,286,6);, J& u7 f4 V4 h1 `- M3 a8 F floodfill(293,286,YELLOW); o; t- I) H3 Z& J7 H+ Q setfillstyle(8,3);7 [; i6 g! |4 V4 ]5 ]7 L/ m" @3 e circle(322,286,6);9 N+ I; ]7 `$ I! K+ |+ Z floodfill(322,286,YELLOW); % e3 m8 v9 w1 ]' \! X+ L setfillstyle(8,4);5 Y3 {+ n5 X* n1 D) ], L circle(333,286,6);% m5 ?, w$ W. }! Y! f! q8 y floodfill(333,286,YELLOW); : f7 q& g5 A) f- [' @! ~6 E getch();& F+ L/ M; G' Z) z$ l* t" S' ?$ L closegraph();5 J4 W1 w5 c: H* G# {, T8 { } 4 E$ C2 T$ e/ s7 p4 N/ m+ F! y * C2 E: _! T( i# Z; r . f6 X( l0 k; r! m! v6 [
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    7
    发表于 2003-10-21 18:58:00 | 只看该作者
    你在搞那么多画图干什么?你不是要做进程的创建吗??6 e+ v; T" ~, T8 g. [# O4 z
    难道不是《操作系统》的‘进程’那一章进程创建??) R3 y' @5 C$ e! V/ P% P6 k
    到底是要个什么效果??糊涂了
    towny 该用户已被删除
    8
     楼主| 发表于 2003-10-21 20:34:00 | 只看该作者
    手误贴错了!
    % C3 S0 l% S' I9 b3 ?不好意思!!
  • 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 | 只看该作者
    做了一半的半成品望斑竹指点!!+ L2 n1 h- } |+ t0 h8 O2 @9 b + _7 Q C" X' l9 B1 x i( _( Aint timecount=0;2 l* i; B7 s; T1 P7 D& a$ \0 N char far *indos_ptr=0;2 e( D( Z/ N9 a% l$ ] char far *crit_err_ptr=0; ' d2 a3 ]$ g/ B$ s! L" \int num=0,current=0,i;* I' Y- R2 `9 P/ H0 `3 n void over();) T2 f7 T$ f6 q& ^- R typedef int (far*codeptr)(void);$ n6 u' X: e+ A* { int create(char *name ,codeptr code ,int stacklen) 1 {0 b; I* D9 j5 V# u2 V" x{ - A3 j5 S4 x8 K% S& o- m5 P& Tunsigned int * s;9 P/ z, s0 Z: [- O9 {) t, M num++;) K! f g& \7 ^' P3 P tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));& [5 ^/ Z* s5 q' ?- ~2 }5 K tcb[num].state = READY; , Y* ~6 G1 ^( M! [ strcpy( tcb[num].name ,name);) O3 T" Z/ c, ~$ R! H tcb[num].ss = FP_SEG(tcb[num].stack);3 p7 t/ b% e* K tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); + ]" {) X6 h, t+ |$ H6 D; f, a5 \ *(tcb[num].stack+stacklen-1) = FP_SEG(over); $ Y" p, \# Y! e* k( H *(tcb[num].stack+stacklen-2) = FP_OFF(over); % x# J7 a {' L# ?- _ *(tcb[num].stack+stacklen-3) = 0x200; ; ?8 d1 F3 }& p *(tcb[num].stack+stacklen-4) = FP_SEG(code);- h( z6 x8 p( \* C& F! x+ { *(tcb[num].stack+stacklen-5) = FP_OFF(code); ; H- I6 C* Q1 s0 o: {+ D9 v8 p *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);- |" E, C% L5 | *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack);$ z0 ^! c$ |! `" \: v5 G return num; 3 S! g* }5 S: X} ;: P$ b9 m, M* N) ^( E n void interrupt (* old_int8)(void); * w% c$ B# i$ w* N: bvoid interrupt new_int8(void)" b- c2 Q9 P% }( [( y { 5 f3 i- `1 B+ M; D (*old_int8)(); 6 v5 d+ H+ D3 [: Y timecount++;/ x0 x9 M* R, t0 y( M5 x/ ^ if(timecount>=TL); 2 i% H+ S; x4 I+ i+ O if(!DosBusy()) / a" ~1 e: L$ [; x" t { 1 [. z8 x+ U! R: I5 ]/ O7 N disable(); 3 Z8 r) S$ y; t |' Z/ o tcb[current].ss=_SS; 9 T: b+ J9 _- L* b tcb[current].sp=_SP; + l% _: o7 H( F2 N6 J! s if(tcb[current].state==RUNNING)" M+ i: ?. @' [: Z$ f# M+ I tcb[current].state=READY; - |4 c5 K. t8 @' X, e2 z/ q current=3-current; # c! _; D1 n3 C+ n6 |. T6 dif(tcb[current].state==READY)1 ^# S4 T3 i4 f7 G' \. | { _SS=tcb[current].ss;* L5 U3 P7 c( ~, K _SP=tcb[current].sp; g! ~' F8 a. J8 B, z' x tcb[current].state=RUNNING;8 d: j2 u7 l. h: u timecount=0;6 l7 H% y. R3 K1 b" t4 g enable(); ( q$ z5 Z6 s7 @; u0 S} 0 w, w! ^0 P( _! N5 K) d+ b1 p} $ j9 t( D( z& S7 F9 M2 Z2 M9 g};% ?3 x: X8 y1 J, ] w8 L void tcb_state()- \+ q& W- j5 j$ l3 { {- ^+ u* E5 ?) c: C% ~/ ` int i; : s. C* Y- b7 |: Z for(i=1;i<=num;i++)1 m# u5 p8 R$ }- [& B printf("Thread %s is %d ",tcb.name,tcb.state); + K% A2 I+ T- M}; 3 v. L0 N: z6 o9 c; t3 Wint all_finished() 0 y0 S/ |- n% ?0 S* P{ , u& s' o. O0 J( g int i;: g6 [6 O5 l2 R$ U9 g0 C for(i=1;i<=num;i++)3 b' j1 j4 f& q% m" p if (tcb.state!=FINISHED) 1 I; J" g% K( X# W0 h return 0; " H4 W4 K% {0 _( ]. `+ P" Z return 1; , p+ P+ T1 q! _5 A- j& f" B. H% L( Z' W3 {. K/ W1 P8 W) I0 c }; 5 T. d3 E0 }) R9 pvoid interrupt swtch(void)' N% ]& b7 y! X u6 t( h$ b {9 P$ C" l; b; T( `9 m) {7 v. } int i; 8 J6 L) v5 _0 |9 A disable(); ' R9 K7 |3 x7 T, ]( {/ Q( y tcb[current].ss=_SS;' A- k6 p+ b" J+ Z tcb[current].sp=_SP; , x: R7 N* u% }& n: z( n) K if(tcb[current].state==RUNNING) - R: S7 D0 Z$ L7 o, v$ p8 o! u tcb[current].state=READY;9 \2 S8 @' q9 w0 C& W/ e2 m6 D for( i= current+1 ; i <= num;i++) 1 p2 u2 [$ X |; T) p { if(tcb.state == READY )' q. g% [; w4 q: d X! O goto excute; 9 R: i- ~1 `" x } " i1 e- p( u6 B$ g; c for( i = 1 ; i <= current ; i++): \1 l6 n9 X' G9 u. t }* ^ { if(tcb.state == READY)+ E/ I* G; }( n8 ^ goto excute;2 ]0 P8 [ J( W } " {" q& z# D" `- N6 E# \ i = 0 ; ' y. f* L! S* Z, z l excute:4 v( W% W5 j# q) M0 Z _SS = tcb.ss;6 v# ?' i8 N/ P8 X4 Y _SP = tcb.sp;9 Q8 g0 R, d3 P6 F" w tcb.state = RUNNING;8 a$ F$ k1 w/ l' D1 r+ \ current = i; / l/ j0 C7 h$ M enable();- ~) I! j6 \0 N0 c$ a9 i6 m }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    ) [$ _/ d+ ?2 I8 \0 Z给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    + Q8 T: y9 k9 v搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!, a$ b1 t0 y* q, b
    别占着茅坑不拉屎!
    # _9 y& C3 _$ @+ F  |
  • 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 | 只看该作者
    完成了你们看吧! # S$ l6 d- e; Z) Z k3 O5 B; }( A6 J0 M6 A+ ~0 v #include / R- {/ n( o) @3 {7 ` #include ( N, q7 g6 Y2 C* s6 ^1 e. h( y* }2 ^) D( Q #include $ k: v! [; o( [3 S #define GET_INDOS 0x34 5 k2 F; D* L0 W: T$ }5 V#define GET_CRIT_ERR 0x5d06 5 t# R3 |; Z" e+ i7 H% W#define FINISHED 0 , h% U8 {; h, @% B#define RUNNING 1 # y/ z+ D" u8 m#define READY 2 / m0 t+ \' F( @8 J#define BLOCKED 3 3 W- [+ ^! c; N" U- G#define Ntcb 8; v, ~5 T0 n( O0 B* G #define TL 1$ X+ r5 Y* i. l7 K struct tcb{6 g5 i) N/ x# L unsigned int * stack;/*堆栈的起始地址*/ " W e/ |) I& B# y& r* B4 i1 L unsigned ss; /*堆栈段址*/; {- r5 j5 p, w- l" _ unsigned sp; /*堆栈指针址*/ 9 D7 z: ^' b7 s2 c2 \" z$ e! ] char state; /*进程状态*/ 8 A8 U8 J+ P# P0 j& E' h char name[10];/*线程的外部标识符*/ - Y) N( v% c7 C% W# N }tcb[Ntcb]; /* 系统允许最多的任务数 */5 k0 O) k9 |/ t- Q& R# j int timecount=0;/ K, u8 o2 t& J char far *indos_ptr=0; * t; g& r3 N G; ^char far *crit_err_ptr=0;9 m! f5 J5 z" b8 N( L/ g int num=0,current=0,i; 9 Z* f6 e1 w( l! n3 n9 |% Yvoid over(); 8 B* e) d4 f4 btypedef int (far*codeptr)(void); . J' r# p! I/ o9 Q5 Fint create(char *name ,codeptr code ,int stacklen) + ^3 A. K0 Y! T7 V{ ( ^. {/ Z! N+ j6 G) Xunsigned int * s;& a$ l& T' A0 k/ s ~1 l1 ^/ Q1 Z) k num++;$ Q/ ~ H2 \5 r- {- v! Y3 A tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); ' }7 C: L8 l8 X! L6 y+ v tcb[num].state = READY; ' ] i) d* i1 a' q5 k0 M strcpy( tcb[num].name ,name);1 [ u5 Z* b% m& z) g$ d0 W* L tcb[num].ss = FP_SEG(tcb[num].stack); 5 p0 U% r% T) [ tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); , R' t6 x# c3 E8 X1 a, z& T" S *(tcb[num].stack+stacklen-1) = FP_SEG(over); 8 J# ^' Z+ r" J N/ ]3 B% }9 v- s *(tcb[num].stack+stacklen-2) = FP_OFF(over); & u3 c+ e$ y! U1 n0 f( B5 V& B. E *(tcb[num].stack+stacklen-3) = 0x200;/ M( A5 d; P1 V$ H *(tcb[num].stack+stacklen-4) = FP_SEG(code);; E5 `, _9 Y3 i *(tcb[num].stack+stacklen-5) = FP_OFF(code); # j9 z' k6 C" Q! `- u4 P& m *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); " D: F5 r1 M5 [* o5 L$ R& r T *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); 8 Y' y1 x1 A2 w+ _$ x: {: ]& b% R V return num; 7 L) V" a0 j7 g8 w8 m) t} ; ! A) B( T {7 a, K* h6 e+ h# u' e2 d8 ?void interrupt (* old_int8)(void); ! r: k6 x0 o3 y' h* r. a8 x void interrupt new_int8(void)3 U* V2 D9 h, u. U2 S$ [+ G1 k' o) ? {; K7 V; |) B: Y: Y (*old_int8)(); 9 W, [3 j- m& I& x5 x. _ timecount++;' r) f: C Z: I0 m3 Y; C4 P0 }" z if(timecount>=TL);- Z9 r% D m" U; a+ u- c if(!DosBusy()) ; n0 X5 s5 x. g( f {' x. ^& G1 p; ^ `3 e disable();* L' L' F6 H* m: A tcb[current].ss=_SS;; O; S+ K8 o L tcb[current].sp=_SP;5 D* a8 v; N1 r, ~% O5 {) o if(tcb[current].state==RUNNING) - \) V. Z' c* B. W; b6 l tcb[current].state=READY; & C5 |, p8 V0 V% L5 c0 q3 Q current=3-current; & a7 v6 {# h% e, u2 {if(tcb[current].state==READY) 9 }' C: i: T2 K \0 ^# i! ]' x4 Q& x{ _SS=tcb[current].ss; , s7 m X, Q8 F T _SP=tcb[current].sp;! P$ w$ f) d5 ~0 s8 i4 f tcb[current].state=RUNNING;( W! t7 I% l3 }& \; P; _! O2 L timecount=0;2 B/ f( Z" w& o% S enable(); : T, s- _" P& V8 Q! R} ) v2 ]* l& P9 \# V} ; e& k7 y4 Z+ @; X}; # ]7 r; U8 i6 X0 h8 `$ E* lvoid tcb_state() ' d% p' L7 u# C{ , t$ N, U- [) ~. L8 A( g7 | int i; 1 a$ n0 @. L3 [, X: o for(i=1;i<=num;i++) 8 n! Z8 y2 l) b3 k printf("Thread %s is %d ",tcb.name,tcb.state); # v: N' ?4 k. I6 C}; ; W0 H1 \4 u3 Iint all_finished() 6 i, @+ F/ t5 e% d6 G+ q{ / }% p, t A0 b int i;8 `, U) ]% @" U1 F for(i=1;i<=num;i++)3 p& S/ Y; F' m8 c4 W if (tcb.state!=FINISHED) ( {+ [% B2 [' [1 u2 ?: R return 0;9 I' ~- Y6 T- F+ A! u. x return 1; 8 N5 f6 k+ u" V0 r! w( ]+ P# `4 Z3 a };; o+ f3 }! H3 |4 e ? void interrupt swtch(void) $ Q! B& A8 O! w3 ~. F {{4 G: }- v' @6 o1 Q int i; . ~! m5 l" W9 y3 m2 p' U( w disable(); - e7 Z( N+ V K2 b; S- W2 B& y tcb[current].ss=_SS;9 a# m1 t; J9 g3 u1 R! I) D tcb[current].sp=_SP; W$ [, `$ {& A$ A if(tcb[current].state==RUNNING) " X! @ `- O* c6 w% ]: C4 Q& @& H tcb[current].state=READY;+ M$ | q; q S4 O7 S6 n for( i= current+1 ; i <= num;i++) ' ]- o" F1 s9 \% o7 n- M1 @& w { if(tcb.state == READY ) 0 I' x7 X! n! y* Q* T goto excute; - X+ o+ f! M$ r5 d+ E } - d* ^3 M0 ~8 f, g. @' t( q) N% K for( i = 1 ; i <= current ; i++) " c; N4 J+ b( R+ ]3 y+ F, E R { if(tcb.state == READY)7 C) E% i2 u3 @3 j goto excute; ) ?! Q3 V' @7 X: M: x6 K } 8 i# |) N4 C* P- P2 M; @ i = 0 ;+ |+ z7 L# w8 ^5 o @- t& f# B$ M excute:1 @' X1 K6 j8 H* u& Z @$ r' ` _SS = tcb.ss; f) d# L% y+ e5 f4 g! ` _SP = tcb.sp;$ v0 ]! U# n5 q# R" T2 q% y8 r tcb.state = RUNNING; 8 F* N! }% w# d; k8 }" r) M' J& W3 m# a current = i; 7 O: ~3 G& w% z! _( A enable();' s. N9 r W6 M& }2 l( p }. z5 v8 J. c: p5 c( p4 a /*-------------------------------------------------------------------------*/ ! I' M& n) i7 svoid over() o3 {7 {9 z0 p{ % ^( ]; Z7 x: d6 Y! ? P int i=current; o8 l% ?8 x7 p# @ o/ r+ C /*strcpy(tcb[current].name,'\0');*/. `& `7 h! i& {% w. z tcb[current].state=FINISHED; % W) m! X! g9 U4 w swtch();/ y/ k+ \" I# R free(tcb.stack);3 q# L! [- q% J }; / S8 R1 r2 Y# X6 N; c/*---------------------------------------------------*/; h6 G, z6 `9 e* n) m! E2 t void InitInDos(void) o, X7 T: \5 y1 N+ ]- {{, {/ y. C0 W3 J5 M8 O# @ union REGS regs;" f( }- \' ]% K5 i% J& m6 d4 P struct SREGS segregs; 4 I. s8 y- }; R0 E6 d2 {# T4 p% [ /* get the address to INDOS flag*/ # R1 X4 O- ]) L+ s( ]$ @ regs.h.ah=GET_INDOS;& t: w9 U9 S/ z! |& N intdosx(®s,®s,&segregs); ( d' _0 n: v o$ u! E indos_ptr=MK_FP(segregs.es,regs.x.bx);) ]! t, U% b/ j4 B b1 A /*get the address to CRIT_ERR flag*/) T B* g# u/ a+ q P. ?* m if(_osmajor<3) : ]& t$ T( o. j' A8 v0 Y4 Z crit_err_ptr=indos_ptr+1;7 m( `5 N, Z) E/ Q: ` else if (_osmajor==3&&_osminor==0) . Y7 ^6 n# _" ] K' w* v- k crit_err_ptr=indos_ptr-1;+ T+ G! s( [% M+ ~0 O1 b else ( v3 S$ v( G3 S/ R! R* \/ ^0 J {0 z6 Q% P k1 [! W regs.x.ax=GET_CRIT_ERR; : _7 P. A X8 r- P intdosx(®s,®s,&segregs); $ t! H3 \+ }7 M# J! y, {& ^. f crit_err_ptr=MK_FP(segregs.ds,regs.x.si); 2 _% W$ f4 G1 Q) W: p; y } + ]1 L7 e. r; o, q- V) R};7 l, z2 j7 Q- l6 G2 s3 f1 e int DosBusy(void) * c- D* }4 u1 r! Q. I* y$ r S* W{- p$ t' w1 N; W* j! y if(indos_ptr&&crit_err_ptr) $ _; w3 k' m* m& A \" f$ j: C return(*indos_ptr&&*crit_err_ptr);# E8 p/ G7 d; @* x" o3 u! X! I else " \& l8 w7 F/ x7 f. G return( -1);* B; G& b3 C t- ]; _0 C0 ]6 g }; . o! B- d* ]; M. S \void f1(void)3 p2 p& @( P" y2 n* b0 {5 Z( \ { 1 A* v6 D/ f1 x+ f& a int i,j,k;7 y; l$ P) Y$ _ for(i=0;i<40;i++) - h ]# n" o% c5 R { 3 F$ D. N$ j) i ?1 a putchar('a');: X. z/ N) t# ` + U1 q, \6 b H- d R2 O% X J: z for(j=0;j<1000;j++)3 z6 Z* J C- l1 }, E% v for(k=0;k<100;k++)' t$ P' y: I( d4 p ; + [, d! V2 Y: V" \& [* [ } + j, |% R1 m, c! P: ^8 y! e};; c3 T; f( ~. v0 j0 ` g void f2(void) " K1 e( D, ~( f+ K3 V* }* F% X$ ~{ . c+ G0 n5 @! H- C1 Y int i,j,k; T% \7 \# `2 _0 |% ~ for(i=0;i<30;i++) 7 }$ |- @4 g ^1 Q c" b6 d { " s# w. A# ], ^, Z* P putchar('b'); # m' u. @0 x6 ^6 k3 b for(j=0;j<1000;j++) 6 s/ |- D5 l8 F3 S' C" {, N5 w for(k=0;k<50;k++): J2 O# @) G3 Z% @ ;' |2 j# u5 I0 v( S. t3 j }2 r2 }7 k6 }3 t& ? };5 Q! G' L/ n4 I* ?( d& A8 e( r /*------------------------------------------*/; F/ W, t9 O, G3 S }2 d# w main()6 I' y' C: ^$ h1 G' y { ) l( Y; d2 r/ Z2 Z InitInDos();* ]- G# T( n6 I4 I/ V1 E( n old_int8=getvect(8);' X7 g8 _' L! x }" [6 A strcpy(tcb[0].name,"main");5 g) I0 n( ~; G tcb[0].state=RUNNING; 0 H! Z! `6 Q. @, a! t current=0;$ U; T9 X3 d1 a y. ~7 T create("f1",(codeptr) f1,1024); 4 f* b" ^, N: z create("f2",(codeptr) f2,1024);2 A& M% n7 i# f u; N tcb_state();- T1 l% e" l: W F0 Y setvect(8,new_int8);, F- G% N7 I1 z% N swtch(); 8 {& \, L* @. t. ~ while(!all_finished()); ) x3 J" X3 R; {8 c0 h7 o strcpy(tcb[0].name,'\0'); 3 A _2 a! p7 I: K tcb[0].state=FINISHED; : s k: a+ Y8 l* E setvect(8,old_int8);: k5 |4 J) g! U! b tcb_state(); L2 Z% z: x$ i printf("\n Multi_task system terminanted.\n");- p3 }2 c$ u+ E z: N* G6 d };
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!

    本版积分规则

    关闭

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

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