持续更新版本 嵌入式工程师常见面试题(13)


gcc -S xx.i -o xx.s
3、汇编:将汇编文件生成机器代码(二进制代码)
as xx.s -o xx.o
4、链接:去指定路径下找库函数 (头文件包含的是声明,具体实现封装在库中)
gcc xx.o -o xx
11、什么是堆,栈,内存泄漏和内存溢出?
堆(Heap)和栈(Stack)是计算机内存管理中的两个重要概念,而内存泄漏和内存溢出则是与内存管理相关的两个问题 。
堆(Heap):堆是一种动态分配的内存区域,它由程序员分配和释放 。堆的大小受系统限制,通常位于栈的顶部 。在程序运行过程中,当需要分配大块内存时,可以通过调用等函数从堆中分配 。堆的优点是可以灵活地分配和释放内存,但需要注意的是,由于堆是动态分配的,可能会存在内存碎片和内存泄漏的问题 。
栈(Stack):栈是一种静态分配的内存区域,它由系统自动分配和释放 。栈的大小也受系统限制,通常位于内存的底部 。在程序运行过程中,当需要分配局部变量或函数参数时,系统会自动从栈中分配内存 。栈的优点是分配和释放内存的速度较快,但缺点是空间有限且大小固定,无法分配大块内存 。
内存泄漏( Leak):内存泄漏指的是程序中的某些代码由于某些原因未能释放已经不再需要的内存,导致内存无法被再次使用 。这通常会导致程序运行过程中出现内存不足的情况,从而导致程序性能下降或崩溃 。
内存溢出(Out of ):内存溢出指的是程序在运行过程中所需的内存超过了系统所能提供的内存大小 。这通常会导致程序崩溃或出现不可预测的行为 。为了解决内存溢出问题,程序员需要优化程序的内存使用,避免无谓的内存占用和泄漏 。
综上所述,堆、栈、内存泄漏和内存溢出是计算机内存管理中的重要概念 。程序员需要合理地使用堆和栈,避免内存泄漏和
12、堆和栈的区别
堆(Heap)和栈(Stack)是计算机内存管理中的两个重要概念,它们有以下区别:
分配方式:堆是动态分配的,而栈是静态分配的 。在程序运行过程中,当需要分配大块内存时,可以通过调用等函数从堆中分配,而栈则是在程序编译时就已经分配好的 。
大小限制:栈的大小是有限的,而堆的大小受系统限制 。栈通常位于内存的底部,大小固定,而堆位于栈的顶部,可能会占用系统的大部分内存 。
内存释放:堆的内存释放需要手动进行,而栈的内存由系统自动释放 。在程序运行过程中,如果需要释放堆中的内存,需要手动调用free函数,而栈中的内存会自动释放 。
使用场景:栈通常用于存储局部变量、函数参数和返回地址等,而堆通常用于存储动态创建的数据结构和对象 。
需要注意的是,由于堆是动态分配的,可能会存在内存碎片和内存泄漏的问题 。同时,由于栈的大小有限制,如果分配过多的局部变量或递归调用导致栈溢出的问题也可能出现 。
综上所述,堆和栈在分配方式、大小限制和内存释放方面存在明显的区别 。程序员需要合理地使用堆和栈来满足程序的需求,避免内存泄漏和溢出问题 。
13、死锁的原因、条件
死锁的原因主要有以下几个:
系统资源不足 。在这种情况下,进程的资源请求可能无法得到满足,导致死锁 。进程运行推进的顺序不合适,或者由于进程运行推进顺序与速度不同,也可能导致死锁 。资源分配不当也是死锁的原因之一 。
产生死锁的四个必要条件如下:
互斥条件:一个资源每次只能被一个进程使用 。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放 。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺 。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系 。