💻
QMMMS的笔记
博客
  • QMMMS的笔记
  • agent
    • MCP的背景、原理和开发
    • Agent 历史与背景
    • Agentic Workflows
    • 环境检查与基础工具
    • Tool Call
    • 工具与运行时的值
    • temp
    • 处理 Tool Call error
    • trick
  • algorithm
    • 线性结构
    • 二叉树
    • 图
    • 查找
    • 排序
    • 动态规划
    • 优化方法
    • 数学
    • 迁移至Java
  • computer_composition
    • 系统总线
    • 存储器
    • 输入输出系统
    • 计算机的运算方法
    • 指令系统
    • 补充
  • computer_network
    • 引入
    • 应用层
    • 传输层
    • 网络层(数据平面)
    • 网络层(控制平面)
    • 链路层
    • 常见问答
    • 实验
  • database
    • SQL实战
    • 关系代数
    • 数据库设计
    • 规范化
    • 数据库基本概念
    • 查询原理
    • 数据库恢复技术
    • 并发控制
  • dev_tools
    • Git
    • Nginx
    • Spring
    • LangChain
    • PyTorch Cheat Sheet
    • MyBatis
    • MySQL Cheat Sheet
    • MySQL 补充
    • Redis
    • Docker
    • RocketMQ
    • Chrome
  • linux
    • Linux基础命令与使用
    • 文件与权限
    • 文件与目录操作
    • 权限属性高级
    • 命令与文件的查找
    • 文件压缩和打包
    • vim编辑器
    • shell变量
    • 命令补充
    • 数据流重定向
    • 管道命令
    • shell脚本
    • 用户管理
    • 用户间交流
    • 计划任务
    • 进程管理
    • 软件管理
    • 认识系统服务
    • 运维常用命令
    • 常用命令
  • llm
    • 大规模语言模型概述
    • 分布式训练概述
    • 有监督微调概述
    • 强化学习与LLM
    • LLM评估概述
    • 大模型应用
    • 理解大模型
    • 量化
    • 预训练
    • 上下文学习
  • machine_learning
    • 引入
    • 大致正确学习
    • 一致收敛
    • 偏差还是过拟合?
    • 可学习的充要条件
    • 非均匀可学习性
    • 计算复杂性
  • mathematics
    • 概率与统计基础
    • 线性代数基础
  • operating_system
    • 操作系统基本概念
    • 进程和线程
    • 同步,互斥与死锁
    • 内存管理
    • 文件系统
    • I/O系统
    • 保护与安全
    • 《现代操作系统》
  • statistical_learning
    • 统计学习引入
    • 线性回归
    • 分类
    • 重抽样方法
    • 线性模型选择与正则化
    • 非线性模型
    • 基于树的方法
    • 支持向量机
    • 无指导学习
    • 马尔科夫链和蒙托卡罗方法简明理解
    • R语言速查
  • deep_learning
    • basic_concepts
      • 逻辑回归与损失函数
      • 神经网络
      • 正则化、预处理、权重初始化
      • 优化算法
      • 机器学习策略
      • 复习:从计算机视觉的角度
      • 卷积神经网络
      • 深度卷积网络示例
      • 计算机视觉任务
      • 循环神经网络
      • 自然语言处理任务
      • 注意力
      • Transformers 家族
      • 显卡扫盲
      • 强化学习概述
    • semi-supervise
      • 半监督学习简介
      • Consistency Regularization
      • Proxy-label Methods
      • Holistic Methods
      • Generative Models
      • Graph-Based SSL
      • Self-Supervision for SSL
      • Other SSL methods
  • programming
    • cpp
      • STL
      • C++基础
      • 内存管理
      • 面向对象
    • java
      • 环境和介绍
      • 注释
      • String
      • 面向对象思想
      • Object
      • 包
      • 访问权限修饰符
      • 初始化块
      • 接口
      • 内部类
      • 注解
      • 枚举
      • 集合框架
      • List
      • Map
      • 泛型
      • 迭代
      • IO与流
      • 序列化
      • 异常
      • Lambda
      • Stream流
      • Socket
      • 缓冲
      • 命名规范
      • 拆箱装箱
      • 值传递
      • 深拷贝
      • 反射
      • JVM
      • 并发编程基础
    • python
      • 并发编程
      • 环境管理
  • software_engineering
    • basic_concepts
      • 系统分析与设计概述
      • 规划
      • 需求分析与原型设计
      • 项目管理
      • 建模
      • 数据库设计
      • 架构
      • 配置管理
      • 测试管理
      • 安全
      • 编码原则
      • 微服务
      • 补充内容
    • software_testing
      • CMMI基础
      • PPQA与SQA
      • 软件测试基础
      • 黑盒测试
      • 白盒测试
      • 集成测试
      • 系统测试
      • 测开面试补充
