面试题总结

本文探讨了程序运行时的内存布局,包括代码区、静态数据区和动态数据区的区别,以及栈和堆的特点。此外,还讨论了含参数宏与函数的不同之处,何时使用多线程以提高程序效率,内存对齐的原因,进程死锁及其解决策略,最后介绍了 volatile 关键字的作用。

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

1,应用程序在运行时的内存包括代码去和数据区。

对于一个进程的内存空间而言,可以在逻辑上分成三个部分:代码去,静态数据区和动态数据区。动态数据区一般就是“堆栈”。栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。全局变量和静态变量分配在静态数据区,本地变量分配咋动态数据区,既堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。

在传统的c中堆和栈实际是一块物理内存,堆主要用来动态分配内存,从堆栈内存的低端向上分配;而栈主要用来传递函数参数、返回值和局部参数内存分配,是从堆栈内存的高端向下分配,俗称压栈和出栈。堆是动态分配,需要手工释放,否则会导致内存泄漏;栈是静态分配,分配堆栈,但堆栈能够自动释放。


2,含参数的宏和函数。

宏是编译期的,函数是运行期的;宏不是实体,而函数是一个可寻址的实体;宏只是编译期替换,参数两个实体并没有由宏实际产生,而函数会在栈中定义参数;宏没有生存期、作用域之类的概念,而函数有。

宏没有类型检测,而内联函数和函数有。


3,程序什么时候使用线程,什么时候单线程效率高。

1,耗时的操作使用线程,提高应用程序响应。

2,并行操作时使用线程,如C/S架构的服务器并发线程响应用户的请求。

3,多cpu系统中,使用线程提高CPU利用率。

4,改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为及格独立或半独立的运行部分,这样的程序会利于理解和修改。


4,内存对齐的问题

编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,然而,对齐的内存访问仅需要一次访问。


5,进程死锁

原因:资源竞争及进程推进顺序非法

4个必要条件:互斥,请求保持,不可剥夺,环路

处理:鸵鸟策略,预防策略,避免策略,检测和解除死锁

进程调度策略:fcfs(先来先服务),优先级,时间片轮转,多级反馈

6,volatile关键字

volatile表示程序编译过程中不可以对其修饰的变量进行优化,每次使用的时候都要到内存中去取。

当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。


基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值