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

目录

进程和线程区别

进程和线程切换的区别

系统调用流程

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

为什么需要使用虚拟内存


进程和线程区别

本质区别:

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

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

地址空间:

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

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

内存:

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

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

并发性:

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

进程和线程切换的区别

本质是上下文的切换。

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

何时切换:

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

进程切换过程:

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

系统调用流程

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

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

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

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

2 执行中断处理:

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

3 中断返回:

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

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

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

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

为什么需要使用虚拟内存

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

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

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

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

相关推荐
海的透彻6 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat6 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
北京中科新远科技6 小时前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架
开发语言·php
xiaoye-duck7 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
后台模板学习7 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one7 小时前
算法--构造
java·数据结构·算法
SL_staff7 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
AI源码7 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python
旖旎夜光8 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
SL_staff8 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