【重点详解】关于进程

进程是操作系统中很重要和基础的,而且也是面试中的常考题。关于进程可以延申出很多问题。

定义

进程是程序的一次执行过程,是资源分配,接受调度的基本单位。

进程由程序段,数据段,PCB三部分组成。所谓创建进程,实质上是创建进程中的PCB

进程控制块PCB

记录了操作系统所需的,用于描述进程的当前情况以及管理进程运行的全部信息,是操作系统的记录型数据结构

作用:

1)进程的唯一标识

2)能实现间断性运行方式

3)提供进程管理所需要的信息

4)提供进程调度所需要的信息

5)实现与其他进程的同步与通信

进程的五种状态

创建状态,就绪状态,运行状态,阻塞状态,结束状态

其中就绪状态和运行状态能相互转化,当进程为就绪态时,等待CPU分配时间片,得到时间片后就进入运行态。使用完时间片后,就进入就绪态

阻塞状态是进程在运行状态时,需要等待某个资源而处于等待

进程互斥

在操作系统中,当某一进程正在访问某一存储区域时,就不允许其他进程进行读写或者修改该储存区的内容,进程之间的这种相互制约的关系称为进程互斥

进程同步

并发进程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程同步

也就是保证多个进程能有条不紊的运行

进程同步的方式

1)临界区

对临界资源进程访问的那段代码叫做临界区

为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查

2)同步与互斥

3)信号量

信号量是一个整型变量,可以进行PV操作

4)管程

把控制的代码独立出来

进程通信

注意:

进程通信和进程同步容易混淆,他们确实有一定的因果关系。

进程同步:控制多个进程按一定顺序执行

进程通信:进程间传输信息

为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。

通信方式:

1)管道

只支持半双工通信

2)消息队列

3)信号量

4)共享存储

5)套接字

还有六种进程调度算法,也非常重要,这里我就不细讲了,和进程同步耦合性不是很强,笔者主要想讲解关于信号量的问题

信号量机制

信号量其实就是个计数器,简单一点的例子就是a进程访问临界资源,把信号量设置为0,然后b进程也想访问,发现信号量为0,无法访问。

用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥,进程同步

信号量机制实现进程互斥

步骤:

1)分析并发进程的关键活动,划定临界区

2)设置互斥信号量mutex,初值为1

3)在临界区之前执行P

4)在临界区之后执行V

mutex=1,标识两个进程皆未进入需要互斥的临界区

mutex=0,标识有一个进程进入临界区运行,另外一个必须等待,挂入阻塞队列

mutex=-1,表示有一个进程正在临界区运行,另外一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程退出时唤醒

信号量机制实现进程同步

步骤:

1)分析什么地方需要实现同步关系

2)设置同步信号量S,初始为0

3)在“前操作”之后执行V(S)

4)在“后操作”之前执行P(S)

下面的代码中,S就是同步信号量,若先执行到了V(S),则s++,正常执行P(S),保证了代码4在代码2之后执行

若先执行P(S),s–之后表示没有可用资源,P操作会执行block原语,主动请求阻塞

P(1) {
    代码1;
    代码2;
     V(S);
    代码3;
}

P(2) {
     P(S)
    代码4;
    代码5;
    代码6;
}

生产者-消费者问题

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品使用

需求:

  • 生产者每生产一个产品,就消耗一个缓冲区,只有当缓冲区不满的时候才能放入
  • 消费者每消费一个产品,就消耗一个产品,只有当缓冲区不空的时候才能消费

做法:

  • 因为缓冲区是临界资源,所以在访问的时候需要一个互斥信号量,实现互斥访问
  • 为了同步生产者和消费者的操作,需要记录缓冲区的剩余大小empty和产品的个数full。当缓冲区大小不为0时,生产者才能放入产品;当产品个数不为0时,消费者才能拿走产品。

注:同步在前,互斥在后,防止死锁

producer() {
    while(1) {
        生产一个产品;
        P(empty);    //消耗一个空闲缓冲区
        P(mutex);
        把产品放入缓冲区;    //临界区
        V(mutex);
        V(full);     //增加一个产品
    }
}

consumer() {
     while(1) {
         P(full);    //消耗一个产品
         P(mutex);
         从缓冲区取出一个产品;
         V(mutex);
         V(empty);    //增加一个空闲缓冲区
         使用产品;
    }
}
八股文合集 文章被收录于专栏

本专栏是我总结的八股大全

全部评论

相关推荐

点赞 12 评论
分享
牛客网
牛客企业服务