下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]
towny 该用户已被删除
跳转到指定楼层
1
发表于 2003-10-20 12:59:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
create()  创建一个进程* E; w9 M$ c7 {
要求:1 用c语言编写
- s5 _- \- N! I7 i+ N* D( ]  c; n         2 程序+PCB(ID的内外优先权,申请资源)
" |6 w6 ?8 O( b/ T5 T0 a% ^1 J; h只需做进程中”产生“这一步。# ]# y3 m( _' d& `9 X
以下是做了3分之1的范例:
, M$ }& G3 V; B' S' J#include "stdio.h" . }( c# }4 o4 U4 I5 l
#define running 1 /*用running 表示进程处于运行态*/
7 U- M% ]% u$ k#define aready 2 /*用aready表示进程处于就绪态*/
/ f8 G: P+ J( A$ l9 e#define blocking 3 /*用blocking表示进程处于等待态*/
$ L1 f4 W) Z4 G0 n3 c#define sometime 5 /*用sometime 表示时间片大小*/
: S9 m( _- k- ]#define n 10 /* 假定系统允许进程个数为10 */
# l2 P" c( J9 j+ k! s0 l# r
8 D" R! B) X5 {6 W* }" Cstruct
% z# F" i: y3 p1 \3 G{ ) x. t7 \/ k. b% [! q& w% s7 Y
int name; /*进程标识符*/
+ ~2 v: ]& U3 `6 Eint status; /*进程状态*/
; X& j6 n1 j; bint ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/ 9 m2 W; m1 d8 o( ]
int pc; /*进程现场信息,程序计数器内容*/
, ~+ u; {, S4 Z+ u- l2 c% rint psw; /*进程现场信息,程序状态字寄存器内容*/
/ i. a% p% P  `  j7 b& l* i$ Jint next; /*下一个进程控制块的位置*/
1 z4 h0 ]% [# C. M) i. \& T}pcbarea[n]; /*定义模拟进程控制块区域的数组*/ ' b: F, \: |$ v
' S7 E- t0 c8 |: W! p2 r9 u
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
. h5 y. E$ r( ?/ R) [; W0 U" C5 ?- m  r
int run; /*定义指向正在运行进程的进程控制块的指针*/
5 ]& R5 Y" f5 V& P% S, ~struct & T& B7 }5 ~  @' z2 N9 P: Q0 a' c3 x
{
4 T6 c& Q/ s. I) ?7 q( b4 Yint head;
0 j0 D' Q5 l" G, \4 Bint tail;
! B4 G9 O. g3 |9 `}ready; /*定义指向就绪队列的头指针head和尾指针tail*/ % S0 i8 D/ B8 y: q
int block; /*定义指向等待队列的指针*/
: v4 \1 t- Y. g! @* n0 pint pfree; /*定义指向空闲进程控制块队列的指针*/$ `. o8 g3 A" n3 ^

8 c& p: Q7 L% k麻烦各位高手了,望帮忙解决一下,急啊!~~!!!!![em00]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    28
    发表于 2003-12-30 20:24:00 | 只看该作者
    空的。http://www.bb1459.com/beibei1.htm是你的主页?9 h( @, s+ [& G) m
    以下是引用andycl在2003-12-22 22:35:00的发言:$ l/ _( m; b; A- f5 Z3 q4 k6 h
    & h, a0 Q, \! x9 d

    ! ?+ L4 q3 y6 x0 G: C# |% Q/ P9 v www.bb1459.com
      k( M( _$ h. b9 G; Y
    - K3 k2 B* p' }5 E5 w
      Y6 n! X5 Y4 H4 r! N5 K% y( o
    [此贴子已经被作者于2003-12-22 22:43:33编辑过]

    2 B2 X7 q7 F, g

    该用户从未签到

    27
    发表于 2003-12-22 22:35:00 | 只看该作者

    , Y) V6 Y& R$ g% P
    8 R8 F- t8 U" W: ^2 Y) s& L+ k# r. [! N1 b% Z7 H1 i- B1 O
    www.bb1459.com
    7 Z' }: `6 d* _* m8 Y, y  B. t7 n; B. X+ j( P9 w
    * [+ @: d( {! |
    [此贴子已经被作者于2003-12-22 22:43:33编辑过]

    " R  @% ]$ ]6 J4 h# s( O+ r

    该用户从未签到

    26
    发表于 2003-12-8 21:03:00 | 只看该作者
    想学好编程,看了书以后就拼命的去看代码,网上找,然后不懂查书,查资料,自己试着写代码,就会发现,哎呀,我怎么也成高手了。
    # `6 E/ ]# e3 s声明:本人菜鸟
    bigfoot 该用户已被删除
    25
    发表于 2003-10-31 22:36:00 | 只看该作者
    我感到楼主有把课堂作业拿到这里请人代劳之嫌,嘿嘿
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    24
    发表于 2003-10-28 21:20:00 | 只看该作者
    不是吧,我好心帮你思考,花费时间,我哪里伤害你??
    towny 该用户已被删除
    23
     楼主| 发表于 2003-10-28 20:07:00 | 只看该作者
    嘿嘿!!
    - _3 s4 b( B( D- e, Q+ [好向是你们说话伤人在先啊!!0 P) Y3 I0 t2 C
    我只是以牙还牙而已罢!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    22
    发表于 2003-10-27 13:29:00 | 只看该作者
    由于我没有TC(现在开发都在用VC),所以你程序我也没有去编译和仔细看过,语法或者逻辑问题统统也就忽略了。
    , y7 F7 X9 s0 F  W7 }- U$ q2 N& j8 t6 e* W; z: V* k5 f3 j
    另外欢迎侮辱我,但是不要侮辱这个版块 ok?
    , J+ ?9 y* [1 I0 `这里毕竟来的大都是初学的人,你侮辱这里不就是在侮辱他们?
    + f/ L/ Z# F) e! W9 b+ V; q你以后水平真的很强了,那么我想就不会怎么急噪了,生怕别人不知道你很牛了。; e! j" t" s% g) P9 h
    [此贴子已经被作者于2003-10-27 13:32:55编辑过]

    $ D5 C+ H' @8 k3 o# T
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    21
    发表于 2003-10-27 13:27:00 | 只看该作者
    你学习的是操作系统还是炸药系统?是吃了火药吗?8 C1 F2 R4 v4 L% S+ x. E2 T
    那么在这里这么样的叫嚷到底是为了什么呢?
    / K% E6 w( p! H& y; ~7 L: u1 w代码也贴出来了,大家也看了,然后要我怎么样?& Q6 W* Z* m1 f/ g$ j2 m2 ^! Y
    说:“哇!好强的代码!”?我想你自己都会起鸡皮疙瘩吧?6 c/ M& E0 t" r7 Q
    难道我欠了你钱五年没有给你利息?还是我欠了你什么?
    % P* D1 B8 P* q( q9 l$ y: d& p. h
    另外说实话,你的这段程序模拟了最基本的进程创建,同时并没有考虑到更深的东西,看你的tcb的结构就知道了(古老的教学tcb),建议去看看linux的代码,看看那里都为进程的正常运行都准备了什么,如果你不管进程是要运行东西的,只管能够建立和灭亡,那么就到此为止就行了。另外能说什么呢?难道说你在等待allfish的时候每次设置中断函数 setvect(8,old_int8); 比较浪费?好象没有什么意思。因为你程序的目的就是能跑完,那么现在应该是能跑完了,那么就结了啊。& Q: e3 S4 k% j
    [此贴子已经被作者于2003-10-28 7:59:52编辑过]

    ) y$ V* @0 z$ J. v/ ?
    towny 该用户已被删除
    20
     楼主| 发表于 2003-10-27 11:58:00 | 只看该作者
    我不想灌水,也根本不想在这样的版块浪费时间!!
    towny 该用户已被删除
    19
     楼主| 发表于 2003-10-27 11:56:00 | 只看该作者
    完成了你们看吧! - d3 f E3 Z: V7 K/ V" z( D5 O+ G; p7 K, V/ z, z #include 5 q% d9 Y/ M6 G& f! E1 m3 C. \#include 8 m @7 a; D$ ~+ D6 S% C#include 4 W: R- A! ~8 d/ A #define GET_INDOS 0x34 6 `9 s; k" R1 ] A0 f9 V6 h' y- O; {#define GET_CRIT_ERR 0x5d06 # ?3 |: F, d+ U$ K3 x#define FINISHED 0 / B" F0 a8 @9 F$ n9 W. f#define RUNNING 1' ]% B+ K$ `; v4 C. x" H1 @8 ]) W% E #define READY 2 / y4 x" `/ E& I. e& a( _+ j/ |#define BLOCKED 3 / x' z% c4 j2 f# r#define Ntcb 8 0 b1 r. G$ D+ s6 A5 `#define TL 17 h$ y' {# j- o4 `8 O. _& {0 J struct tcb{5 q1 H9 {6 ^& c" p% V3 `0 k/ S0 y unsigned int * stack;/*堆栈的起始地址*/2 t0 ?; z" o- N5 f* [7 ~7 o unsigned ss; /*堆栈段址*/ % S( V9 |9 E8 K2 p+ r& {; w unsigned sp; /*堆栈指针址*/. Z( ^( ^ n3 _$ ` char state; /*进程状态*/' v s, g1 B$ h | char name[10];/*线程的外部标识符*/ ( G3 e" `: d% t/ g }tcb[Ntcb]; /* 系统允许最多的任务数 */ 2 s; v! D5 i% r2 }9 M! W: x" wint timecount=0; 6 \3 G+ M; Q7 v) T0 J) K$ Xchar far *indos_ptr=0; , R! ]1 J1 L: S/ lchar far *crit_err_ptr=0; . L4 r( { o% `/ T) ]/ F1 p) kint num=0,current=0,i; ( C2 B5 o: r. mvoid over();& h: c$ S0 J" \0 m typedef int (far*codeptr)(void);6 z1 J& p) y$ X int create(char *name ,codeptr code ,int stacklen)2 H# b5 p1 N- v2 }! Y1 ^1 N { - ~( c0 n6 D N* K: e, Uunsigned int * s;0 T2 G. z& U! V" I5 G8 K num++;5 _3 c, H# X" o/ h0 _& `& I tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int));: Q1 x& {8 E4 I tcb[num].state = READY; % L; l4 |# g. F" L7 V7 ]6 e' Y strcpy( tcb[num].name ,name); ! n3 r1 V6 T5 j# H* f6 L tcb[num].ss = FP_SEG(tcb[num].stack);, K- R4 Z$ r$ j( r5 ~' h tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); * g3 E& s+ I: S; z- ] *(tcb[num].stack+stacklen-1) = FP_SEG(over);) c! i4 \5 s4 N0 V C8 h- m6 L *(tcb[num].stack+stacklen-2) = FP_OFF(over);" F% {% K3 S9 d V *(tcb[num].stack+stacklen-3) = 0x200;- W/ W# {5 j0 Z" |' t1 S: ^ *(tcb[num].stack+stacklen-4) = FP_SEG(code); 8 V1 e z( F4 a, W b9 d6 p$ ^ *(tcb[num].stack+stacklen-5) = FP_OFF(code);; c! D4 S, K" N8 g' B6 E1 w *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack); Z J6 y* {+ @0 U0 y *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); ! K7 `; |: g. Z4 q/ ^1 | return num; , _# |9 X, u$ ^! d) f} ; ( @7 L7 b: G+ O# |7 Z7 X* \void interrupt (* old_int8)(void); ) Y3 ?3 u: ~8 V# }, T5 uvoid interrupt new_int8(void)' j: ]7 Z% s/ V3 K/ n1 ` {# x+ d+ T5 H7 `+ N' U9 { (*old_int8)(); / ?8 N H4 R- |; T3 _ timecount++;' j2 n& X2 O1 ~ if(timecount>=TL); + {3 \9 l8 i. Z3 X2 M if(!DosBusy())3 k- X# R/ e1 N0 I, Z { ( E* Z# m& }0 {: v' o* S A disable(); % i) N$ D) S+ V6 F6 S8 ^' i/ H8 n4 ^ tcb[current].ss=_SS; # O |6 K2 x y3 F r6 Q9 n tcb[current].sp=_SP; # P5 B1 [, k2 p1 @5 D if(tcb[current].state==RUNNING) " `1 Q, D7 o* }- F8 ~5 W4 F tcb[current].state=READY;5 \& B0 d. x. `+ X; a' T current=3-current; 1 r3 Q. N/ V2 z- Vif(tcb[current].state==READY) # L3 a+ o7 ]5 D, N8 L! h. O9 D+ Z{ _SS=tcb[current].ss; 9 D3 P k% O; U: s4 h6 q3 Q6 ]8 h _SP=tcb[current].sp; 3 L3 X: N6 }) ~$ t1 _ tcb[current].state=RUNNING; $ L2 j1 ?2 I" `; @ timecount=0; : S1 S$ X7 ~$ X. z enable(); : O3 ]2 B+ f8 r0 `: m- _2 k6 k/ B/ p} }# h% ~/ T8 V } # c7 W* u% Z, N' j# Y5 y! z# c};! J( k/ _: ~' s+ p. P% I1 q void tcb_state() 6 U, \/ B- [1 Z" W{ ( _* O. {5 p1 C0 Q, B+ V int i; 7 r2 u( _) G1 A for(i=1;i<=num;i++) 3 _6 Z& ^% Y& S0 H1 L2 h printf("Thread %s is %d ",tcb.name,tcb.state);' \# O. S) ?4 R% q; J }; , z: |2 q+ X& `int all_finished() ! X& Z2 D4 J8 O) |{ : \5 E/ a2 `' s4 C. {8 ~1 l1 t6 B int i;. F, Z" H0 N2 a1 o9 H! W0 `( E for(i=1;i<=num;i++)- B- `# ?! d* e; z" H if (tcb.state!=FINISHED) . a# n% S0 N9 p' U6 d return 0;# X8 Q) n# [% W5 @* k return 1; ! ^5 b. p/ L8 e( J' W% M/ z; Y1 ?) `" J" Z0 W/ y" c$ a9 N! p };$ E) P; M; B! \& k/ q3 a* Y void interrupt swtch(void) ' O) a) R9 D2 C+ N6 Z5 [{ " G3 m# D: j' [4 a! Aint i;; b( N* H' a# {9 a disable();+ x! g& c5 V8 T& l: ^# L2 } tcb[current].ss=_SS;8 v/ B. J: P. A" a1 B tcb[current].sp=_SP; ' B# [7 M* K( i6 c6 k if(tcb[current].state==RUNNING) ! { ?+ r) o& S ^( N9 ^ tcb[current].state=READY;6 t: J4 l! i8 S for( i= current+1 ; i <= num;i++) 4 Z: K$ r5 Z8 e# U) U { if(tcb.state == READY )) Q, a6 V8 C# v2 K goto excute; ' K4 a, r! F" A }% B9 A1 S$ X' j8 `, s4 W for( i = 1 ; i <= current ; i++) , X: I# n0 o$ s: `% H" n { if(tcb.state == READY) " z+ E' L4 m* _5 ?& Y+ _2 q goto excute;- t- N0 f! S" X9 \ }; Y0 N. F5 T# m i = 0 ; . v/ \1 z/ x, a, v0 b excute: ( W1 _6 W' T9 L; o _SS = tcb.ss; 5 D/ d2 C7 A3 c) ]1 h _SP = tcb.sp; ! X$ N- B6 z' c' S# l" A3 p tcb.state = RUNNING; C/ Q6 V# n7 a3 j5 k current = i;" E) g; \8 |: l enable();7 m* B, C' n/ t& K9 Y+ ~$ z }' H! z3 u. ?# H /*-------------------------------------------------------------------------*/1 f5 X1 j4 ~9 s2 U7 F+ s void over()9 X3 ?$ @/ {* S; Q( Q! V' G3 M {# u! Z% S( t# j5 V' ?9 l int i=current; 3 P/ R9 R. j+ z+ K0 U# F /*strcpy(tcb[current].name,'\0');*/ 5 c' q) ?2 Y8 g tcb[current].state=FINISHED; x4 \ K+ ^+ Z2 G5 d* H( `# q) V5 \ swtch(); 6 A1 i L, C& Z" l9 K& X free(tcb.stack); 0 M3 d' {: [) L};2 Q% \ m- |2 A p /*---------------------------------------------------*// j, }1 t6 Q0 w" D void InitInDos(void), m# p0 B% G( c {# ]( j- P& ~, Z0 z+ e' ` union REGS regs; & l1 y& _6 ]) }0 N! E! T( x$ ^ struct SREGS segregs; a1 k6 \7 m" _* ^, m# _( ^5 }8 k /* get the address to INDOS flag*/ 1 Q# u0 z9 G9 S5 Y& v0 s+ _ regs.h.ah=GET_INDOS; # x7 [' o3 n% a* s3 h intdosx(®s,®s,&segregs); 8 [; p/ ~ }* a }2 P; {6 @' g; @3 V' S8 s indos_ptr=MK_FP(segregs.es,regs.x.bx); : ~5 ~/ K, L3 y9 i& q4 p& h S w /*get the address to CRIT_ERR flag*/ ) Z) w7 V/ M' Y- n+ Y4 H if(_osmajor<3) 3 \" z; _* B3 R crit_err_ptr=indos_ptr+1;$ @$ Y- D9 ~% ?) l: h" w+ M+ w else if (_osmajor==3&&_osminor==0) 1 g0 M- w3 E2 E# v9 ?. @- w crit_err_ptr=indos_ptr-1;" F6 U6 Q$ `& e/ @ else) {, U, e4 Y: d3 Y3 h; c% r" y {( S4 o# H! o* n V$ ?2 t- V) I regs.x.ax=GET_CRIT_ERR; - ^& i, ?+ @! P intdosx(®s,®s,&segregs); 3 `+ L6 s( Z% V& P7 ^- F0 U crit_err_ptr=MK_FP(segregs.ds,regs.x.si);% |% E A( I: q6 m9 z" U: B7 g& } }" Y$ n9 ]$ T( u/ j: S. ]+ ?) h1 q }; P$ g8 Y) p9 Yint DosBusy(void)# D) N2 F" U7 C: c { 1 R( ]- N, d [$ k( K5 X if(indos_ptr&&crit_err_ptr)* d4 x* M, B1 L return(*indos_ptr&&*crit_err_ptr);* T+ j+ U' N. ^ Z; H9 F else c" B4 n* A1 m) H0 \, x/ ? return( -1); + Q+ Y2 B) y1 L5 t/ I8 K# l A};" M" n) r/ B( I% I5 B& i+ S3 O/ a void f1(void)4 K/ m' N1 b& F( B8 C" G { - z7 T! q. k! n" j9 e int i,j,k; , Y6 |+ f: b/ R- u Q( e" Z for(i=0;i<40;i++) 8 B4 W f; H& w: [3 ~7 e { + @+ B9 p; o9 k* [ F putchar('a');( T* h' k% @' L $ L6 V1 J1 ]5 K9 H5 q( P for(j=0;j<1000;j++)8 m1 I- ]9 _) F8 u: M for(k=0;k<100;k++) * t2 c8 f1 y0 c; v+ R ;, b# }- A$ B0 `+ P( r } " w6 L* n. u9 y- S; o& M}; ! E# u& T& r) X: r" v/ cvoid f2(void)* U3 G; j2 }3 t% W! R. T {$ {# z) m3 K- A' X5 d ?2 X int i,j,k; ) _. v0 v& W& N& [8 d N for(i=0;i<30;i++)# a% g0 `: N* U7 U6 q {' e: x! l8 h5 k" k( M putchar('b');* K+ r! c1 E% k for(j=0;j<1000;j++) , F5 R4 V; C" z for(k=0;k<50;k++) 6 y w0 ~9 I) N7 `) j, O: ~5 M7 x8 U ;6 F f7 m5 A! u- F7 F } 5 N9 `) F# C, g) n( Z; c};" J7 u2 b9 |* y6 l8 ? /*------------------------------------------*/) C3 ]- ]" O3 {- G main() 2 B: J3 e5 h- F) @2 n{, R J, S/ {9 m) h InitInDos();7 e3 @0 r" U* J4 h& @ old_int8=getvect(8);8 r. e" P% U& R) ], o, i# d strcpy(tcb[0].name,"main"); 0 F& C% ]0 @, K& {/ J# J tcb[0].state=RUNNING;; _& x9 t7 l+ J2 Z3 z current=0; * I) W- ?$ p* q( Z" K9 k- m create("f1",(codeptr) f1,1024); . S7 { Y4 W _ create("f2",(codeptr) f2,1024); 1 e" q: S8 L2 ~5 \/ H tcb_state();: @: z" }) K, K8 x- r8 R8 O setvect(8,new_int8);/ o$ V9 A$ ^3 L8 Y$ {1 q swtch();. q2 V9 b0 S) L4 ]' ]2 m7 Q while(!all_finished()); 5 l3 v6 ^: k( p5 j' V% C: E strcpy(tcb[0].name,'\0');) t2 _9 E- s! |3 F k tcb[0].state=FINISHED;5 m8 v; n! [- C O) z setvect(8,old_int8); 5 g6 P" u3 Z2 d1 U$ @+ k tcb_state(); 9 u% J; W9 x9 L# J+ C printf("\n Multi_task system terminanted.\n");4 [4 t, H5 ~! G' o };
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    18
    发表于 2003-10-27 10:57:00 | 只看该作者
    感觉楼主有踢馆的味道哦。HOHO,还是希望楼主先把自己写过的代码全贴出来吧,不然我们就怀疑楼主是不是弄懂了操作系统的进程原理呢,而怀疑楼主是不是随便到网络上拷一段牛头不对马嘴的代码过来,要我们怎么看?因为从上面的代码看,没有完整的代码数据结构都搞不零清啊,况且为你解答不是我们必尽的义务,也希望态度好一点,如果是希望斑竹退位,哈哈……,随便啦。
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    17
    发表于 2003-10-25 16:47:00 | 只看该作者
    我一直都等待强人的参与,十分欢迎。我没有权限加你为斑竹,‘煎饼’ 看到请满足他。
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    16
    发表于 2003-10-25 16:39:00 | 只看该作者
    您来,我让位
    towny 该用户已被删除
    15
     楼主| 发表于 2003-10-24 21:58:00 | 只看该作者
    你要是不懂就让位!1 L% q* q0 G4 ?
    别占着茅坑不拉屎!
    7 A) d  T4 O  U) r
    towny 该用户已被删除
    14
     楼主| 发表于 2003-10-24 21:48:00 | 只看该作者
    操!
    ) b4 C) d8 Y# D" A: Z& ^4 S搞什么脾气啊!一个斑竹有什么了不起的啊垃圾!!
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    13
    发表于 2003-10-24 18:02:00 | 只看该作者
    指点什么呢?效率?方法?还是编程格式?
    9 ]8 B1 F4 c# I" @给一篇代码给别人叫别人指点?我从来没有过。
    towny 该用户已被删除
    12
     楼主| 发表于 2003-10-23 23:08:00 | 只看该作者
    做了一半的半成品望斑竹指点!! / C* k `# Q* w q' W % O3 i+ h- k+ h/ O9 nint timecount=0;7 Q0 L9 m9 ]8 e9 K char far *indos_ptr=0; 9 `8 s$ y+ Y7 }8 l5 M% ichar far *crit_err_ptr=0;1 @% p$ x. C: I int num=0,current=0,i; 3 |9 n0 t9 i( @0 e( e) O0 tvoid over(); . P8 W1 c! H3 P% \typedef int (far*codeptr)(void); / z0 ^$ ~" Q- \- rint create(char *name ,codeptr code ,int stacklen) ; v8 z" ?, F( v/ ]8 [3 h{ 5 A/ s, ^) r, T5 uunsigned int * s;# H+ p7 E& L M) Z2 s num++;6 L$ M* r" g+ h" O tcb[num].stack =(unsigned int*) malloc( stacklen*sizeof(int)); 9 _- ^( u+ O }1 q" k tcb[num].state = READY; X4 F' a$ l' n5 O* P7 o! M strcpy( tcb[num].name ,name); # p* z/ L% C& J+ B* u+ H tcb[num].ss = FP_SEG(tcb[num].stack);$ Y6 O( @0 i6 n( s2 | tcb[num].sp = FP_OFF(tcb[num].stack+stacklen-14); % ]* | y+ E1 _: M *(tcb[num].stack+stacklen-1) = FP_SEG(over);5 k9 D3 m2 r( Z: n, L+ D' i; J *(tcb[num].stack+stacklen-2) = FP_OFF(over);4 \& g/ R; Q" V6 B3 d( a *(tcb[num].stack+stacklen-3) = 0x200; + i; Z3 T' Z: n9 H# Y& R2 d *(tcb[num].stack+stacklen-4) = FP_SEG(code); 4 E5 \. C6 Y$ @# g *(tcb[num].stack+stacklen-5) = FP_OFF(code);- M3 _- r% _1 o$ `! ` *(tcb[num].stack+stacklen-10) = FP_SEG(tcb[num].stack);3 M% l# }' `" R! W- i7 Q7 @ *(tcb[num].stack+stacklen-11) = FP_SEG(tcb[num].stack); $ v+ [# Z. m" U4 C. P# o+ A return num; 8 ~8 ?# B! h* C8 \7 D! C# Y; w} ;. P9 L2 v1 Y; W. Z void interrupt (* old_int8)(void); + g+ v/ T' |# ?# g void interrupt new_int8(void) 2 U7 B7 z& y4 A, @% m$ U1 l7 B{ : |; `7 ]5 S8 c- _ (*old_int8)();9 x8 ^3 ^* m& f5 m0 V( ]5 w timecount++; ' a( ~9 b4 l, x; o' X) I if(timecount>=TL);+ b, h7 R& N- \6 w2 \! l if(!DosBusy()) 3 E4 ^4 ^- S% A6 V { 9 I8 k6 p# w6 l# ` Q! F disable(); 8 N8 u# A7 }, E tcb[current].ss=_SS; " q; t/ I, z/ [ n- m tcb[current].sp=_SP; $ c6 Q/ B, f( x5 \ w if(tcb[current].state==RUNNING) + u6 V3 v* X7 ^ tcb[current].state=READY; % ^& b9 @( i5 `! ~% u7 z current=3-current;: f& A+ C6 u7 ^0 f( Q if(tcb[current].state==READY): P% ]1 f p2 |: J' M5 X* {3 f j2 E { _SS=tcb[current].ss;) c x! `7 A! P& _) Y _SP=tcb[current].sp;) b- A' p- s) Z4 r6 e+ `' P tcb[current].state=RUNNING;# W' q5 D( w, P0 q) M7 V9 g timecount=0; & z6 r/ @+ P Z4 J1 x) n; H enable(); 4 s% j9 v$ G4 y" n) q} % v" n* I& F' C" u- `4 z; S9 R} ' a; @) T- e$ `: ]};: n: Q1 m$ S) s. z) i5 a void tcb_state()$ Z5 d5 i& A9 `9 n/ e H0 e' C; `6 g { + v8 ]# Q( {' y- b* n9 u int i;& @7 p2 N1 W6 l6 b9 W! t for(i=1;i<=num;i++)& [0 R- B) f R2 L: i printf("Thread %s is %d ",tcb.name,tcb.state);7 X* b6 @7 U! ~3 h# j- ] }; $ n$ L% i3 k' a2 ?- H; Uint all_finished() * N3 b& w5 Z1 Z3 @{ % X9 ~/ _, J0 ?( w int i; + i7 p7 q( i/ g) t for(i=1;i<=num;i++)& B* r' A( g2 F3 ?% f% `& q if (tcb.state!=FINISHED) ; \( w0 R. k( ~( }5 A return 0; ( w+ a( a8 x9 T8 @0 } V: E8 b return 1;- ]+ E, X) _4 j) ~ 1 {! {/ ?$ K1 ]! \* O }; + R: v2 b8 l9 Bvoid interrupt swtch(void)& T9 R6 t7 `! `$ ` {. m' A2 V% C k/ \8 |3 N4 J: \ int i; 4 G, G# q$ L! z disable();5 i6 d+ O% S# Z( a tcb[current].ss=_SS; ) Y& Z5 v, F0 h& j tcb[current].sp=_SP; . ^5 I5 N& A! k1 C/ a5 u/ O- v6 U if(tcb[current].state==RUNNING)) n( A5 O! I( u7 \1 s7 M8 ~ tcb[current].state=READY; 0 Y* J6 P- `7 G9 a for( i= current+1 ; i <= num;i++) # ?/ m6 w, ]# ?0 w( d* z { if(tcb.state == READY ) 2 m2 u& `8 @, k1 Q8 u- j9 e goto excute;$ l( Y# Z7 g8 Q. M" ^3 O V' h# P }! v3 L& y+ A- d: [* S( U8 S for( i = 1 ; i <= current ; i++) 8 x0 V z( B* z/ C5 V$ M { if(tcb.state == READY) r s% h0 u: |0 K9 ^! a goto excute;6 A1 g1 u2 b1 o; ~ } 0 o5 R( u! d; B* ?. x; C: | i = 0 ;" z7 F; p6 v0 R" q* c3 T5 w excute: $ y, N. J/ C/ f# Z' A: U+ M _SS = tcb.ss;% b# O6 f' C! S* i" Y* v+ S W _SP = tcb.sp;$ e8 v* P) \6 M9 U! r tcb.state = RUNNING; @- Y ^; y0 w9 |% i current = i; " t# L7 ~ v, i enable();+ Y; M' _! k8 O2 x. r }
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    11
    发表于 2003-10-22 21:09:00 | 只看该作者
    等待楼主的高见。
  • TA的每日心情
    无聊
    2015-1-16 14:36
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    10
    发表于 2003-10-22 21:09:00 | 只看该作者
    狂晕,这个手误也太离谱了。
    关闭

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

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