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

📄 mos_proc.cpp

📁 用VC编写的一个微型操作系统
💻 CPP
字号:
// Mos_proc.cpp: implementation of the CMos_proc class.
// Wrote by biti_zx. Released March,2002.
// Copyright (C) 2002 by biti_zx.
// All rights reserved.
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Mos.h"
#include "Mos_proc.h"
#include "Mos_io.h"
#include "Mos_stor.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern PCB m_pcb;
extern JCB m_jcb;
extern CVCS m_cpu;
extern CMos_io m_io;
extern CMos_stor m_stor;
CMos_proc::CMos_proc()
{

}

CMos_proc::~CMos_proc()
{

}

void CMos_proc::creat(pcbtype *p,jcbtype* pJ)
//仅由jsw调用执行
//仅用作创建用户进程。创建系统进程不在此列,另作处理
//前提:PCB、内存已申请成功
{	
	p->errn = 0;
	p->io = 0;
	p->next = NULL;
	p->mode = USERMODE;
	p->flag = READY;
	p->resultline = 0;
	p->regc = '0';//初始化寄存器
	p->regpc[0] = p->regpc[1] = '0';
	p->jcb = pJ;
	p->cputime = 0;//time
	for(int i = 0;i<=3;i++)
		p->regr[i] = '0';
/////////////////////////////////////////初始化PCB//////////////////////
	rearrange(p,m_pcb.readypcbhead,m_pcb.readypcbtail,p->mode,IDC_STATIC_CP);	//将p挂入就绪队列
}

void CMos_proc::halt(int e)
{
////////////////////////////////////////////////////////回收内存////////
	int m=m_pcb.curr_pcb->regptr[1]-0x30+2;//memory:op2
	int allocmem=(m_pcb.curr_pcb->regptr[2]-0x30)*10+m_pcb.curr_pcb->regptr[3]-0x30;
	memtype* p=&m_stor.MEMTB[allocmem];
	m_stor.mem_free(m,p);
	if(m_stor.MEMFRC==30) m_UI.UpdateListAll(IDC_LIST1);
	else for(int i=0;i<(m-1)*11;i++)
			m_UI.UpdateList(IDC_LIST1);
	if(m_pcb.waitmem_head!=NULL) wakeup(MEMFULL);
/////////////////////////////////////////////////////////填JCB//////////
	m_cpu.time = 0;//用户进程撤销,time置零
	m_pcb.curr_pcb->jcb->jc = m_cpu.C;
	m_pcb.curr_pcb->jcb->jpc[0] = m_cpu.PC[0];
	m_pcb.curr_pcb->jcb->jpc[1] = m_cpu.PC[1];
	for(m=0;m<=3;m++)
		m_pcb.curr_pcb->jcb->jr[m] =m_cpu.R[m];
	m_pcb.curr_pcb->jcb->jio = m_pcb.curr_pcb->io;
	m_pcb.curr_pcb->jcb->resultline = m_pcb.curr_pcb->resultline;
	m_pcb.curr_pcb->jcb->jcputime = m_pcb.curr_pcb->cputime;
	m_pcb.curr_pcb->jcb->error = e;
	if(e>0){
		int addr;
		addr=(m_cpu.PC[1]-0x30)*10+m_cpu.PC[0]-0x30;
		m_pcb.curr_pcb->jcb->eraddr = addr;
	}
///////////////////////////////将当前进程挂入自由队列<=>回收PCB表///////
	rearrange(m_pcb.curr_pcb,m_pcb.pcb_free_head,m_pcb.pcb_free_tail,0);
	m_pcb.free_pcb_count++;
	CString str;
	str.Format("%d",PCBMAX-m_pcb.free_pcb_count);
	m_UI.DealWithUI(str,IDC_STATIC_PN);
	if(m_pcb.waitpcb_head!=NULL) wakeup(PCBFULL);
/////////////////////////////////////////////////挂入输出作业队列///////
	if(m_jcb.out_head == NULL)
	{
		m_jcb.out_head = m_jcb.out_tail = m_pcb.curr_pcb->jcb;
		m_pcb.curr_pcb->jcb->jnext = NULL;
	}
	else{
			m_jcb.out_tail->jnext = m_pcb.curr_pcb->jcb;
			m_jcb.out_tail = m_jcb.out_tail->jnext;
			m_pcb.curr_pcb->jcb->jnext = NULL;
	}
	m_pcb.curr_pcb = NULL;
	m_UI.DealWithUIEx(NULL,IDC_STATIC_CP);
	if(m_pcb.waitout_head!=NULL) wakeup(OUTNULL);
}

