进程管理

一,进程的基本概念

在传统的操作系统中,程序不能独立的运行,作为资源分配和独立运行的基本单位都是进程,操作系统所具有的四大特征也都是基于进程而形成的。


二,进程的特征

1,结构特征

通常的程序不能并发执行,为使程序能独立运行,应为之配置一进程控制块,即PCB(Process  Control  Block)。而由程序段、相关的数据和PCB三部分构成了进程实体。


2,动态性

进程的实质是进程实体的一次执行过程,动态性是进程最基本的特征。进程的动态性还表现在,它由创建而产生,由调度而执行,由撤销而消失。


3,并发性

指多个进程实体同存在于内存中,且能在一段时间内同时运行。


4,独立性

进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位。


5,异步性

进程按各自独立的、不可预知的速度向前推进。


三,进程的三种基本状态

1,就绪状态

当进程分配到除CPU以外的所有必要资源后,只要获得CPU,便可立即运行,进程此时的状态称为就绪状态。


2,执行状态

进程已获得CPU,正在执行。


3,阻塞状态

正在执行的进程由于发生某件事无法继续执行下去,便放弃处理机而处于暂停状态。


四,进程同步

1,进程同步的概念

进程同步的主要任务是对多个相关进程在执行次序上进行协调,以使多个并发执行的进程之间能有效的共享资源与相互合作,从而使程序的执行具有可再现性。


2,临界资源

打印机、IO设备都是临界资源,多个进程之间应该采用互斥方式,实现对这种资源的共享。


3,临界区

每个进程中访问临界资源的那段代码称为临界区。


4,同步机制应遵循的规则

(1),空闲让进:

    没有进程处于临界区,表示临界资源处于空闲状态,应允许一个请求进入临界区的进程进入自己的临界区,以有效利用临界资源。

(2),忙则等待:

    当已有进程处于临界区,其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。

(3),有限等待:

    对要求访问临界资源的进程,应保证在有效的时间内进入自己的临界区。

(4),让权等待:

    当进程不能进入自己的临界区时,应立即释放掉处理机。


五,进程间的通信

进程通信指的是进程间的信息交换,目前常用的三种进程间的通信方式如下:

1,共享存储器系统。

2,消息传递系统。

3,管道通信系统。


六,信号量机制

1,整型信号量

整型信号量是一个用于表示资源数目的整形量S,它与一般的整形量不同,除初始化外,仅能通过两个标准的原子操作wait(S)和singal(S),这两个操作可以描述为:

wait(S)   : while(S <= 0) do no-op
            S = S - 1;
signal(S) : S = S + 1;

wait(S)和singal(S)是两个原子操作,他们的执行是不可中断的,当一个进程在修改某信号量时,没有其他的进程可同时对该信号量进行修改。


2,利用信号量实现进程互斥

为使多个进程能互斥的访问某临界资源,只需为该资源设置一个互斥信号量mutex,并把它的值初始化为1,然后将各进程访问该资源的临界区代码置于wait(mutex)与signal(mutex)之间即可。

mutex = 1;
process 1:
    begin
        repeat
            wait(mutex);
            critical section;
            signal(mutex);
        until false;
    end
process 2:
    begin
        repeat
            wait(mutex);
            critical section;
            signal(mutex);
        until false;
    end

 

七,经典的进程同步问题

1,生产者 - 消费者

问题描述:

有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经满的缓冲区中再次投放产品。

解决方法:

假设生产者与消费者之间的公用缓冲池中,具有n个缓冲区。此时可以使用互斥信号量mutex实现诸进程对缓冲池的互斥使用,利用信号量empty与full分别表示空缓冲区与满缓冲区的数量。

buffer[n];
mutex = 1;
empty = n;
full = 0;

proceducer:
    begin
        repeat
            producer an item;
            wait(empty);
            wait(mutex);
            do op;
            signal(mutex);
            signal(full);
        until false;
    end;
consumer:
    begin
        repeat
            wait(full);
            wait(mutex);
            do op;
            signal(mutex);
            signal(empty);
            consumer the item;
        until false;
    end;

 

2,哲学家进餐问题

问题描述:

n哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,n哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,n平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,n进餐完毕,放下筷子又继续思考。

约束条件:

(1),只有拿到两只筷子时,哲学家才能吃饭。

(2),如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。

(3),任一哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。
解决方法:
筷子是临界资源,一段时间只允许一位哲学家使用。为了表示互斥,用一个信号量表示一只筷子,五个信号量构成信号量数组。算法描述如下:n用五支筷子的信号量构成信号量数组
semaphore stick[5] = {1, l, 1, l, 1};
philosopher:
    begin
        repeat
            p(stick[i]);
            p(stick[(i+1) % 5]);
            进餐;
          v(stick[(i+1) % 5]);
            v(stick[i]);
           思考;
        until false;
    end
死锁问题:
当哲学家饥饿时,总是先去拿他左边的筷子,执行wait(stick[I]),成功后,再去拿他右边的筷子,执行wait(stick[I+1]%5),成功后便可进餐。进餐完毕,先放下他左边的筷子,然后再放下右边的筷子。当五个哲学家同时去取他左边的筷子,每人拿到一只筷子且不释放,即五个哲学家只得无限等待下去,引起死锁。
解除死锁:
破坏请求保持条件,利用原子思想完成。即只有拿起两支筷子的哲学家才可以进餐,否则,一支筷子也不拿。利用记录型信号量机制实现在初始化中增加一个互斥信号量定义:semaphore mutex=1。
semaphore stick[5] = {1, l, 1, l, 1};
semaphore mutex = 1;
philosopher:
    begin
        repeat
            p(mutex);
            p(stick[i]);
            p(stick[(i+1) % 5]);
            进餐;
          v(stick[(i+1) % 5]);
            v(stick[i]);
            v(mutex);
            思考;
        until false;
    end
 
3,读者 - 写者问题
问题描述:
有读者和写着两组并发进程,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不能写文件。 
约束条件:
(1),允许多个文件可以同时对文件执行读操作。
(2),只允许一个写者执行写的操作。
(3),任一写者在完成写的操作之前,不允许其他的写者或读者对文件进行访问。
(4),写者执行写操作之前,应让所有的写者和读者全部退出。
问题分析:
(1),由题目分析写者与读者是互斥的,写者与写者也是互斥的,读者与读者不是互斥的。
(2),两个进程,即读者与写者。写者是很容易实现的,它和任一的其他进程都是互斥的,可以使用一个互斥信号量解决。读者进程比较的复杂,它要实现与写者进程的互斥,同时要与其他的读者进程保持同步。在这里可以设置一个计数器,用来判断有多少读者进程在读文件。当有读者在读文件时,写者是无法进行写操作的,当没有读者的时候,写者才可以写文件。同时,不同的读者对计算器的访问也是互斥的。
(3),信号量的设置,首先设置信号量count为计算器,用来记录当前的读者的数量。设置mutex为互斥信号量,保持对count的互斥访问。设置互斥信号量rw,用于读者与写者的互斥访问。
解决方法:
1,读者优先算法
int count=0;        //用于记录当前的读者数量
semaphore mutex=1;  //用于保证对count的互斥访问
semaphore rw=1;     //用于保证读者和写者互斥地访问文件

writer(){           //写者进程
    while(1){
        P(rw);      //互斥访问共享文件
        Writing;    //执行写操作
        V(rw) ;     //释放共享文件
    }
}

reader(){               //读者进程
    while(1){
        P(mutex);       //互斥访问count变量
        if(count==0){   //当第一个读进程读共享文件时
            P(rw);      //阻止写进程写
        }
        count ++;       //读者计数器加1
        V(mutex);       //释放互斥变量count
        reading;        //执行读操作
        P(mutex) ;      //互斥访问count变量
        count --;       //读者计数器减1
        if (count==0){  //当最后一个读进程读完共享文件
            V(rw) ;     //允许写进程写
        }
        V(mutex) ;      //释放互斥变量 count
    }
}
程序分析:
在上面的算法中读进程是优先的,也就是说当存在读进程在读取文件时,写进程会被延时。只要有一个读进程在读取文件,随后进来的读进程都会被允许读取文件。这样的方式下,可能会导致写进程长时间的无法访问文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值