全知识整理目录
操作系统整理的目录,包括了整理的所有操作系统的知识。
概述
进程的软件实现方法,就是在进入区设置检查一些标志,来标明是否有进程在临界区中,如果已经有进程在临界区,那么通过循环检查进行等待,进程离开临界区后则在退出修改标志。
简而言之,就是入区循环检查,离开临界区则修改标志。
目录
单标志法
每个进程进入临界区都会被赋予权限,但是这个临界区只能赋予一个进程。
int turn = 0; //turn表示当前允许进入临界区的进程号
P0进程:
while(turn != 0){
critical section;
turn = 1;
remainder section;
}
int turn = 0; //turn表示当前允许进入临界区的进程号
P0进程:
while(turn != 1){
critical section;
turn = 0;
remainder section;
}
单标志法,就是使用turn来做出一定的标志,根据判断标志来判断,此刻应该让那个进程进入临界区。即一直要按照指定的顺序访问临界区,P0->P1->P0->P1........,如果此时P0出现访问不到临界的情况,那么P1也会一直访问不到临界区,违反了空闲让进的原则。
双标志先检查法
设置一个Boolean类型的数组flag[],数组中各个元素用来,标记各进程想进入临界区的意愿,比如flag[0] = ture 就代表0号进程P0,现在想要进入临界区。每个进程在进入临界区前,先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设置为true,之后开始访问临界区。
bool flag[2]; //表示进入临界区的意愿组
flag[0] = false;
flag[1] = false; //刚开始两个进程都想要进入临界区
P0进程:
while(flag[1]) //循环等待
flag[0] = true; //想要进入临界区
critical section; //临界区
flag[0] = false; //退出区
remainder section //剩余区
P1进程:
while(flag[0]) //循环等待
flag[1] = true; //想要进入临界区
critical section; //临界区
flag[1] = false; //退出区
remainder section //剩余区
双标志检查法的最大缺点是,检查和上锁两个处理不是一气呵成的。检查后,上锁可能发生进程的切换,那么此刻可能发生进程的却换。违反了忙则等待的原则。
双标志后检查法
这是为了解决双标志检查法的问题。为了解决双标志检查法,检查和上锁无法一气呵成,有可能导致进程切换的情况。那么就先上锁后检查,这就是双标志后检查法做的事情。
bool flag[2]; //表示进入临界区的意愿组
flag[0] = false;
flag[1] = false; //刚开始两个进程都想要进入临界区
P0进程:
flag[0] = true; //进入区
while(flag[1]); //循环等待
critical section; //临界区
flag[0] = false; //退出区
remainder section //剩余区
P1进程:
flag[1] = true; //进入区
while(flag[1]) //循环等待
critical section; //临界区
flag[1] = false; //退出区
remainder section //剩余区
如果,P0和P1都同事i想要进入临界区,那么都会进入循环等待对方的情况,这样就违反了,空闲让进和有限等待的原则。
Peterson算法
双标志后检查法,遗留的问题是,两个进程都想要进入临界区,但是谁也不让谁,最后都会陷入等待的状态。peterson这个人想到了一个办法,如果双方都想要进入临界区,那么就互相让,主动让对方先使用临界区,谁后让谁就使用临界区。
bool flag[2]; //表示进入临界区的意愿组
int turn = 0; //表示那个进程进入临界区
P0进程:
flag[0] = true; //进入区
turn = 1; //置换为对方的序号,表示可以让对方先进入
while(flag[1] && trun ==1); //循环等待
critical section; //临界区
flag[0] = false; //退出区
remainder section //剩余区
P1进程:
flag[1] = true; //进入区
trun = 0; //置换为对方的序号,表示可以让对方先进入
while(flag[0] && turn == 0); //循环等待
critical section; //临界区
flag[1] = false; //退出区
remainder section //剩余区