1、自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用自旋锁还是信号量?
自旋锁会一直自旋等待,不会休眠;而信号量是等待信号来唤醒进程,进程会睡眠。
使用时注意希望长等待不吃系统资源时使用信号量,反过来短期的等待使用自旋锁,但会增加系统开销。
中断中不可以使用信号量,因为中断不能睡眠。
2、异步IO和同步IO的区别
同步和异步来自于Linux内核态和用户态的切换,通常IO包括网络IO和来自设备/文件的IO,完成IO操作分两步,发起请求和执行。 当请求被阻塞时,为同步IO,否则为异步IO。
同步IO进程需要等待IO执行完毕。而异步IO在IO执行时,进程可以继续执行,不陷入阻塞。
3、请你讲一讲Linux中断的原理和开发方法?
Linux中断处理过程分为两部分:
上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。
下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。
那些对时间敏感、执行速度快的操作可以放到中断处理函数中,也就是上半部。剩下的所有工作都可以放到下半部去执行,比如在上半部将数据拷贝到内存中,关于数据的具体处理就可以放到下半部去执行。
一般来说,不希望被其他中断打断、对时间敏感、和硬件有关的任务建议放在中断上半部
4、说一说进程的几个状态及转换条件?
进程状态包括就绪态,运行态,阻塞态,除此以外还包括新建态和退出态。
进程首次创建并未参与调度为新建态 从新建态做好准备(初始化成功)等待调度为就绪态 内核调度此进程时,此进程从就绪态转换为运行态 进程执行完内核分配的时间片后,从运行态再次回到就绪态 进程执行时如果等待其他条件满足后才能执行,则进程从运行态转换为阻塞态 阻塞的进程等待的条件满足后,进程重新进入就绪态 进程终止或者异常,进程将进入退出态
5、static修饰局部变量和全局变量会有什么效果
静态全局变量:具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。
静态局部变量:具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在。
6、堆和栈的区别
栈由系统分配,堆由程序员控制,例如C/C++的malloc函数 栈的大小较小,有默认上限,堆理论上可以申请整个虚拟内存的大小 栈向下增长,地址由高到低,堆向上增长,地址从低到高 栈的分配效率较高,保证函数执行跳转的效率,堆的分配更为复杂,容易产生碎片,需要回收 栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等;
堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。
7、简述gcc编译过程
预处理、编译、汇编和链接,一个hello.c的c语言程序如下。
- 预处理阶段:hello.c–>hello.i
- 编译阶段:hello.i–>hello.s
- 汇编阶段:hello.s–>hello.o
- 链接阶段:hello.o–>hello
8、线程与进程的区别
进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发
线程是操作系统可识别的最小执行和调度单位。
一个线程只能属于一个进程,而一个进程可以有多个线程 进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存
进程是资源分配的最小单位,线程是CPU调度的最小单位
进程切换的开销也远大于线程切换的开销。
进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。
9、野指针出现情况、怎么解决?
1.指针变量声明时没有被初始化,可以在指针声明时初始化,可以是具体的地址值,也可让它指向NULL。
2.指针 p 被 free 或者 delete 之后,没有置为 NULL。指针指向的内存空间被释放后指针应该指向NULL。
3.指针操作超越了变量的作用范围,在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL。
10、dma有什么用
直接存储器存取(Direct Memory Access,DMA)可以让某些电脑内部的硬体子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道 CPU。在同等程度的CPU负担下,DMA是一种快速的数据传送方式。它允许不同速度的硬件装置来沟通,而不需要依于 CPU的大量中断请求。大大提高了访问效率,减少访问时间,降低CPU资源的消耗。