os是直接控制和管理计算机硬件、软件资源,合理地对各类作业进行调度,以方便用户使用的程序的集合
紧贴系统硬件之上,所有其他软件之下
人工操作方式
脱机I/O方式
优点:
批处理系统
单道批处理系统
主要缺点:系统资源得不到充分利用
多道批处理系统
优缺点:
分时系统
目标:对用户的请求及时相应;尽量提高系统资源的利用率
特性:
实时系统
为多道程序的运行提供良好的运行环境,以保证多道程序能有条不紊、高效地运行,并能最大程度上地提高系统中各种资源的利用率和方便用户使用
无结构操作系统
缺点:既庞大有杂乱,缺乏清晰的程序结构;程序错误多,调试难、阅读难、理解难、维护难
模块化OS结构
分层式OS结构
缺点:
系统效率低。只能是单向依赖。每执行一个功能,自底向上需要穿越很多层次
前趋图是一个有向无环图(DAG),用于描述进程之间执行的前后关系
注意:前趋图中必须不存在循环
I->C->P
特征:
特征:
定义:
程序关于某个数据集合的一次执行过程
进程的特征:
结构特征
进程控制块(PCB)+程序+数据 = 进程实体
动态性 ——最基本特征
进程:进程实体的一次执行过程,有生命周期
程序:程序是一组有序指令的集合,是静态的概念
并发性
独立性
异步性
就绪状态
进程获得除CPU之外的所有必需资源,一旦得到CPU控制权,立即可以运行
运行状态
进程已获得运行所必须的资源,它的程序正在处理机上执行
阻塞状态
正在执行的进程由于发生某事件而暂时无法执行时,便放弃处理机而处于暂停状态,称该进程处于阻塞状态或等待状态
挂起、激活
使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程
进一步阐述:
creat()原语
申请空白PCB->为新进程分配资源->初始化进程控制块->将新进程插入到就绪队列
正常结束
异常结束
越界错误;非法指令
外界干预
操作员或操作系统干预
父进程的请求
父进程的终止
找到被终止的PCB->若进程状态为运行态,置CPU调度标志为真->若其有子进程,终止其子进程并收回其资源->回收终止进程的资源->回收终止进程的PCB
进程同步的主要任务:
是并发执行的诸进程之间能有效的共享资源相互合作;从而是使程序的执行具有可再线性
进程间两种形式的制约关系
把一次仅允许一个进程访问的资源叫做临界资源
两个进程不能同时进入访问同一临界资源的临界区
某进程为获得合作进程发来的消息之前该进程等待,消息到来之后方可继续执行合作关系
系统用来实现进程之间同步与互斥的机构
semapore mutex = 1
begin
parbegin
p1:begin
repeat
wait(mutex)
critical section
signal(mutex)
remainder section
until false
end
p2:begin
repeat
wait(mutex)
critical section
signal(mutex)
remainder section
until false
end
parend
end
semapore mutex = 0
begin
parbegin
p1:begin
repeat
critical section
signal(mutex)
remainder section
until false
end
p2:begin
repeat
wait(mutex)
critical section
remainder section
until false
end
parend
end
samaphore empty = 1 full = 0
begin
parbegin
p1:begin
repeat
wait(full)
print(x)
signal(empty)
until false
end
p2:begin
repeat
wait(empty)
print(x)
signal(full)
until false
end
parend
end
生产者往buffer数组中存放数据,消费者从buffer中取数据,生产者和消费者之间是异步的,但必须同步,先生产再消费。生产者在存放数据的时候是需要修改数组指针的,所以生产者之间是互斥的,消费者同理。
Pi -> □□□□ -> Ci
semaphore empty=n full=0 mutex=1
void producer(){
wait(empty)
wait(mutex)
buffer[in] = nextp
in = in+1%n
signal(mutex)
signal(full)
}
void consumer(){
wait(full)
wait(mutex)
nextc = buffer[out]
out = out+1%out
signal(mutex)
signal(empty)
}
semaphore chopstick[5]={1,1,1,1,1}
Phliosopher i(){
wait(chopstick[i])
wait(chopstick[i+1%5])
eat
signal(chopstick[i])
signal(chopstick[i+1%5])
}
这样是不可行的,当5个哲学家同时拿起筷子的时候,会引起死锁
解决方法:
semaphore chopstick[5]={1,1,1,1,1} num=4
Phliosopher i(){
wait(num)
wait(chopstick[i])
wait(chopstick[i+1%5])
eat
signal(chopstick[i])
signal(chopstick[i+1%5])
signal(num)
}
semaphore chopstick = [1,1,1,1,1]
Philosopher i(){
swait(chopstick[i], chopstick[i+1%5])
eat
Ssignal(chopstick[i], chopstick[i+1%5])
}
semaphore chopstick = [1,1,1,1,1]
Philosopher i(){
if i%2==0:{
wait(chopstick[i])
wait(chopstick[i+1%5])
}
else{
wait(chopstick[i+1%5])
wait(chopstick[i])
}
eat
signal(chopstick[i])
signal(chopstick[i+1%5])
}
samaphore rmuter=1 wmutex=1
int readcount=0
#rmuter表示读者修改readcount时候的互斥,wmitex表示读者与写者、写者和写者之间的互斥
void read(){
wait(rmutex)
if(readcount==0){
wait(wmutex)
}
readcount++
sginal(rmutex)
read
wait(rmutex)
readcount--
if(readcount==0){
sginal(wmutex)
}
wait(sginal)
}
void write(){
wait(wmutex)
write
sginal(wmutex)
}
对写者不公平,只要用读者,写者就无法进行
semaphore L=rn, mutex=1
#L表示允许读者的最大数量rn,mutex读写、写写互斥
void read(){
Swait(L,1,1; mutex,1,0)
read
Ssignal(L,1)
}
void write(){
Swite(L,rn,0; mutex,1,1)
write
Ssignal(mutex,1)
}
进程通信:指进程之间的信息交换
低级通信:进程间仅交换一些状态和少量数据
进程之间的互斥和同步——低级通信
信号量机制的通信缺点:
高级通信:进程间可交换大量数据。是指用户可直接利用操作系统所提供的一组通信命令,高效地传送大量数据的一种通信方式
操作系统隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性。
共享存储器系统
相互通信的进程之间共享某些数据结构或共享存储区,通过这些空间进行通信
基于共享数据结构的通信方式
公用某些数据结构(是一个空间),比如消费者生产者的buffer
特点:低效、只适合传递相对少量的数据
基于共享存储区的通信方式
在存储器划分出一块共享存储区,从共享存储区中申请一块分区
消息传递系统
进程间的数据交换,以格式化的消息为单位
管道通信
管道:用于连接一个读进程和一个写进程以实现他们之间通信的一个打开的共享文件,又名pipe文件
管道
写进程-> ====== ->读进程
管道机制提供的协调能力:互斥、共享、确认对方是否存在
直接通信方式
通信原语:
send(receiver, message)
receive(sender, message)
间接通信方式——通过信箱通信
消息在信箱中可安全保存,只允许核准的目标用户随时读取
既可实时通信,又可非实时通信
一对一、多对一、一对多、多对多
原语:
信箱的创建和撤销
消息的发送和接受
send(mailbox, message)
receive(mailbox, message)
通信链路分类:
消息的格式
进程同步方式
在进程之间进行通信时,辅以进程同步机制,使诸进程间能协调通信
发送进程或接收进程在完成消息的发送或接收后,都存在两种可能性:进程或者继续发送(接收);阻塞。