void CMos_proc::sleep(int reason)
{
	switch(reason)//挂睡眠队列
	{
	case 1:rearrange(m_pcb.curr_pcb,
			         m_pcb.restkb_head,
					 m_pcb.restkb_tail,m_pcb.curr_pcb->mode,IDC_STATIC_RKB);break;//IORESTKB
	case 2:rearrange(m_pcb.curr_pcb,
			         m_pcb.restprt_head,
					 m_pcb.restprt_tail,m_pcb.curr_pcb->mode,IDC_STATIC_RPRT);break;//IORESTPRT
	case 3:rearrange(m_pcb.curr_pcb,
			         m_pcb.restdsk_head,
					 m_pcb.restdsk_tail,m_pcb.curr_pcb->mode,IDC_STATIC_RDSK);break;//IORESTDSK	
	case 4:m_pcb.waitpcb_head = m_pcb.curr_pcb;
		   m_UI.DealWithUIEx(m_pcb.waitpcb_head,IDC_STATIC_WPCB);break;//PCBFULL
	case 5:m_pcb.waitjcb_head = m_pcb.curr_pcb;
		   m_UI.DealWithUIEx(m_pcb.waitjcb_head,IDC_STATIC_WJCB);break;//JCBFULL
	case 6:m_pcb.waitout_head = m_pcb.curr_pcb;
		   m_UI.DealWithUIEx(m_pcb.waitout_head,IDC_STATIC_WOUT);break;//OUTNULL	
	case 7:m_pcb.waitmem_head = m_pcb.curr_pcb;
		   m_UI.DealWithUIEx(m_pcb.waitmem_head,IDC_STATIC_WMEM);break;//MEMFULL
	case 8:rearrange(m_pcb.curr_pcb,
			         m_pcb.dsk_head,
					 m_pcb.dsk_tail,m_pcb.curr_pcb->mode,IDC_STATIC_WDSK);break;//DSKFULL
	case 9:m_pcb.kbend_head = m_pcb.curr_pcb;
		   m_UI.DealWithUIEx(m_pcb.kbend_head,IDC_STATIC_WJOB);
		   break;//KBEND
	case 10:m_pcb.jcbnull_head = m_pcb.curr_pcb;
		    m_UI.DealWithUIEx(m_pcb.jcbnull_head,IDC_STATIC_WRJ);
		    break;//JCBNULL
	default:break;
	}
	if(m_pcb.curr_pcb->mode == USERMODE)
	{
		m_pcb.curr_pcb ->regc = m_cpu.C;//保存现场
		m_pcb.curr_pcb->regpc[0] = m_cpu.PC[0];
		m_pcb.curr_pcb->regpc[1] = m_cpu.PC[1];
		for(int i=0;i<=3;i++)
			m_pcb.curr_pcb->regr[i] =m_cpu.R[i];
	}
	m_pcb.curr_pcb->flag = SLEEP;
	m_pcb.curr_pcb = NULL;//相当关键的一个处理!
	m_UI.DealWithUIEx(NULL,IDC_STATIC_CP);
}

void CMos_proc::wakeup(int reason, int chno)
{
	pcbtype* p = NULL;
	CString str;
	switch(reason)//取队首进程
	{
	case 1:p =GetQueueHead(m_pcb.restkb_head,m_pcb.restkb_tail,IDC_STATIC_RKB);
		   p->iorbp = NULL;
		   break;
	case 2:p =GetQueueHead(m_pcb.restprt_head,m_pcb.restprt_tail,IDC_STATIC_RPRT);
		   p->iorbp = NULL;
		   break;
	case 3:p =GetQueueHead(m_pcb.restdsk_head,m_pcb.restdsk_tail,IDC_STATIC_RDSK);
		   p->iorbp = NULL;
		   break;
	case 4:p = m_pcb.waitpcb_head;
		   m_pcb.waitpcb_head = NULL;
		   m_UI.DealWithUIEx(NULL,IDC_STATIC_WPCB);
		   break;//PCBFULL
	case 5:p = m_pcb.waitjcb_head;
		   m_pcb.waitjcb_head = NULL;
		   m_UI.DealWithUIEx(NULL,IDC_STATIC_WJCB);
		   break;//JCBFULL
	case 6:p = m_pcb.waitout_head;
		   m_pcb.waitout_head = NULL;
		   m_UI.DealWithUIEx(NULL,IDC_STATIC_WOUT);
		   break;//OUTNULL
	case 7:p = m_pcb.waitmem_head;
		   m_pcb.waitmem_head = NULL;
		   m_UI.DealWithUIEx(NULL,IDC_STATIC_WMEM);
		   break;//MEMFULL
	case 8:p =GetQueueHead(m_pcb.dsk_head,m_pcb.dsk_tail,IDC_STATIC_WDSK);
		   break;
	case 9:p = m_pcb.kbend_head;
		   m_pcb.kbend_head = NULL;
		   m_UI.DealWithUIEx(NULL,IDC_STATIC_WJOB);
		   break;//KBEND
	case 10:p = m_pcb.jcbnull_head;
		    m_pcb.jcbnull_head = NULL;
		    m_UI.DealWithUIEx(NULL,IDC_STATIC_WRJ);
	default:break;
	}
	if(chno > 0&&m_io.CHHEAD[chno-1]!=NULL)
	{
		m_cpu.CHST[chno-1] = BUSY;
		if(chno < 3)
			m_cpu.CHCOUNT[chno-1] = 3;
		else m_cpu.CHCOUNT[chno-1] = 1;
		str.Format("%d",m_cpu.CHCOUNT[chno-1]);
		m_UI.DealWithUI(str,IDC_STATIC_IOKB-chno+KB);
	}
	p->flag = READY;
	rearrange(p,m_pcb.readypcbhead,m_pcb.readypcbtail,p->mode,IDC_STATIC_RP);
	//挂入就绪队列
}

void CMos_proc::rearrange(pcbtype* &p, pcbtype* &head, pcbtype* &tail, int tag,int ID)
{
	if(head == NULL){
		head = tail = p;
		p->next = NULL;
	}
	else{
			if(tag == 0){//user mode
				tail->next = p;
				tail = tail->next;
				p->next = NULL;
			}
			else if(tag == 1){
				p->next = head;
				head = p;
			}
	}
	if(ID!=0)
		m_UI.DealWithUIEx(head,ID);
}

pcbtype* CMos_proc::GetQueueHead(pcbtype* &queuehead,pcbtype* &queuetail,int ID)
{
	pcbtype* p = NULL;
	if(queuehead!=NULL){
		p=queuehead;
		if(queuehead->next==NULL)
			queuehead=queuetail=NULL;
		else queuehead=queuehead->next;
		p->next = NULL;
	}
	if(ID!=0)
		m_UI.DealWithUIEx(queuehead,ID);
	return p;
}

⌨️ 快捷键说明

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