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

目录

进程和线程区别

进程和线程切换的区别

系统调用流程

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

为什么需要使用虚拟内存


进程和线程区别

本质区别:

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

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

地址空间:

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

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

内存:

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

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

并发性:

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

进程和线程切换的区别

本质是上下文的切换。

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

何时切换:

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

进程切换过程:

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

系统调用流程

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

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

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

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

2 执行中断处理:

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

3 中断返回:

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

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

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

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

为什么需要使用虚拟内存

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

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

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

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

相关推荐
懂点Tech26 分钟前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
金銀銅鐵1 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin1 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
福建佰胜张工2 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
念何架构之路2 小时前
go-grpc设计思想
开发语言·后端·golang
catoop2 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x2 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
酷炫码神3 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
驭渊的小故事3 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客3 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es