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

📄 os1dlg.cpp

📁 主存空间的分配和回收 可变分区管理方式下采用首次适应算法实现主存分配和回收
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		        baseaddr.Format("%d",pCur->BaseAddress);
		        pCur->BaseAddress=pCur->BaseAddress+atoi(allocnum);
		        pCur->FreeLength=pCur->FreeLength-atoi(allocnum);
		        if (pCur->FreeLength==0)
				{
		      	pCurrent->pNext=pCur->pNext;
		        delete pCur;
				}
		        pHead1=pnew;
		        pnew->pNext1=NULL;
		        ProList(proname,baseaddr,allocnum);
		        OnAllocDraw(pnew->proBaseAddress,atoi(allocnum));
		        OnPaint();	
			  }
		       return;
			}
	     	else
			{ 
				pCur=pCur->pNext;
		        pCurrent=pCurrent->pNext;
			}
		 }
		}
		else
		{    
			 CFREEMEM *pCurr=NULL;
             pCurr=pCurrent;
		     if(pCurr->FreeLength>=atoi(allocnum))
			 {  
				 pCurrent1=pHead1;
			    if (pCurrent1!=NULL)
				{
	              while(pCurrent1->pNext1!=NULL)
		           pCurrent1=pCurrent1->pNext1;
		         COSPRO *pnew;
	             pnew=(COSPRO *)(new COSPRO);
		         pnew->proName=proname;
		         pnew->proLength=atoi(allocnum);
		         pnew->proBaseAddress=pCurr->BaseAddress;
		         baseaddr.Format("%d",pCurr->BaseAddress);
		         pCurr->BaseAddress=pCurr->BaseAddress+atoi(allocnum);
		         pCurr->FreeLength=pCurr->FreeLength-atoi(allocnum);
		         if (pCurr->FreeLength==0)
				 {
			      if (pCurr->pNext!=NULL)
				  { 
					  pHead=pCurr->pNext;
					  pCurr=NULL;
				  }
				  else
				  {
				    pCurr=pHead=NULL;
				  }
				 }
		         pCurrent1->pNext1=pnew;
		         pnew->pNext1=NULL;
		         ProList(proname,baseaddr,allocnum);
		         OnAllocDraw(pnew->proBaseAddress,atoi(allocnum));
		         OnPaint();
			  }
			  else
			  { 
		        pHead1=(COSPRO *)(new COSPRO);
		        COSPRO *pnew;
	            pnew=(COSPRO *)(new COSPRO);
		        pnew->proName=proname;
	        	pnew->proLength=atoi(allocnum);
		        pnew->proBaseAddress=pCurr->BaseAddress;
		        baseaddr.Format("%d",pCurr->BaseAddress);
		        pCurr->BaseAddress=pCurr->BaseAddress+atoi(allocnum);
		        pCurr->FreeLength=pCurr->FreeLength-atoi(allocnum);
		        if (pCurr->FreeLength==0)
				{
		      	   if (pCurr->pNext!=NULL)
				  { 
					  pHead=pCurr->pNext;
					  pCurr=NULL;
				  }
				  else
				  {
				    pCurr=pHead=NULL;
				  }
				}
		        pHead1=pnew;
		        pnew->pNext1=NULL;
		        ProList(proname,baseaddr,allocnum);
		        OnAllocDraw(pnew->proBaseAddress,atoi(allocnum));
		        OnPaint();	
			  }
			 
			 }
			 else
			 {
			   MessageBox("内存不足,不能完成此次分配!");
		       pEdit2->SetWindowText("");
		       pEdit2->SetFocus();
		       return;
			 }
		}
	}
	else
	{
	    MessageBox("内存不足,不能完成此次分配!");
		pEdit2->SetWindowText("");
		pEdit2->SetFocus();
		return;
	}	    
}

void COS1Dlg::ProList(CString proname,CString baseaddr,CString len)
{
   CString m_strPro,proName;
   proName.Format("%-10s",proname);
   baseaddr.Format("%-12s",baseaddr);
   len.Format("%-10s",len);
   m_strPro=" "+proName+baseaddr+len;
   CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LISTPRO);
   int nIndex = pListBox->FindStringExact(-1,m_strPro);
   nIndex=pListBox->AddString(m_strPro);
   pListBox->SetItemDataPtr(nIndex,new CString(proname));
}

