赞
踩
进程(进程映像:PCB,程序,数据)是资源分配和调度的独立单位。(动态的,而非静态)
PCB: 包含进程的标记,优先级。
正文段: 全局赋值变量。
堆段: malloc动态分配资源。
栈段: 未赋值局部变量,函数调用实参传递。
若就绪态有就绪进程,则运行态必有进程。没有运行进程和就绪进程不代表没有进程:可能死锁,可能等待。
对于键盘数据输入开启单线程即可。
因为每个进程都有独立的空间,需要借助 kernel 通信。
共享存储: 数据结构,数据区。
消息传递: 直接通信(消息队列);间接通信(挂入中间实体)。
管道通信: 双向传输的半双工通信的pipe文件操作;管道空,读进程阻塞;管道满,写进程阻塞,允许同时存在。
基本: 进程实体,独立调度和分派的最小单位;处理机的分配单元。
其他: 不拥有资源,并发性强,开销小,共享同一进程下的资源,可以直接通信;同一程序可分成不同的用户线程供用户使用。
ULT & KLT: 用户,内核。
多线程模型: 多对一(不同参数控制同一个程序),一对一(进程<->程序),多对多(并发执行不同程序),一对多(一个进程多个程序)。
多任务模型: OS同时执行的程序个数。
(高级调度)作业调度: 高
(中级调度)内存调度: 中
(低级调度)进程调度: 低
调度方式:抢占/非抢占。
(常考)周转时间: 完成时间 - 进入队列的时间
(常考)带权周转时间: 周转时间 / 程序执行时间
RR的最后的周转时间以最后的那个为准。
操作 | 指标 | 具体细节 |
---|---|---|
FCFS | 时间 | 不可剥夺,短不利,CPU长 |
SJF | 执行时间长度 | 长不利,饥饿 |
优先级调度 | 优先级 | 优先级一致的时候,先来先服务 |
高响应比 | 比 | (等待 + 要求服务时间) / 要求服务时间,高者优先 |
RR | 时间片大小 | 强行停止,每次-1 |
多级反馈 | – | 适合各类用户 |
制约关系。
空闲让进,忙则等待,有限等待,让权等待。
单标志法:
设置公共资源占用标记turn,如果 turn 为一个标记为0的时候,这个程序可以使用。
while(turn != 0); | while(turn != 1);
critical section; | critical section;
turn = 1; | turn = 0;
remainder section; | remainder section;
双标志检查法
先检测对方的标志位,然后再检查自己的标志位。
//P0
while(flag[j]); //P2访问的话挡在外面
flag[i] = true;
critical section;
flag[i] = false;
remainder section;
//P1
while(flag[i]); //P1访问的话挡在外面
flag[j] = true;
critical section;
flagp[j] = false;
remainder section;
双标志法后检查
先设置自己的标志位,然后再检测对方的标志。
//P1
flag[i] = true;
while(flag[j]);
critical section;
flag[i] = false;
remainder section;
//P2
flag[j] = true;
while(flag[i]);
critcial section;
flag[j] = false;
remainder section;
Peterson’s Algorithm
设置完自己的标志之后也补充一个turn设置为对方使用。
//P1
flag[i] = true;
turn = j;
while(flag[j] && turn == j); //P2要使用,谦让之后挡在门外
critical section;
flag[i] = section;
remainder section;
//P2
flag[j] = true;
turn = i;
while(flag[i] && turn == i);
critical section;
flag[j] = false;
remainder section;
中断屏蔽: 关/开中断
硬件指令: T&S , Swap
PV: wait(消耗一个资源),signal(产生一个资源)
前驱实现
semaphore a1 = a2 = a3 = a4 = 0; //每种关系产生 / 消耗一个资源
S1(){
V(a1);V(a2);
}
管程: 一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
关系: 生产者 + 消费者
思路: 生产者生产放入缓冲池,消费者从缓冲池中拿出资源;缓冲池要设置满和空。
信号: mutex,full
semaphore mutex = 1 , empty = n , full = 0; producer(){ while(1){ produce an item in nextp; P(empty); P(mutex); add an item in nextp; V(mutex); V(full); } } consumer(){ while(1){ P(full); P(mutex); remove an item from buffer; P(mutex); V(empty); consume the item; } }
关系: 读者,写者
思路: 1.多个读者同时读取信息,2.一个写者写入信息,3.写完成之前不允许其他读者/写着工作;4.写前,读者/写者退出。
信号: mutex,cnt(此时读取资源的人数),rw(控制cnt的信号)
semaphore mutex = 1 , rw = 1; int cnt = 0; Reader(){ while(1){ P(rw); Writing; V(rw); } } Writer(){ while(1){ P(mutex); if(count == 0) P(rw); count ++; V(mutex); reading; P(mutex); count --; if(count == 0) V(rw); V(mutex); } }
关系: 哲学家和其两边的哲学家存在互斥关系。
思路: 取筷子的时候要带上互斥量,拿起筷子,吃,放下筷子,思考。
信号: chop[5] = {1 , 1 , 1 , 1 , 1} , 左边标号 i,右边标号(i + 1) % 5;mutex。
semaphore chop[5] = {1 , 1 , 1 , 1 , 1} , mutex = 1;
Pi(){
do{
P(mutex);
P(chop[i]); //拿左筷子
P(chop[(i + 1) % 5]); //拿右筷子
V(mutex);
eat;
V(chop[i]); //放左筷子
V(chop[(i + 1) % 5]); //放右筷子
think;
}while(1);
}
关系: 三个抽烟者,一个供应者
思路: 一个随机生成函数,三个进程函数。
信号: offer1, offer2 , offer3 , finish抽烟动作。
int random; semaphore offer1 = offer2 = offer3 = finish = 0; process P1(){ random; random = random % 3; if(random == 0) V(offer1); else if(random == 1) V(offer2); else V(offer3); put on the desk; P(finish); } Process P2(){ while(1){ P(offer3); put paper and clue on the desk; V(finish); } } Process P3(){ while(1){ P(offer2); put cig and clue on the desk; V(finish); } } Process P4(){ while(1){ P(offer1); put cig and paper on the desk; V(finish); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。