深度思考操作系统面经
1 堆和栈的区别:(如果记的不太清楚,可以类比jvm中的堆和栈的区别,大差不差)
- 存储位置:堆是在计算机内存中动态分配的区域,而栈是在计算机内存中由操作系统自动分配和管理的区域。
- 管理方式:堆中的内存由程序员管理和释放,而栈中的内存由操作系统自动管理。
- 生命周期:堆中的对象生命周期由程序员控制,可以跨函数调用存在;而栈中的对象生命周期只在函数调用期间存在。
- 访问速度:栈的访问速度比堆更快,因为栈是基于LIFO (后进先出) 方式访问的。
- 大小限制:堆的大小受到计算机系统的物理内存限制,而栈的大小受到操作系统限制。
- 存储内容:栈主要存储函数的局部变量和函数调用信息,而堆主要存储动态分配的对象和数据。
1.1 栈的访问速度比堆更快,因为栈是基于LIFO (后进先出) 方式访问的。为什么
这个说法是一个简化的描述,实际上栈访问速度比堆更快的原因并不仅仅是因为其LIFO特性。栈和堆之间速度差异的原因主要是:
-
内存分配方式:堆内存是动态分配的,这意味着每次分配都可能需要搜索足够大的空闲空间来满足请求,而且在释放时可能还需要处理内存碎片问题。相对地,栈内存的分配仅仅是移动栈指针,这是一个固定的开销。
-
空间局部性:栈用于存储局部变量和函数调用信息。局部变量通常是函数中频繁访问的数据。由于它们存储在栈上,并且栈是连续的内存区域,这使得CPU的缓存更容易高效地缓存这部分数据。而堆上的对象可能散布在不同的内存区域,导致缓存效率不如栈高。
-
管理开销:堆内存管理涉及到分配和释放的开销,包括可能的内存碎片处理、垃圾回收(在一些语言中)等。相比之下,栈内存的管理简单得多,仅涉及调整栈指针。
-
预测性:由于栈是LIFO结构,CPU可以更容易地预测数据的存储位置,这有助于优化。
-
同步和并发:在多线程环境中,堆是所有线程共享的资源,所以堆上的操作可能需要额外的同步机制以避免数据竞争。而每个线程都有自己的栈,所以栈上的操作不需要这样的开销。
总的来说,栈的速度之所以比堆快,是因为它有简单的管理方式、良好的空间局部性和较少的并发管理开销。但这并不意味着栈总是比堆更好——两者各有用途和优点。
2 OS的锁
2.1 在操作系统中,锁是用于控制多个进程或线程访问共享资源的基本工具。以下是几种典型的锁及其描述:
-
互斥锁 (Mutex Lock):
- 互斥锁保证任何时候只有一个线程可以持有该锁,从而保证对共享资源的独占访问。
- 用于保护临界区,防止同一时间有多个线程进入临界区。
-
读写锁 (Read-Write Lock):
- 允许多个线程同时读共享资源,但在写入资源时只允许一个线程。
- 当某个线程持有写锁时,其他线程不能获取读锁或写锁。
-
自旋锁 (Spinlock):
- 当线程尝试获取自旋锁并失败时,它会不断循环尝试获取锁,而不是进入睡眠状态。这在锁被持有时间较短的情况下是有效的,因为线程可以快速获取锁而不用等待。
- 适用于锁持有时间短和线程不想在获取锁时睡眠的场景。
-
信号量 (Semaphore):
- 是一个更为通用的同步工具,可以看作是可以持有多个资源的锁。
- 信号量可以限制对资源的并发访问数,而不仅仅是一个。
-
条件变量 (Condition Variable):
- 常与互斥锁结合使用,允许线程等待某个条件为真以获取锁。
- 当某个条件不满足时,线程可以被放到休眠状态,直到另一个线程更改了条件并唤醒等待的线程。
-
屏障 (Barrier):
- 用于同步一组线程,使它们在某个点上达到共同的执行点。
- 当所有线程都到达屏障时,它们都会被释放继续执行。
-
读者-写者锁 (Reader-Writer Lock):
- 类似于读写锁,但更强调“读者优先”或“写者优先”的策略。
- “读者优先”允许多个读者并发访问资源,直到一个写者来到。而“写者优先”会让写者有更高的优先级。
-
递归锁 (Recursive Lock):
- 允许一个线程多次获取同一个锁,而不会造成死锁。
- 通常用于需要多次进入临界区的复杂函数或方法。
这些锁的实现和语义可能因操作系统和具体应用而异。选择合适的锁类型取决于具体的同步需求和使用场景。
OS在各个锁上是如何实现的(大概的实现)
在操作系统中,锁的实现通常涉及硬件级的支持、系统调用和高效的数据结构设计。以下是几种常见的锁及其基本实现原理:
-
互斥锁 (Mutex Lock)
- 基本实现: 使用原子操作,如
Test-and-Set
或Compare-and-Swap
。这些原子操作是由硬件直接支持的。 - 当线程尝试获取锁时,它使用原子操作检查锁的状态。如果锁是空闲的,则线程获取锁;否则,线程可能被阻塞或自旋。
- 基本实现: 使用原子操作,如
-
读写锁 (Read-Write Lock)
- 基本实现: 包含两部分:一个读锁计数器和一个互斥锁。互斥锁用于写操作,读锁计数器用于跟踪当前的读线程数量。
- 读取时,读锁计数器增加;写入时,首先要获得互斥锁。
-
自旋锁 (Spinlock)
- 基本实现: 当锁被占用时,线程会在一个循环中不断尝试获取锁,而不进入休眠状态。
- 也是基于原子操作实现的,如
Test-and-Set
。
-
信号量 (Semaphore)
- 基本实现: 通常包含一个整数值和一个等待队列。整数值代表可用资源的数量。
- 当线程尝试获得资源而资源不足时,线程会被放入等待队列。当其他线程释放资源时,等待队列中的线程可能会被唤醒。
-
条件变量 (Condition Variable)
- 基本实现: 与互斥锁结合使用。条件变量通常包含一个等待队列。
- 当某个条件不满足时,线程会进入等待状态。当条件变为真时,线程会被唤醒。
-
屏障 (Barrier)
- 基本实现: 屏障通常包含一个计数器和一个等待队列。计数器跟踪已到达屏障的线程数。
- 当所有线程都到达屏障时,它们都会被释放继续执行。
-
读者-写者锁 (Reader-Writer Lock)
- 基本实现: 与读写锁类似,但可能包括其他策略,如优先权策略,来决定何时允许读或写操作。
-
递归锁 (Recursive Lock)
- 基本实现: 与互斥锁类似,但它还跟踪锁的拥有者和锁的持有计数。
- 当当前持有锁的线程再次尝试获取锁时,持有计数增加而不是被阻塞。
这些锁的实现会涉及到操作系统的调度策略、上下文切换和内存管理。锁的选择和使用也会受到程序的同步模式、性能需求和应用场景的影响。
相关文章:

深度思考操作系统面经
1 堆和栈的区别:(如果记的不太清楚,可以类比jvm中的堆和栈的区别,大差不差) 存储位置:堆是在计算机内存中动态分配的区域,而栈是在计算机内存中由操作系统自动分配和管理的区域。管理方式&…...

智慧工地源码:数字孪生智慧工地可视化解决方案
一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段,进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加,施工现场管理的内容越来越多,管理的技术难度和要求在不断提高。传统的施工现场管理模…...

解决rockchip平台Android13系统以太网设置静态IP保存不了问题
前言 rk平台平Android13系统测试以太网,发现设置静态IP保存不了问题,即设置静态IP以后重启系统,IP又变成动态的了。 分析 抓取log发现保存静态IP的时候会打印如下log: 08-07 06:22:28.377 626 749 D EthernetNetworkFactory: updateInterface, iface: eth0, ipConfi…...

SQLAlchemy与标准SQL相比有哪些优点?
让我来给你讲讲SQLAlchemy和标准SQL相比有哪些优点吧! 首先,我们要知道,SQLAlchemy是一个Python的SQL工具包和对象关系映射(ORM)系统,它把Python的面向对象编程(OOP)的理念带入了数…...

Zookeeper与Kafka
Zookeeper与Kafka 一、Zookeeper 概述1.Zookeeper 定义2.Zookeeper 工作机制3.Zookeeper 特点4.Zookeeper 数据结构5.Zookeeper 应用场景6.Zookeeper 选举机制 二、部署 Zookeeper 集群1.准备 3 台服务器做 Zookeeper 集群2.安装 Zookeeper3.拷贝配置好的 Zookeeper 配置文件到…...

MySQL—— 基础语法大全
MySQL—— 基础 一、MySQL概述1.1 、数据库相关概念1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.4、DML2.5、DQL2.6、DCL 三、函数四、约束五、多表查询六、事务 一、MySQL概述 1.1 、数据库相关概念 数据库、数据库管理系统、SQL&a…...

css小练习:案例6.炫彩加载
一.效果浏览图 二.实现思路 html部分 HTML 写了一个加载动画效果,使用了一个包含多个 <span> 元素的 <div> 元素,并为每个 <span> 元素设置了一个自定义属性 --i。 这段代码创建了一个简单的动态加载动画,由20个垂直排列的…...

使用正则表达式替换文本中的html标签
文章目录 使用正则表达式替换文本中的html标签原文本:使用正则表达式进行替换替换后:展示 html 文本 使用正则表达式替换文本中的html标签 我们存储 markdown 文章时,如果存储转换后的 html 页面,那么在查出来的时候,…...

当向数据库导入大量数据时,mysql主键唯一键重复插入,如何丝滑操作并不导入重复数据呢
解决办法: 答案来源:...

【go-zero】docker镜像直接部署go-zero的API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现
一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…...

微信小程序读取本地json
首先在项目录下新建【server】文件夹,新建data.js文件,并定义好json数据格式。如下: pages/index/index.ts导入data.js并请求json pages/index/index.wxml页面展示数据...

