操作系统(一) 进程管理

  1. 进程
    进程,就是运动中的程序代码块,它是“活的”。于是,程序与进程可以理解为,死人与活人的区别。既然进程是“活的”,那么它必定就有“活着”的几种状态——就绪,执行,阻塞。
    就绪,进程已具有了运行的能力,但是CPU还不能分配给它;执行,进程占用CPU,并在CPU上面运行;阻塞,正在执行的进程,由于等待某个事件发生而无法执行时,便放弃CPU而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

这里写图片描述

(1)创建》》》就绪,单个CPU被占用时,进程创建之后就处于就绪状态。
(2)就绪》》》执行,当一个执行的进程的时间片用完之后,就绪列队中就出现某一进程占用CPU执行。
(3)执行》》》就绪,当一个执行的进程的时间片用完之后,便进入就绪列队等待下一次的召唤,前提是该进程没有被杀死。
(4)执行》》》阻塞,在执行的过程中,由于突然出现了某种“故障”,此时,进程放弃CPU。
(5)阻塞》》》执行,“故障”得到解决,但是此刻的CPU被其他进程霸占,因此,只能处在就绪状态。

  1. 进程控制块
    进程创建之后,操作系统要如何才能感知进程呢?这时候就需要用到进程控制块了。进程控制块是操作系统核心的一种数据结构,操作系统只能通过进程控制块来控制和管理进程。进程控制块是操作系统感知进程的唯一标志。

  2. 进程与线程
    线程是进程的一部分。例如,网易云音乐是什么?一说到网易云音乐你此刻的脑海里联想到的是什么?听音乐、下载音乐…….我们把网易云音乐抽象出来,就可以理解为一个进程。网易云音乐可以同时听歌和下歌,听歌和下歌就是就是我们所说的线程。一个进程同时干很多事情,就是多线程。以下有一个更加通俗易懂的文章。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);
}


#include #include &quot;dos.h&quot; #include &quot;stdlib.h&quot; #include &quot;conio.h&quot; //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=NULL; //head=NULL; return(head); } //从链表起始地址开始输出该链表的内容 void disp(PCB *head) {PCB *p1; p1=head; AnsiString str2; if(head!=NULL) //链表非空 { do { str2+=&quot; &quot;; str2+=IntToStr(p1->id);str2+=&quot; &quot;; str2+=(p1->state);str2+=&quot; &quot;; str2+=IntToStr(p1->ra);str2+=&quot; &quot;; str2+=IntToStr(p1->rb);str2+=&quot; &quot;; str2+=IntToStr(p1->rc);str2+=&quot; &quot;; str2+=IntToStr(p1->ntime);str2+=&quot; &quot;; str2+=IntToStr(p1->rtime);str2+=&quot;\r\n&quot;; p1=p1->next; }while(p1!=NULL); //不断输出进程的信息,直到链尾! } //if else { str2+=&quot;\t\t该 队 列 中 没 有 进 程!\r\n&quot; ;} 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); //读取需初
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值