HDU操作系统程序设计

这个程序设计弄得我蛋痛,到最后也只是把调度弄好了。消息缓冲队列还是没弄好。

星期三就要考试了。悲剧。不管了。。

现在把我的代码公布一下。

做这个程序设计一定要先看那本实验书,然后看看汇编语言的相关内容。然后不懂的一定要问老师。 😯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#include <stdio .h>
#include <stdlib .h>
#include <dos .h>
#include <string .h>
 
#define FINISHED 0   /*结束*/
#define RUNNING 1    /*运行*/
#define READY  2      /*就绪*/
#define BLOCKED 3     /*阻塞*/
#define NTCB 10   /*系统最多线程数,其中0号为系统0#线程对应main函数*/
#define TL 2  /*时间片轮转大小*/
 
#define GET_INDOS 0x34  /*取得INDOS标志*/
#define GET_CRIT_ERR 0x5d06 /*取得严重错误标志*/
 
int current;       /*时间片轮转调度记数*/
int timecount=0;     /*永远指向当前线程*/
 
char far*indos_ptr = 0;
char far*crit_err_ptr = 0;
 
typedef int (far *codeptr)(void);  /*断间调用函数*/
 
void InitInDos(void);
void InitTcb() ;
int DosBusy(void);
int find();
void interrupt(*old_int8)(void);   /*原来INT 08的入口地址,并保存*/
void interrupt new_int8(void);
void create(char *name,codeptr code,int stacklen);
void Over() ;
void Destory(int i);
void tcb_state();
void interrupt swtch();
void f1(void);
void f2(void);
int all_finished();
 
struct int_regs {   /*线程信息*/
  unsigned bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags,off,seg;
};
 
struct TCB {       /*线程控制块TCB*/
	unsigned char*stack;   /*堆栈的起始地址*/
	unsigned ss;    /*堆栈段址*/
	unsigned sp;    /*堆栈指针*/
	char state;     /*进程状态*/
	char name[10];  /*线程名*/
}tcb[NTCB];     /*系统允许的最多任务数为10*/
 
void InitInDos(void)   /*得到 INDOS 和 CRIT_ERR 的标记的地址*/
{
	union REGS regs;
	struct SREGS segregs;
 
	regs.h.ah=GET_INDOS;   /*得到 INDOS flag的地址*/
	intdosx(&regs,&regs,&segregs);
	indos_ptr=MK_FP(segregs.es,regs.x.bx);
 
	if(_osmajor<3)
		crit_err_ptr=indos_ptr+1;
	else if(_osmajor==3&&_osminor==0)
		crit_err_ptr=indos_ptr-1;
	else        /*得到 CRIT_ERR flag的地址*/
	{
		regs.x.ax=GET_CRIT_ERR;
		intdosx(&regs,&regs,&segregs);
		crit_err_ptr=MK_FP(segregs.ds,regs.x.si);
	}
}
 
void InitTcb()  /*初始化TCB*/
{
  int i;
  for(i=0;i<ntcb ;i++)
  {
	 tcb[i].name[0] = '\0';
     tcb[i].state = FINISHED;
  }
}
 
int DosBusy(void)   /*如果 DOS 忙,返回没空间*/
{
	if(indos_ptr&&crit_err_ptr)
		return(*indos_ptr||*crit_err_ptr);
	else
		return(-1);
}
 
int find()
{
	int i;
	for(i=1;i<ntcb;i++)
	{
		if(tcb[i].state==READY)
			return(i);
	}
	return 0;
}
 
void interrupt new_int8(void)  /*新的时钟中断,中断产生间隔TL*/
{
	int i;
	(*old_int8)();
	timecount++;
	if(timecount==TL)
	{
		if(!DosBusy())
		{
			disable();
			tcb[current].ss=_SS;
			tcb[current].sp=_SP;
			if(tcb[current].state==RUNNING)
				tcb[current].state=READY;
			i=find();
			_SS=tcb[i].ss;
			_SP=tcb[i].sp;
			tcb[i].state=RUNNING;
			current=i;
			timecount=0;
			printf("\n %s is running\n",tcb[i].name);
			enable();
		}
	}
}
 
void f1(void)
{
	int i,j,k;
	for(i=0;i<40;i++)
	{
		putchar('a');  /*延时*/
		for(j=0;j<1000;j++)
			for(k=0;k<1000;k++);
	}
	i=1;
}
 
