操作系统实验一:进程管理

一、实验目的:
通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤销)。
二、实验要求及内容:
用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间的通信等功能。
三、实验代码:

#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;
}

四、实验结果截图:

  1. 创建进程:

    创建进程-小花

    创建进程-小明

  1. 查看运行进程

  2. 换出进程-小花

  3. 杀死进程-小明,并查看用以验证

  1. 唤醒进程

  2. 退出程序
    五、实验总结
    通过这次实验,让我对操纵系统进程这一章的内容有了更深入的理解。我了解了进程的概念,进程是程序的一次执行过程。进程是一个程序及其数据在处理机上顺序执行时所发生的活动。进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。也了解了每一个进程都有一个进程控制块(PCB)。进程控制块是操作系统用与记录和刻画进程状态及有关信息的数据结构,也是操作系统控制和管理的主要依据。使一个在多道程序下不能独立运行的程序(含数据),成为一个能独立运行的基本单位、一个能与其他进程并发执行的进程。在实验中我们进程的创建、执行、撤销,通过实验过程对其更加理解。
    总之,此次实验我收获很多。熟练了代码的调试,对进程的相关内容更加理解,也知道遇到问题要查阅资料,不要就闭门造车。

操作系统实验一:进程管理相关推荐

  1. 操作系统实验二 进程管理

    进程管理 一.实验目的 1. 理解进程的概念,明确进程和程序的区别. 2. 理解并发执行的实质. 3. 掌握进程的创建.睡眠.撤销等进程控制方法. 二.实验内容与基本要求 用C语言编写程序,模拟实现创 ...

  2. 操作系统——实验二 进程管理

    1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...

  3. 计算机操作系统实验二 进程管理

    一.实验目的 1.掌握进程的概念,明确进程的含义 2.认识并了解并发执行的实质 二.实验内容 1.编写一段程序,使用系统调用fork( )创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进 ...

  4. 操作系统 实验一 进程管理与进程同步

    理解安全性算法和银行家算法的核心机制: 针对3类资源.5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况: 编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申 ...

  5. 操作系统实验一 Linux基本操作|实验二 进程管理

    由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...

  6. linux进程管理命令实验,实验2Linux进程管理.doc

    实验2Linux进程管理 实验2 Linux进程管理 实验目的 1.加深对进程概念的理解,明确进程和程序的区别 2.进一步认识并发执行的实质 3.分析进程争用资源的现象,学习解决进程互斥的方法 实验性 ...

  7. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...

  8. (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 文章目录 一 ...

  9. (王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题

    注意:生产者与消费者问题Linux系统编程专栏有案例讲解 Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型 Linux系统编程40:多线程之基于环形队列的生产者与消费者模型 本文接:(王 ...

  10. 笔记篇:操作系统第二章 进程管理

    笔记篇:操作系统第二章 进程管理 目录 笔记篇:操作系统第二章 进程管理 2.1 进程的基本概念 2.1.1 程序的顺序执行及其特征 2.1.2 前驱图 2.1.3 程序的并发执行及其特征 2.1.4 ...

最新文章

  1. LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化
  2. 如何真正理解用户标签体系?
  3. RMAN的一些术语解释
  4. 桶排序(BucketSort)(java)
  5. view detail data in gateway error log
  6. wince版本ffmpeg的编译 第四篇
  7. 本地修改指向服务器,本地修改指向服务器
  8. Python高级——Web静态服务器(面向对象)
  9. 计算机毕业设计中用Java实现商场库存清单案例
  10. 肺结节圆形边界光滑_肺结节读片(16):再谈肺磨玻璃结节边界的CT形态特点
  11. Java设计模式------单例模式
  12. PPT设置自动保存时间 mac_第17期分享:如何控制PPT演讲汇报时间?
  13. win10升级补丁_win10教育版有什么优缺点
  14. LX4056耐高压线性锂电池充电IC(耐压30V,带OVP,带NTC)
  15. DSP28377S_CAN通信
  16. 360怎样修改wifi服务器地址,360安全路由器IP地址设置的具体操作方法介绍
  17. 公司内部搭建DHCP和DNS服务器
  18. Redis遇到过的问题(Could not get a resource from the pool)
  19. matlabnbsp;pcode命令nbsp;生成…
  20. 台式计算机如何上网设置,台式电脑怎样设置宽带自动连接?

热门文章

  1. how2heap 深入学习(2)
  2. 隔离式DC/DC高压模块5V12V24V转50V110V250V300V380V600V1100V短路保护直流升压可调开关控制电源模块
  3. 关于字符数组的初始化
  4. 分布式和集群的概念区别
  5. 机器学习案例丨基于广泛和深入的推荐 - 餐厅评级预测
  6. linux越狱amd卡代码,为Linux内核贡献27.5万行代码中:AMD意外泄漏下一代APU信息
  7. java 获取当前时间所在自然周起止时间及自然周中的每一天
  8. 关于结构化,半结构化,非结构化数据的理解
  9. linux - 中断子系统分析(1) -- GICv3硬件架构
  10. Educoder Java高级特性 - JDBC(上)