futex简介_fut是什么牌子

futex简介_fut是什么牌子找到一篇很好的文章,讲得深入浅出;貌似原网站也很不错。转载自http://linuxperf.com/?p=23futex(fastuserspacemutex)是Linux的一个基础构件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的。大多数时候编写应用程序并不需要直接使用futex,一般用基于它所实现的系统库就够了。futex的性能非常优异,它是怎样做到的呢?这要从它的设计思想谈起。传统的SystemVIPC(interproces

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

找到一篇很好的文章,讲得深入浅出;貌似原网站也很不错。
转载自 http://linuxperf.com/?p=23

futex (fast userspace mutex) 是Linux的一个基础构件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的。大多数时候编写应用程序并不需要直接使用futex,一般用基于它所实现的系统库就够了。

futex的性能非常优异,它是怎样做到的呢?这要从它的设计思想谈起。传统的SystemV IPC(inter process communication)进程间同步机制都是通过内核对象来实现的,以 semaphore 为例,当进程间要同步的时候,必须通过系统调用semop(2)进入内核进行PV操作。系统调用的缺点是开销很大,需要从user mode切换到kernel mode、保存寄存器状态、从user stack切换到kernel stack、等等,通常要消耗上百条指令。

事实上,有一部分系统调用是可以避免的,因为现实中很多同步操作进行的时候根本不存在竞争,即某个进程从持有semaphore直至释放semaphore的这段时间内,常常没有其它进程对同一semaphore有需求,在这种情况下,内核的参与本来是不必要的,可是在传统机制下,持有semaphore必须先调用semop(2)进入内核去看看有没有人和它竞争,释放semaphore也必须调用semop(2)进入内核去看看有没有人在等待同一semaphore,这些不必要的系统调用造成了大量的性能损耗。

futex就为了解决这个问题而生的,它的办法是:

  • 在无竞争的情况下,futex的操作完全在user space进行,不需要系统调用;
  • 仅在发生竞争的时候进入内核去完成相应的处理(wait 或者 wake up)。

所以说,futex是一种user mode和kernel mode混合的同步机制,需要两种模式合作才能完成,futex变量必须位于user space,而不是内核对象,futex的代码也分为user mode和kernel mode两部分,无竞争的情况下在user mode,发生竞争时则通过sys_futex系统调用进入kernel mode进行处理,
具体来说:

  • futex变量是位于user space的一个整数,支持原子操作。futex同步操作都是从user space开始的。

  • 当要求持有futex的时候,对futex变量执行”down”操作,即原子递减,
    如果变量变为0,则意味着没有竞争发生,进程成功持有futex并继续在user mode运行;
    如果变量变为负数,则意味着有竞争发生,需要通过sys_futex系统调用进入内核执行futex_wait操作,让进程进入休眠等待。

  • 当释放futex的时候,对futex变量进行”up”操作,即原子递增,如果变量变成1,则意味着没有竞争发生,进程成功释放futex并继续在user mode执行;
    否则意味着有竞争,需要通过sys_futex系统调用进入内核执行futex_wake操作,唤醒正在等待的进程。
    笔者注:原作这里的意思是,“up”操作之后,变量可能是0或负数,这就说明有人在等待semaphore(即存在竞争),此时在user space搞不定了,所以进入内核来释放。这相当于是一种lazy得策略。

  • 如果需要在多个进程之间共享futex,那就必须把futex变量放在共享内存中,并确保这些进程都有访问共享内存的权限;

  • 如果仅需在线程之间使用futex的话,那么futex变量可以位于进程的私有内存中,比如普通的全局变量即可。

更详细的信息请参阅futex作者的论文:
Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux

(完)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190971.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java helloworld源代码_Java Hello World源代码notepad++版

    java helloworld源代码_Java Hello World源代码notepad++版Notepad++中写JavaHelloWorld代码并运行,步骤如下:1、在E:\CodeDemo\Java文件夹下(你也可以选择自己的文件夹)新建一个txt文本文件。如果没有NotePad++,请去官网下载安装。2、重命名为Hello.java,在弹出对话框单击是。3、右单击新建的Hello.java文件弹出快捷菜单,使用editwithnotepad++编辑Hello.java文件…

    2022年5月28日
    42
  • linux node 安装_linux查看gcc是否安装

    linux node 安装_linux查看gcc是否安装官方下载:最新版下载地址:http://nodejs.cn/download/v14.3下载地址:https://nodejs.org/download/release/v14.3.0/安装

    2022年10月15日
    3
  • 关于勒索病毒“永恒之蓝”的解决方案

    关于勒索病毒“永恒之蓝”的解决方案关于勒索病毒“永恒之蓝”的解决方案(没什么新鲜的,就是通过注册表关闭445端口)(首先,最近发现我的文章会被其他网站盗版,所以特此声明,本文原作来自http://www.cnblogs.com/an

    2022年7月2日
    68
  • 获取计算机用户名,java获取计算机用户名

    获取计算机用户名,java获取计算机用户名NetworkInfo()Dimwshnetwork,infoAsStringSetwshnetwork=CreateObject(“WScript.Network”)’获取当前电脑用户信息一、用户名命名规范:总纲:用户名规范包括通用规范和特殊原则。A.通用规范:a.用户名只能由字母、数字和下划线组成,且必须以字母开头。不得出…1、“姓”的全拼+“ZhongS”…

    2022年10月15日
    5
  • RSA加密算法的基本流程

    RSA加密算法的基本流程本文只是说一下RSA加密的流程,对于其他的不做过多的介绍!首先找到两个大素数p,q计算n=p*q,=φ(n)(p-1)*(q-1),其中φ(n)表示的是n的欧拉函数值任意选择一个满足要求的证书e,满足1

    2022年5月24日
    43
  • montavuego_Vue.js+Flask+MongoDB

    montavuego_Vue.js+Flask+MongoDBMongoVUE是一个可以操作mongodb的图形化客户端,方面查看等使用; 一、下载MongoVUE(绿色激活成功教程版):http://download.csdn.net/detail/u011694549/5945519二、解压,打开文件夹:           三、启动MongoVUE.exe         四、建立连接,即可访问数据库了

    2022年8月21日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号