C++进程、线程、内存管理

目录

进程和线程区别

进程和线程切换的区别

系统调用流程

系统调用是否会引起线程切换

为什么需要使用虚拟内存


进程和线程区别

本质区别:

进程是资源分配的基本单元。

线程是操作系统调度的基本单元。

地址空间:

进程具有独立的虚拟地址空间。

线程共享进程的虚拟地址空间。

内存:

系统为每个线程分配不同的内存空间

线程使用的资源来源于所属进程。

并发性:

线程是系统调用的最小单位,线程切换性能好,并发性能好。

进程和线程切换的区别

本质是上下文的切换。

  • 用户级上下文
  • 系统级上下文:进程标识信息、进程线程信息、进程控制信息、系统内核栈
  • 寄存器上下文:硬件上下文 cpu各寄存器的内容

何时切换:

  • 主动:条件不满足
  • 被动:时间片结束

进程切换过程:

  • 保存当前进程的硬件上下文
  • 修改进程的PCB,状态由运行改为就绪或者阻塞 加入相关队列
  • 调度另外一个进程
  • 修改该调度进程的PCB,状态修改为运行
  • 把当前进程的存储管理数据改为被调度进程的存储管理信息(页表,TLB)
  • 恢复被调度进程的硬件上下文,让PC指向被调度的进程代码

系统调用流程

**请求准备:**系统调用号 -> eax寄存器

(设置系统调用号,每个系统调用都有一个特有的系统调用号放到寄存器中)

触发中断:执行int 0x80 用户态 切换到 内核态

  • 1 保存用户态状态
  • 2 运行内核代码 - 执行中断处理
  • 3 恢复运行现场 - 中断返回

2 执行中断处理:

根据中断号从系统调用表的查找表来找到与该号码关联的具体函数,内核开始执行这个函数。

3 中断返回:

iret 将返回值返回,并从内核态切换到用户态

系统调用是否会引起线程切换

不一定,如果是阻塞IO且IO未就绪,就是他在阻塞等待了,那么线程会切换;

非阻塞IO不会导致线程切换。

为什么需要使用虚拟内存

也就是为什么进程需要通过一个页表映射到物理内存。

内存利用率 :通过需求分页或需求分段,只有当进程真正访问一个页面或段时,它才会被加载到物理内存中 。这使得更多的进程可以同时在内存中运行 (即便它们的总虚拟内存使用超过了可用的物理内存),从而提高了内存的利用率和系统的吞吐量。

抽象与隔离 :虚拟内存为每个进程提供了它自己的地址空间,使其看起来好像它独占了全部的物理内存。这样,每个进程都不能直接访问其他进程的内存,从而实现了进程间的隔离,提高了系统的安全性和稳定性。

磁盘与内存之间的交换:当物理内存不足时,操作系统可以将不常用的内存页面移到磁盘上的交换区或页面文件中,从而释放物理内存供其他进程使用。当进程再次访问被换出的页面时,操作系统可以将其换回内存中。

相关推荐
越甲八千9 小时前
python socket
开发语言·python
xqqxqxxq9 小时前
《智能仿真无人机平台(多线程V1.0)技术笔记》(初识线程,带你理解程序运行的基本流程)
java·笔记
缺点内向9 小时前
告别“复制粘贴”:用C#和模板高效生成Word文档
开发语言·c#·word
edisao9 小时前
【开源】轻量级 LLM 文本质检工具:精准识别核心概念缺失,支持动态别名 + 反馈闭环
大数据·开发语言·人工智能·经验分享·gpt·架构·开源
进阶小白猿9 小时前
Java技术八股学习Day23
java·网络·学习
砚边数影9 小时前
DL4J框架入门(三):基础配置,计算后端(CPU/GPU)选型与优化
java·数据库·人工智能·ai·金仓数据库
名字无法显示3419 小时前
Arthas 实战指南:结合 IDEA 的 Java 线上排查完整流程
java·intellij-idea
qq_12498707539 小时前
基于Spring Boot的桶装水配送管理系统的设计与实现(源码+论文+部署+安装)
java·前端·spring boot·后端·spring·毕业设计·计算机毕业设计
季明洵9 小时前
二分搜索、移除元素、有序数组的平方、长度最小的子数组
java·数据结构·算法·leetcode
Leweslyh9 小时前
【实战】如何在家定位国际空间站 (ISS)? —— 坐标转换的魔法 (例题 5.9)
开发语言·javascript·ecmascript