⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu.h

📁 一个内含进程管理、内存管理、文件管理的操作系统设计实现方案
💻 H
字号:

void initial()
{   //系统初始化
	int i;                                        //循环标号
	link p;                                    
	system_time=0;                                //初始系统时间为0,每执行一条指令增一                                        
	id=1;                                         //初始进程号,以后的进程号由此递增
	local_time=5;                                 //初始时间片为3'
	psw_flag=0;
    for(i=0;i<5;i++) wake[i]=NULL;
	
//初始空队列
	InitList(&ready_pcb);
	InitList(&empty_pcb);
	for(i=0;i<10;i++)
	{   //创建10个空队列
		p=(link)malloc(sizeof(pcb));
		InsertList(&empty_pcb,p);
	}
	create_idle();                                //创建闲逛进程
	idle->status=2;                                //修改进程状态为运行
	running=idle;                                 //系统初始时为运行idle进程
	pc=running->ppc;   
	Initial_equp();
}

void cpu()
{
	 check_interrupt();
     execute_one();
	 equipment();
}
void execute_one()
{
	strcpy(dr,pc->a);
    strcpy(ir,dr);
	system_time++;
	local_time--;
	if(local_time==0) psw=2;
	if(ir[0]=='x'&&ir[1]=='=') strcpy(ac,ir);
	if(ir[1]=='+'&&ir[2]=='+')  ac[2]=ac[2]+1;
	if(ir[1]=='-'&&ir[2]=='-')  ac[2]=ac[2]-1;
	if(ir[0]=='e'&&ir[1]=='n'&&ir[2]=='d')  psw=1;        //程序结束的优先级更高
	if(ir[0]=='!'){psw=4;return;}                             //程序I/O中断的优先级跟高
	if(ir[0]=='?')    strcpy(ac,ir);  
	pc=pc->next;
}

Status create(exelist *l)
{
	link p;
	char a[4]="0";
	if(empty_pcb.len!=0) p=DeleteList(&empty_pcb);
	//初始化进程控制块
	p->base=l->head;
	p->next=NULL;
	p->pid=(id%100);
	p->ppc=p->base->next;
	p->status=1;
	p->wait_time=0;
	strcpy(p->temp_result,a);
	InsertList(&ready_pcb,p);//将进程插入就绪队列
	id++;
	return OK;
}
void check_interrupt()
{
	extern exelist *l;
	link q;
	int i=0;
	if(psw)                                   //检查系统是否有中断
		{
			switch(psw){
			case 1:i=i%10;
				   k=i;
				   psw_flag=psw;
				   strcpy(temp[i++],ac);          //程序结束
				   q=running;
				   running=schedul(running);
				   destory(q);              //释放进程内存
				   break;
			case 2:running=schedul(running);      //时间片到
				   break;                         //(ok)
			case 3:awake(); 
				   break;                        // 结束I/O中断
			case 4:halt=running;
				   block();               //需要I/O
			       running=schedul(running); 
				   break;
			case 5://on_create=l;
				   //create(on_create);
				   break;                        //psw=5,需要创建进程  
			default:break;
			}
		}
}

link schedul(link r)
{	
	link q;                                  //指向pcb块
	linklist *l;
	l=&ready_pcb;                            //l指向就绪队列
	r->ppc=pc;
	strcpy(r->temp_result,ac);
	if(psw==2&&r->pid!=0)InsertList(&ready_pcb,r);	
	if(l->len==0)q=idle;                     // 就绪队列为空
	else  q=DeleteList(&ready_pcb);
	pc=q->ppc;
	strcpy(ac,q->temp_result);
	local_time=5;                             //重设时间片为3
	psw=0;                                   //清除中断
	r=q;
	return q;	
}

Status  create_idle()
{
    extern Status InitListexe(exelist *l);
	extern Status InsertListexe(exelist*l,pointer p);
	pointer q;                            //指向可执行文件的一条指令
	link p;                               //指向pcb
	exelist execute;                      //可执行文件
	char a[4]="???";
	InitListexe(&execute);               //初始化可执行文件
	q=(pointer)(malloc(sizeof(exe)));
    strcpy(q->a,a);
	InsertListexe(&execute,q);
	q->next=q;
	if(empty_pcb.len!=0) p=DeleteList(&empty_pcb);
	//初始化进程控制块
	p->base=execute.head;                //指向可执行文件头部
	p->next=NULL;                        //指向下一个进程
	p->pid=0;                            //闲逛进程id为0
	p->ppc=p->base->next;                //指向下一条可执行指令,即当前可执行指令
	p->status=0;                         //状态为新建
	p->wait_time=0;                      //等待设备得时间为0
	idle=p;
	return OK;
}
Status block()
{
	link p;
	p=halt;
	p->ppc=pc; 
	strcpy(p->temp_result,ac);           //保存cpu现场
	p->status=3;
	p->ppc->a[2]-=48;
	switch(p->ppc->a[1]){
	case 'a':;
	case 'A':InsertList(&a_block_pcb,p);
			 printf("a Insert\n");
		    break;
	
	case 'b':;
	case 'B':InsertList(&b_block_pcb,p);
		     break;
			  printf("b end\n");
	case 'c':;
	case 'C':InsertList(&c_block_pcb,p);
		     break;
	 printf("c end\n");
	default: break;}
	printf("block end\n");
	return OK;
}
Status awake()
{  //when psw=3
	int i;
 	for(i=0;i<5;i++)
	    if(wake[i]) 
		InsertList(&ready_pcb,wake[i]);
	return OK;
}	
void destory(link p)
{
	free(p->base);
	InsertList(&empty_pcb,p);
	p=NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -