当前位置: 首页 > news >正文

深度思考操作系统面经

1 堆和栈的区别:(如果记的不太清楚,可以类比jvm中的堆和栈的区别,大差不差)

  • 存储位置:堆是在计算机内存中动态分配的区域,而栈是在计算机内存中由操作系统自动分配和管理的区域。
  • 管理方式:堆中的内存由程序员管理和释放,而栈中的内存由操作系统自动管理。
  • 生命周期:堆中的对象生命周期由程序员控制,可以跨函数调用存在;而栈中的对象生命周期只在函数调用期间存在。
  • 访问速度:栈的访问速度比堆更快,因为栈是基于LIFO (后进先出) 方式访问的。
  • 大小限制:堆的大小受到计算机系统的物理内存限制,而栈的大小受到操作系统限制。
  • 存储内容:栈主要存储函数的局部变量和函数调用信息,而堆主要存储动态分配的对象和数据。

1.1 栈的访问速度比堆更快,因为栈是基于LIFO (后进先出) 方式访问的。为什么

这个说法是一个简化的描述,实际上栈访问速度比堆更快的原因并不仅仅是因为其LIFO特性。栈和堆之间速度差异的原因主要是:

  1. 内存分配方式:堆内存是动态分配的,这意味着每次分配都可能需要搜索足够大的空闲空间来满足请求,而且在释放时可能还需要处理内存碎片问题。相对地,栈内存的分配仅仅是移动栈指针,这是一个固定的开销。

  2. 空间局部性:栈用于存储局部变量和函数调用信息。局部变量通常是函数中频繁访问的数据。由于它们存储在栈上,并且栈是连续的内存区域,这使得CPU的缓存更容易高效地缓存这部分数据。而堆上的对象可能散布在不同的内存区域,导致缓存效率不如栈高。

  3. 管理开销:堆内存管理涉及到分配和释放的开销,包括可能的内存碎片处理、垃圾回收(在一些语言中)等。相比之下,栈内存的管理简单得多,仅涉及调整栈指针。

  4. 预测性:由于栈是LIFO结构,CPU可以更容易地预测数据的存储位置,这有助于优化。

  5. 同步和并发:在多线程环境中,堆是所有线程共享的资源,所以堆上的操作可能需要额外的同步机制以避免数据竞争。而每个线程都有自己的栈,所以栈上的操作不需要这样的开销。

总的来说,栈的速度之所以比堆快,是因为它有简单的管理方式、良好的空间局部性和较少的并发管理开销。但这并不意味着栈总是比堆更好——两者各有用途和优点。

2 OS的锁

2.1 在操作系统中,锁是用于控制多个进程或线程访问共享资源的基本工具。以下是几种典型的锁及其描述:

  1. 互斥锁 (Mutex Lock):

    • 互斥锁保证任何时候只有一个线程可以持有该锁,从而保证对共享资源的独占访问。
    • 用于保护临界区,防止同一时间有多个线程进入临界区。
  2. 读写锁 (Read-Write Lock):

    • 允许多个线程同时读共享资源,但在写入资源时只允许一个线程。
    • 当某个线程持有写锁时,其他线程不能获取读锁或写锁。
  3. 自旋锁 (Spinlock):

    • 当线程尝试获取自旋锁并失败时,它会不断循环尝试获取锁,而不是进入睡眠状态。这在锁被持有时间较短的情况下是有效的,因为线程可以快速获取锁而不用等待。
    • 适用于锁持有时间短和线程不想在获取锁时睡眠的场景。
  4. 信号量 (Semaphore):

    • 是一个更为通用的同步工具,可以看作是可以持有多个资源的锁。
    • 信号量可以限制对资源的并发访问数,而不仅仅是一个。
  5. 条件变量 (Condition Variable):

    • 常与互斥锁结合使用,允许线程等待某个条件为真以获取锁。
    • 当某个条件不满足时,线程可以被放到休眠状态,直到另一个线程更改了条件并唤醒等待的线程。
  6. 屏障 (Barrier):

    • 用于同步一组线程,使它们在某个点上达到共同的执行点。
    • 当所有线程都到达屏障时,它们都会被释放继续执行。
  7. 读者-写者锁 (Reader-Writer Lock):

    • 类似于读写锁,但更强调“读者优先”或“写者优先”的策略。
    • “读者优先”允许多个读者并发访问资源,直到一个写者来到。而“写者优先”会让写者有更高的优先级。
  8. 递归锁 (Recursive Lock):

    • 允许一个线程多次获取同一个锁,而不会造成死锁。
    • 通常用于需要多次进入临界区的复杂函数或方法。

