푸텍스
Futex컴퓨팅에서 futex(fast userspace mutex의 줄임말)는 프로그래머가 기본 잠금을 구현하거나 세마포어나 POSIX 뮤텍스 또는 조건 변수와 같은 상위 수준의 잠금 추상화를 위한 구성 블록으로 사용할 수 있는 커널 시스템 호출입니다.
futex는 사용자 공간의 원자 정수에 연결된 커널 공간 대기 큐로 구성됩니다.여러 프로세스 또는 스레드는 사용자 공간 내에서 완전히 정수 상에서 동작합니다(서로 간섭하지 않기 위해 원자적인 조작을 사용).또한 비교적[citation needed] 비용이 많이 드는 시스템콜에만 의존하여 대기 큐에서의 조작을 요구합니다(예를 들어 대기 프로세스를 웨이크업하거나 현재 프로세스를 대기 큐에 넣습니다).적절하게 프로그램된 futex 기반 잠금에서는 잠금이 경합되어 있는 경우를 제외하고 시스템콜이 사용되지 않습니다.대부분의 조작에서는 프로세스간의 조정이 필요 없기 때문에, 대부분의 경우, 이러한 조작은 행해지지 않습니다.
이력
이 섹션에서는 주로 와인/프로톤 "fsync"에서 WaitForMultipleObjects를 모방하기 위한 밸브별 FUTEX2에 대한 정보가 누락되어 있습니다.(2021년 11월) |
Linux에서는 Hubertus Franke(IBM Thomas J. Watson Research Center), Matthew Kirkwood, Ingo Molnar(Red Hat) 및 Rusty Russell(IBM Linux Technology Center)이 futex 메커니즘을 개발했습니다.Futexes는 Linux 커널 개발 시리즈의 버전 2.5.7에서 처음 등장했습니다.버전 2.5.40에서 안정화된 시멘틱스는 2003년 12월 2.6.x 안정 커널 시리즈 출시 이후 Linux 커널 메인라인의 일부가 되었습니다.
2002년에, 파일 시스템을 통해 futex에 접근할 수 있도록 하기 위한 제안에 대한 논의가 이루어졌습니다./dev
또는/proc
그러나 Linus Torvalds는 이 생각에 강력히 반대하여 관련 [1]패치를 거부했습니다.
Futex는 WaitOnAddress라는 [2]이름으로 Windows 8 또는 Windows Server 2012 이후 Microsoft Windows에 구현되어 있습니다.
2013년 마이크로소프트는 futex를 특허로,[3] 2014년에 특허가 부여되었다.
2014년 5월 CVE 시스템은 Linux 커널의 futex 하위 시스템에서 발견된 취약성을 발표하여 서비스 거부 공격 또는 로컬 권한 상승이 [4][5]허용되었습니다.
2015년 5월 Linux 커널은 Commit b0c29f79ecea를 통해 사용자 애플리케이션의 행업을 야기하는 교착 버그를 도입했습니다.이 버그는 3.x 및 4.x 커널, Red Hat Enterprise Linux 버전 5, 6, 7, SUSE Linux 12 및 Amazon Linux [6]등 많은 엔터프라이즈 Linux 배포에 영향을 미쳤습니다.
Futex는 OpenB에 구현되어 있습니다.2016년부터 [7]SD.
futex 메커니즘은 적어도 2018년 [9]4월부터 구글의 Fuchsia 운영체제에서 지르콘[8] 커널의 핵심 개념 중 하나입니다.
운용
Futex에는 두 가지 기본 조작이 있습니다.WAIT
그리고.WAKE
.
WAIT(addr, val)
- 값이 주소에 저장되어 있는 경우
addr
이val
는 현재의 스레드를 sleep 상태로 합니다.
WAKE(addr, num)
- 깨어난다
num
주소에 대기 중인 스레드 수addr
.
보다 고도의 용도를 위해서, 그 외의 조작이 다수 있습니다만, 가장 많이 사용되고 있는 조작입니다.REQUEUE
그리고.WAKE_OP
둘 다 보다 범용적인 기능을 합니다.WAKE
운용을 실시합니다.[10]
CMP_REQUEUE(old_addr, new_addr, num_wake, num_move, val)
- 값이 주소에 저장되어 있는 경우
old_addr
이val
, 웨이크업num_wake
주소에 대기하고 있는 스레드old_addr
, 및 큐잉num_move
주소에 대기하고 있는 스레드old_addr
이제 주소를 기다리다new_addr
.[11][12] 이것은 천둥 치는 무리 문제를 방지하기 위해 사용할 수 있습니다.
WAKE_OP(addr1, addr2, num1, num2, op, op_arg, cmp, cmp_arg)
- 읽다
addr2
,수행하다op
와 함께op_arg
그 위에 결과를 저장하다addr2
그럼 깨어날 거야num1
기다리고 있는 실addr1
및 이전에 읽은 값이addr2
일치하다cmp_arg
비교 사용cmp
가 기동합니다.num2
기다리고 있는 실addr2
이 매우 유연하고 일반적인 웨이크 메커니즘은 많은 동기화 프리미티브를 구현하는 데 유용합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Torvalds, Linus. "Futex Asynchronous Interface".
- ^ "WaitOnAddress function". Retrieved 2019-11-01.
- ^ "US8782674B2 Wait on address synchronization interface". Retrieved 2019-11-01.
- ^ CVE-2014-3153
- ^ "[SECURITY] [DSA 2949-1] linux security update". Lists.debian.org. 2014-06-05. Retrieved 2014-06-08.
- ^ "Linux futex_wait() bug..." 2015-05-13. Retrieved 2018-03-24.
- ^ Mazurek, Michal. "'Futexes for OpenBSD' - MARC". marc.info. Retrieved 30 April 2017.
- ^ "Zircon Kernel Concepts". fuchsia.dev. Retrieved 20 October 2019.
- ^ "zx_futex_wait". fuchsia.dev. Retrieved 20 October 2019.
- ^ Futex는 까다로운 Ulrich Drepper(Red Hat, v1.6, 2011)
- ^ Linux futex (2) man 페이지, FUTEX_CMP_REQUE 섹션
- ^ Zircon zx_futex_requue 매뉴얼
외부 링크
- - futex() 시스템콜
- - futex 의미 및 사용방법
- 휴버터스 프랭크, 러스티 러셀, 매튜 커크우드호들갑, 푸텍스 및 퍼웍스: Linux에서의 고속 사용자 수준 잠금, Ottawa Linux Symposium 2002.
- Drepper, Ulrich (2011). "Futexes are Tricky" (PDF). 1.6. Red Hat.
- 버트 휴버트(2004년).비공식 Futex 맨 페이지
- 잉고 몰나."Robust Futex", Linux 커널 문서
- "Priority Inheritance Futex", Linux 커널 문서