Man page - futex(7)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr es ja ru roManual
FUTEX
名 前書 式
説 明
セ マ ン テ ィ ク ス
バ ー ジ ョ ン
注 意
関 連 項 目
こ の 文 書 に つ い て
名 前
futex - 高 速 ユ ー ザ ー 空 間 ロ ッ ク 機 構
書 式
#include <linux/futex.h>
説 明
Linux カ ー ネ ル は 、 ユ ー ザ ー 空 間 で 高 速 な ロ ッ ク 機 構 や セ マ フ ォ を 使 用 す る た め の 基 礎 的 要 素 と し て futex ("Fast user-space mutexes"; 高 速 ユ ー ザ ー 空 間 mutex) を 提 供 し て い る 。 futex は 非 常 に 基 本 的 な も の で 、 よ り 高 位 な ロ ッ ク 機 構 の 概 念 (mutex、 状 態 変 数 (condition variables)、 読 み 書 き ロ ッ ク 、 セ マ フ ォ な ど ) を 構 築 す る の に 利 用 さ れ て い る 。
実 際 の と こ ろ 、 多 く の プ ロ グ ラ マ ー は futex を 直 接 使 う こ と は な く 、 Native POSIX ス レ ッ ド ラ イ ブ ラ リ (NPTL; pthreads (7) 参 照 ) な ど の futex を 使 っ て 作 ら れ た シ ス テ ム ラ イ ブ ラ リ を 使 う こ と だ ろ う 。
futex は プ ロ セ ス 間 や ス レ ッ ド 間 で 共 有 す る こ と の で き る メ モ リ ー 片 で 識 別 さ れ る 。 こ れ ら の 異 な る プ ロ セ ス で 、 futext が 同 じ ア ド レ ス で あ る 必 要 は な い 。 裸 の 姿 で は futex の セ マ ン テ ィ ク ス は セ マ フ ォ と 同 じ で あ る 。 futex は 不 可 分 操 作 で (atomically) イ ン ク リ メ ン ト し た り デ ク リ メ ン ト し た り で き る カ ウ ン タ ー で 、 プ ロ セ ス は 値 が 正 に な る の を 待 つ こ と が で き る 。
futex の 操 作 は 、 競 合 が な い 場 合 に は 完 全 に ユ ー ザ ー 空 間 で 行 な わ れ る 。 カ ー ネ ル は 競 合 が 起 こ っ た 場 合 の 仲 裁 に 関 与 す る だ け で あ る 。 良 識 あ る 設 計 で は 競 合 が 起 こ ら な い よ う 努 力 す る が 、 futex も 競 合 状 態 に 関 し て 最 適 化 さ れ て い る 。
裸 の 姿 で は 、 futex は 不 可 分 な ア セ ン ブ リ 命 令 で の み 操 作 さ れ る ア ラ イ ン メ ン ト の 揃 っ た 整 数 で あ る 。 こ の 整 数 の 大 き さ は す べ て の プ ラ ッ ト フ ォ ー ム で 4 バ イ ト で あ る 。 複 数 の プ ロ セ ス は こ の int 型 変 数 を 、 mmap (2) を 用 い る か 、 共 有 メ モ リ ー セ グ メ ン ト を 介 す る か 、 メ モ リ ー 空 間 を 共 有 す る (こ の 場 合 、 ア プ リ ケ ー シ ョ ン は 一 般 的 に マ ル チ ス レ ッ ド で あ る と 呼 ば れ る ) か 方 法 で 共 有 す る 。
セ マ ン テ ィ ク ス
futex の 操 作 は す べ て ユ ー ザ ー 空 間 か ら 始 ま る が 、 必 要 に 応 じ て futex (2) シ ス テ ム コ ー ル を 用 い て カ ー ネ ル と 通 信 す る 。
futex を "up" す る に は 、 ホ ス ト CPU に 対 し int 型 変 数 を 不 可 分 操 作 で イ ン ク リ メ ン ト す る よ う な 、 適 切 な ア セ ン ブ リ 命 令 を 実 行 す る 。 そ の あ と 、 実 際 に 0 か ら 1 に 変 化 し た か ど う か を チ ェ ッ ク し 、 変 化 し て い れ ば 待 ち プ ロ セ ス (waiter) は な い と い う こ と で あ り 、 操 作 は 完 了 す る 。 こ れ は 競 合 の な い 場 合 で あ り 、 高 速 で よ く 起 こ る は ず で あ る 。
競 合 が あ る 場 合 、 不 可 分 操 作 の イ ン ク リ メ ン ト で カ ウ ン タ ー は -1 (ま た は 他 の 負 の 数 ) か ら 変 化 す る 。 こ れ が 検 出 さ れ る と 、 待 ち プ ロ セ ス が あ る と い う こ と で あ る 。 ユ ー ザ ー 空 間 で は カ ウ ン タ ー を 1 に 設 定 し 、 FUTEX_WAKE を 用 い て カ ー ネ ル に 待 ち プ ロ セ ス を wake (起 床 ) さ せ る よ う 指 示 す る 。
futex の 獲 得 を 待 つ 、 す な わ ち futex を "down" す る に は 反 対 の 操 作 を 行 な う 。 不 可 分 操 作 で カ ウ ン タ ー を デ ク リ メ ン ト し 、 カ ウ ン タ ー が 0 に 変 化 し た か ど う か を チ ェ ッ ク す る 。 変 化 し て い れ ば 操 作 は 完 了 し futex は 競 合 し て い な い と い う こ と で あ る 。 0 に な ら な か っ た 場 合 、 プ ロ セ ス は カ ウ ン タ ー を -1 に 設 定 し 、 他 の プ ロ セ ス が そ の futex を up す る の を 待 つ よ う カ ー ネ ル に 要 求 し な け れ ば な ら な い 。 こ れ は FUTEX_WAIT を 行 な う こ と で 実 現 さ れ る 。
futex (2) シ ス テ ム コ ー ル に は 、 省 略 可 能 な 引 数 と し て タ イ ム ア ウ ト を 渡 す こ と が で き 、 カ ー ネ ル は そ の futex が up さ れ る の を ど れ く ら い の 期 間 待 つ べ き か を 指 定 す る こ と が で き る 。 こ の 場 合 、 セ マ ン テ ィ ク ス は も っ と 複 雑 に な る た め 、 よ り 詳 細 な 情 報 を 得 る に は プ ロ グ ラ マ は futex (2) を 参 照 す る こ と 。 同 じ ペ ー ジ に 非 同 期 の futex 待 ち に つ い て も 記 さ れ て い る 。
バ ー ジ ョ ン
最 初 の futex 対 応 は Linux 2.5.7 で 組 み 込 ま れ た が 、 上 記 の セ マ ン テ ィ ク ス と は 異 な る 。 現 在 の セ マ ン テ ィ ク ス は Linux 2.5.40 以 降 で 利 用 可 能 で あ る 。
注 意
再 び 繰 り 返 し て お く が 、 裸 の futex は エ ン ド ユ ー ザ ー が 容 易 に 使 え る 概 念 と し て 意 図 さ れ た も の で は な い 。 実 装 者 は 、 ア セ ン ブ リ 言 語 に 慣 れ て お り 、 以 下 に 挙 げ る futex ユ ー ザ ー 空 間 ラ イ ブ ラ リ の ソ ー ス を 読 み 終 え て い る こ と が 要 求 さ れ る 。
こ の マ ニ ュ ア ル ペ ー ジ に は futex (2) プ リ ミ テ ィ ブ の 最 も 一 般 的 な 使 用 法 が 記 さ れ て い る 。 こ れ は 決 し て 唯 一 の 使 用 法 で は な い 。
関 連 項 目
clone (2), futex (2), get_robust_list (2), set_robust_list (2), set_tid_address (2), pthreads (7)
Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux (proceedings of the Ottawa Linux Symposium 2002), futex の 使 用 例 ラ イ ブ ラ リ , futex-*.tar.bz2 ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/ .
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。