目录
Linux的进程管理
-
Linux进程的相关概念
-
进程的类型
- 1.前台进程
- 2.后台进程
- 3.守护进程
- 前台进程
- 前台进程就是具有终端,可以和用户交互的进程
- 我们通过命令行去使用Linux时是通过终端Shell来使用的
- 后台进程
- 与前台进程相对,没有占用终端的就是后台进程
- 后台程序基本上不和用户交互,优先级比前台进程低
- 守护进程
- 守护进程(daemon)是特殊的后台进程
- 很多守护进程在系统引导的时候启动,一直运行直到系统关闭
- Linux有很多典型的守护进程
- 如:crond,httpd,sshd,mysqld
- 进程名字以d结尾的一般都是守护进程
-
进程的标记
- 进程ID是进程的唯一标记,每个进程拥有不同的ID
- 进程ID表现为一个非负整数,最大值由操作系统限定
- 操作系统提供fork函数接口创建进程
- 进程A调用fork接口创建进程B
- 进程B调用fork接口创建进程C
- 这就是进程的层级关系
- 这个关系称为父子进程关系
- 进程A是进程B的父进程
- 进程B是进程A的子进程
- 父子进程关系可以通过pstree命令查看
- ID为0的进程为idle进程,是系统创建的第一个进程
- ID为1的进程为init进程,是0号进程的子进程,完成系统初始化
- init进程是所有用户进程的祖先进程
-
进程的状态标记
-
操作Linux进程的相关命令
- ps命令
- top命令
- kill命令
-
作业管理之进程调度
-
进程调度概述
- 进程调度是指计算机通过决策决定哪个就绪进程可以获得CPU使用权
- 前提也是多道程序设计
-
2个步骤:
- 1.保留旧进程的运行信息,请出旧进程(收拾包袱离开CPU)
- 2.选择新进程,准备运行环境并分配CPU(新进驻)
-
为了实现2个步骤,就要了解3种重要的机制:
- 1.就绪队列的排队机制
- 2.选择运行进程的委派机制
- 3.新老进程的上下文切换机制
- 就绪队列的排队机制
- 为了提高进程调度的效率,事先将就绪进程按一定的方式排成队列,以便调度程序可以最快找到就绪进程
- 选择运行进程的委派机制
- 调度程序以一定的策略选择就绪进程,将CPU资源分配给它
- 新老进程的上下文切换机制
- 如果需要把新的进程调度到CPU里的话,那么就要将老的进程的CPU环境备份出来,然后将新的进程的环境切换到CPU里面去
- 保存当前进程的上下文信息,装入被委派执行进程的运行上下文
-
按照老进程有没有执行完,可以把进程调度方法分为2大类:
- 1.非抢占式的调度
- 2.抢占式的调度
- 非抢占式的调度
- 处理器一旦分配给了某个进程,就让该进程一直使用下去
- 调度程序不以任何原因抢占正在被使用的处理器
- 直到进程完成工作或因为IO阻塞才会让出处理器
- 抢占式的调度
- 允许调度程序以一定的策略暂停当前运行的进程
- 保存好旧进程的上下文信息,分配处理器给新进程
-
进程调度的算法
- 1.先来先服务调度算法
- 2.短进程优先调度算法
- 3.高优先权优先调度算法
- 4.时间片轮转调度算法
- 先来先服务调度算法
- 在就绪队列里,按照先来先服务的原则,优先取出队列前面的进程进行调度
- 短进程优先调度算法
- 调度程序优先选择就绪队列中估计运行时间最短的进程
- 短进程优先调度算法不利于长作业进程的执行
- 高优先权优先调度算法
- 进程附带优先权,调度程序优先选择权重高的进程
- 高优先权优先调度算法使得紧迫的任务可以优先处理
- 时间片轮转调度算法
- 按先来先服务的原则排列就绪进程
- 每次从队列头部取出待执行进程,分配一个时间片执行
- 是相对公平的调度算法,但不能保证及时响应用户
-
作业管理之死锁
- 介绍:
-
死锁的产生
-
主要有2种情况:
- 1.竞争资源
- 2.进程调度顺序不当
- 竞争资源
- 本质:
- 共享资源数量不满足各个进程需求
- 各个进程之间因为共享资源的竞争导致死锁
- 特点:
- 等待请求的资源被释放
- 自身占用资源不释放
-
死锁的4个必要条件
- 1.互斥条件
- 2.请求保持条件
- 3.不可剥夺条件
- 4.环路等待条件
- 互斥条件
- 进程对资源的使用是排他性的使用
- 某资源只能由一个进程使用,其它进程需要使用只能等待
- 请求保持条件
- 进程至少保持一个资源,又提出新的资源请求
- 新资源被占用,请求被阻塞
- 被阻塞的进程不释放自己保持的资源
- 不可剥夺条件
- 进程获得的资源在未完成使用前不能被剥夺
- 获得的资源只能由进程自身释放
- 环路等待条件
- 发生死锁时,必然存在进程-资源环形链
-
死锁的处理
-
预防死锁的方法
- 为了预防死锁只需破坏1个或多个必要条件,死锁就不会产生
- 破坏请求保持条件
- 系统规定进程运行之前,一次性申请所有需要的资源
- 进程在运行期间不会提出资源请求,从而破坏请求保持条件
- 破坏不可剥夺条件
- 当一个进程请求新的资源得不到满足时,必须释放占有的资源
- 进程运行时占有的资源可以被释放,意味着可以被剥夺
- 破坏环路等待条件
- 可用资源线性排序,申请必须按照需要递增申请
- 线性申请不再形成环路,从而破坏环路等待条件
-
银行家算法
- 是一个可操作的著名的避免死锁的算法
- 以银行借贷系统分配策略为基础的算法
- 理解:
- 客户申请的贷款是有限的,每次申请需声明最大资金量
- 银行家在能够满足贷款时,都应该给用户贷款
- 客户在使用贷款后,能够及时归还贷款
- 这个算法要求有3个数据结构
- 1.已分配资源表
- 2.所需资源表
- 3.可分配资源表
- 将所需资源表减去已分配资源表得到还需分配资源表
- 将还需分配资源表与可分配资源表进行对比
- 优先把可分配的所有资源都分发给某个可满足的进程
- 让此进程可以继续执行下去,等此进程执行完后,再归还相关资源
- 归还资源后,又可以把新的资源重新分配给其它需要的进程