void COS1Dlg::OnAllocDraw(int baseaddr, int len)
{
    CString tp="",tp1="";
	int lenn=0;
	COSPRO *pCurrent2;
	pCurrent2=pHead1;
	if (pCurrent2!=NULL)
	{
	  pCurrent2=pCurrent2->pNext1;
	  while(pCurrent2!=NULL)
	  {
	    lenn+=pCurrent2->proLength;
		pCurrent2=pCurrent2->pNext1;
	  }
	}
    tp.Format("%d",lenn*100/260000);
	tp1.Format("%d",(260000-lenn));
	CWnd *pWnd = GetDlgItem(IDC_BK);
    CRect rcClient;
	CDC *pDC =pWnd->GetDC();
	CBrush drawBrush;
	CPen newPen,*oldPen;
	LOGFONT LocalLogFont;
	memset(&LocalLogFont,0,sizeof(LOGFONT));
	LocalLogFont.lfCharSet=GB2312_CHARSET;
    strcpy(LocalLogFont.lfFaceName, "黑体");
    LocalLogFont.lfEscapement = 0;
    LocalLogFont.lfOrientation = 0;
	LocalLogFont.lfWeight = 700;
	pDC->SetBkColor(RGB(202,243,227));
	pDC->SetTextColor(RGB(7,180,286));
	CFont MyFont,*cMyOldFont;
	MyFont.CreateFontIndirect(&LocalLogFont);
	cMyOldFont = pDC->SelectObject(&MyFont);
	oldPen =pDC->SelectObject(&newPen);
	pWnd->GetClientRect(rcClient);
	pDC->TextOut(rcClient.left+145,rcClient.top+118,tp+"%"+"( 剩余"+tp1+"KB)");
	pDC->SelectObject(cMyOldFont);
	MyFont.DeleteObject();
	newPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
	oldPen =pDC->SelectObject(&newPen);
	for(int i=(baseaddr*128/260000);i<((baseaddr*128/260000)+(len*128/260000)+1);i++)
	{
	  pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+18);
	  pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2-1);
	  pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2+1);
	  pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()-19);
	}
	pDC->SelectObject(oldPen);
	newPen.Detach();
}

