1. 程式人生 > >作業系統的程序管理(c語言模擬)

作業系統的程序管理(c語言模擬)

<span style="font-size:18px;">今天就更一下,模擬程序管理程式。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
//#define NULL 0
int shumu=0;
//程序的內容結構體
struct node
{

	char a[20];
    //int a;
   // char ch;
};
typedef struct node Node;
 
//程序PCB結構體
struct jincheng
{
	int pid;
    int youxian;
    float luntime;
    float zhantime;
    char zhuangtai;    //a表示執行,b表示動態就緒
    Node *neirong;
    struct jincheng *next;
};
typedef struct jincheng Jincheng;

Jincheng *jiuxu,*yunxing,*p,*q;

//換出程序函式
void huanchu(int a)
{
    p=jiuxu; 
    while(p->pid!=a&&p!=NULL)
	{    
		q=p;
        p=p->next;
	}
	
    if(p==NULL) 
	{
        printf("該程序不在記憶體裡!\n");
        return;  
	}  
    if(p==jiuxu)  
	{   
		q=yunxing->next;
        yunxing->next=jiuxu;
        q->next=jiuxu->next;
		jiuxu=q; 
	}
    else  
	{   
        q->next=yunxing->next;
		q->next->next=p->next;
        yunxing->next=p;     
	}  
 } 

//殺死正在執行程序函式 
void shasi() 
{ 
     
     yunxing->next=NULL; 
     printf("執行的程序已經殺死!\n");  
    return; 
}  


//建立新程序後與正在執行程序比較優先順序並根據優先順序判斷誰該佔用處理機 
int bijiao() 
{  
    int i,j; 
    p=jiuxu;  
    while(p->next!=NULL)  
	{   
	     
        p=p->next;     
	} 
	q=p;                 //q指向程序的末尾,即新建的程序
    i=q->youxian;        //i代表新建程序的優先順序  
    j=yunxing->next->youxian;  //j代表正在執行程序的優先順序  
    if(i>j)                   //如果新建的程序的優先順序高於正在執行程式的優先順序  
	{   
        p=jiuxu;   
        if(p==q)         //就緒佇列的程序中只有一個程序。也就是那個新建的程序  
		{   
			jiuxu->next=yunxing->next;
			yunxing->next=jiuxu;
			jiuxu=jiuxu->next;
                
            return 1;   
		} 
	
        else{                                 
            while(p->next!=q)   
			{     
                p=p->next;   
			}                    //執行完後 p 指標在 q指標前面
		    
            p->next=yunxing->next;   //將正在執行的程序放置p的後面                 
            yunxing->next=q;      //將q放置在正在執行列表中,把處理機交給優先順序高階的程序
			p->next->next=q->next;
            yunxing->next->next=NULL;
			
            return 1;  
		}
	}  
  
    else   
		return -1;
}  


//建立新的程序函式   
int create() 
{
    int i= 0;
    if(shumu>20)  
	{   
        printf("記憶體已滿請先換出程序!\n");         
        i = -1;  
        return i;  
	}  
    else  
	{   
        if(jiuxu==NULL)  //如果就緒佇列中沒有程序的話   
		{        
            p=(Jincheng*)malloc(sizeof(Jincheng));    
            printf("請輸入新程序的名字(數字):\n");    
            scanf("%d",&p->pid);   
            printf("請輸入新程序的優先順序:(數字)\n");    
            scanf("%d",&p->youxian);    
            p->luntime=3.5;    
            p->zhantime=3; 
			printf("請輸入程序內容:\n");
            p->neirong=(Node*)malloc(sizeof(Node));
			scanf("%s",p->neirong->a);
           // p->neirong=NULL;    
            p->zhuangtai='b'; //新建程序的狀態設定為“就緒”    
            p->next=NULL;    
            jiuxu=p;    
            shumu++;    
            i=1;   
		}   
        else                   //如果就緒佇列不是空佇列   
		{    
            p=jiuxu;    
            while(p->next!=NULL)    
			{     
                p=p->next;         //p一直指向就緒佇列的隊尾    
			}    
            q=(Jincheng*)malloc(sizeof(Jincheng));    
            q->next=NULL;    
            p->next=q;             //在就緒佇列的隊尾加入新建的程序    
            printf("請輸入新程序的名字(數字):\n");    
            scanf("%d",&q->pid);    
            printf("請輸入新程序的優先順序:(數字)\n");    
            scanf("%d",&q->youxian);    
            q->luntime=3.5;    
            q->zhantime=3;   
			printf("請輸入程序內容:\n");
            q->neirong=(Node*)malloc(sizeof(Node));
	        scanf("%s",q->neirong->a);
            //q->neirong=NULL;    
            q->zhuangtai='b';     //新建程序的狀態設定為就緒    
            shumu++;    
			i=1;   
		}  
	}  
    return i;
}  


