进程通信及处理器调度

进程通信及处理器调度
1、进程并发条件


在并发环境中进程执行方式与顺序环境中的进程执行方式存在一些差异,主要表现在:
1.进程执行是简短的。因为在多道程序中,处理器交替的为多个进程服务,进程运行中会出现间断。对某个程序而言,其执行过程很可能失去原有的时序关系。
2.程序执行有可能失去其封闭性。程序的封闭性是指在同一段程序中一旦处置设定后,程序执行结果不应该受外界环境的影响。
3.程序运行有可能失去可再现性。在程序执行中由于其封闭性被打破,所以程序的再现性无法保证。也就是说,当进程两次运行的环境发生变化是,进程运行的结果叶产生了变化,使得程序多次执行的结果不一致,无法复现上一次的执行状态。
如果在并发环境中的程序失去了封闭性和可再现性,那么程序执行将毫无意义。


条件:
1.对程序P1的读集合与对程序P2的写集合的操作的交集为空
2.对程序P1的写集合与对程序P2的读集合的操作的交集为空
3.对程序P1的写集合与对程序P2的写集合的操作的交集为空
如果并发程序满足以上条件,可以保证其执行结果满足封闭性和可再现性。


2、进程交互方式
1.交互时进程间完全不知道对方的存在
2.交互时进程间接知道对方的存在
3.交互时进程直接知道对方的存在


3、进程互斥的实现


进程互斥基本原则:
1.进程对共享资源访问必须采用强制的互斥方式
2.当某进程推出临界区时,不能阻止其他进程进入临界区
3.每个进程从申请进入临界区到允许进入临界区这个时间段应该是一个有限值
4.当临界区中没有进程存在是,任何请求进入临界区的进程都应该能够立即进入
5.进程互斥对进程执行速度和使用处理器的个数应该没有要求和限制
6.一个进程驻留在临界区的时间必须是有限的。

进程互斥机制的实现方式:
1>进程互斥软件实现方法
在互斥实现中以用到一种算法--Dekker算法,其主体思想就是在程序中设置一些标志,让这些标志提醒进程是否可以进入临界区工作;当临界区中已有一个进程时,调整标识的值给出警示,禁止另一个进程在此时进入临界区。

Peterson算法:
void P0()
boolean flag[2];
int turn;
void P0()
{
while(true)
{
flag[0] = true;
turn = 1;
while(flag[1] && turn == 1)
{
/*不做任务操作*/
/*进入临界区操作*/
flag[0] = false;
/*释放临界区*/
}
}
}
void P1()
{
while(true)
{
flag[0] = true;
turn = 1;
while(flag[1] && turn == 1)
{
/*不做任务操作*/
/*进入临界区操作*/
flag[0] = false;
/*释放临界区*/
}
}
}

2>支持进程互斥的硬件机制
1.中断禁用
2.设计专用的机器指令

使用机器语言实现进程互斥的特点:
优点:
1.适用于单处理器或共享主存储器的多处理器系统中的多个进程互斥管理
2.构造互斥机制的方法比较简单
3.可支持多临界区的互斥管理,每个临界区用自己的变量来定义
缺点:
1.因为在设计中使用了忙等待,所以等待进入临界区的进程也在消耗处理器时间
2.可能出现饿死状态,因为若有多个进程等待进入临界区,最后选谁进入没有进程控制
3.可能出现死锁情况。如:进程P2比P1优先级高,P1被P2抢先,而P2又要使用P1已占用的资源,这时就出现了死锁情况。


4、进程同步的含义

若存在直接制约关系的进程,又一个简单的管理方法,即让进程间相互传递、接收具有执行条件的信号,然后再开始工作,从而达到协同工作的目的。我们将一组并发进程中因直接制约而相互发送消息,协同工作的过程称为进程间的同步。

5、生产者--消费者问题


该模型中存在同步问题,是:
1.当消费者需要使用缓冲区数据时,n个缓冲区中至少有一个单元是被填写过的
2.生产者进程需要填写数据时,至少缓冲区中有一个单元时空的
该模型中还存在互斥问题,时:
1.多个生产者进程生产数据后要填写缓冲区时,因为要通过指针找到当前填写的位置,这时指针变量就是临界资源,所以它们要进行互斥操作
2,多个消费者进程需要使用数据时,因为消费指针变量时临界资源,所以也要进行互斥操作

假设生产者进程用函数produce_item(data)填写缓冲区,消费者进程用函数remove_item(data)使用缓冲区,设定以下信号量:
Mutex--公用信号量,表示可用缓冲区个数,初值为1
Empty--生产者私有信号量,表示缓冲区中的空单元数,初值为n
Full--消费者私有信号量,表示缓冲区中的非零单元数,初值为0

设计方案:
#define N 100 /*定义缓冲区的缓冲单元个数*/
typedef int semaphore; /*semaphore是一种特殊的int类型*/
semaphore mutex = 1; /*控制临界区访问*/
semaphore empty = N; /*缓冲区空单元计数*/
semaphore full = 0; /*缓冲区已填充计数*/
void producer(void)
{
int item;
while(TURE) /*TRUE设置为常数1*/
{
item = produce_item(); /*生成一些数据放在缓冲区*/
down(&empty); /*完成判定并递减空单元数的操作*/
down(&mutex); /*进入临界区,并设置互斥量*/
insert_item(item); /*将新生成数据放入缓冲单元中*/
up(&mutex); /*完成释放临界区操作*/
up(&full); /*完成递增已填写单元数的操作*/
}
}
void consumer(void)
{
int item;
while(TRUE)
{
down(&full); /*递减并判别已填充缓冲单元数*/
down(&mutex); /*进入临界区,并设置互斥量*/
item = remove_item(item); /*从缓冲单元中拿走一项*/
up(&mutex); /*释放临界区*/
up(&empty); /*递增缓冲区空单元数*/
consumer_item(item); /*使用取出的数据项完成消费工作*/
}
}