void COS1Dlg::OnBunalloc() 
{
	// TODO: Add your control notification handler code here
	CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LISTPRO);
	CString *proname1,proname;
	int proBaseAddr;
	int proLength;
	int proLastAddr=0;
	int nIndex= pListBox->GetCurSel();
	if (nIndex==LB_ERR)
	{
		MessageBox("您没有选择要回收的进程!");
		return;
	}
	proname1=(CString *)pListBox->GetItemDataPtr(nIndex);
	proname=*proname1;
	delete (CString *)pListBox->GetItemDataPtr(nIndex);
	pListBox->DeleteString(nIndex);
	COSPRO *pCurrent2;
	pCurrent1=pHead1;
	pCurrent2=pCurrent1->pNext1;
	if (pCurrent2!=NULL)
	{
	    while (pCurrent2!=0)
	  {
	   if(pCurrent2->proName==proname)
	   {
           pCurrent1->pNext1=pCurrent2->pNext1;
		   proBaseAddr=pCurrent2->proBaseAddress;
		   proLength=pCurrent2->proLength;
		   proLastAddr=proBaseAddr+proLength;
		   delete pCurrent2;
		   break;
	   }
	   else
	   {
		   if(pCurrent1->proName==proname)
		   {
		   proBaseAddr=pCurrent1->proBaseAddress;
		   proLength=pCurrent1->proLength;
		   proLastAddr=proBaseAddr+proLength;
		   pHead1=pCurrent2;
		   delete pCurrent1;
		   break;
		   }
	    pCurrent1=pCurrent1->pNext1;
		pCurrent2=pCurrent2->pNext1;
	   }
	  }
	}
	else
	{
	  if(pCurrent1->proName==proname)
	   {
		   proBaseAddr=pCurrent1->proBaseAddress;
		   proLength=pCurrent1->proLength;
		   proLastAddr=proBaseAddr+proLength;
		   pHead1=NULL;
		   delete pCurrent1;
	  }
	}
     CFREEMEM *pCurrent3,*pnew;
	 pCurrent=pHead;
	 if(pCurrent!=NULL)
	 {
       pCurrent3=pCurrent->pNext;
	   if (pCurrent3!=NULL)
	   {       
           while(pCurrent3!=NULL)
		   {   
		   if((pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)||(proLastAddr==pCurrent3->BaseAddress))
		   {    
		       if((pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)&&(proLastAddr==pCurrent3->BaseAddress))
			   {   
			       pCurrent->FreeLength=pCurrent->FreeLength+proLength+pCurrent3->FreeLength;
				   pCurrent->pNext=pCurrent3->pNext;
				   delete pCurrent3;
				   break;
			   }
			   if((pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)&&(proLastAddr<pCurrent3->BaseAddress))
			   {   
			       pCurrent->FreeLength+=proLength;
				   break;
			   }			
			   if((pCurrent->BaseAddress+pCurrent->FreeLength<proBaseAddr)&&(proLastAddr==pCurrent3->BaseAddress))
			   {   
			       pCurrent3->BaseAddress=proBaseAddr;
				   pCurrent3->FreeLength+=proLength;
				   break;
			   }
		   }
		   else
		   {  
		      if((pCurrent->BaseAddress+pCurrent->FreeLength<proBaseAddr)&&(proLastAddr<pCurrent3->BaseAddress))
			   {   
			       pnew=(CFREEMEM *)(new CFREEMEM);
				   pnew->BaseAddress=proBaseAddr;
				   pnew->FreeLength=proLength;
				   pnew->pNext=pCurrent3;
				   pCurrent->pNext=pnew;
				   break;
			   }
			  if((pHead==pCurrent)&&(proLastAddr==pCurrent->BaseAddress))
			  { 
			    pCurrent->BaseAddress=proBaseAddr;
				pCurrent->FreeLength+=proLength;
				pHead=pCurrent;
				break;
			   }
		     if((pHead==pCurrent)&&(proLastAddr<pCurrent->BaseAddress))
			 { 
			   pnew=(CFREEMEM *)(new CFREEMEM);
	           pnew->BaseAddress=proBaseAddr;
	           pnew->FreeLength=proLength;
	           pnew->pNext=pCurrent;
			   pHead=pnew;
               break;
			 }
			 if((pCurrent3->pNext==NULL)&&(proBaseAddr==(pCurrent3->BaseAddress+pCurrent3->FreeLength)))
			 {
			  pCurrent3->FreeLength+=proLength;
			  break;
			 }
			 if((pCurrent3->pNext==NULL)&&(proBaseAddr>(pCurrent3->BaseAddress+pCurrent3->FreeLength)))
			 {
			  pnew=(CFREEMEM *)(new CFREEMEM);
	          pnew->BaseAddress=proBaseAddr;
	          pnew->FreeLength=proLength;
			  pnew->pNext=NULL;
			  pCurrent3->pNext=pnew;
			  break;
			 }
			 pCurrent=pCurrent->pNext;
			 pCurrent3=pCurrent3->pNext;
		   }
		   }
	   }
	   else
	   {   
        if(proLastAddr==pCurrent->BaseAddress)
			   {
			    pCurrent->BaseAddress=proBaseAddr;
				pCurrent->FreeLength+=proLength;
				pHead=pCurrent;
			   }
		if(proLastAddr<pCurrent->BaseAddress)
			 { 
			   pnew=(CFREEMEM *)(new CFREEMEM);
	           pnew->BaseAddress=proBaseAddr;
	           pnew->FreeLength=proLength;
	           pnew->pNext=pCurrent;
			   pHead=pnew;
			 }
		if(pCurrent->BaseAddress+pCurrent->FreeLength==proBaseAddr)
		{
		  pCurrent->FreeLength+=proLength;
          pCurrent->pNext=NULL;
		}
		if(pCurrent->BaseAddress+pCurrent->FreeLength<proBaseAddr)
		{
		  pnew=(CFREEMEM *)(new CFREEMEM);
	      pnew->BaseAddress=proBaseAddr;
	      pnew->FreeLength=proLength;
	      pnew->pNext=NULL;
		  pCurrent->pNext=pnew;
		}
	   }
   }
   else
   {
          pnew=(CFREEMEM *)(new CFREEMEM);
	      pnew->BaseAddress=proBaseAddr;
	      pnew->FreeLength=proLength;
	      pnew->pNext=NULL;
		  pCurrent=pHead=pnew;     
   }
   OnUnAllocDraw(proBaseAddr,proLength);
	OnPaint();
}

