每日面经(四)

文章讨论了内存管理中malloc函数的限制,如何受内存碎片和系统限制影响;上下文切换的概念,及其对系统性能的影响;互斥锁与自旋锁的原理、优缺点及适用场景;视频直播常用的RTMP、HLS和DASH协议的特点;以及HTTPS加密的过程和安全特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.malloc最多能申请多少内存

地址空间限制是有的,但是malloc通常情况下申请到的空间达不到地址空间上限。内存碎片会影响到你“一次”申请到的最大内存空间。比如你有10M空间,申请两次2M,一次1M,一次5M没有问题。但如果你申请两次2M,一次4M,一次1M,释放4M,那么剩下的空间虽然够5M,但是由于已经不是连续的内存区域,malloc也会失败。系统也会限制你的程序使用malloc申请到的最大内存。Windows下32位程序如果单纯看地址空间能有4G左右的内存可用,不过实际上系统会把其中2G的地址留给内核使用,所以你的程序最大能用2G的内存。除去其他开销,你能用malloc申请到的内存只有1.9G左右。

2.描述一下上下文切换

在操作系统中,上下文(Context)指的是程序运行时的环境信息,包括程序的 CPU 寄存器的内容、程序运行的堆栈,以及其他必要的状态。当操作系统需要在多个任务之间进行切换时,则需要保存一个任务的上下文信息,用于恢复任务的状态。这个过程就是上下文切换(Context Switching)。

在操作系统中,上下文切换是非常常见的一个操作,它可以通过改变 CPU 的运行环境来实现多任务或者多进程的交替运行。当一个进程或者线程需要等待某些条件达成时,操作系统就会将这个进程或线程的上下文信息保存下来,并切换到另一个进程或者线程运行。当条件达成后,操作系统再将之前保存的上下文信息恢复,让这个进程或线程继续运行。

上下文切换的开销非常大,因为需要保存和恢复大量的状态信息,包括 CPU 寄存器、进程或线程的堆栈、程序计数器、程序状态字等。此外,上下文切换还需要执行复杂的内核操作,包括切换虚拟地址空间、更新页表等。因此,如果上下文切换发生的频率过高,会导致系统性能下降。

在操作系统中,上下文(Context)指的是程序运行时的环境信息,包括程序的 CPU 寄存器的内容、程序运行的堆栈,以及其他必要的状态。当操作系统需要在多个任务之间进行切换时,则需要保存一个任务的上下文信息,用于恢复任务的状态。这个过程就是上下文切换(Context Switching)。

在操作系统中,上下文切换是非常常见的一个操作,它可以通过改变 CPU 的运行环境来实现多任务或者多进程的交替运行。当一个进程或者线程需要等待某些条件达成时,操作系统就会将这个进程或线程的上下文信息保存下来,并切换到另一个进程或者线程运行。当条件达成后,操作系统再将之前保存的上下文信息恢复,让这个进程或线程继续运行。

上下文切换的开销非常大,因为需要保存和恢复大量的状态信息,包括 CPU 寄存器、进程或线程的堆栈、程序计数器、程序状态字等。此外,上下文切换还需要执行复杂的内核操作,包括切换虚拟地址空间、更新页表等。因此,如果上下文切换发生的频率过高,会导致系统性能下降。

在操作系统中,上下文(Context)指的是程序运行时的环境信息,包括程序的 CPU 寄存器的内容、程序运行的堆栈,以及其他必要的状态。当操作系统需要在多个任务之间进行切换时,则需要保存一个任务的上下文信息,用于恢复任务的状态。这个过程就是上下文切换(Context Switching)。

在操作系统中,上下文切换是非常常见的一个操作,它可以通过改变 CPU 的运行环境来实现多任务或者多进程的交替运行。当一个进程或者线程需要等待某些条件达成时,操作系统就会将这个进程或线程的上下文信息保存下来,并切换到另一个进程或者线程运行。当条件达成后,操作系统再将之前保存的上下文信息恢复,让这个进程或线程继续运行。

上下文切换的开销非常大,因为需要保存和恢复大量的状态信息,包括 CPU 寄存器、进程或线程的堆栈、程序计数器、程序状态字等。此外,上下文切换还需要执行复杂的内核操作,包括切换虚拟地址空间、更新页表等。因此,如果上下文切换发生的频率过高,会导致系统性能下降。

3.互斥锁与自旋锁的优缺点?原理?应用场景

互斥锁

互斥锁是一种非常常用的锁机制,也称作互斥量。它是通过操作系统等核心层面提供的互斥保护来实现线程同步的。互斥锁的原理是,在代码临界区(Critical Section)使用锁来保证同一时间只有一个线程访问临界区。当一个线程进入临界区时,操作系统会给它分配一个互斥锁,其他线程想要访问临界区时则需要先尝试获取互斥锁,如果获取不到则需要进入睡眠等待状态。当临界区访问完成后,线程会释放互斥锁,使得其他线程可以继续访问临界区。

