操作系统(一) 进程管理

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值