void COS1Dlg::OnUnAllocDraw(int baseaddr, int len)
{
CString tp="",tp1="";
	int lenn=0;
	COSPRO *pCurrent2;
	pCurrent2=pHead1;
	if (pCurrent2!=NULL)
	{
	  while(pCurrent2!=NULL)
	  {
		lenn+=pCurrent2->proLength;
		pCurrent2=pCurrent2->pNext1;
	  }
	}
    tp.Format("%d",lenn*100/260000);
	tp1.Format("%d",(260000-lenn));
	CWnd *pWnd = GetDlgItem(IDC_BK);
    CRect rcClient;
	CDC *pDC =pWnd->GetDC();
	CBrush drawBrush;
	CPen newPen,*oldPen;
	LOGFONT LocalLogFont;
	memset(&LocalLogFont,0,sizeof(LOGFONT));
	LocalLogFont.lfCharSet=GB2312_CHARSET;
    strcpy(LocalLogFont.lfFaceName, "黑体");
    LocalLogFont.lfEscapement = 0;
    LocalLogFont.lfOrientation = 0;
	LocalLogFont.lfWeight = 700;
	pDC->SetBkColor(RGB(202,243,227));
	pDC->SetTextColor(RGB(7,180,286));
	CFont MyFont,*cMyOldFont;
	MyFont.CreateFontIndirect(&LocalLogFont);
	cMyOldFont = pDC->SelectObject(&MyFont);
	oldPen =pDC->SelectObject(&newPen);
	pWnd->GetClientRect(rcClient);
	pDC->TextOut(rcClient.left+145,rcClient.top+118,tp+"%"+"( 剩余"+tp1+"KB)");
	pDC->SelectObject(cMyOldFont);
	MyFont.DeleteObject();
	newPen.CreatePen(PS_SOLID,2,RGB(152,101,101));
	oldPen =pDC->SelectObject(&newPen);
	for(int i=(baseaddr*128/260000);i<((baseaddr*128/260000)+(len*128/260000));i++)
	{
	  pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+18);
	  pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2-1);
	  pDC->MoveTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()/2+1);
	  pDC->LineTo(rcClient.left+24+3*i,rcClient.top+rcClient.Height()-19);
	}
	pDC->SelectObject(oldPen);
	newPen.Detach();
}

void COS1Dlg::OnView() 
{ 
	CStatic *pStat;
	CString tp[3],tp1="";
	pCurrent=pHead;
	while (pCurrent!=NULL)
	{
	 tp[0].Format("%-13d",pCurrent->BaseAddress);
	 tp[1].Format("%-10d",pCurrent->FreeLength);
     tp[2].Format("%-10d",(pCurrent->FreeLength+pCurrent->BaseAddress));
     tp1+=tp[0]+tp[1]+tp[2]+"\n";
	 pCurrent=pCurrent->pNext;
	}
	pStat = (CStatic *)GetDlgItem(IDC_VIEW);
	pStat->SetWindowText(tp1);
	pStat->ShowWindow(SW_SHOW);
}

void COS1Dlg::OnBegin() 
{
	// TODO: Add your command handler code here
	//初始化空闲块链表
	pHead=NULL;
	pHead1=NULL;
	CFREEMEM *pnew;
	pnew = (CFREEMEM *)(new CFREEMEM);
	pnew->BaseAddress=0;
	pnew->FreeLength=260000;
	pnew->pNext=pHead;
	pHead=pnew;
	CEdit *pEdit1,*pEdit2;
	pEdit1=(CEdit *)GetDlgItem(IDC_PRONAME);
	pEdit2=(CEdit *)GetDlgItem(IDC_ALLOCNUM);
	pEdit1->SetWindowText("");
	pEdit2->SetWindowText("");
	CListBox *pListBox=(CListBox *)GetDlgItem(IDC_LISTPRO);
	for(int nIndex=pListBox->GetCount()-1;nIndex>=0;nIndex--)
	{
	  delete (CString *)pListBox->GetItemDataPtr(nIndex);
	  pListBox->DeleteString(nIndex);
	}
}

⌨️ 快捷键说明

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