6、信号量

信号量是信号处理中的特殊变量,信号管理的基本思想就是通过简单的信号量,实现多个进程间的彼此合作,完成任务的并发调度。


通常对信号量的操作有两个:信号发送和信号接收
1.发送信号s采用函数是signal(s)。对信号量做signal操作时,会增加信号量的值,如果信号量的值不是正整数,就解除由于wait操作而阻塞的一个进程
2.接收信号s采用的函数是wait(s)。对信号量做wait操作时,会减少信号量的值。如果数值变成了负数,那么执行wait操作的进程会被阻塞

缺陷:
1.对信号量的控制分布在整个程序中,其争取行难以保证
2.设计中很难保证进程互斥访问临界区完全正确
3.使用信号量实现进程互斥和同步的程序易读性差
4.程序不利于修改和维护。由于模块间耦合力度大,任何一组变量或一段代码的修改都可能影响到全局。

7、管程

管程时并发管理中的一个特殊概念,它的出现主要时因为在解决并行管理的实际问题中发现,用信号量实现进程间同步存在着一些很难克服的弊端。
管程时一种设计语言结构,每一个管程时一个基本程序单位,可以被单独编译。管程所构成的软件模块其内部时由一个或多个过程、一个初始化序列和全局数组构成的。


进入管程的进程管理
1.当进入管程的进程执行等待操作时,需要设防管程中的互斥权,这时就允许新的进程进入管程,原来的进程进入睡眠态。在管程内有一套进程控制机制,当进程执行唤醒操作时,从宏观看,管程中存在两个同时处于活动状态的进程
2.假设管程中有进程P,Q,那么它们的唤醒切换约定如下:
P等待,Q继续,知道Q等待或退出
Q等待,P继续,知道P等待或退出
规定唤醒是管程中最后一个可执行的操作。

8、经典IPC问题:读者--写者问题

当一个共享数据区为多个进程提供读写服务时,存在一些只读进程(reader)和一些只写进程(writer)。
1.任意时刻写进程只能有1个
2.有多个读进程请求访问共享区时,可以同时访问
3.若有一个写进程正在对共享区访问,则将禁止所有其他读写进程的访问


typedef int semaphore; /*定义整型的信号量*/
semaphore mutex = 1; /*为控制对全局量rc的访问而设置的信号量*/
semaphore db = 1; /*为控制对数据库的访问而设置的信号量*/
int rc = 0; /*rc是正在读或者等待读的进程数,初值为0*/
void reader(void)
{
while(TRUE){ /*设置无限循环方式*/
down(&mutex); /*获取对rc变量的互斥访问权*/
rc = rc+1; /*这时又多了一个读进程*/
if(rc==1) down(&db); /*若是第一个读者,则允许访问*/
up(&mutex); /*释放对rc的互斥操作*/
reader_data_dase(); /*完成数据访问操作*/
down(&mutex); /*获取对rc变量的互斥访问权*/
rc = rc-1; /*这时减少了一个读者进程*/
if(rc==0) up(&db); /*若是最后一个读者,可允许写*/
up(&mutex); /*释放对rc的互斥访问*/
use_data_read(); /*非临界区操作,使用读出数据*/
}
}
void writer(void)
{
while(TRUE){ /*设置无限循环方式*/
think_up_data(); /*非临界区操作,准备希望修改的数据*/
down(&db); /*获取数据库互斥访问权*/
writer_data_dase; /*更新数据库消息*/
up(&db); /*释放数据库互斥访问权*/
}
}

9、处理器调度算法

1>先来先服务(First Come First Service,FCFS)
主体思想是按照进程的某种顺序进行排序,然后按照这个排序进行调度
特点:
1.有利于长进程的运行,不利于短进程的进行,尤其不利于排在长进程后的短进程的运行。
2.有利于CPU繁忙型进程,不利于I/O繁忙型进程。因为对于CPU繁忙型,一旦分配了处理器就可以全力运行而不会有其他打扰;而对于I/O繁忙型进程,岗占用处理器时间步长就会碰到I/O操作,这时就会放弃处理器,效率低
2>短进程优先(Shortest Process Next,SPN)
是对FCFS的改进,目的是减少进程调度中的平均周转时间。主体思想是对预计执行时间短的进程优先分配处理器,同时规定后来进来的短进程不抢先正在执行的进程。
优点:
改善了FCFS的平均周转时间和平均带权周转时间,缩短了进程等待时间,提高整体吞吐量
缺点:
对长作业不利,甚至会导致长作业长时间无法得到关注而使得整体执行性能下降;另外,由于难以准确估计进程的执行时间,从而影响调度性能。
3>时间片轮转
将进程按FCFS原则拍成一个队列,每次调度是将处理器分派给对首进程。当进程执行一个时间片后,无论是否完成都将处理器让出。
4>多级队列算法
调度中引入了多个就绪队列,每个就绪队列与某类进程特性项对应,在调度时区别对待不同的就绪队列,以达到高效的综合调度目标。
5>优先级算法
调度时按多级队列的不同优先级调度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值