OS_02 进程管理

进程管理

线程、进程、协程

进程是资源分配的最基本单位。windows的.exe就是进程,运行一个程序会创建一个或多个进程。
线程是程序执行的最基本单位。每个进程有且仅有一个主线程,线程可以调用进程的资源。线程是独立调度的基本单位。线程可直接通过读写同一进程的数据进行通信。
协程是用户态的轻量级线程,是线程内部的基本单位。无需切换线程的开销,无需原子操作锁定及同步的开销,方便切换控制流,简化编程模型。

PCB

PCB:为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构。

PCB一般包括:
1.程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整形数字
2.特征信息:一般分系统进程、用户进程、或者内核进程等
3.进程状态:运行、就绪、阻塞,表示进程现的运行情况
4.优先级:表示获得CPU控制权的优先级大小
5.通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道
6.现场保护区:保护阻塞的进程用
7.资源需求、分配控制信息
8.进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
9.其他信息:工作单位,工作区,文件信息等

PCB的作用是使一个在多道程序环境下不能独立运行的程序(包含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。

进程和线程的创建和撤销

进程允许创建和控制另一个进程,前者称为父进程,后者称为子进程,子进程又可以创建孙进程,如此下去进而形成一个进程的家族树,这样子进程就可以从父进程那里继承所有的资源,当子进程撤销时,便将从父进程处获得的所有资源归还,此外,撤销父进程,则必须撤销所有的子进程。(撤销的过程实际上就是对这棵家族树进行后序遍历的过程)
在应用中创建一个子进程的过程如下:
1.申请空白的PCB
2.初始化进程描述信息
3.为进程分配资源以及地址空间
4.将其插入就绪队列中

当进程完成后,系统会回收占用的资源,撤销进程,而引发进程撤销的情况有:进程正常结束或者异常结束,外界的干预(比如我们在任务管理器中强制停止某个进程的运行)。
1.查找需要撤销的进程的 PCB
2.如果进程处于运行状态,终止进程并进行调度
3. 终止子孙进程 - 归还资源
4. 将它从所在的队列中移除

线程的创建和撤销

进程的五种状态

创建态、就绪态、运行态、阻塞态、终止态。
在这里插入图片描述

进程调度算法

cyc大佬总结:进程调度算法

批处理系统

先来先服务(FCFS):有利于长作业
短作业优先(SJF):长作业等待时间过长
最短剩余时间优先(SRTN): 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

交互式系统

时间片轮转
优先级调度:可以随着时间增加提高进程优先级
多级反馈队列:设置多个队列,从上至下每个队列的时间片逐渐增加。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
在这里插入图片描述

实时系统

软实时和硬实时。

进程同步

临界区

对临界资源的访问那段代码被称为临界区,为了互斥的访问临界区,每个进程在进入临界区时,都需要先进行检查,也就是查看锁。

同步与互斥

同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后顺序。
互斥:多个进程在同一时刻只有一个进程能进入临界区。

信号量

信号量是一个整型变量,可以对其执行 P 和 V 操作。
P:如果信号量大于零,就对其进行减 1 操作;如果信号量等于 0,进程进入 waiting 状态,等待信号量大于零。
V:对信号量执行加 1 操作,并唤醒正在 waiting 的进程
如果信号量只能取 0 或者 1,那么就变成了互斥量,其实也可以理解成加锁解锁操作,0 表示已经加锁,1 表示解锁。

生产者消费者模型
伪代码:

mutex = 1;
empty = N;
full = 0;

void Producer() {
    P(empty); // 生产者生产一个产品,消耗一个缓冲区 
    P(mutex);
    ....      // 临界区
    V(mutex);
    V(full); // 产品数量加1
}
void Consumer() {
    P(full); // 消费者消耗一个产品,释放一个缓冲区
    P(mutex); // 临界区上锁
    ....
    V(mutex); // 临界区锁释放
    V(empty); // 增加一个缓冲区
}
void P(S){
    S--;
    if(S < 0) block();  // 如果小于0,代表资源没了
}
void V(S){
    S++;
    if(S <= 0) wakeUp(); // 如果小于等于0,代表有进程仍然在等待,通知他们ok了
}

管程

使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。
管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其它进程永远不能使用管程。
管程引入了条件变量 以及相关的操作:wait() 和 signal() 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。

进程间的通信方式

进程同步:控制多个进程按一定顺序执行;
进程通信:进程间传输信息。

进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。

管道

匿名管道
通过调用 pipe 函数创建的,fd[0] 用于读,fd[1] 用于写。

#include <unistd.h>
int pipe(int fd[2]);

限制:
1.只支持半双工通信(单向交替传输)。
2.只能在父子进程或者兄弟进程中使用。

FIFO(命名管道)
去除了管道只能在父子进程中使用的限制。

#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode);

FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。

消息队列

优点:
1.消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难。
2.避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法。
3.读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
缺点:
如果进程发送的数据较大,并且两个进程通信非常频繁的话,消息队列模型就不太合适了,因为如果发送的数据很大的话,意味着发送消息(拷贝)这个过程就需要很多时间来读写内存。

共享内存

1.解决拷贝耗时很长的问题。
2.共享内存是最快的一种进程通信的方式,因为进程是直接对内存进行存取的。但是也要求进程对共享内存的访问是互斥的。通常把信号量和共享内存一起使用来实现进程通信。
3.系统加载一个进程的时候,分配给进程的内存并不是实际的物理内存,而是虚拟内存空间。那么我们可以让两个进程各自拿出一块儿虚拟地址空间来,映射到同一个物理内存中。这样两个进程虽然有独立的虚拟内存空间,但有一部分是映射到相同的物理内存,这样就完成共享机制了。

信号量

信号量是一个计数器,用于为多个进程提供对共享数据对象的访问。

套接字

套接字可以实现两个不同的机器之间的进程通信,比如 socket 使用(TCP/UDP)。

死锁

死锁发生条件

1.互斥条件:资源分配是互斥的。
2.等待和占有条件:进程在请求资源得不到满足时,进入阻塞态,并且不释放已占有资源。
3.不剥夺条件:已经分配给一个进程的资源不能强制性的被抢占,只能等待进程主动释放。
4.环路等待:有两个或两个以上的进程组成环路,该环路中每个进程都在等待下一个进程释放所占有资源。

如何避免死锁发生

预防策略(破坏死锁发生条件)
1.破坏互斥条件:只读文件、磁盘等软硬件文件可以采用这种办法。
2.破坏等待和占有条件:在进程开始前分配其所需要的所有资源,直到资源全部满足再执行进程。
3.破坏不剥夺条件:允许进程强行从资源占有者那夺取资源。
4.破坏环路等待条件:给系统的所有资源编号,规定进程请求所需资源的顺序必须按照资源的编号依次执行。
银行家算法
当有新进程请求申请资源时,检测是否有安全序列。

死锁发生如何处理

死锁检测
DFS节点,检查是否有环。
死锁恢复
1.撤销进程:撤销所有进入死锁的进程/逐个撤销陷入死锁的进程直到死锁解除。
2.资源剥夺:从死锁的进程中强制剥夺其资源/从其他进程中强制夺取资源。
3.鸵鸟算法:重新启动。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值