参考: https://blog.csdn.net/Javadino/article/details/2891385
要解决的问题:
Futex按英文翻译过来就是快速用户空间互斥体。其设计思想其实不难理解,在传统的Unix系统中,System V IPC(inter process communication),如 semaphores, msgqueues, sockets还有文件锁机制(flock())等进程间同步机制都是对一个内核对象操作来完成的,这个内核对象对要同步的进程都是可见的,其提供了共享的状态信息和原子操作。当进程间要同步的时候必须要通过系统调用(如semop())在内核中完成。
可是经研究发现,很多同步是无竞争的,[popexizhi:这种研究如何做呢?比较感兴趣,这个是推动改进的真正动力,也是看设计的效果真正有效反馈] 即某个进程进入互斥区,到再从某个互斥区出来这段时间,常常是没有进程也要进这个互斥区或者请求同一同步变量的。但是在这种情况下,这个进程也要陷入内核去看看有没有人和它竞争,退出的时侯还要陷入内核去看看有没有进程等待在同一同步变量上。
这些不必要的系统调用(或者说内核陷入)造成了大量的性能开销。
为了解决这个问题,Futex就应运而生,Futex是一种用户态和内核态混合的同步机制。
首先,同步的进程间通过mmap共享一段内存,futex变量就位于这段共享的内存中且操作是原子的,当进程尝试进入互斥区或者退出互斥区的时候,先去查看共享内存中的futex变量,如果没有竞争发生,则只修改futex,而不用再执行系统调用了。当通过访问futex变量告诉进程有竞争发生,则还是得执行系统调用去完成相应的处理(wait 或者 wake up)。
简单的说,futex就是通过在用户态的检查,如果了解到没有竞争就不用陷入内核了,大大提高了low-contention时候的效率。Linux从2.5.7开始支持Futex。[popexizhi: 自己想的类别,把查询是否有同步竞争的查询,从内核态拿到了用户态,可以直接查看了,这样就把”多数无同步竞争“的实验事实使用上了。]
2. Futex系统调用
Futex是一种用户态和内核态混合机制,所以需要两个部分合作完成,linux上提供了sys_futex系统调用,对进程竞争情况下的同步处理提供支持。
---------------------------------------------------------------------------------
参考:https://blog.csdn.net/fpcc/article/details/84483954
没有评论:
发表评论