C語言做的,呵呵,不知道有沒用,發出去了
#include "stdafx.h"
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
const int MAXJOB=100;//定義表最大記錄數
typedef struct node
{
int front;
int length;
char data[20];
}job;
job frees[MAXJOB];//定義空閑區表
int free_quantity;
job occupys[MAXJOB];//定義已分配區表
int occupy_quantity;
//初始化函數
void initial()
{
int i;
for(i=0;i<MAXJOB;i++)
{
frees[i].front=-1;
frees[i].length=0;
strcpy(frees[i].data,"free");
occupys[i].front=-1;
occupys[i].length=0;
strcpy(occupys[i].data," ");
}
free_quantity=0;
occupy_quantity=0;
}
//創建空閑分區表
int creatfree()
{
FILE *fp;
char fname[20];
cout<<"請輸入空閑區數據文件來源的文件名:";
cin>>fname;
if((fp=fopen(fname,"r"))==NULL){
cout<<"錯誤,文件打不開,請檢查文件名"<<endl;
}
else{
while(!feof(fp))
{
fscanf(fp,"%d\t%d\n",&frees[free_quantity].front,&frees[free_quantity].length);
free_quantity++;
}
cout<<"空閑的分區表已建立!\n";
return 1;
}
return 0;
}
.............沒有結束呢
更多的內容請查看
希望有所幫助
更多參考
② (操作系統) 編寫代碼對存儲管理部件的工作過程進行模擬
採用分頁存儲器允許把一個作業存放到若干不相鄰的分區中,既可免去移動信息的工作,又可盡量減少主存的碎片。分頁式存儲管理的基本原理如下:
1、 頁框:物理地址分成大小相等的許多區,每個區稱為一塊;
2、址分成大小相等的區,區的大小與塊的大小相等,每個稱一個頁面。
3、 邏輯地址形式:與此對應,分頁存儲器的邏輯地址由兩部分組成,頁號和單元號。邏輯地址格式為 頁號 單元號(頁內地址) 採用分頁式存儲管理時,邏輯地址是連續的。所以,用戶在編制程序時仍只須使用順序的地址,而不必考慮如何去分頁。
4、頁表和地址轉換:如何保證程序正確執行呢?
採用的辦法是動態重定位技術,讓程序的指令執行時作地址變換,由於程序段以頁為單位,所以,我們給每個頁設立一個重定位寄存器,這些重定位寄存器的集合便稱頁表。頁表是操作系統為每個用戶作業建立的,用來記錄程序頁面和主存對應頁框的對照表,頁表中的每一欄指明了程序中的一個頁面和分得的頁框的對應關系。絕對地址=塊號*塊長+單元號 以上從拓撲結構角度分析了對稱式與非對稱式虛擬存儲方案的異同,實際從虛擬化存儲的實現原理來講也有兩種方式;即數據塊虛擬與虛擬文件系統. 數據塊虛擬存儲方案著重解決數據傳輸過程中的沖突和延時問題.在多交換機組成的大型Fabric結構的SAN中,由於多台主機通過多個交換機埠訪問存儲設備,延時和數據塊沖突問題非常嚴重.數據塊虛擬存儲方案利用虛擬的多埠並行技術,為多台客戶機提供了極高的帶寬,最大限度上減少了延時與沖突的發生,在實際應用中,數據塊虛擬存儲方案以對稱式拓撲結構為表現形式. 虛擬文件系統存儲方案著重解決大規模網路中文件共享的安全機制問題.通過對不同的站點指定不同的訪問許可權,保證網路文件的安全.在實際應用中,虛擬文件系統存儲方案以非對稱式拓撲結構為表現形式. 虛擬存儲技術,實際上是虛擬存儲技術的一個方面,特指以CPU時間和外存空間換取昂貴內存空間的操作系統中的資源轉換技術 基本思想:程序,數據,堆棧的大小可以超過內存的大小,操作系統把程序當前使用的部分保留在內存,而把其他部分保存在磁碟上,並在需要時在內存和磁碟之間動態交換,虛擬存儲器支持多道程序設計技術 目的:提高內存利用率 管理方式
A 請求式分頁存儲管理 在進程開始運行之前,不是裝入全部頁面,而是裝入一個或零個頁面,之後根據進程運行的需要,動態裝入其他頁面;當內存空間已滿,而又需要裝入新的頁面時,則根據某種演算法淘汰某個頁面,以便裝入新的頁面
B 請求式分段存儲管理 為了能實現虛擬存儲,段式邏輯地址空間中的程序段在運行時並不全部裝入內存,而是如同請求式分頁存儲管理,首先調入一個或若干個程序段運行,在運行過程中調用到哪段時,就根據該段長度在內存分配一個連續的分區給它使用.若內存中沒有足夠大的空閑分區,則考慮進行段的緊湊或將某段或某些段淘汰出去,這種存儲管理技術稱為請求式分段存儲管理
你好,希望採納!
③ 求代碼~操作系統 進程管理實驗 語言C++ 要求如下:
四、實驗思路和設計
1、進程管理
(1)程序流程圖
由學生自行完成。
(2)主要程序代碼
//PCB結構體
struct pcb{
int id; //進程序號
int ra; //所需資源A的數量
int rb; //所需資源B的數量
int rc; //所需資源C的數量
int ntime; //所需的時間片個數
int rtime; //已經運行的時間片個數
char state; //進程狀態
struct pcb *next;
} *hready=NULL,*hblock=NULL,*p; //hready,hblock分別為指向就緒和阻塞隊列
typedef struct pcb PCB;
int m,n,r,a,b,c,h=0,i=1,time1Inteval; //m為要模擬的進程個數,n為初始化進程個數
//r為可隨機產生的進程數(r=m-n)
//a,b,c分別為A,B,C三類資源的總量
//i為進城計數,i=1…n
//h為運行的時間片次數,time1Inteval為時間片大小(毫秒)
//建立一個PCB結構體型的空鏈表
PCB *increat(void)
{ PCB *head;
head=NULL;
return(head);
}
//從鏈表起始地址開始輸出該鏈表的內容
void disp(PCB *head)
{PCB *p1;
p1=head;
AnsiString str2;
if(head!=NULL) //鏈表非空
{
do
{
str2+=" ";
str2+=IntToStr(p1->id);str2+=" ";
str2+=(p1->state);str2+=" ";
str2+=IntToStr(p1->ra);str2+=" ";
str2+=IntToStr(p1->rb);str2+=" ";
str2+=IntToStr(p1->rc);str2+=" ";
str2+=IntToStr(p1->ntime);str2+=" ";
str2+=IntToStr(p1->rtime);str2+="\r\n";
p1=p1->next;
}while(p1!=NULL); //不斷輸出進程的信息,直到鏈尾!
} //if
else
{ str2+="\t\t該 隊 列 中 沒 有 進 程!\r\n" ;}
Form1->Memo1->Lines->Add(str2);
}
//將進程插入到鏈尾(包括就緒隊列和阻塞隊列)
PCB *insert(PCB *head,PCB*pcb) //帶兩個指針形參:隊列指針和當前進程PCB
{
PCB *pi,*p1;
p1=head;
pi=pcb;
if (head==NULL)
{
head=pi;
pi->next=NULL;
}
else
{
while(p1->next!=NULL)
{p1=p1->next;}
p1->next=pi;
pi->next=NULL;
}
return(head);
}
//對進程進行初始化,建立就緒隊阻塞隊列。
void input()
{
AnsiString str1;
m=StrToInt (Form1->Edit1->Text); //讀取要模擬的進程總數給m
n=StrToInt (Form1->Edit2->Text); //讀取需初始化進程數給n
a=StrToInt (Form1->Edit3->Text); //讀取A類資源的總數給a
b=StrToInt (Form1->Edit4->Text); //讀取B類資源的總數給b
c=StrToInt (Form1->Edit5->Text); //讀取C類資源的總數給c
time1Inteval=StrToInt(Form1->Edit6->Text); //讀取時間片長度給time1Inteval
Form1->Timer1->Interval=time1Inteval;
r=m-n; //計算可隨機產生的進程數為r
for(i=1;i<=n;i++) //初始化n個進程信息
{
p=getpcb(PCB); // #define getpcb(type) (type*)malloc(sizeof(type))
p->id=i;
str1+=" 產生進程ID:";str1+=IntToStr(p->id);str1+="\r\n";
p->ra=(random(a-3)+3);
str1+=" 所需A類資源數:";str1+=IntToStr(p->ra);str1+="\r\n";
p->rb=(random(b));
str1+=" 所需B類資源數:";str1+=IntToStr(p->ra);str1+="\r\n";
p->rc=(random(c-2)+2);
str1+=" 所需C類資源數:";str1+=IntToStr(p->ra);str1+="\r\n";
p->ntime=(random(5)+1);
str1+=" 所需時間片個數:";str1+=IntToStr(p->ntime);str1+="\r\n";
p->rtime=0;
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0)) //如果資源符合所需要求
{ //則寫入就緒隊列隊尾
a=a-(p->ra); //當前所剩A類資源數目
b=b-(p->rb); //當前所剩B類資源數目
c=c-(p->rc); //當前所剩C類資源數目
p->state='W';
hready=insert(hready,p); //將進程插入就緒隊列
}//if
else //如果資源不符合所需要求,則寫入阻塞隊列隊尾
{
p->state='B';
hblock=insert(hblock,p);
} //if
str1+=" 當前進程狀態:";
str1+=(p->state);
str1+="\r\n";
str1+="\r\n";
}//for
Form1->Memo1->Lines->Add(str1);
}
//輸出就緒隊列和阻塞隊列的信息
void outputall()
{
AnsiString str1,str2,str3;
str3+="\r\n" ;
str3+="= = = = = = = = = = = = = = = CPU時間片運行了: " ;
str3+=IntToStr(h);
str3+=" 次= = = = = = = = = = = = = = =\r\n";
Form1->Memo1->Lines->Add(str3);
str1+="*********************************當 前 就 緒 隊 列 的 信 息" ;
str1+="*********************************\r\n" ;
str1+="進程ID 進程狀態 A資源數 B資源數 C資源數 需要時間片 已運行時間片";
Form1->Memo1->Lines->Add(str1);
disp(hready);
str2+="*********************************當 前 阻 塞 隊 列 的 信 息";
str2+="*********************************\r\n" ;
str2+="\r\n";
str2+="進程ID 進程狀態 A資源數 B資源數 C資源數 需要時間片 已運行時間片";
Form1->Memo1->Lines->Add(str2);
disp(hblock);
}
//運行就緒隊列的頭進程,運行一個時間片(FCFS),輪轉一個時間片
PCB *running(PCB *head)
{
PCB *p1;
p1=head;
AnsiString str4;
If (p1->next==NULL) head=increat();
else {head=p1->next; }
p1->state='R'; //進程狀態由就緒轉向運行
(p1->rtime)++; //已運行時間片數增加1
h++;
str4+="~~~~~~~~~~~~~~~~ 當前正在運行的進程ID是: ";
str4+=IntToStr(p1->id);
str4+=" ~~~~~~~~~~~~~~~~~~\r\n";
str4+="進程ID 進程狀態 A資源數 B資源數 C資源數 需要時間片 已運行時間片\r\n";
str4+=" ";
str4+=IntToStr(p1->id);str4+=" ";
str4+=(p1->state);str4+=" ";
str4+=IntToStr(p1->ra);str4+=" ";
str4+=IntToStr(p1->rb);str4+=" ";
str4+=IntToStr(p1->rc);str4+=" ";
str4+=IntToStr(p1->ntime);str4+=" ";
str4+=IntToStr(p1->rtime);str4+=" ";
Form1->Memo1->Lines->Add(str4);
if(p1->ntime==p1->rtime) //如果已經運行的時間片到達所需次數,該進程結束
{
str4+="\r\n\r\n\t\tID號為:";
str4+=IntToStr(p1->id);
str4+=" 的進程已經完成!!!";
Form1->Memo1->Lines->Add(str4);
a=a+(p1->ra);
b=b+(p1->rb);
c=c+(p1->rc);
free(p1); //釋放當前指針
}
else //如果已經運行的時間片未到達所需次數,該進程運行一個時間片後進入就緒隊列尾
{
p1->state='W';
head=insert(head,p1);
}
return(head);
}
//檢測當前資源數目是否滿足阻塞隊列里進程的需求
void testblock()
{
PCB *p1,*p2;
p1=hblock;
p2=hblock;
AnsiString str5;
while((hblock!=NULL)&&(p1!=NULL))
{
if((a-(p1->ra)>=0)&&(b-(p1->rb)>=0)&& (c-(p1->rc)>=0)) //如果滿足
{if(p1==hblock)
{
hblock=p1->next;
p1->state='W';
hready=insert(hready,p1); //將阻塞的進程插入就緒隊列
a=a-(p->ra);
b=b-(p->rb);
c=c-(p->rc);
str5="\tID號為: " ;
str5+=IntToStr(p1->id);
str5+=" 的進程由阻塞隊列轉入就緒隊列!\r\n";
p1=hblock;
} //if(p1==hblock)
else
{p2->next=p1->next;
p1->state='W';
hready=insert(hready,p1);
str5="\tID號為: " ;
str5+=IntToStr(p1->id);
str5+=" 的進程由阻塞隊列轉入就緒隊列!\r\n";
p1=p2->next;
}//else
} //大if
else
{p2=p1;
p1=p1->next;
} //else
Form1->Memo1->Lines->Add(str5);
} //whlie
}
//檢測是否有新的進程產生,隨機產生新進程
void testnew()
{
int t;
AnsiString str6;
if(r>0) //r=m-n為可隨機產生的進程數目
{
t=random(9); //生成隨機數
if(t<=7) //如果隨機數小於等於7,則產生新進程,否則不產生
{
p=getpcb(PCB);
str6+="有新的進程申請加入:\r\n" ;
p->id=i++; //i為全程變數,表示進程號?
str6+="進程ID:";
str6+=IntToStr(p->id);
str6+="\r\n";
p->ra=(random(a-3)); //隨機分配資源
str6+="所需A類資源數:";
str6+=IntToStr(p->ra);
str6+="\r\n";
p->rb=(random(b-3));
str6+="所需B類資源數:";
str6+=IntToStr(p->rb);
str6+="\r\n";
p->rc=(random(c-3));
str6+="所需C類資源數:";
str6+=IntToStr(p->rc);
str6+="\r\n";
p->ntime=(random(5)+1); //隨機分配時間片總數
str6+="所需時間片個數:";
str6+=IntToStr(p->ntime);
str6+="\r\n";
p->rtime=0; //已運行時間片數初始為0
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0))
{ //進程滿足要求,進入就緒隊列
a=a-(p->ra); //分配資源給該進程,總資源數減少
b=b-(p->rb);
c=c-(p->rc);
p->state='w';
str6+="當前進程狀態:";
str6+=(p->state);
str6+="\r\n";
hready=insert(hready,p);
str6+="資源滿足新進程需求,該進程進入就緒隊列!";
}//if
else //進程不滿足要求,進入阻塞隊列
{
p->state='B';
hblock=insert(hblock,p);
str6+="當前進程狀態:";
str6+=(p->state);
str6+="\r\n";
str6+="資源不能滿足新進程需求,該進程進入阻塞隊列!" ;
}//else
}//if (t<=7)
Form1->Memo1->Lines->Add(str6);
}//if(r>0)
r--;
}
//系統三類資源變化情況的顯示
void rescore()
{
if(a>a1) {Form1->Edit7->Text=IntToStr(a1);}
if(a<0) {Form1->Edit7->Text=0;}
if(a>=0&&a<a1) {Form1->Edit7->Text=IntToStr(a);}
if(b>b1) {Form1->Edit8->Text=IntToStr(b1);}
if(b<0) {Form1->Edit8->Text=0;}
if(b>=0&&b<=b1) {Form1->Edit8->Text=IntToStr(b); }
if(c>c1) {Form1->Edit9->Text=IntToStr(c1);}
if(c<0) {Form1->Edit9->Text=0;}
if(c>=0&&c<=c1) {Form1->Edit9->Text=IntToStr(c); }
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
runFcfs(); //先來先服務(FCFS)調度演算法
}
//先來先服務(FCFS)調度演算法
void runFcfs()
{
AnsiString str;
if(form1_hready!=NULL) //如果就緒隊列為非空,則不斷運行,直到就緒隊列為空為止
{
outputall(); //輸出就緒隊列和阻塞隊列的信息
form1_hready=running(form1_hready); //將就緒隊列的第一個進程運行一個時間片
testblock(); //檢查阻塞隊列是否有進程可以進入就緒隊列
testnew(); //檢查是否有新進程產生
rescore() ; //系統三類資源變化情況的顯示
}
else
{
Form1->Timer1->Enabled=false;
Form1->Edit7->Text=IntToStr(a1);
Form1->Edit8->Text=IntToStr(b1);
Form1->Edit9->Text=IntToStr(c1);
str+="\r\n\r\n<<<<<<<<<<<<<<<所 有 的 進 程 都 已 經 成 功 運 行 結 束 !>>>>>>>>>>>>>>";
Form1->Memo1->Lines->Add(str);
}
}
//將結果保存成txt文件
void __fastcall TForm1::N8Click(TObject *Sender)
{
if(Form1->SaveDialog1->Execute())
{
FILE* fp=fopen(Form1->SaveDialog1->FileName.c_str(),"w");
if(fp==NULL)
{
MessageBox(NULL,"打開文件出錯","信息",MB_OK);
return;
}
for(int i=0;i<Form1->Memo1->Lines->Count;i++)
{ fputs(Form1->Memo1->Lines->Strings[i].c_str(),fp);
fputc('\n',fp);
}
fclose(fp);
}
}
//開始模擬按鈕單擊執行函數
void __fastcall TForm1::Button1Click(TObject *Sender)
{
runmain();
Form1->Button1->Enabled=false;
Form1->Edit1->Enabled=false;
Form1->Edit2->Enabled=false;
Form1->Edit3->Enabled=false;
Form1->Edit4->Enabled=false;
Form1->Edit5->Enabled=false;
Form1->Edit6->Enabled=false;
}
//清除屏幕按鈕單擊執行函數
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Memo1->Clear();
Button1->Enabled=true;
h=0;
Form1->Edit1->Enabled=true;
Form1->Edit2->Enabled=true;
Form1->Edit3->Enabled=true;
Form1->Edit4->Enabled=true;
Form1->Edit5->Enabled=true;
Form1->Edit6->Enabled=true;
}
//運行的主函數
void runmain()
{
AnsiString str,str1;
input();
Form1->Timer1->Enabled=true; //觸發時鍾,調用runFCFS。
str+="\r\n";
}
④ c語言程序學生成績管理系統源代碼
VC++6.0編譯通過,利用結構體,結構體指針,單鏈表,文件操作,命令窗口下簡單菜單設計,可從文件讀入數據,自動保存數據,有錯誤自動判斷修復,能添加,刪除,查詢,顯示,排序記錄,通過本人2小時升級修改,已經適合多數初學者期末C語言作業設計要求!如果要增加科目,只要修改源代碼中的Class_N的值就可以了,科目的名稱在程序第一次運行時輸入,會自動保存到student.ini文件,程序運行時自動生成的student.ini文件為系統信息文件(二進制文件),student.db為數據存儲文件(二進制文件),Student.txt為操作記錄文件(文本文件),可以修改Student.txt的打開方式,那樣就能保存以前的操作記錄了。代碼下載:請點擊下載鏈接:網頁鏈接
⑤ 商品庫存管理系統的c語言源代碼
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct BOOK
{
int id,usr[10],total,store,days[10];
char name[31],author[21];
}books[100];
/*上面是結構體的定義,用於存放書籍及借書的信息。*/
void page_title(char *menu_item)
{
clrscr();
printf(">>> 圖 書 管 理 系 統 <<<\n\n- %s -\n\n",menu_item);
}
/*上面是列印頁眉的函數,同時通過參數menu_item,可以顯示當前的狀態。*/
void return_confirm(void)
{
printf("\n按任意鍵返回……\n");
getch();
}
/*上面是返回前請求確認的函數,以便在返回前觀察結果*/
int search_book(void)
{
int n,i;
printf("請輸入圖書序號:");
scanf("%d",&i);
for(n=0;n<100;n++)
{
if(books[n].id==i)
{
printf("書名:%s\n",books[n].name);
printf("作者:%s\n",books[n].author);
printf("存數:%d of ",books[n].store);
printf("%d\n",books[n].total);
return n;
}
}
printf("\n輸入錯誤或無效圖書序號.\n");
return -1;
}
/*上面的函數是在數組中找到圖書號匹配的記錄,顯示其信息並返
回數組下標,如果找不到相應記錄則提示錯誤並返回-1。*/
void book_out(void)
{
int n,s,l,d;
page_title("借閱圖書");
if((n=search_book())!=-1&&books[n].store>0)
{
printf("請輸入借書證序號:");
scanf("%d",&s);
printf("請輸入可借天數:");
scanf("%d",&d);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==0)
{
books[n].usr[l]=s;
books[n].days[l]=d;
break;
}
}
books[n].store--;
}
if(n!=-1&&books[n].store==0) printf("此書已經全部借出.\n");
return_confirm();
}
/*上面是借書的函數,首先調用找書函數*/
void book_in(void)
{
int n,s,l;
page_title("歸還圖書");
if((n=search_book())!=-1&&books[n].store<books[n].total)
{
printf("借閱者圖書證列表:\n");
for(l=0;l<10;l++)
if (books[n].usr[l]!=0)
printf("[%d] - %d天\n",books[n].usr[l],books[n].days[l]);
printf("請輸入借書證序號:");
scanf("%d",&s);
for(l=0;l<10;l++)
{
if(books[n].usr[l]==s)
{
books[n].usr[l]=0;
books[n].days[l]=0;
break;
}
}
books[n].store++;
}
if(n!=-1&&books[n].store==books[n].total)
printf("全部入藏.\n");
return_confirm();
}
void book_add(void)
{
int n;
page_title("注冊新書");
for(n=0;n<100;n++)
if(books[n].id==0) break;
printf("序號:");
scanf("%d",&books[n].id);