1.有名管道 VS 无名管道
区别:无名管道是一种非永久性的管道通信机制,当访问它的进程全部终止时,它将随之被撤销,它不能用于不同族系的进程间通信,只能用于父子进程间的通信,而有名管道是一种永久性的管道通信机制,可以用于不同族系的进程间的通信。
2.消息队列 VS 管道
区别:管道是以管道文件为中间介质,而消息队列的方式是以消息缓冲区为中间介质,消息队列与管道相比具有更大的灵活性,首先,它提供有格式的字节流,有利于减少开发人员的工作量,其次,消息具有类型,在实际应用中,可作为优先级使用。
3.共享内存和管道
区别:共享内存是一种最快的进程通信机制,但是比起管道来需要处理竞态。
4.自旋锁 VS 信号量
区别:
1.当锁不能获得时,使用信号量的开销是进程上下文切换时间Tsw,使用自旋锁的开销是等待获取自旋锁(由临界区执行时间决定)Tcs,若Tcs比较小,宜使用自旋锁,若Tcs很大,应使用信号量。
2.信号量所保护的临界区可包含引起阻塞的代码,而自旋锁绝对要避免用来保护包含这样代码的临界区,因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一个进程企图获取本自旋锁,死锁就会发生。
3.信号量存在于进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则在信号量和自旋锁之间只能选自旋锁,当然如果一定要选信号量,则只能通过down_trylock()方式进行,不能获取就立即返回避免阻塞。
5.tasklet、软中断 VS 工作队列
区别:软中断和tasklet运行于软中断上下文,仍属于原子上下文的一种,而工作队列则运行于进程上下文,因此,软中断和tasklet处理函数不能睡眠,而工作队列处理函数允许睡眠。
6.kmalloc、kzalloc、__get_free_page VS vmalloc
区别:前面三个函数申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真正的物理地址只有一个固定的偏移,因此存在比较简单的转换关系。kzalloc在kmalloc的基础上将分配到的内存初始化为0。vmalloc在虚拟内存空间给出一块连续的内存区,实际上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc申请的虚拟内存和物理内存之间也没用简单的换算关系。
待续......