//從活動就緒程序佇列中找到一個優先順序最高的程序併為它分配處理機 
int zhixing() 
{  
    int i,j;  
    p=jiuxu;    
    if(yunxing->next!=NULL)  
	{    
        return -1;  
	}   
    i=jiuxu->youxian;                    
    p=jiuxu->next;                       
    while(p!=NULL)   
	{   
        j=p->youxian;                    
        if(i>=j)  
		{   
            p=p->next;             
		}  
        if(i<j)                       
		{   
            i=p->youxian;                              
            p=p->next;                                
		}                                                 
	}  
    if(jiuxu->youxian==i)                                        
	{     
        yunxing->next=jiuxu;   
        jiuxu=jiuxu->next;   
        yunxing->next->next=NULL;  
	}  
    else  
	{
        p=jiuxu;   
        while(i!=p->youxian)   
		{    
            q=p;    
            p=p->next;   
		}                          // q是p前面的指標     
        p->zhuangtai='a';   
          
        yunxing->next=p;           //將p放入執行列表   
        q->next=p->next;          //將優先順序高的節點捨去 
		yunxing->next->next=NULL;
	}  
    return 1; 
} 
// 

void chakan() 
{  
    p=yunxing->next;  
    printf("該執行程序的名字為:%d\n",p->pid); 
    printf("該執行程序的的優先順序:%d\n",p->youxian); 
    printf("該執行程序的輪轉時間為:%f\n",p->luntime);  
    printf("該執行程序佔用cpu的時間為:%f\n",p->zhantime);  
    printf("該執行的程序內容為:\n");  
    printf("%s",p->neirong->a);  
    //printf("%c",p->neirong->ch);  
    printf("\n"); 
} 

void tongxing(int a) 
{  
	char c[20];
	int i;
    q=jiuxu;  
    while((q != NULL) && (q->pid != a))  
	{   
        q=q->next; 
	}//q為id為a的程序     
    if(q == NULL)  
	{   
        printf("所輸入的程序不在記憶體中!\n");   
        return;   
	}    
    p=yunxing->next;//p為正在執行的程序  
    
	for(i = 0; i < 20; i++)
	{
		c[i] = p->neirong->a[i];
        p->neirong->a[i] = q->neirong->a[i];
		q->neirong->a[i] = c[i];
	}
	//q->neirong=(Node*)malloc(sizeof(Node));  
    //q->neirong->a=p->neirong->a;  
    //q->neirong->ch=p->neirong->ch;//將正在執行的程序內容複製給id為a的程序
    printf("通訊成功!\n"); 
    return; 
}

void init()
{
	yunxing=(Jincheng*)malloc(sizeof(Jincheng)); 
    yunxing->next=NULL;  
    jiuxu=(Jincheng*)malloc(sizeof(Jincheng));   
    jiuxu=NULL;

    
}