这些锁的实现和语义可能因操作系统和具体应用而异。选择合适的锁类型取决于具体的同步需求和使用场景。

OS在各个锁上是如何实现的(大概的实现)

在操作系统中,锁的实现通常涉及硬件级的支持、系统调用和高效的数据结构设计。以下是几种常见的锁及其基本实现原理:

  1. 互斥锁 (Mutex Lock)

    • 基本实现: 使用原子操作,如Test-and-SetCompare-and-Swap。这些原子操作是由硬件直接支持的。
    • 当线程尝试获取锁时,它使用原子操作检查锁的状态。如果锁是空闲的,则线程获取锁;否则,线程可能被阻塞或自旋。
  2. 读写锁 (Read-Write Lock)

    • 基本实现: 包含两部分:一个读锁计数器和一个互斥锁。互斥锁用于写操作,读锁计数器用于跟踪当前的读线程数量。
    • 读取时,读锁计数器增加;写入时,首先要获得互斥锁。
  3. 自旋锁 (Spinlock)

    • 基本实现: 当锁被占用时,线程会在一个循环中不断尝试获取锁,而不进入休眠状态。
    • 也是基于原子操作实现的,如Test-and-Set
  4. 信号量 (Semaphore)

    • 基本实现: 通常包含一个整数值和一个等待队列。整数值代表可用资源的数量。
    • 当线程尝试获得资源而资源不足时,线程会被放入等待队列。当其他线程释放资源时,等待队列中的线程可能会被唤醒。
  5. 条件变量 (Condition Variable)

    • 基本实现: 与互斥锁结合使用。条件变量通常包含一个等待队列。
    • 当某个条件不满足时,线程会进入等待状态。当条件变为真时,线程会被唤醒。
  6. 屏障 (Barrier)

    • 基本实现: 屏障通常包含一个计数器和一个等待队列。计数器跟踪已到达屏障的线程数。
    • 当所有线程都到达屏障时,它们都会被释放继续执行。
  7. 读者-写者锁 (Reader-Writer Lock)

    • 基本实现: 与读写锁类似,但可能包括其他策略,如优先权策略,来决定何时允许读或写操作。
  8. 递归锁 (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 写了一个加载动画效果&#xff0c;使用了一个包含多个 <span> 元素的 <div> 元素&#xff0c;并为每个 <span> 元素设置了一个自定义属性 --i。 这段代码创建了一个简单的动态加载动画&#xff0c;由20个垂直排列的…...

使用正则表达式替换文本中的html标签

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

当向数据库导入大量数据时,mysql主键唯一键重复插入,如何丝滑操作并不导入重复数据呢

解决办法&#xff1a; 答案来源&#xff1a;...

【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】文件夹&#xff0c;新建data.js文件&#xff0c;并定义好json数据格式。如下&#xff1a; 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 方式二&#xff08;推荐&#xff09; 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.完成安装向导&#xff0c;登录管理界面即可…...

elementui实现当前页全选+所有全选+翻页保持选中状

原文来自&#xff1a;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–动态链接库一文中提到&#xff0c;动态方式加载dll只能加载 extern "C“ 的导出函数&#xff0c;而无法加载类&#xff0c;因此可以使用Qt提供的插件来实现导出类的动态加载。 QPlugin是Qt插件框架的一部分&#xff0c;是一种轻量级的插件系统&#xff0c;…...

公会发展计划 (GAP) 第 4 季:塑造 YGG 的成就版图

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

ExpressJS教程_编程入门自学教程_菜鸟教程-免费教程分享

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

时序预测 | MATLAB实现BO-BiLSTM贝叶斯优化双向长短期记忆神经网络时间序列预测

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

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...