问:驱动程序分成上半部和下半 部,具体讲讲?
答:(当时我把中断处理程序的上下半部给答了)下半部是处理一些推后的工作,举个例子吧,比如网卡驱动,当有数据包到达网卡的时候,就会产生中断,然后一
个特定的程序就会去处理他。实现这个功能的程序就是上半部……云云,省去若干字。(答完之后面试官没啥表情,不知道是对是错)
--->上半部在ISR中执行,是最关键的部 分,执行时间很短,关中断执行,不及时处理就会丢失数据,影响实时性;
下半部的作用是上半部的延续,一般用于处理数据,执行时间可能较长,延迟并开中断处理,以免屏蔽其它中断,影响中断响应。
《windosw NT 技术内幕》一书中讲的很明白,此书中把“下半部”叫做“延迟过程调用(DPC)”。
问:说一下Linux环境编程中进程间通信都有哪几种。
答:管道、Unix Socket、共享内存……云云
问:这些通信方式的作用/或者是区别
答:不知道(这个确实忘了,没办法)
Linux下进程间通信的几种主要手段简介:
问:说一下快速排序
答:(这个太简单了)找一个key作为基准,然后划分左右子序列,左边的比key小,右边的比key大,然后继续之,形成了一个递归的关系……云云
问:说一下指针的指针的作用
答:举个例子吧,我要操作一个链表,该链表只有一个头指针,但是我想在表头插入节点,那么就需要修改头指针,如果我是写一个函数来实现的话,那么我需要把 头指针的地址传过去……云云
问:你对线程了解么?
答:不了解,因为Linux下好像用的不多。
1.管道(Pipe)及有名管道 (named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通 信;
2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了 支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了 实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
报文 (Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息, 被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以 及缓冲区大小受限等缺点。
共享内存:使得多个进程可以访问同一 块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同 步及互斥。
信号量(semaphore):主要 作为进程间以及同一进程不同线程之间的同步手段。
套接口(Socket):更为一般的进程间通信机 制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和 System V的变种都支持套接字。
下面将对上述通信机制做具体阐述。
附1:参考文献[2]中对Linux环境下的进程进行了概括说明:
一般来说,Linux下的进程包含以下几个关键要素:
1.有一段可执行程序;
2.有专用的系统堆栈空间;
3.内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,进程 才能接受内核的调度;
4.具有独立的存储空间
5.进程和线程有时候并不完全区分,而往往根据上下文理解其含 义。
快速排序法是分治法的经典应 用实例之一。快速排序法是对冒泡排序法的一种改进,也是基于交换排序的一种算法。因此,被称为"分 区交换排序"。
在待排序序列中按某种方法选取一个元素K,以它为分界点,用交换的方法将序列分为两个部分:比该值小的放在左边,否则在右边。形成"{左子序列}K{右子 序列}"。再分别对左、右两部分实施上述分解过程,直到各子序列长度为1,即有序为止。
分界点元素值K的选取方法不同,将构成不同的排序法,也将影响排序的效率:例如,可取左边第1个元素为分界点、取中点A[(left+right)/2] 为分界点、或选取最大和最小值的平均值为分界点等。