int main() 
{  
	int i,n=1;  
    int k,j,s; 
	
    init(); 

    printf("——————————ZHENGXUHONG——————————\n");  
       
    while(n==1)  
	{   
		
        printf("********************************************\n");   
        printf("*               程序演示系統               *\n");  
        printf("********************************************\n");   
        printf("     1.建立新的程序      2.檢視執行程序 \n");       
        printf("     3.換出某個程序      4.殺死執行程序 \n");       
        printf("     5.程序之間通訊      6.退出系統 \n");           
        printf("********************************************\n");   
        printf("請選擇(1~6)\n");   
        scanf("%d",&i);   
        switch(i)   
		{   
        case 1:k=create();    
              if(k==1)     
			  {    
				  printf("程序建立成功!\n"); 
			  }
              if(yunxing->next == NULL && jiuxu != NULL)    
			  {     
                   printf("由於只有一個程序所以為它分配處理機.\n");    
                   yunxing->next=jiuxu;         
                   jiuxu=NULL; 

				   //system("CLS");
                   continue;    
			  }    
              k=bijiao();  
  
              if(k==1)
			  {     
                  printf("由於新程序的優先順序高於正在執行的程序所以正在執行的\n");     
                  printf("程序讓出處理機交給新程序,而它變為活動就緒!\n");   
			  }    
              if(k!=1)    
                  printf("新程序的優先順序低於正在執行的程序所以它只有等待\n"); 
			  //system("CLS");
              break;   
         case 2:    
              if(yunxing->next==NULL)    
			  {     
                  printf("沒有程序處於執行狀態!\n");     
                  continue;    
			  }   
              chakan();break;   
         case 3:    
              if(jiuxu==NULL)    
			  {     
                  printf("記憶體中已經沒有處於活動就緒的程序了請建立!\n");     
                  continue;    
			  }    
              printf("已有處於活動就緒程序的名字為:\n");    
              p=jiuxu;    
              printf("(");    
              while(p!=NULL)    
			  {     
                  printf("%d ",p->pid);    
                  p=p->next;    
			  }   
              printf(")\n");    
              printf("請輸入要換出的處於活動就緒程序的名字\n");    
              scanf("%d",&s);    
              huanchu(s);    
              //if(jiuxu==NULL)     
             //     printf("記憶體中已經沒有活動就緒程序!\n");   
             // else    
			 // {     
              //    printf("已有處於活動就緒程序的名字為:\n");     
              //    p=jiuxu;     
              //    printf("(");     
               //   while(p!=NULL)     
			//	  {      
               //       printf("%d ",p->pid);      
               //       p=p->next;  
  
			//	  }
              //    printf(")\n");    
			 // }    
              break;   
    case 4:    
         if(yunxing->next==NULL)    
		 {     
             printf("沒有處於執行狀態的程序!\n");     
             continue;    
		 }    
         shasi();    
         if(jiuxu==NULL)    
		 {     
             printf("已經沒有處於活動就緒的程序請建立!\n");     
             continue;   
		 }    
         j=zhixing();    
         if(j==1)    
		 { 
              printf("已為一個動態就緒程序中優先順序最高的程序分配處理器!\n");    
		 }    
         break;   
     case 5:    
          if(jiuxu==NULL)    
		  {     
              printf("記憶體中已經沒有處於活動就緒的程序了請建立!\n");     
              continue;    
		  }    
          if(yunxing->next==NULL)    
		  {    
              printf("沒有處於執行狀態的程序!\n");     
              continue;    
		  }    
          printf("請輸入要與正在執行的程序進行程序通訊的程序名字\n");    
          scanf("%d",&s);             
          tongxing(s);   
          break;   
      case 6:exit(0);   
      default:n=0;   
		}  
    } 
	return 0;
}</span>

相關推薦

作業系統程序管理c語言模擬

<span style="font-size:18px;">今天就更一下,模擬程序管理程式。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include&

作業系統程序排程實現演算法c語言

#include <stdio.h>#include <stdlib.h>#include <windows.h>   //包含sleep函式#define TRUE 1#define FALSE 0#define OK 1#define

儲存管理之分頁儲存管理方式C語言模擬實驗五

       分頁儲存管理方式,將程式劃分為若干個大小固定的區域(頁),也把實體記憶體劃分為大小和頁相等的塊,通過頁表完成頁到塊的對映。 分頁儲存管理之C語言模擬: #include <stdio.h> #include <string.h> #i

Word Count程序C語言實現

地址 組成 other 進一步 and 文件遍歷 stand evel oid Word Count 程序 GitHub地址:https://github.com/MansonYe/Word-Count 一、項目簡介 Word Count 是用以統計文本文件的字符數

學生成績管理系統C語言實現

        今天,我來介紹一個C語言的小專案 --- 學生成績管理系統。在該系統中,主要是完成對學生資訊的錄入,新增,刪除,修改,查詢以及按照要求完成學生資訊的排序,此外還包括系統的初始化和清空。        整個專案包括三個檔案main.c  ,   Sort.

作業系統輪轉排程演算法c語言描述

/*輪轉排程演算法*/ #include<stdio.h> #include<malloc.h> #define N 100 typedef struct RR{int arivaltime;int gotime,copytime;int final

職工資訊管理系統c語言實現

