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

目录

进程和线程区别

进程和线程切换的区别

系统调用流程

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

为什么需要使用虚拟内存


进程和线程区别

本质区别:

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

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

地址空间:

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

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

内存:

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

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

并发性:

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

进程和线程切换的区别

本质是上下文的切换。

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

何时切换:

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

进程切换过程:

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

系统调用流程

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

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

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

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

2 执行中断处理:

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

3 中断返回:

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

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

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

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

为什么需要使用虚拟内存

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

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

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

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

相关推荐
袋鼠云数栈6 小时前
整库迁移与分库分表同步:批量数据搬迁的配置简化思路
jvm·数据库·oracle
2601_962297256 小时前
C# vs Java vs Python:YOLO工业部署性能对比实战
java·python·c·工业视觉·性能对比
计算机毕设定制辅导-无忧学长6 小时前
《基于SpringBoot的马术俱乐部管理系统》
java·spring boot·后端
Persistent的粽子!6 小时前
C++:类与对象(二)
开发语言·c++
Dreams°1236 小时前
【Java后端+Vue前后端分离:内网正常、公网访问异常|5个高频经典踩坑完整复盘】
java·开发语言·vue.js
学长毕业设计6 小时前
基于SpringBoot的民间艺术传承管理系统(源码+文档+讲解视频)
java·spring boot·后端
小蒜学长6 小时前
基于Springboot+Vue的环保行动志愿者招募系统设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
frjc7 小时前
如何在 IDEA 中打开并运行已有Java项目
java·ide·intellij-idea
.YM.Z7 小时前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
java_nnnn7 小时前
文件操作和IO
java