1.Intro
为了实现多道程序环境,操作系统设计引入了进程Process的概念。 为了协调进程间的相互制约,则又引入了进程同步进程互斥的概念。 为了更直观地处理进程相互制约的问题,我们把一次仅允许一个进程使用的资源称为临界资源。把进程访问这个资源的那段代码称为临界区。
do {
entry section; //进入区
critical section; //临界区
exit section; //退出区
remainder section; //剩余区
} while (true)
2.什么是进程同步?什么是进程互斥?
同步是指为了完成某种任务而建立的多个进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。通俗地讲,多个存在合作关系的进程之间使用进程同步技术来协调。
互斥是指一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后另一个进程才能访问该资源。
3.实现临界区进程互斥的技术
3.1软件方法,即Peterson算法
// Px进程
flag[x]=1; turn=y;
while(!flag[x] && turn!=x);
critical section;
flag[x]=0;
remainder section
//Py进程
flag[y]=1; turn=x;
while(!flag[y] && turn!=y);
critical section;
flag[x]=0;
remainder section;
3.2硬件方法,即硬件指令方法
TestAndSet指令:一个原子操作。功能是读出指定标志后把该标志设置为1.
bool TestAndSet(bool *lock)
{
bool old;
old = *lock;
*lock = 1;
return old;
}
为每个临界资源设置一个共享bool型变量lock,为1表示被占用。
while TestAndSet (& 1 ock);
// 进程的临界区代码段;
lock=false;
// 进程的其他代码
Swap指令:该指令的功能是交换两个字节的内容。其功能描述如下。
Swap(boolean *a, boolean *b){
boolean temp;
Temp=*a;
*a = *b;
*b = temp;
}
4信号量机制
4.1信号量是什么
我们设计一个量,用来描述某一资源的当前状态。如整型信号量s用来描述当前某一空闲资源的数量。
- 整型信号量
在设计操作系统的时候,我们会保留出两个原子语句操作:P(S)和V(S),也可以称为wait(s)和signal(s)。wait(s)表示请求占用资源s,signal(s)表示回收资源s。这里使用s来表示某一空闲资源数量。
seaphore wait(s)
{
while(s<1);
s--;
}
seaphore signal()
{
s++;
}
- 记录型信号量
typedef struct {
int value; //资源数目
struct process *L; //整型变量
} semaphore;
void wait(semaphore S)
{
S.value--;
if(S.value>0)
{
add a process P to S.L;
S.value--;
}
}
void signal(semaphore S)
{
S.value++;
if(S.value<=0)
{
remove a process P from S.L;
wakeup(P);
}
}
4.2利用信号量实现进程互斥
4.3利用信号量实现进程同步
5经典进程同步问题:生产者消费者问题
6经典进程同步问题:读者写着问题
7经典进程同步问题:哲学家进餐问题
8总结summary
- linux
- windows