Stephen Wolfram:ChatGPT 的训练
The Training of ChatGPT ChatGPT 的训练 OK, so we’ve now given an outline of how ChatGPT works once it’s set up. But how did it get set up? How were all those 175 billion weights in its neural net determined? Basically they’re the result of very large…...

SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关
目录 1 Nacos配置管理1.1 统一配置管理1.1.1 在nacos中添加配置文件1.1.2 从微服务拉取配置 1.2 配置热更新1.2.1 方式一1.2.2 方式二(推荐) 1.3.配置共享 2 搭建Nacos集群2.1 集群结构图2.2 搭建集群2.2.1 初始化数据库2.2.2 下载nacos2.2.3 配置Nacos2…...

tomcat配置文件和web站点部署(zrlog)简介
一.tomcat/apache-tomcat-8.5.70/conf/server.xml组件类别介绍 1.类别 2.Connector参数 3.host参数 4.Context参数 二.web站点部署(以zrlog为例) 1.将zrlog的war包传到webapps下面 2.在mysql数据库中创建zrlog用户并赋予权限 3.完成安装向导,登录管理界面即可…...

elementui实现当前页全选+所有全选+翻页保持选中状
原文来自:https://blog.csdn.net/sumimg/article/details/121693305?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121693305-blog-127570059.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm…...

Opencv项目实战:24 石头剪刀布
目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与部分讲解 pyzjr库...

Qt--QPlugin插件
写在前面 Qt–动态链接库一文中提到,动态方式加载dll只能加载 extern "C“ 的导出函数,而无法加载类,因此可以使用Qt提供的插件来实现导出类的动态加载。 QPlugin是Qt插件框架的一部分,是一种轻量级的插件系统,…...

公会发展计划 (GAP) 第 4 季:塑造 YGG 的成就版图
基于前三个赛季所取得的成果,Yield Guild Games(YGG)自豪地宣布推出 公会发展计划(GAP)第 4 季。公会最近的一些精英成员将在本季加入公会,公会成员将在全新的任务中磨练自己的技能,建立自己在 …...

ExpressJS教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Express是基于Node.js平台,快速、开放、极简的Web开发框架;通俗的理解:Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的;Express的本质:就是一个npm上的第三方包,提供了快速创建Web服务器的便捷方法。ExpressJS是一个Web…...

时序预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆神经网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆…...

HIVE优化之不需要参数优化
#1.数据倾斜 什么是数据倾斜? 一部分数据多 一部分数据少 造成的结果: MR运行过慢 主要是shuffle和reduce过程慢 分组聚合导致数据倾斜 Hive未优化的分组聚合 方法1:在MAP端直接聚合(分组聚合优化),减少…...

前端 select 标签如何创建下拉菜单?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…...

基于 eclipse-temurin 构建国内时区,地区,语言的docker镜像
基于 eclipse-temurin 构建国内时区,地区,语言的镜像 使用场景自定Dockerfile构建自己的基础镜像构建本地镜像推送远程仓库 使用场景 在给应用构建自定义镜像时,往往需要在每次构建时去调整时区,地区这些东西;每次构建…...

RunnerGo配置场景时接口模式该怎么选
在进行性能测试时,测试场景的正确配置非常关键。首先,需要根据业务场景和需求,设计出合理的测试场景,再利用相应的工具进行配置,实现自动化的性能测试。 在JMeter中,用户需要自己组织测试场景,…...

系统分享UIActivity
iOS自带的分享控件可以完成绝大部分的分享需求。 它可以不需要集成微信、QQ等第三方SDK就可以实现分享(需要在弹出视图里面点击更多打开开关)到微信好友、朋友圈等,功能很强大,也很方便。 一、系统分享两个步骤 UIActivity配置分享的内容和…...

常用抓包工具
Fiddler Fiddler 是一个很好用的抓包工具,可以用于抓取http/https的数据包,常用于Windows系统的抓包,它有个优势就是免费 Charles Charles是由JAVA开发的,可以运行在window Linux MacOS,但它是收费的,和…...

自然语言处理学习笔记(五)————切分算法
目录 1.切分算法 2.完全切分 3.正向最长匹配 4.逆向最长匹配 5.双向最长匹配 6.速度评测 1.切分算法 词典确定后,句子可能含有很多词典中的词语,他们有可能互相重叠,如何切分需要一些规则。常用规则为:正向匹配算法、逆向匹…...

SQL-方法论
写SQL时可以考虑的手段: 行转列 先分为多个临时表,然后JOIN到一起 select uid,t1.name YuWen,t2.name ShuXue from (select uid,namefrom tableAwhere naem 语文) t1join (select uid,namefrom tableAwhere naem 数学) t2on t1.uid t2.uid; 用sum(if…...

[Python从零到壹] 六十八.图像识别及经典案例篇之图像特效(毛玻璃、浮雕、油漆和模糊特效变换)
八月太忙,还是写一篇吧! 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足…...

undefined与null的区别
null 表示一个对象被定义了,值为“空值” undefined 表示不存在这个值 1.undefined typeof undefined //"undefined" undefined 是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值,但还没有…...