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

📄 page1.cpp

📁 一个内含进程管理、内存管理、文件管理的操作系统设计实现方案
💻 CPP
字号:
// Page1.cpp : implementation file
//

#include "stdafx.h"
#include "Property5.h"
#include "Page1.h"
#include "Page2.h"
#include"stdlib.h"
#include"string.h"

#include "menory.h"	//内存头文件

#include"exe.h"
#include"queue.h"                                  //创建进程队列数据结构
#include"systemp.h"                                  //模拟系统变量
#include"assertion.h"                                //函数声明
#include"createxe.h"
#include"equipment_mj.h"
#include"cpu.h"
//#include"file.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPage1 dialog


CPage1::CPage1(CWnd* pParent /*=NULL*/)
	: CDialog(CPage1::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPage1)
	m_pid = 0;
	m_local_time = 0;
	m_ir = _T("??");
	m_ac = _T("??");
	m_system_time = 0;
	m_result = _T("??");
	m_exe = _T("");
	//}}AFX_DATA_INIT
}


void CPage1::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPage1)
	DDX_Control(pDX, IDC_LIST4, m_list4);
	DDX_Control(pDX, IDC_LIST3, m_list3);
	DDX_Control(pDX, IDC_LIST2, m_list2);
	DDX_Text(pDX, IDC_EDIT3, m_pid);
	DDX_Text(pDX, IDC_EDIT4, m_local_time);
	DDX_Text(pDX, IDC_EDIT5, m_ir);
	DDX_Text(pDX, IDC_EDIT6, m_ac);
	DDX_Text(pDX, IDC_EDIT2, m_system_time);
	DDX_Text(pDX, IDC_EDIT7, m_result);
	DDX_Text(pDX, IDC_EDIT_create, m_exe);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPage1, CDialog)
	//{{AFX_MSG_MAP(CPage1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_WM_TIMER()
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BUTTON_create, OnBUTTONcreate)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPage1 message handlers



//m_page1.OnButton2();

void CPage1::OnButton2() 
{
		// TODO: Add your control notification handler code here
		
 		OnTimer(1);
	

}