优点

  • 可以有效避免竞态条件(Race Condition)和死锁等问题。
  • 由于利用了操作系统等核心层面提供的互斥保护,可以保证线程安全性。

缺点

  • 互斥锁实现需要操作系统等核心层面提供支持,因此会涉及到内核态和用户态的频繁切换,开销较大。
  • 由于互斥锁是内核实现的,因此需要访问内核资源,而这种操作是相对耗费时间的,因此在高并发场景下性能可能不太理想。
  • 在多个进程中使用互斥锁时,需要使用进程间通信的方式来传递锁,增加了额外的开销和复杂度。

应用场景

  • 对于需要保证线程安全的场景,互斥锁是必不可少的锁机制。
  • 在应用程序中,如果需要竞争某个共享资源,互斥锁同样也是一种非常不错的选择。

自旋锁

自旋锁是另外一种常用的锁机制,它是由多个线程通过不断查询锁状态来进行同步,而不是像互斥锁那样将线程挂起。当一个线程尝试获取自旋锁失败时,它会进入自旋等待(Spin Waiting)状态,即不停查询锁的状态直到获取到锁为止。

自旋锁的原理是,一个线程在访问共享资源之前,先尝试获取自旋锁。如果自旋锁已经被占用,则线程等待一段时间,然后再次尝试获取锁。如果在一定的时间内获取到了锁,则线程可以访问共享资源;否则线程会继续等待。当线程访问完成后,会释放自旋锁,以便其他等待线程可以获取锁。当然,自旋锁也可以在尝试若干次后主动放弃 CPU 进入睡眠状态,以避免出现长时间自旋的情况。

优点

  • 没有进程切换的开销,因此性能相对互斥锁会更好。
  • 自旋锁可以使用在多个进程空间中,因为它不需要使用内核资源。

缺点

  • 如果等待锁的时间过长,则会消耗大量 CPU 资源,导致系统性能下降。
  • 自旋锁被多个线程同时获取时,只能有一个线程获得锁,其他线程都需要等待,因此不适用于互斥锁的应用场景。

应用场景

  • 自旋锁通常适用于锁使用频率非常高且锁持有时间短的场景,例如操作系统内核中的中断处理程序,在其中使用自旋锁效果比较好。

4.视频直播用什么协议为什么

视频直播使用的主要协议有RTMP,HLS和DASH等。

  1. RTMP协议通常被用于低延迟直播。它基于TCP传输,通过流媒体服务器将视频内容推送到客户端。RTMP在传输过程中可以做到数据压缩和优化,因此可以控制延迟。

  2. HLS协议是苹果提出的一种基于HTTP的流媒体传输协议,主要用于苹果设备和浏览器的直播和点播视频。服务器将音视频流转换成HTTP的标准格式,客户端通过HTTP请求来获取流片段数据。HLS技术延迟较高,不能满足实时直播需求。

  3. DASH协议是一种开放标准的流媒体协议,支持多种编码和格式,可以在不同设备和平台间实现无缝转换。DASH相比于HLS来说更强大、更灵活,它可以根据设备性能和网络情况自适应调整视频质量和码率,以提供更佳的用户体验。

总体来说,RTMP协议具有低延迟、多平台支持优势,适用于实时直播等场景;HLS协议则支持多设备、稳定性强,适用于点播和网络环境较差的场景;DASH协议则兼具两种协议的优点,可以自适应调整码率和画质,并提供更好的用户体验。

5.https加密过程

HTTPS(Hypertext Transfer Protocol Secure)是HTTP协议上的安全传输协议,通常使用SSL/TLS协议对HTTP协议进行加密传输。下面是HTTPS加密的过程:

  1. 客户端发起HTTPS请求。客户端通过TCP/IP协议与服务器建立连接,发送连接请求,并且请求协商安全传输协议。

  2. 服务器回应安全传输协议和证书。如果服务器支持HTTPS协议,它将通过SSL/TLS协议发送数字证书,该数字证书包含了服务器的公钥和证书颁发机构的信息。

  3. 客户端验证数字证书。客户端通过证书颁发机构验证数字证书的真实性,确保SSL/TLS协议管理的公钥是来自于服务器端的。如果证书有效,客户端使用证书中的公钥加密一个“随机数”,并将其发送给服务器。

  4. 服务器解密客户端发送的信息。服务器使用私钥解密客户端发送的“随机数”。

  5. 服务器与客户端使用“随机数”生成对话密钥。服务器通过使用客户端发送的“随机数”和服务器生成的“随机数”生成对话密钥,该对话密钥用于对接受和发送的数据进行加密和解密操作。

  6. 数据加密传输。一旦密钥被生成,客户端和服务器可以使用对话密钥对数据进行加密和解密,保证数据的安全传输。

