不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • Linux入门

  • Linux高级

  • Nginx

  • Keepalive

  • ansible

  • zabbix

  • Shell

  • Linux内核

    • 01.Linux核心概念
    • 02.内存管理
    • 03.进程管理
      • 01.进程原理
        • 1.1 什么是进程
        • 1.2 进程状态
      • 02.进程fork与vfork
        • 2.1 fork
        • 2.2 vfork
      • 03.进程调度算法
        • 3.1 先来先服务调度算法
        • 3.2 短作业(进程)优先调度算法
        • 3.3 优先权调度算法的类型
        • 3.4 高响应比优先调度算法
      • 04.基于时间片的轮转调度算法
        • 4.1 时间片轮转法
        • 4.2 多级反馈队列调度算法
    • 问题排查
  • Linux
  • Linux内核
xiaonaiqiang
2022-02-06
目录

03.进程管理

# 01.进程原理

# 1.1 什么是进程

  • 从物理内存的分配来看
    • 每个进程占用一片内存空间,即进程就是内存的某片空间
    • 由于CPU只能执行一条指令,所以执行指令的顺序由程序计数器决定
  • 从逻辑上看
    • 每个程序可以执行也可以暂时挂起让别的程序执行,之后又可以接着继续执行
    • 所以每个进程都有一个计数器,记录下一条指令的位置,从而使继续接着运行时能找到正确地址
  • 从时间上看
    • 在运行一定时间后,进程都已经完成了一定的工作量,即,每个进程都必须向前推进
  • linux通过task_struct结构体描述一个进程
    • mm 成员:描述内存资源
    • fs 成员:描述文件系统资源
    • files 成员:进程运行时打开了多少文件,fd的数组
    • signal 成员:进程接收的信号资源

# 1.2 进程状态

  • 就绪态:等待CPU调度执行
  • 执行态:CPU正在执行的进程指令
  • 阻塞态:等待事件发生
  • 执行态——>就绪态:系统给每个进程分配一个时间片,当时间片用完,无论是何种状态,就将其转入就绪,在执行另一个进程
  • 当阻塞挂起的过程中事件发生了,就会把阻塞挂起的进程放在就绪挂起中。

# 02.进程fork与vfork

# 2.1 fork

  • 一个现有的进程可以调用fork函数创建一个新进程,子进程相当于是父进程的副本
  • 子进程会拷贝父进程的所有资源,变量,但是子进程从父进程拷贝下的所有资源会放到一个新的地址中
  • 父子间共享的内存空间只有代码段,子进程修改一个从父进程中拷贝下来的变量,父进程中的这个变量不会改变
  • fork方案弊端
    • 一般fork()调用后都会跟着调用execve(),用新的内存镜像取代原来的内存镜像
    • 当地址空间很大时,复制的操作会很费时,而且又是做无用功,所以就产生了vfork()。

# 2.2 vfork

  • vfork并不复制父进程的进程环境,子进程在父进程的地址空间中运行
  • 写时复制
    • 这些区域由父子进程共享,而且内核将他们的访问权限改为只读
    • 如果父子进程中的任意一个试图修改这些区域,则**内核只为修改区域的那块内存创建一个副本**
    • 只有在需要写入的时候数据才会被复制,从而使各个进程拥有自己的拷贝
    • 也就是说,资源的复制只有在需要写入的时候才进行,除此之外,只是以只读形式进行共享

# 03.进程调度算法

  • **进程调度算法:**根据系统的资源分配策略所规定的资源分配算法

# 3.1 先来先服务调度算法

  • 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
  • 当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业
  • 将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

# 3.2 短作业(进程)优先调度算法

  • 短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法,它们可以分别用于作业调度和进程调度。
  • 短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。

# 3.3 优先权调度算法的类型

1) 非抢占式优先权算法

  • 在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;
  • 或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。
  • 这种调度算法主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。

2) 抢占式优先权调度算法

  • 在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。
  • 但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程
  • 重新将处理机分配给新到的优先权最高的进程
  • 注:
    • 因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。
    • 如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。
    • 显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求
    • 故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。

# 3.4 高响应比优先调度算法

  • 由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先权又相当于响应比RP

  • (1) 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业。

  • (2) 当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务。

  • (3) 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高,从而也可获得处理机。

# 04.基于时间片的轮转调度算法

# 4.1 时间片轮转法

  • 在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列
  • 每次调度时,把CPU 分配给队首进程,并令其执行一个时间片,时间片的大小从几ms 到几百ms
  • 当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾
  • 然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
  • 这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。

# 4.2 多级反馈队列调度算法

  • (1) 应设置多个就绪队列,并为各个队列赋予不同的优先级

    • 第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。
    • 该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。
  • (2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度

    • 当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;
    • 如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;
    • 如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去
    • 当一个长作业(进程)从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。
  • (3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;

    • 仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。
    • 如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列)
    • 则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。
上次更新: 2024/3/13 15:35:10
02.内存管理
问题排查

← 02.内存管理 问题排查→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式