void f2(void)
{
	long i,j,k;
	for(i=0;i<30;i++)
	{
		putchar('b');  /*延时*/
		for(j=0;j<1000;j++)
			for(k=0;k<5000;k++);
	}
	i=1;
}
 
 
void create(char *name,codeptr code,int stacklen)
{
	int i,flag=0;
	unsigned char *p;
	struct int_regs *q;
	for (i=1;i<ntcb;i++)
	{
		if(tcb[i].state == FINISHED)
		{
			strcpy(tcb[i].name,name);
			tcb[i].stack = (unsigned char *)malloc(stacklen);
            p = tcb[i].stack+stacklen;
			q = (struct int_regs *)p-1;
 
			q -> ds = _DS;
			q -> es = _ES;
			q -> ip = FP_OFF(code);
			q -> cs = FP_SEG(code);
			q -> flags = 0x200;
			q -> off = FP_OFF(Over);
			q -> seg = FP_SEG(Over);
 
			tcb[i].sp = FP_OFF(q);
			tcb[i].ss = FP_SEG(q);
			tcb[i].state = READY;
            flag=1;
		    break;
		}
	}
	if(flag == 0)
		printf("Sorry.No free TCB!\n");
}
 
void Over()   /*撤销线程函数*/
{
    Destory(current);
	swtch();
}
 
void Destory(int i)  /*释放线程私有堆栈*/
{
    if(tcb[i].state == RUNNING)
	{
		disable();
		tcb[i].state = FINISHED;
		free(tcb[i].stack);
		enable();
	}
}
 
void tcb_state()
{
	int i;
	for(i=0;i<10;i++)
	{
      printf("Thread %d state is:\t",i);
	  if(tcb[i].state == FINISHED)
		  printf("FINISHED!\n");
	  else if(tcb[i].state == RUNNING)
		  printf("RUNNING!\n");
	  else if(tcb[i].state == BLOCKED)
		  printf("BLOCKED!\n");
	  else
		  printf("READY!\n");
	}
}
 
void interrupt swtch()   /* CPU调度 ,线程切换 */
{
	int i;
	disable();
	tcb[current].ss=_SS;
	tcb[current].sp=_SP;
	if(tcb[current].state==RUNNING)/*把正在处于执行态RUNNING的线程变成就绪态READY*/
		tcb[current].state=READY;
	i=find();    /*选择空闲的线程*/
	if(i<0)
		i=0;
	_SS=tcb[i].ss; /*把现在系统寄存器_SS和_SP的内容放到线程里面的堆栈段址ss和堆栈指针sp*/
	_SP=tcb[i].sp;
	tcb[i].state=RUNNING; /*把选择好的线程变成执行态*/
	current=i;  /*根据调度条件进行选择线程号码*/
	/*printf("%s is running!\n",tcb[i].name);*/
	enable();
	/*tcb_state();*/
}
 
int all_finished()  /*判断所有线程是否结束*/
{
   int i;
   for(i=1;i</ntcb><ntcb ;i++)
   {
	  if(tcb[i].state!=FINISHED)
		  return 0;  /*0为没有全部结束*/
   }
   return 1;  /*1为线程全部结束*/
}
 
 
main()
{
	InitInDos();  /*初始化 DOS*/
	InitTcb();   /*初始化 TCB*/
	old_int8=getvect(8);
    /*创建0#线程*/
	strcpy(tcb[0].name,"main");
	tcb[0].state=RUNNING;
	current=0;
 
	create("f1",(codeptr)f1,1024);
	create("f2",(codeptr)f2,1024);
    tcb_state();
 
	setvect(8,new_int8);
	swtch();  /*切换进程*/
 
	while(!all_finished()); /*终止多任务系统*/
	tcb[0].name[0]='\0';
	tcb[0].state=FINISHED;
	setvect(8,old_int8);
 
    tcb_state();
	printf("\n Multi_task system terminated. \n");
	getchar();
}

>> 若为原创,转载请注明: 转载自Laycher's Blog

>> 本文链接地址: HDU操作系统程序设计

>> 订阅本站: http://feed.feedsky.com/laycher



无觅相关文章插件,快速提升流量

《HDU操作系统程序设计》有4个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注