功能實現: (1)系統以選單方式工作 (2)職工資訊錄入功能(職工資訊用檔案儲存)--輸入 (3)職工資訊瀏覽功能--輸出 (4)職工資訊查詢功能--演算法 查詢方式:按姓名查詢/按職工號查詢 (5)職工資訊

小型圖書館管理系統C語言實現

全部實現程式碼如下: -------------------------------------------------------------------------------------- main.cpp#include "c1.h" typedef int ElemType; #inclu

作業系統】頁面置換演算法最佳置換演算法C語言實現

# 【作業系統】頁面置換演算法(最佳置換演算法)(C語言實現) #####(編碼水平較菜,寫部落格也只是為了個人知識的總結和督促自己學習,如果有錯誤,希望可以指出) ## 1.頁面置換演算法: > 在地址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。當發生缺頁中斷時,如果作業系

二十四進制編碼串轉換為32位無符號整數C語言實現

bool while open 參數錯誤 hint div 第一個字符 bsp opened typedef int BOOL; #define TRUE 1; #define FALSE 0; #define UINT_MAX 0xffffffff

堆排序C語言實現

names 博客 鏈接 c語言實現 建立 ron 要求 clas [1] 之前的博客介紹介紹了數組的兩種排序算法:插入排序和歸並排序(採用遞歸),見鏈接http://blog.csdn.net/u013165521/article/detai

雙向循環鏈表C語言描述

雙向循環鏈表 還要 ons 函數 保存 hat 加載 dir dict   下面以一個電子英漢詞典程序(以下簡稱電子詞典)為例,應用雙向循環鏈表。分離數據結構,可以使邏輯代碼獨立於數據結構操作代碼,程序結構更清晰,代碼更簡潔;電子詞典的增、刪、查、改操作分別對應於鏈表的插入

雙向循環鏈表C語言描述

open color end int fin spa assert not des 代碼清單 1 // dictionary.h 2 #ifndef __DICTIONARY_H__ 3 #define __DICTIONARY_H__ 4 5 #i

算法 - 棧與隊列C 語言實現

元素 語言 訪問規則 並且 下標 出棧 數據結構 規則 算法 目標: 理解 棧 與 隊列 這兩種數據結構, 並且知道如何應用。 算法 + 數據結構 = 程序 一、堆棧 堆棧是一組元素的集合,類似於數組,但數組可以按下標訪問,堆棧的訪問規則只能為push 與

歸並排序C語言實現

ngs 基本 merge 兩個 它的 efi 分別是 void rec 合並排序(MERGE SORT)是又一類不同的排序方法,合並的含義就是將兩個或兩個以上的有序數據序列合並成一個新的有序數據序列,因此它又叫歸並算法。 它的基本思想就是假

隊列的實現及操作C語言描述

img tdi 定義數據 上一個 判斷 free 隊列的單鏈表 插入數據 尾指針 // 隊列的單鏈表實現 // 頭節點:哨兵作用,不存放數據,用來初始化隊列時使隊頭隊尾指向的地方 // 首節點:頭節點後第一個節點,存放數據 #include&

數據結構-線性表的鏈式存儲相關算法C語言實現

存儲位置 lib 方法 lis 逆序 順序 程序 查詢 c語言 鏈表的簡單介紹 為什麽需要線性鏈表 當然是為了克服順序表的缺點,在順序表中,做插入和刪除操作時,需要大量的移動元素,導致效率下降。 線性鏈表的分類 按照鏈接方式: 按照實現角度: 線性鏈表的創建和簡單遍歷

C++學習十一C語言部分之 練習

文件頭 語句 font 判斷 c++ c++學習 %d \n AI 1 /* 2 3 1.if 4 輸入一個成績 進行分級 5 6 輸入一個數字 判斷是否是水仙花數 7 比如 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3

qsort歸納學習c語言版本

serve www. 返回 char s regexp ever char* str ret 參考:https://www.cnblogs.com/ForeverJoker/archive/2013/05/25/qsort-sort.html 包含在<stdlib.h

排序C語言實現

內部排序 利用 int 分治 arr 個數 size quic 外部排序 讀數據結構與算法分析 插入排序 核心:利用的是從位置0到位置P都是已排序的 所以從位置1開始排序,如果當前位置不對,則和前面元素反復交換重新排序 實現 void InsertionSort