由 GitBook 提供支持
在本页
  • 进程
  • 进程状态图
  • 进程间通信
  • 线程
  • 多线程模型
  • 调度算法
  • 实时CPU调度
  • 协程(Coroutines)
  • 其他
  • 例题
  • T1
在GitHub上编辑
  1. operating_system

进程和线程

上一页操作系统基本概念下一页同步,互斥与死锁

最后更新于8个月前

进程

程序是储存在磁盘上的文件,进程除了有文本段,还有进程ID、程序计数器PC、PCB进程控制块、处理器寄存器、堆栈(函数参数、返回地址、局部变量)、数据段(全局变量)、堆。

  • 动态性

  • 并发性

  • 独立性

  • 异步性。因此需要同步机制。

进程状态图

  • 新建

  • 终止

  • 等待

  • 就绪

  • 运行

进程间通信

  • 共享内存:允许两个或多个进程共享一个给定的内存区,一个进程写⼊的东西,其他进程⻢上就能看到。共享内存是最快的进程间通信方式,它是针对其他进程间通信方式运行效率低而专门设计的。

  • 消息队列:消息队列是保存在内核中的消息链表,按照消息的类型进行消息传递,具有较高的可靠性和稳定性。缺点:消息体有一个最大长度的限制,不适合比较大的数据传输;存在用户态与内核态之间的数据拷贝开销。

  • 套接字:提供网络通信的端点,可以让不同机器上运行的进程之间进行双向通信。

  • 信号:用于通知接收进程某件事情发生了,是一种较为简单的通信方式,主要用于处理异步事件。例如SIGKILL强制杀死进程且不能被阻塞和忽略。

  • 管道(pipe):生产者从管道一端写,消费者从管道另一端读。数据只能单向流动,遵循先进先出(FIFO)的原则。

线程

线程是轻量级进程,是一个基本的CPU执行单元,是程序执行流的最小单元。

每个线程包括:线程ID、程序计数器PC、处理器寄存器、堆栈。

与同一进程的其它线程共享:代码段、数据段、打开的文件、信号等等。

进程与线程的区别:

  • 进程可以视为系统资源分配单元,线程是一个基本的CPU执行单元。

  • 进程拥有资源,线程不具有。

  • 进程的上下文切换、创建和撤销开销大,线程的调度、创建和撤销开销小。

  • 线程提供了更好的并发性。

多线程模型

  • 多对一:多个用户线程映射到一个内核线程,并发度不高

  • 一对一:并发度高,但开销较大

  • 多对多:n个用户线程映射到m个内核线程,n>=m,综合上面的优点。

调度算法

一般要求计算:

  • 等待时间

  • 轮转时间(周转时间):作业完成时间-作业到来(或者说提交)时间

  • 带权轮转时间:轮转时间作业实际运行时间\frac{轮转时间}{作业实际运行时间}作业实际运行时间轮转时间​

具体算法包括:

  • FCFS先到先服务

  • SJF最短作业优先

  • 抢占SJF或者最短剩余时间优先

  • 优先级调度(教材中数字越小优先级越高)

  • 高相应比优先调度,相应比Rp=等待时间+要求服务时间要求服务时间R_p=\frac{等待时间+要求服务时间}{要求服务时间}Rp​=要求服务时间等待时间+要求服务时间​

  • RR轮转调度

  • 多级队列调度:将就绪队列分成多个单独队列,每个队列有自己的调度算法,进程被永久地分配到某个队列

  • 多级反馈队列调度:允许进程在队列之前迁移

Little公式如下,其中n为平均队列长度,W为平均等待时间,每秒$\lambda$个新进程到达队列:

n=W×λn=W\times \lambdan=W×λ

实时CPU调度

  • 单调速率调度:周期越短,优先级越高。调度N个进程的最坏情况下CPU利用率为:N(21N−1)N(2^{\frac{1}{N}}-1)N(2N1​−1),例如,对于两个进程的系统,如果CPU利用率小于83%,那么一定能够保证完成,反正不能保证。

  • EDF最早截止期限优先。可抢占。

协程(Coroutines)

协程是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。

其他

僵尸进程是已完成且处于终止状态,但在进程表中却仍然存在的进程。一般发生有父子关系的进程中,一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中

一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程 (进程 ID 为 1 的进程) 所收养,并由 init 进程对它们完成状态收集工作。因为孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。

例题

T1

  • 若每个作业只能建立一个进程,为了照顾短作业用户,应采用(短作业优先调度算法 )

  • 为了照顾紧急作业用户,应采用( 基于优先级的剥夺调度算法)

  • 为了实现人机交互,应采用(时间片轮转调度算法)

  • 为了使短作业、长作业和交互作业用户都满意,应采用( 多级反馈队列调度算法)