- 进程
进程,就是运动中的程序代码块,它是“活的”。于是,程序与进程可以理解为,死人与活人的区别。既然进程是“活的”,那么它必定就有“活着”的几种状态——就绪,执行,阻塞。
就绪,进程已具有了运行的能力,但是CPU还不能分配给它;执行,进程占用CPU,并在CPU上面运行;阻塞,正在执行的进程,由于等待某个事件发生而无法执行时,便放弃CPU而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
(1)创建》》》就绪,单个CPU被占用时,进程创建之后就处于就绪状态。
(2)就绪》》》执行,当一个执行的进程的时间片用完之后,就绪列队中就出现某一进程占用CPU执行。
(3)执行》》》就绪,当一个执行的进程的时间片用完之后,便进入就绪列队等待下一次的召唤,前提是该进程没有被杀死。
(4)执行》》》阻塞,在执行的过程中,由于突然出现了某种“故障”,此时,进程放弃CPU。
(5)阻塞》》》执行,“故障”得到解决,但是此刻的CPU被其他进程霸占,因此,只能处在就绪状态。
进程控制块
进程创建之后,操作系统要如何才能感知进程呢?这时候就需要用到进程控制块了。进程控制块是操作系统核心的一种数据结构,操作系统只能通过进程控制块来控制和管理进程。进程控制块是操作系统感知进程的唯一标志。进程与线程
线程是进程的一部分。例如,网易云音乐是什么?一说到网易云音乐你此刻的脑海里联想到的是什么?听音乐、下载音乐…….我们把网易云音乐抽象出来,就可以理解为一个进程。网易云音乐可以同时听歌和下歌,听歌和下歌就是就是我们所说的线程。一个进程同时干很多事情,就是多线程。以下有一个更加通俗易懂的文章。http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
进程与线程之间还纠缠着许多的问题。不过,此文只讲进程的管理。以下为PCB代码。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct PCB //结构体的构建
{
char name[10]; //进程名
int priority; //优先级
int time; //运行时间
int state; //状态
};
struct PCB NeiCun[20]; //该程序假设一个进程一个内存
int num = 0;
void ChuangJian();
void ChaKan();
void HuanChu();
void ShaSi();
/***********************主程序*************************/
void main()
{
int a = 1,b;
while(a)
{
printf("\n**********************************************");
printf("\n*** 进程演示系统 ***");
printf("\n**********************************************");
printf("\n 1.创建新的进程 2.查看运行进程");
printf("\n 3.换出某个进程 4.杀死运行进程");
printf("\n 5.退出 ");
printf("\n**********************************************");
printf("\n请选择(1~5):");
scanf("%d",&b);
switch(b)
{
case 1: ChuangJian(); getch(); break;
case 2: ChaKan(); getch(); break;
case 3: HuanChu(); getch(); break;
case 4: ShaSi(); getch(); break;
case 5: exit(0);
default: a = 1; break;
}
}
}
/***********************创建新的进程*************************/
void ChuangJian()
{
if(num >= 20)
{
printf("\n内存已满,请退出或者换出进程");
}
else
{
num++;
printf("\n请输入新的进程名\n");
scanf("%s",NeiCun[num-1].name);
printf("\n请输入新进程的优先级(数字)\n");
scanf("%d",&NeiCun[num-1].priority);
printf("\n请输入新进程的需要的运行时间\n");
scanf("%d",&NeiCun[num-1].time);
printf("\n创建进程时令其状态为就绪\n");
NeiCun[num-1].state=2; //1为阻塞,2就绪,3为运行
} //状态只能选择这三种
printf("\n创建进程成功!");
}
/***********************查看运行进程*************************/
void ChaKan()
{
if(num <= 0)
{
printf("当前状态无进程,按任意键继续创建进程\n");
return;
}
int max = 0;
for(int i = 0; i < num; i++)
if(NeiCun[i].state == 2 && NeiCun[i].priority <= NeiCun[max].priority)
{
max = i; //此处判断优先级的高低。
}
if(NeiCun[max].state == 2)
{
NeiCun[max].state = 3; //此时进程运行
printf("/************当前已有进程%d个***********/:\n",num);
for(int i = 0; i < num; i++)
{ printf("进程编号:%d",i+1);
printf("\n/***正在运行进程程序名:%s ***/\n",NeiCun[i].name);
printf("\n/***该进程的优先级: %d ***/\n",NeiCun[i].priority);
printf("\n/***该进程的运行时间: %d ***/\n",NeiCun[i].time);
printf("\n/***该进程的状态: %d (1为阻塞,2就绪,3为运行)***/\n",NeiCun[i].state);
}
}
}
/***********************换出运行进程*************************/
void HuanChu()
{
int k;
if(num <= 0)
{
printf("当前进程数目为0,不能执行该操作\n");
return;
}
printf("当前已有的进程%d个",num);
for(int h = 0; h < num; h++)
printf("序号:%d\t程序名:%s\t优先级:%d\t运行时间:%d\t状态:%d\t\n", h, NeiCun[h].name, NeiCun[h].priority, NeiCun[h].time, NeiCun[h].state);
printf("请输入要换出的进程的序号:");
scanf("%d",&k);
if(NeiCun[k].state == 3)
{
NeiCun[k].state = 1; //令当前运行进程状态为等待,即,将该进程换出
printf("已被换出,进程名为:%s、状态为:%d", NeiCun[k].name, NeiCun[k].state);
}
else
{
printf("无法换出,进程名为:", NeiCun[k].name);
}
}
/***********************杀死运行进程*************************/
void ShaSi()
{
int k;
if(num <= 0)
{
printf("当前进程数目为0,不能执行该操作\n");
return;
}
printf("当前已有的进程%d个\n",num);
for(int h = 0; h < num; h++)
{
printf("序号:%d\t程序名:%s\t优先级:%d\t运行时间:%d\t状态:%d\t\n", h, NeiCun[h].name, NeiCun[h].priority, NeiCun[h].time, NeiCun[h].state);
}
printf("请输入要杀死的进程的序号:");
scanf("%d", &k);
num--; //进程数目减一
printf("进程名为:%s已被杀死!\n", NeiCun[k].name);
}