void CPage1::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CString str[10];
	CString strLine;
	link p,q,s;
	int j,i;
	SetTimer(0,1000,NULL);

	if(count==0){initial();count++;}//系统初始
    cpu();
	m_system_time=system_time;
	m_local_time=local_time;
	m_pid=running->pid;
	m_ac=ac;
	m_ir=ir;
	
    //第一个列表控件的显示	
	if(psw_flag==1){m_result=temp[k];psw_flag==0;}
	i=0;
	p=ready_pcb.head->next;
	while(p){
		str[i].Format("%4d",p->pid);
		 //GetDlgItem(IDC_EDIT3)->SetWindowText(strLine);
		m_list2.InsertItem(i,str[i]);
		p=p->next;	
		i++;
		}
    //第二个列表控件的显示
	i=0;
	p=a_block_pcb.head->next;
	while(p){
		str[i].Format("%4d",p->pid);
		m_list3.InsertItem(i,str[i]);
		p=p->next;
		i++;
	}
	q=b_block_pcb.head->next;
	while(q){
		str[i].Format("%4d",q->pid);
		m_list3.InsertItem(i,str[i]);
		q=q->next;
		i++;
	}
	s=c_block_pcb.head->next;
	while(s){
		str[i].Format("%4d",s->pid);
		m_list3.InsertItem(i,str[i]);
	 	s=s->next;
		i++;
	}  
	p=a_using;
	if(p){
		str[i].Format("%4d",p->pid);
		m_list3.InsertItem(i,str[i]);
		i++;
	}
	for(j=0;j<2;j++){
		if(b_using[j]){
		str[i].Format("%4d",b_using[j]->pid);
		m_list3.InsertItem(i,str[i]);
		i++;
		}
	}
	for(j=0;j<2;j++){
		if(c_using[j]){
		str[i].Format("%4d",c_using[j]->pid);
		m_list3.InsertItem(i,str[i]);
		i++;
		}
	}


	//第二项的显示
	i=0;
	p=a_block_pcb.head->next;
	while(p){
		str[i].Format("%4d",p->wait_time);
		m_list3.SetItem(i,1,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		p=p->next;
		i++;
	}
	q=b_block_pcb.head->next;
	while(q){
		str[i].Format("%4d",q->wait_time);
		m_list3.SetItem(i,1,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		q=q->next;
		i++;
	}
	s=c_block_pcb.head->next;
	while(s){
		str[i].Format("%4d",s->wait_time);
		m_list3.SetItem(i,1,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
	 	s=s->next;
		i++;
	}  
	p=a_using;
	if(p){
		str[i].Format("%4d",p->wait_time);
		m_list3.SetItem(i,1,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		i++;
	}
	for(j=0;j<2;j++){
		if(b_using[j]){
		str[i].Format("%4d",b_using[j]->wait_time);
		m_list3.SetItem(i,1,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		i++;
		}
	}
	for(j=0;j<2;j++){
		if(c_using[j]){
		str[i].Format("%4d",c_using[j]->wait_time);
		m_list3.SetItem(i,1,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		i++;
		}
	}
	//第三个列表控件的显示
	//第二项的显示
    char used[5]="已用";
	i=0;
	p=a_using;
	if(p){
		m_list4.SetItem(i,1,LVIF_TEXT,used,0,0,0,LPARAM(0));
		i++;
	}
	for(j=0;j<2;j++){
		if(b_using[j]){
		m_list4.SetItem(i,1,LVIF_TEXT,used,0,0,0,LPARAM(0));
		i++;
		}
	}
	for(j=0;j<2;j++){
		if(c_using[j]){
		m_list4.SetItem(i,1,LVIF_TEXT,used,0,0,0,LPARAM(0));
		i++;
		}
	}
	//第三项的显示
	i=0;
	p=a_using;
	if(p){
		str[i].Format("%4d",p->pid);
		m_list4.SetItem(i,2,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		i++;
	}
	for(j=0;j<2;j++){
		if(b_using[j]){
		str[i].Format("%4d",b_using[j]->pid);
		m_list4.SetItem(i,2,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		i++;
		}
	}
	for(j=0;j<2;j++){
		if(c_using[j]){
		str[i].Format("%4d",c_using[j]->pid);
		m_list4.SetItem(i,2,LVIF_TEXT,str[i],0,0,0,LPARAM(0));
		i++;
		}



	
	
	
	
	
	}

	
	
	
	
	
	
	
	
	
	
	UpdateData(FALSE);

	CDialog::OnTimer(nIDEvent);
	
}


void CPage1::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	   
	// 内存显示
	CWnd   *pWnd=GetDlgItem(IDC_STATIC_MEN);   
          CDC   *pControlDC=pWnd->GetDC();   
          pWnd->Invalidate();   
          pWnd->UpdateWindow();   
          pControlDC->SelectStockObject(WHITE_BRUSH);   
          pControlDC->Rectangle(5,0,60,512);   

		  /*
		  int i,j;      
//初始化内存	
free_table[0].address=c_start; //客户区起始地址假定为30
 free_table[0].length=bigest-c_start;  //长度假定为512,即512b
 free_table[0].flag=1;   //初始空闲区为一个整体空闲区
 
 for(i=1;i<m;i++) 
  free_table[i].flag=0;  //其余空闲分区表项未被使用

 //已分配表初始化
 for(i=0;i<n;i++) 
  used_table[i].flag=0;  //初始时均未分配
		  
		  
		  
		 
	
		 
		  for(i=0;i<10;i++)
		  {
			if(used_table[i].flag!=0)
			{
			pControlDC->SelectStockObject(BLACK_BRUSH); 
				pControlDC->Rectangle(5,used_table[i].address,60,used_table[i].address+used_table[n].length);
			}
		  }
		 
		  for(j=0;j<0;j++)
		  {
			if(free_table[j].flag!=0)
			{
			    pControlDC->SelectStockObject(WHITE_BRUSH); 
				pControlDC->Rectangle(5,free_table[j].address,60,free_table[j].address+used_table[n].length);
			pControlDC->SelectStockObject(BLACK_BRUSH);
			pControlDC->Rectangle(5,0,60,20); 

			}

		  }
			
*/
		  
		  pWnd->ReleaseDC(pControlDC);   




	// Do not call CDialog::OnPaint() for painting messages
}
extern Status InsertListexe(exelist *l,pointer p);
extern Status InitListexe(exelist *l);

void CPage1::OnBUTTONcreate() 
{
	// TODO: Add your control notification handler code here
	exelist execute,*l;                          //可执行文件
	InitListexe(&execute);               //初始化可执行文件
	l=&execute;
    pointer p;
	char *a[]={"x=5","x++","x++","x--","!A3","!B4","x++","end"};
	for(int i=0;i<8;i++)
	{
		p=(pointer)(malloc(sizeof(exe)));
        strcpy(p->a,a[i]);
		p->next=NULL;
	    InsertListexe(l,p);

		  CWnd   *pWnd=GetDlgItem(IDC_STATIC_MEN);   
          CDC   *pControlDC=pWnd->GetDC();   
          pWnd->Invalidate();   
          pWnd->UpdateWindow();   
          pControlDC->SelectStockObject(WHITE_BRUSH);   
          pControlDC->Rectangle(5,0,60,512); 
		  pControlDC->SelectStockObject(BLACK_BRUSH);   
          pControlDC->Rectangle(5,492-10*i,60,512); 
	
	
	}
//	char *b[]={"x=3","x--","!b3","end"};
	create(&execute);	

 




}

//申请主存函数
void CPage1::distribute(int pid, int size)	//给pid,采用最佳分配算法分配size大小的空间
{
	
	int i,k; 
	int ad; 
	k=-1; 

 for(i=0;i<m;i++) //寻找空间大于size的最小空闲区登记项k 
  if(free_table[i].length>=size&&free_table[i].flag==1) 
  {
	  if(k==-1||free_table[i].length<free_table[k].length) 
		k=i;
  } 
   if(k==-1)//未找到可用空闲区,返回 
   { 
MessageBox("无可用空闲区"); 
    return; 
   } 

 //找到可用空闲区,开始分配:

 if(free_table[k].length-size<=minisize) //若空闲区大小与要求分配的空间差小于minisize大小,则空闲区全部分配;
 {  
  free_table[k].flag=0; 
  ad=free_table[k].address; 
  size=free_table[k].length; 
 } 
 else //若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配
 { 
  free_table[k].length=free_table[k].length-size; 
  ad=free_table[k].address+free_table[k].length; 
 } 
 
 //修改已分配区表
 i=0; 
 while(used_table[i].flag!=0&&i<n) //寻找空表目 
  i++; 

 if(i>=n) //无表目可填写已分配分区
 { 
MessageBox("无表目填写已分分区,错误"); 

  //修正空闲区表 
  if(free_table[k].flag==0) 
   //前面找到的是整个空闲分区 
   free_table[k].flag=1; 
  else 
   {//前面找到的是某个空闲分区的一部分 
    free_table[k].length=free_table[k].length+size; 
    return; 
   } 
 } 
 else 
 {//修改已分配表
  used_table[i].address=ad; 
  used_table[i].length=size; 
  used_table[i].flag=pid; 

  //////////////将内容赋值到内存中
//	for (i=ad;i<(ad+size);i++)			//&menory[ad]为首地址
//	  menory[i]='T';

return ;
	}

}


void CPage1::reclaim(int pid)		//回收内存函数
{
	int i,k,j,s,t; 
int S,L; 

 //寻找已分配表中对应的标志位 
 s=0; 
 while((used_table[s].flag!=pid||used_table[s].flag==0)&&s<n) 
  s++; 

 if(s>=n)	//在已分配表中找不到该进程pid 
 { 
MessageBox("找不到该进程\n"); 
  return; 
 } 

 //修改已分配表 
 used_table[s].flag=0; 

 //取得归还分区的起始地址S和长度L 
 S=used_table[s].address; 
 L=used_table[s].length; 
 j=-1;k=-1;i=0; 

 //寻找回收分区的空闲上下邻,上邻表目k,下邻表目j 
 while(i<m&&(j==-1||k==-1)) 
 { 
  if(free_table[i].flag==1) 
  { 
   if(free_table[i].address+free_table[i].length==S)k=i;//找到上邻
   if(free_table[i].address==S+L)j=i;					//找到下邻 
  } 
  i++; 
 } 

 if(k!=-1) 
  if(j!=-1) 
  //上邻空闲区,下邻空闲区,三项合并 
  { 
   free_table[k].length=free_table[j].length+free_table[k].length+L; 
   free_table[j].flag=0; 
  } 
  else 
  //上邻空闲区,下邻非空闲区,与上邻合并 
   free_table[k].length=free_table[k].length+L; 
 else 
  if(j!=-1) 
  //上邻非空闲区,下邻为空闲区,与下邻合并
  { 
   free_table[j].address=S; 
   free_table[j].length=free_table[j].length+L; 
  } 
  else 
  //上下邻均为非空闲区,回收区域直接填入 
  { 
   
	//在空闲区表中寻找空栏目
   t=0; 
   while(free_table[t].flag==1&&t<m) 
    t++; 
   
   if(t>=m)		//空闲区表满,回收空间失败,将已分配表复原 
   { 
MessageBox("主存空闲表没有空间,回收空间失败\n"); 
    used_table[s].flag=pid; 
    return; 
   } 

   free_table[t].address=S; 
   free_table[t].length=L; 
   free_table[t].flag=1; 
  } 

   //////////////将内容赋值到内存中
//	for (i=S;i<(S+L);i++)
//		menory[i]='0';
 return; 

}

void CPage1::Integration()	//合并碎片
{
		int i,j=0;
	int min;
	int x,y;
	struct use t;
	min=c_start;

for(x=0;x<10;x++)			//用冒泡排序将分配表按首地址从小到大排列
	for(y=0;y<10-j;j++)
		if(used_table[y].address>used_table[y+1].address)
		{	
			t=used_table[y];
			used_table[y]=used_table[y+1];
			used_table[y+1]=t;
		}

	for(i=0;i<10;i++)
	{	if (used_table[i].flag!=0)		//判断该分配表是否有效,
		{
			if(used_table[i].address>min)	//判断该分配表地址前是否有空闲区
			{	
				for(j=0;j<used_table[i].length;j++)	//有空闲区,则将其数据缩进
				{
				menory[min+j]=menory[used_table[i].address+j];
				menory[used_table[i].address+j]='0';
				}
				used_table[i].address=min;		//将分配表地址修改
			
			}	
				min=used_table[i].address+used_table[i].length;	//min为下个空闲区起始地址
		}
	}

	//空闲分区表初始化
	free_table[0].address=min; 
	free_table[0].length=bigest-min;
	free_table[0].flag=1;   //空闲区为一个整体空闲区
	for(i=1;i<m;i++) 
	free_table[i].flag=0;  //其余空闲分区表项未被使用

}

⌨️ 快捷键说明

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