序言
1.OS以进程、线程的方式在CPU中执行静态保存在外存(内存)中的程序,进程的构成与状态转化,特别是进程的切换;
2.当有多个进程处于就绪态,有哪些常见的挑选以执行方式;
3.并发执行(乱序发射)的进程,共享内存等资源,很可能修改其他程序的变量,需作同步处理来控制;此外有些资源如打印机不能共享,需作互斥处理;
4.进程在CPU中的执行顺序是难以预测的(时间片、各种故障等factor)
Question
- 程序分割成线程执行的代码怎么写?用进程管理程序实现,python如何可以实现多线程并行吗,如何实现?
- 为什么用户级线程中,1个线程因系统调用被阻塞会导致其他线程也被阻塞?
因为在大多数操作系统中,内核是单线程运行的,所以当一个线程被阻塞时,它会释放CPU资源。这将导致其他线程在等待CPU资源时也被阻塞,其他线程只能要么等待,无法保存现场(工作在用户层)再切换,produce block。
在内核级线程中,中断的保存/恢复现场为内核的功能,可以实现线程间的调度,且支持多处理机(多个内核级线程,每个可以运行在一个单独的处理机上)。
在组合方式中,
a. 用户进程的多个线程对应内核级的多个线程,用户1个线程系统调用的内核级线程A被阻塞,CPU可以切换到其他线程的不同内核级线程B;多核处理器可对应多个内核级线程;
b. 可以像用户态线程一样在用户态进行线程切换
- 系统动态DLL库是个玩意?
进程
- 进程是一段指令流,还是?process=PCB+data section+code section
PCB=处理器(时间片轮转比其他设备周期短,单成1列)+其他资源+进程控制与管理信息+PIDUUID - 不同的进程是如何利用系统资源(IO,MM,CPU)的?
- 进程之间如何通信?进程如何运转?
- 通信方式的对比
- 共享存储只有OS提供存储空间和互斥工具(P(S),V(S)),数据的交换由用户实现
- 消息传递中进程通过发送和接受信息原语,数据交换由OS完成,网络中的通信就是由OS的网络部分完成的
- 管道通信=共享存储’s upgraded version,管道为半双工通信的存储区域,且写满buffer才会release,因此不会出现其他进程写而导致读取被阻塞的现象
- 另外有意思的是父进程与子进程的权限继承,进程的权限to a file comes from 用户标识和文件属性collaborative determination.
线程
- 线程是处理器调度与分配的基本单元
- 进程是除了处理器之外其他资源的分配单位——IO,MM的分配单元
- 进程分割为线程的猜测——线程=循环指令流中不交叉的最小块
进程调度
-
线程的调度类似,不过同一个进程的线程切换不用替换进程上下文,运行时间的算法需要更新(更复杂了)
共享存储只有OS提供存储空间和互斥工具(P(S),V(S)),数据的交换由用户实现 消息传递中进程通过发送和接受信息原语,数据交换由OS完成,网络中的通信就是由OS的网络部分完成的; 管道通信的管道,为半双工通信的存储区域,因此不会出现进程阻塞的现象
同步与互斥
同步与互斥都围绕共享资源的使用:
1.对于那些只能被单独访问的共享资源,要做互斥处理;
2.对于那些可以被共享访问的资源,虽然RAR没问题,但RAW,WAR,WAW 均可能导致最终的共享资源结果不同,要作同步处理。
互斥可通过用户程序中使用API实现lock和release
- 数据库中,为了防止数据的脏读,需要给数据表或表项加上二阶段锁或S锁,
- 为什么要引入同步与互斥?——进程之间共享资源,不同进程并发执行,封闭性丧失,为了得到逻辑正确的结果。
- 临界资源:一次只能被1个进程访问的资源
- 临界区:访问临界资源的代码;
- 进入区:访问临界资源前,要把临界区的标志设置为正在访问;
- 退出区:将正在访问的临界区的signal清除;
- 剩余区:代码中的其余部分?
- 同步:如A和B通过缓冲区实现数据传送,缓冲区满了,A必须等待B读取数据,才能接着传送;缓冲区空,B必须等待A传入数据,才能接着传送;缓冲区相比于📫机制,再与缓冲区大小固定。
- 互斥:对临界资源的访问;而同步,是为了正确完成任务而协调工作次序;
互斥的实现
双标志互斥alg的问题是进程的线程乱序执行导致的,只有Peterson alg能在所有乱序执行保证同步的3大准则:
空则让进,忙则等待,有限等待,(让权等待)。
硬件实现——简单可靠,但不能实现让权等待,perform low efficiency
硬件实现有中断屏蔽和硬件指令2种方法:
- 中断屏蔽:关中断,临界区,开中断,那一个进程进入critical area其他进程不能交替执行
- 硬件指令方法:TestandSet或Swap原子操作
boolean TestandSet(boolean *lock){
boolean old;
old=*lock;
*lock=true;
return old;;
}
while TestandSet(&lock);
临界区
lock=false;
剩余区
postscript:只有lock==false(原先不被占用),才能获得锁,并将lock置为ture
premium:TestandSetfunction必须为原子操作,不可分割,can be only accessed by one function,否则导致多进程同时占用lock,把这个设为一条指令,单CPU不会出现the scene.
comment:
- 为每个临界资源设置一个共享布尔变量
- 和下面的Swap都是互斥锁
Swap(boolean *a,boolean *b){
boolean temp;
temp=*a;
*a=*b;
*b=temp;
}
key=true;
while(key!=false)
swap(&key,&lock);
临界区
lock=false
剩余代码
comment:
- 当lock=false(代表资源空闲),设置key=false,lock=ture,标识该进程独占临界资源;
- swap和testandset其实是硬件原子操作,不可分,不会出现多个进程进入lock=false的swap函数,不会出现共用临界资源;
- 当lock=true,未得到临界资源的进程会一直while查询,占用处理机资源,不能实现让权等待;
software implement/enforcement
approach | defect | offended rule |
---|---|---|
单标志-turn | 互斥两进程必须同时进入临界区 | 空闲让进 |
双标志先检查法 | 可能同时进入临界区 | 忙则等待 |
double-symbol examined later |
flag1,2==true,无法进入临界区 | 有限等待 |
peterson(双标志+turn) | none | |
hardware command | 一个指令进入临界区耗费处理机时间 可能一直选不上 |
让权等待 有限等待 |
- review:peterson utilize turn to settle starvation phenomenon,double-symbol examined later to solve enter critical area simultaneously.
对比
实现临界区互斥的硬件方法和软件方法各有什么优势?
硬件方法的优势:
原子性操作:硬件方法通常使用特定的指令或硬件机制来实现原子操作,如原子交换(Atomic Exchange)或测试并设置(Test-and-Set)。这些操作在硬件级别上保证了操作的原子性(不会出现共用临界资源),无需额外的软件开销。
性能:硬件方法通常比软件方法更高效,因为它们直接利用了硬件的特性,如高速缓存和并行处理能力。这使得硬件方法更适合于对性能要求较高的应用场景。
软件方法的优势:
可移植性:软件方法不依赖于特定的硬件指令或机制,因此更易于在不同的平台上实现和移植。这使得软件方法更具通用性,可以应用于不同类型的系统和架构。
灵活性:软件方法通常可以更灵活地实现复杂的同步机制,如信号量、条件变量等。这些机制提供了更多的控制和功能,可以满足不同线程同步需求。
容错性:软件方法可以在一些特殊情况下提供更好的容错性。例如,当硬件出现故障或不支持某些原子操作时,软件方法可以通过算法和复杂的同步机制来弥补。
需要注意的是,硬件方法和软件方法并不是互斥的选择,它们可以结合使用来提供更可靠和高效的同步机制。例如,硬件指令可以用于实现基本的原子操作,而软件方法可以用于构建更复杂的同步机制。选择何种方法取决于具体的应用需求、平台特性和性能要求。
临界区互斥的其他方法
mutually exclusive lock
acquire(){
//锁被占用则等待
while(available!=true)
;
//锁空闲,占用后,将锁设为false
available=false;
}
release(){ //释放锁
available=true;
}
信号量(系统中的资源数目)mechanism
采用两个不可中断(为软件method,achieved by 屏蔽中断方法)的原语—wait和signal来管理
There are two signal realization mechanism as integral and record-type.
整形信号量
wait(S){ //请求资源
while(S<=0) ; //若没有资源,则等待
S--; //占用资源,S--
}
signal(S){
S++; //释放资源
}
Defect:wait在无资源可用,will continuously occupy cpu(conduct while query),offend 让权等待
记录型信号量
- S.value>0,表示可用的资源数目;
- S.value<=0,标识阻塞的进程数目;
- 每种资源对应1个S
typedef struct{
int value;
struct process *L;
} semaphore(信号量);
请求资源
void wait(semaphore S){
S.value--; //S>0则资源数--;S<0则阻塞进程数++;
if(S.value<0){
add this process to S.L;
block(S.L);
}
}
释放资源
voic signal(semaphore S){
S.value++; //资源数++或阻塞进程数--
if(S.value<0){ //若为后者,唤醒该进程——资源来临
remove process P from S.L;
wakeup(P);
}
}
Application of signal mechanism
- 同步
进程按照(资源的)特定顺序执行
each synchronous relationship is confered with an exclusive resource with num=1
semaphore S=0;
P1(){
x;
V(S);
...
}
P2(){
...
P(S);
y;
...
}
- further,用同步实现前驱关系——每个偏序关系用1个资源
S1(){
V(a1);
}
S2(){
P(a1);
V(b1);V(b2);
}
...
分析同步、互斥、前驱关系,设置信号量,确定P,V
- 互斥—只有1个进程能进入临界区
- P(S)请求资源;V(S)释放资源
semaphore S=1;
P1(){
...
P(S);
critical area;
V(S);
}
P2(){
...
P(S);
critical area;
V(S);
}
Note
- in internal part of a process 不用set synchronous signal superfluously
- sender are required to release entity (signal(Sx)) only,while receiver are requested to request (wait(Sx)) merely.
管程—信号量的封装类
背景:针对每个共享变量,所有使用变量都要设置P(),V()操作;
改进:每个共享资源,只要1个共享数据结构demo来管理;
管程=类,成员变量为共享资源的数目,成员函数为对共享资源的操作,如对互斥变量的take_away和release,
多个共享资源可以用记录型信号量表示,
不知道为什么要把条件变量单独拎出来,用来表示进程被阻塞的原因,
- 如果两个进程有先后关系,它们之间可以一个条件变量的lock和release,
- 互斥资源可以且应该用条件变量表示,就是整数型信号量
经典同步问题
Essence: 用信号量机制表示 1)互斥资源的访问;2)偏序关系
生产者、消费者
- 明明可以用num表示缓冲区的数目,为了符合P(锁),V(释放)的形式(值得唾弃),
缓冲区为互斥资源,expressed as mutex;
缓冲区的单元为一种资源,为什么消费者和生产者不share一种资源?
消费者需要的是满的块,producer需要的是空的块,故用两种资源full and empty表示
只有consumer之间与producer之间才公用一种资源,用signal(full)和wait(full) to describe competitive relation;
放苹果橘子
- 可以把事件的同步与互斥用箭头表示,每个同步关系用一个针对互斥资源的P(),V()表示;
桌子一个时刻只有一个人能占用,为互斥资源,用一个table变量express
Dad放了apple daughter才能吃,用信号量 apple 表示偏序,
读者-写者
- 终于用count表示
资源读者的数量,为了count错误修改,自然加个mutex的PV锁;
文件为特定条件下的互斥资源,写者与其他人的互斥用rw锁表示读者与写者的互斥,
第一个读者访问时需要互斥,读者可以共同访问,因此后续的读者访问不用申请rw lock
不过这样需要用count记录读者的数量,不同的读者间对count的访问用mutex来避免差错
summary to universal solution
- 对每个互斥资源用一个信号量表示,name it rw
- 对每个偏序关系用一个信号量表示
- 对每个共享变量加一个互斥锁来避免RAW等差错
- 根据context 自定义变量来控制对互斥资源的特殊访问
rest questions
- 哲学家就餐就非常social了,一个时刻只有一个人能pick up 筷子~~
- 吸烟者问题,吸完烟要向供应商发信号,也要用个锁~~
死锁
- 可剥夺资源:优先级高的可以抢占优先级低的进程的资源;
- 有循环等待未必构成死锁,
- 若每类资源只有1个资源,资源分配图含圈
↔
\leftrightarrow
↔ 系统出现死锁
PS:CSDN图片id用的是128位的散列值
死锁处理
安全状态:按照某种推进顺序,能满足每个进程对资源的最大需求,使每个进程可顺序完成;
死锁避免在分配资源给进程的过程中拒绝进入dangerous state
banker’s alg一般都是DFS+回溯,可以用BFS?
破圈法是为了寻找有环图的最小生成树,
死锁检测定理——待证
1)找出非阻塞(请求的资源数量均不大于系统的空闲资源数量)的非孤立进程Pi,释放Pi所有资源;
2)重复1),若消去所有边,图可完全简化
↔
\leftrightarrow
↔ 不死锁;文章来源:https://www.toymoban.com/news/detail-600922.html
预防中的消除循环等待和请求并保持,均不可行,
文章来源地址https://www.toymoban.com/news/detail-600922.html
到了这里,关于OS1_进程与线程的管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!