嵌入式面试题(一)
1.静态变量与局部静态变量的区别
- 存储类别:非零的全局变量,非零的局部静态变量存储在数据段;零初始化的全局变量或者局部静态变量存储在bss段
- 作用域:静态变量属于内链接,只在当前模块内可以被访问。
- 生命周期:bss段和数据段的生命周期是永久的,从程序开始到程序结束。
扩展
变量类型 | 存储类型 | 链接属性 | 作用域 | 生命周期 |
---|---|---|---|---|
局部变量 | 栈 | 无链接 | 代码块作用域{} | 临时的,在变量空间代码运行时开辟,运行结束释放 |
局部静态变量 | bss或者数据段 | 无链接 | 代码块作用域{} | 永久的 |
全局变量 | bss或者数据段 | 外连接 | 文件作用域 | 永久的 |
静态全局变量 | bss或者数据段 | 内链接 | 文件内部 | 永久 |
malloc申请变量 | 堆 | 链接属性根据变量类型 | 代码块作用域 | malloc到free之间 |
const变量 | 只读段 | -- | 根据变量类型 | 永久的 |
函数 | 代码段 | 外连接 | 文件作用域 | 永久 |
2.C语言调用函数过程中,栈是如何变化的?
- 调用前的准备:实参入栈,参数从右向左先后入栈;返回地址入栈
- 函数执行:程序控制流程跳转;保存caller的栈帧指针;为局部变量分配空间;执行计算;销毁局部变量;恢复caller的栈帧指针
- 控制返回
3.为什么指针都是占四个字节?
C语言的指针变量所占的空间,是一个字的空间。这其实跟机器有关。
如果你使用的是32位的编译器,编译后的指针变量是4个字节。
如果使用的是64位的编译器,编译后的指针变量应该是8字节
4.进程与线程的区别?
- 进程是系统资源分配的最小单位;线程是程序执行的最小单位,也是处理器调度的基本单位。两者均可并发执行。
- 进程有自己独立的地址空间,每启动一个进程,系统会为它分配地址空间建立数据表来维护代码段、堆栈段、数据段这种操作非常昂贵;线程是共享进程中数据,使用相同的地址空间,因此CPU切换一个线程的花费比切换一个线程要小。
- 线程之间通信更加方便,同一线程共享进程下全局变量和静态变量;进程间通信方式要通过IPC方式。
- 进程切换资源大、效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
- 每个独立进程都有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立运行,必须依赖于应用程序,由应用程序提供多个线程执行程序。
5.进程间通信?
- 管道。有名管道和无名管道。
- 信号量。
- 消息队列
- 共享内存
- 套接字