Futex
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
퓨텍스(Futex)는 2002년 허버투스 프랑케, 매튜 커크우드, 잉고 몰나르, 러스티 러셀에 의해 리눅스 커널에 도입된 사용자 공간에서 빠른 뮤텍스 및 세마포어를 구현하기 위한 메커니즘이다. 퓨텍스는 리눅스 커널 2.6.x 버전부터 메인라인에 포함되었으며, 마이크로소프트, 오픈BSD, 구글 퓨시아, 애플 등 다양한 운영 체제에서 구현되었다. 퓨텍스의 기본 동작은 WAIT와 WAKE 연산에 기반하며, CMP_REQUEUE 및 WAKE_OP와 같은 확장 연산을 통해 더욱 유연한 동기화 기능을 제공한다.
더 읽어볼만한 페이지
Futex | |
---|---|
Futex | |
![]() | |
일반 정보 | |
유형 | 시스템 호출 |
운영체제 | 리눅스 GNU Hurd DragonFly BSD FreeBSD NetBSD OpenBSD Solaris macOS Microsoft Windows |
세부 정보 | |
첫 출시 | 2003년 1월 2일 |
구현 | 커널 |
상태 | 표준 |
추가 정보 | |
관련 표준 | POSIX |
참고 자료 | 뮤텍스 |
2. 역사
밸브 코퍼레이션은 2021년 11월 와인/프로톤 "fsync"에서 WaitForMultipleObjects를 모방하기 위해 FUTEX2를 만들었다.
허버투스 프랑케(IBM 토마스 J. 왓슨 연구소), 매튜 커크우드, 잉고 몰나르(레드햇), 러스티 러셀(IBM 리눅스 기술 센터)은 2002년 리눅스에서 퓨텍스 메커니즘을 개발했다. 퓨텍스는 2003년 12월부터 리눅스 커널 메인라인의 일부가 되었다.
마이크로소프트는 2013년 퓨텍스 관련 기술에 대해 특허를 냈고, 2014년에 승인되었다. 퓨텍스 기능은 Microsoft Windows 8 또는 Windows Server 2012부터 '''WaitOnAddress'''라는 이름으로 구현되었다.
2014년 5월, CVE 시스템은 리눅스 커널의 퓨텍스 서브시스템에서 취약점을 발표했다. 2015년 5월, 리눅스 커널은 데드락 버그를 포함시켰다.
퓨텍스는 2016년부터 오픈BSD에 구현되었다. 구글의 퓨시아 운영 체제에서는 2018년 4월부터, 애플은 2024년부터 퓨텍스를 구현했다.
2. 1. 리눅스
허버투스 프랑케(IBM 토마스 J. 왓슨 연구소), 매튜 커크우드, 잉고 몰나르(레드햇), 러스티 러셀(IBM 리눅스 기술 센터)은 2002년에 리눅스에서 퓨텍스 메커니즘을 개발했다. 같은 해, 퓨텍스를 파일 시스템을 통해 접근하도록 하는 제안이 있었으나 리누스 토르발스가 반대했다.퓨텍스는 리눅스 커널 개발 시리즈 버전 2.5.7에서 처음 등장했고, 2.5.40에서 안정화되었으며, 2003년 12월 2.6.x 안정 커널 시리즈 출시 이후부터 리눅스 커널 메인라인의 일부가 되었다.
2014년 5월, CVE 시스템은 리눅스 커널의 퓨텍스 서브시스템에서 서비스 거부 공격 또는 로컬 권한 상승을 허용하는 취약점을 발표했다.[1]
2015년 5월, 리눅스 커널은 [https://github.com/torvalds/linux/commit/b0c29f79ecea Commit b0c29f79ecea]를 통해 사용자 애플리케이션에서 중단을 일으키는 데드락 버그를 도입했다.[2]
2. 2. 기타 운영체제
마이크로소프트는 2013년에 퓨텍스 관련 기술에 대해 특허를 냈고, 해당 특허는 2014년에 승인되었다.[1] Windows 8 또는 Windows Server 2012부터 '''WaitOnAddress'''라는 이름으로 퓨텍스 기능이 구현되었다.[2]2016년부터 오픈BSD에 퓨텍스가 구현되었다.[3]
구글의 퓨시아 운영 체제에서는 2018년 4월부터 Zircon 커널의 핵심 개념 중 하나로 퓨텍스 메커니즘을 사용하고 있다.[4]
애플은 iOS/iPadOS/tvOS 17.4, macOS 14.4, watchOS 10.4 및 visionOS 1.1에서 퓨텍스를 구현했다.[5]
2. 3. FUTEX2
밸브 코퍼레이션(Valve Corporation)은 2021년 11월에 주로 와인/프로톤 "fsync"에서 WaitForMultipleObjects를 모방하기 위한 목적으로 FUTEX2를 제안했다.3. 동작
퓨텍스는 `WAIT`와 `WAKE`라는 두 가지 기본 동작을 기반으로 한다. `WAIT`는 특정 주소의 값을 확인하여 조건이 맞으면 스레드를 대기 상태로 만들고, `WAKE`는 해당 주소에서 대기 중인 스레드를 깨운다. 일부 리눅스 커널 futex 구현은 특정 목적을 위해 확장된 동작들을 제공한다. 가장 많이 사용되는 확장 동작은 `CMP_REQUEUE`와 `WAKE_OP`이며, 이들은 더 일반적인 `WAKE` 연산으로 기능한다.[13]
3. 1. 기본 동작
futex의 기본 동작은 WAIT영어와 WAKE영어 두 가지 특정 동작에 기반한다. 특정 버전의 리눅스 커널에만 의존하는 일부 futex 구현체는 특정 목적을 위해 몇 가지 동작이 더 있을 수 있다.[16]- WAIT (addr, val)영어: addr영어 주소에 저장된 값이 val영어인지 확인하고, 맞으면 현재 스레드를 sleep 상태로 둔다.
- WAKE (addr, val)영어: addr영어 주소에서 대기 중인 스레드 수만큼 val영어을 깨운다.
더욱 진보된 사용을 위해, CMP_REQUEUE영어와 WAKE_OP영어가 가장 많이 사용되는 여러 다른 연산이며, 둘 다 더욱 일반적인 WAKE영어 연산으로 기능한다.[13]
- CMP_REQUEUE(old_addr, new_addr, num_wake, num_move, val)영어: old_addr영어 주소에 저장된 값이 val영어이면, old_addr영어 주소에서 대기 중인 num_wake영어개 스레드를 깨우고, old_addr영어 주소에서 대기 중인 num_move영어개 스레드를 new_addr영어 주소에서 대기하도록 재정렬한다. 이는 깨울 때 스레딩 허드 문제를 피하는 데 사용될 수 있다.[14][15]
- WAKE_OP(addr1, addr2, num1, num2, op, op_arg, cmp, cmp_arg)영어: addr2영어를 읽고, op_arg영어를 사용하여 op영어를 수행한 후 결과를 다시 addr2영어에 저장한다. 그런 다음 addr1영어에서 대기 중인 num1영어개 스레드를 깨우고, 이전에 addr2영어에서 읽은 값이 비교 cmp영어를 사용하여 cmp_arg영어와 일치하면 addr2영어에서 대기 중인 num2영어개 스레드를 깨운다. 이 매우 유연하고 일반적인 깨우기 메커니즘은 많은 동기화 기본 요소를 구현하는 데 유용하다.
3. 2. 확장 동작
Futex는 두 가지 기본 연산, WAIT영어와 WAKE영어를 갖는다.- WAIT(addr, val)영어: 주소 addr영어에 저장된 값이 val영어이면 현재 스레드를 대기 상태로 만든다.
- WAKE(addr, num)영어: 주소 addr영어에서 대기 중인 num영어개의 스레드를 깨운다.
더욱 진보된 사용을 위해, CMP_REQUEUE영어와 WAKE_OP영어가 가장 많이 사용되는 여러 다른 연산이 있으며, 둘 다 더욱 일반적인 WAKE영어 연산으로 기능한다.[13]
- CMP_REQUEUE(old_addr, new_addr, num_wake, num_move, val)영어: 주소 old_addr영어에 저장된 값이 val영어이면, 주소 old_addr영어에서 대기 중인 num_wake영어개의 스레드를 깨우고, 주소 old_addr영어에서 대기 중인 num_move영어개의 스레드를 주소 new_addr영어에서 대기하도록 재정렬한다. 이는 깨울 때 스레딩 허드 문제를 피하는 데 사용될 수 있다.[14][15]
- WAKE_OP(addr1, addr2, num1, num2, op, op_arg, cmp, cmp_arg)영어: addr2영어를 읽고, op_arg영어를 사용하여 op영어를 수행한 후 결과를 다시 addr2영어에 저장한다. 그런 다음 addr1영어에서 대기 중인 num1영어개의 스레드를 깨우고, 이전에 addr2영어에서 읽은 값이 비교 cmp영어를 사용하여 cmp_arg영어와 일치하면 addr2영어에서 대기 중인 num2영어개의 스레드를 깨운다. 이 매우 유연하고 일반적인 깨우기 메커니즘은 많은 동기화 기본 요소를 구현하는 데 유용하다.
참조
[1]
논문
Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux
Ottawa Linux Symposium
2002
[2]
웹사이트
Futex Asynchronous Interface
http://yarchive.net/[...]
[3]
웹사이트
WaitOnAddress function
https://docs.microso[...]
2019-11-01
[4]
웹사이트
Comparing WaitOnAddress with futexes
https://devblogs.mic[...]
2024-05-09
[5]
웹사이트
US8782674B2 Wait on address synchronization interface
https://patents.goog[...]
2019-11-01
[6]
문서
CVE-2014-3153
http://cve.mitre.org[...]
[7]
웹사이트
"[SECURITY] [DSA 2949-1] linux security update"
https://lists.debian[...]
Lists.debian.org
2014-06-08
[8]
웹사이트
Linux futex_wait() bug...
https://groups.googl[...]
2018-03-24
[9]
웹사이트
'Futexes for OpenBSD' - MARC
https://marc.info/?l[...]
2017-04-30
[10]
웹사이트
Zircon Kernel Concepts
https://fuchsia.dev/[...]
2019-10-20
[11]
웹사이트
zx_futex_wait
https://fuchsia.dev/[...]
2019-10-20
[12]
웹사이트
os_sync_wait_on_address
https://docs.develop[...]
2024-03-14
[13]
문서
Futexes Are Tricky
https://www.akkadia.[...]
Red Hat
2011
[14]
문서
Linux futex(2) man page, FUTEX_CMP_REQUEUE section
http://man7.org/linu[...]
[15]
문서
Zircon zx_futex_requeue documentation
https://fuchsia.dev/[...]
[16]
문서
Futexes Are Tricky
http://dept-info.lab[...]
Red Hat
2011
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com