futex内核同步

futex快速用户空间互斥体,用来给上层应用构建更高级别的同步机制,是实现信号量和锁的基础。

进程间通信,管道、消息队列、信号量、共享内存、套接字、信号。

使用信号量(semget()、semop()、semctl())进程间通信,是通过系统调用在内核中完成的。

进程要陷入内核去看看有没有人和它竞争,退出的时侯还要陷入内核去看看有没有进程等待在同一同步变量上。这些不必要的系统调用造成了大量的性能开销。

所以出现了futex,futex是一种用户态和内核态混合的同步机制。通过在用户态检查,没有竞争就不陷入内核执行系统调用了。访问futex变量通知进程有竞争发生,则执行系统调用去完成相应的操作。

futex系统调用

sys_futex系统调用,对进程竞争情况下的同步处理提供支持。

futex同步

进程、线程可以利用futex来进行同步。

futex同步操作都应该从用户空间开始,创建一个futex整形同步变量。

同步的进程间通过mmap共享一段内存,futex变量就位于这段共享的内存中,执行原子操作。

进程尝试持有锁或者要进入互斥区的时候,futex同步变量减1。如果同步变量变为0,则没有竞争发生, 进程照常执行。如果为负意味有竞争发生,系统调用的futex_wait休眠当前进程。

当进程释放锁或者要离开互斥区的时候,futex同步变量加1。如果同步变量由0变成1,则没有竞争发生,进程照常执行。如果为负意味有竞争发生,系统调用的futex_wake唤醒一或多个等待进程。

futex系统调用案例

一个进程在等待某个信号的时候,最终会通过系统调用进入到futex。

系统调用有6个参数,上层应用在等待一个信号量的时候,给op这个参数传递的FUTEX_WAIT_BITSET,代码流程:

// kernel/futex.c
SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
struct __kernel_timespec __user *, utime, u32 __user *, uaddr2,
u32, val3) {...return do_futex(... op, ...);
}long do_futex(...int op,...) {int cmd = op & FUTEX_CMD_MASK;switch (cmd) {case FUTEX_WAIT_BITSET:return futex_wait(uaddr, flags, val, timeout, val3);...}...
}

进程系统调用futex_wait时,会将自己设置为睡眠状态,进行一次进程调度。

// kernel/futex.c
static int futex_wait(...) {...futex_wait_queue_me(...);...
}// kernel/futex.c
static void futex_wait_queue_me(...) {...
//  调用futex的进程变为睡眠状态set_current_state(TASK_INTERRUPTIBLE);...freezable_schedule();...
}// include/linux/freezer.h
static inline void freezable_schedule(void) {...schedule();...
}

linux内核futex快速用户空间互斥体简介相关推荐

  1. Linux内核中断引入用户空间(异步通知机制)【转】

    转自:http://blog.csdn.net/kingdragonfly120/article/details/10858647 版权声明:本文为博主原创文章,未经博主允许不得转载. 当Linux内 ...

  2. linux内核驱动之 用户空间和内核空间

    A module runs in kernel space, whereas applications run in user space. This concept is at the base o ...

  3. Linux Malloc分析-从用户空间到内核空间

    Linux Malloc分析-从用户空间到内核空间 本文介绍malloc的实现及其malloc在进行堆扩展操作,并分析了虚拟地址到物理地址是如何实现映射关系. ordeder原创,原文链接: http ...

  4. linux内核态和用户态

    参考文章: linux系统内核空间与用户空间通信的实现与分析: http://www.ibm.com/developerworks/cn/linux/l-netlink/ 进程上下文VS中断上下文: ...

  5. Linux内核 | Netlink 快速开始

    文章目录 一.Linux内核 | Netlink 快速开始 1. 背景基础 "内核空间"和"用户空间" Linux中的进程间通信机制 IPC(Inter-Pro ...

  6. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  7. 跟踪 linux 内核调用_Linux用户和内核空间中的动态跟踪

    跟踪 linux 内核调用 您是否曾经遇到过这样的情况,即您意识到没有在代码中的某些点插入调试打印 ,所以现在您将不知道您的CPU是否命中了特定的代码行来执行,直到您重新编译该代码为止.调试语句? 不 ...

  8. linux 各用户内存_Linux用户空间与内核空间(理解高端内存)

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

  9. Linux Malloc分析-从用户空间到内核空间【转】

    转自:http://blog.csdn.net/ordeder/article/details/41654509 版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文 ...

最新文章

  1. Android的数据存储
  2. 032-element模块
  3. @ConfigurationProperties + @EnableConfigurationProperties
  4. dubbo之.xml配置文件报错
  5. 6-4-1:STL之list——list的快速入门、常用接口
  6. Centos6版本ssh连接CentOS7.6及以上版本提示RSA和ecdsa问题
  7. 小米营销教父的滚烫十年
  8. Sobel边缘检测算法及OpenCV函数实现
  9. C++ 顺序容器基础知识总结
  10. Java基础程序设计的报告
  11. pcb排版技巧_借鉴大师的排版技巧
  12. 多重网格法-松弛迭代法-二维泊松方程-python实现
  13. 暴力递归到动态规划 05 (贴纸拼词)
  14. python_matplotlib分别使用plot()和scatter()画散点图,以及如何改变点的大小
  15. 3dmax2014植树插件_【亲测能用】3dsMax种树插件:Forest Pack Pro v6.2.1 For 2015-2020+资源库下载-羽兔网...
  16. 不是那个层次的人,也便没机会领略…
  17. Android开发 BaseExpandableListAdapter的使用
  18. python画图为什么运行不出来_python matplotlib画的图怎么显示不出来
  19. 结构,是指事物自身各种要素之间的相互关联和相互作用的方式
  20. 软件测试入门:阅读《软件测试》(原书第2版,(美)Ron Patton 著,张小松、王钰、曹跃 等译)一书

热门文章

  1. 在PyCharm中集成Vue开发
  2. 银行系统取款的顺序图
  3. 方格纸(square)
  4. 关于MySQL错误 2005 - Unknown MySQL server host ‘localhost‘ (0) 原因及解决方法
  5. React Native Animated 动画详解 - 实例篇 (这篇就够了)
  6. javaEE基于ssm的新生报到系统
  7. google代码风格(C++)
  8. Java平台UC浏览器6.7发布啦
  9. c++编程幸运“52”小游戏
  10. python程序设计教程杨年华课后答案_《PYTHON程序设计》习题与答案.pdf