总结来说,HTTPS加密过程包括数字证书认证、公钥加密和私钥解密、对话密钥生成、数据加密传输等几个步骤。虽然HTTPS协议传输过程要比HTTP协议复杂,但是它能够保证数据传输的安全性,防止敏感信息被窃取和篡改。

<think>好的,我现在需要处理用户关于Web面试经验总结的请求。首先,用户可能希望得到全面试准备指导,涵盖前端、后端以及常见问题的解答。我要确保回答结构清晰,分点列出,符合用户提到的系统级指令中的中文回答和正确使用LaTeX格式的要求。 首先,用户可能想知道前端面试的重点。HTML/CSS、JavaScript、框架和项目经验是关键点。需要注意每个部分的具体细节,比如HTML5新特性、盒模型、Flex布局等。在JavaScript部分,闭包、原型链、ES6特性都是常见问题,需要提及。框架方,React和Vue的区别以及生命周期是常问的,可能需要用行内公式示例,比如虚拟DOM的diff算法时间复杂度$O(n)$。 然后是后端面试,包括语言基础、数据库、系统设计和项目经验。比如Java的集合框架、线程,数据库的索引优化、事务隔离级别。系统设计部分,RESTful API设计原则和分布式系统问题如缓存穿透需要解释。这里可能需要用独立公式,比如CAP定理的公式,但用户示例中没有使用,所以暂时不考虑,除非必要。 接下来是常见问题,如项目难点、技术学习、团队协作。这些需要给出回答思路,帮助用户准备具体例子。此外,算法题也是重点,需要提到LeetCode和《剑指Offer》,可能涉及时间复杂度的计算,比如快速排序的平均复杂度$O(n \log n)$。 然后生成相关问题,确保覆盖用户可能感兴趣的扩展方向,如前端性能优化、后端高并发设计、项目亮点描述等。最后检查引用部分,用户示例中有引用标识,但当前内容中没有引用来源,可能需要添加,但用户提供的参考信息中没有具体引用来源,所以可能忽略或假设引用来自常见资料。 还要注意LaTeX的正确使用,所有行内数学表达式用$...$,独立公式用$$...$$,但用户示例中部分是行内的,如时间复杂度。确保代码块用正确的语法,比如Python示例,但这里可能涉及JavaScript或其它语言的代码,但用户问题不涉及具体代码,所以可能不需要。 最后整理结构,确保各部分清晰,语言简洁,符合中文表达习惯,避免使用Markdown格式,使用自然的分段和标号。检查是否遗漏重要点,比如面试软技能、行为问题等,但用户可能更关注技术方,所以集中在技术准备上。</think># Web面试经验总结 ## 一、前端面试重点 ### 1. HTML/CSS核心 - HTML5新特性:语义化标签(如`<article>`)、Web Storage、WebSocket - CSS盒模型:标准盒模型与怪异盒模型对比,通过`box-sizing`属性切换 - 布局方案:Flex布局实现响应式设计,Grid布局二维排版,浮动清除技巧 - 性能优化:雪碧图实现原理(通过$background-position$定位),重绘与回流优化 ### 2. JavaScript进阶 - 闭包应用场景:模块化开发中实现私有变量,柯里化函数实现 - 原型链机制:`__proto__`与`prototype`关系图解,`new`操作符实现原理 - ES6特性:箭头函数`this`绑定规则,Promise异步处理链,`let/const`暂时性死区 - 框架原理:虚拟DOM的diff算法时间复杂度$O(n)$,Vue双向绑定实现(Object.defineProperty) ## 二、后端面试要点 ### 1. 语言基础 - Java集合框架:HashMap扩容机制(负载因子0.75,容量翻倍) - 并发编程:线程池参数设置(核心线程数=CPU核数+1),synchronized锁升级过程 - 设计模式:Spring框架中的单例模式实现(注册式单例),代理模式在AOP中的应用 ### 2. 数据库优化 - 索引设计:B+树高度计算(假设每页16KB,单记录200B,3层可存$10^6$级数据) - 事务隔离:MVCC实现原理(版本链与ReadView机制),解决幻读的Next-Key Lock - 慢查询优化:通过`EXPLAIN`分析执行计划,关注`type`列(最优const到最差ALL) ## 三、高频面试问题 1. **项目难点突破** "在电商促销系统开发中,通过二级缓存(Redis+本地缓存)解决库存超卖问题,采用Lua脚本保证原子性[^1]" 2. **技术学习路径** "系统学习React源码时,先理解Fiber架构的链表结构,再分析调度器的工作循环" 3. **团队协作案例** "在前后端联调中,使用Swagger定义接口规范,通过Mock.js生成测试数据提升协作效率" ## 、算法准备建议 - LeetCode刷题策略:按类型分类(数组->链表->树),每日保持3题练习量 - 重点题型:字符串处理(KMP算法时间复杂度$O(n+m)$)、动态规划(背包问题状态转移方程) - 白板编程:先阐述思路(如快速排序分治策略),再编写可运行代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值