หน้านั้นผิด ดูเหมือนว่าจะอ้างว่าการดำเนินการของอะตอมมิกที่ไม่มีการล็อคนั้นได้รับสิทธิพิเศษใน ISA โดยทั่วไป แต่นั่นไม่ใช่กรณีดังกล่าว ฉันไม่เคยได้ยินมาก่อนว่าการทดสอบและตั้งค่าอะตอมมิกหรือการดำเนินการที่ไม่มีการล็อคอื่น ๆ ต้องใช้โหมดเคอร์เนล
หากเป็นเช่นนั้น จะต้องมี C++11 lock-free atomic read-modify- การดำเนินการเขียนเพื่อคอมไพล์กับการเรียกของระบบ แต่ไม่ได้ใช้บน x86, ARM, AArch64, MIPS, PowerPC หรือ CPU ปกติอื่น ๆ (ลองใช้ที่ https://godbolt.org/)
นอกจากนี้ยังจะทำให้การล็อก "น้ำหนักเบา" (ซึ่งพยายามจะล็อกโดยไม่ต้องมีการเรียกระบบ) เป็นไปไม่ได้ (http://preshing.com/20111124/always-use-a-lightweight-mutex/)
ISA ปกติอนุญาตให้พื้นที่ผู้ใช้ดำเนินการ atomic RMW บนหน่วยความจำที่ใช้ร่วมกันระหว่างเธรด หรือแม้แต่ระหว่างกระบวนการที่แยกจากกัน ฉันไม่ทราบถึงกลไกในการปิดใช้งาน atomic RMW สำหรับพื้นที่ผู้ใช้บน x86 แม้ว่าจะมีสิ่งดังกล่าวใน ISA ใดๆ แต่ก็ไม่ใช่โหมดการทำงานปกติ
การเข้าถึงแบบอ่านอย่างเดียวหรือเขียนอย่างเดียวมักจะเป็นแบบอะตอมมิกตามธรรมชาติในตำแหน่งที่จัดเรียงบน ISA ทั้งหมด จนถึงความกว้างที่กำหนด (เหตุใดจึงมีการกำหนดจำนวนเต็มบนตัวแปร atomic ที่จัดเรียงตามธรรมชาติบน x86) แต่ atomic RMW จำเป็นต้องมีการสนับสนุนด้านฮาร์ดแวร์
บน x86 TAS คือ lock bts
ซึ่งไม่มีสิทธิพิเศษ (เอกสารประกอบสำหรับคำนำหน้า lock
) x86 มีการดำเนินการอะตอมมิกอื่นๆ ให้เลือก กว้าง เช่น lock add [mem], reg/immediate
, lock cmpxchg [mem], reg
และแม้กระทั่ง lock xadd [mem], reg
ซึ่งจะใช้ fetch_add
เมื่อจำเป็นต้องใช้ค่าที่ส่งคืน (num++ สามารถเป็นอะตอมมิกสำหรับ 'int num' ได้หรือไม่)
RISC ส่วนใหญ่มี LL/SC รวมถึง ARM, MIPS และ PowerPC รวมถึง RISC ISA รุ่นเก่าที่ไม่ธรรมดาอีกต่อไป
futex(2)
เป็นการเรียกของระบบ หากคุณเรียกมัน ทุกอย่างที่ทำจะอยู่ในโหมดเคอร์เนล
เป็นกลไกทางเลือกที่ใช้โดยการล็อกแบบน้ำหนักเบาในกรณีที่มีความขัดแย้ง เป็น ซึ่งให้ OS ช่วยในการนอนหลับ/ปลุก ดังนั้นจึงไม่ใช่ futex
เองที่ทำอะไรในพื้นที่ผู้ใช้ แต่การใช้งานการล็อคที่สร้างขึ้นรอบ ๆ futex
สามารถหลีกเลี่ยงการเรียกระบบในกรณีที่ไม่มีการโต้แย้งหรือมีความขัดแย้งต่ำ
(เช่น หมุนในพื้นที่ผู้ใช้สองสามครั้งในกรณีที่การล็อคพร้อมใช้งาน)
นี่คือสิ่งที่ futex(7)
man page กำลังอธิบาย แต่ฉันพบว่ามันแปลกนิดหน่อยที่จะเรียกมันว่า "การดำเนินการ futex" หากคุณไม่ได้ทำการเรียกระบบจริงๆ ฉันเดาว่ามันทำงานบนหน่วยความจำที่โค้ดเคอร์เนลอาจดูในนามของเธรดอื่นที่กำลังรออยู่ ดังนั้นความหมายที่จำเป็นสำหรับการแก้ไขตำแหน่งหน่วยความจำในโค้ดพื้นที่ผู้ใช้จึงขึ้นอยู่กับ futex
person
Peter Cordes
schedule
02.09.2018
Test_and_Set (TS)
Intel CPU มีอะตอมมิก แต่ขาดคำสั่งเฉพาะนั้น อาจเป็นฟิลด์ในรีจิสเตอร์/รีจิสเตอร์ควบคุมเฉพาะเครื่องและการอ่าน/การเขียนได้รับการป้องกันหรือไม่ ปิง @PeterCordes. - person jww   schedule 02.09.2018cmpxchg
ฉันจะส่ง Ping เขาได้อย่างไร? - person flow2k   schedule 02.09.2018[assembly]
:P - person Peter Cordes   schedule 02.09.2018lock bts
ตั้งแต่ 386bts
= ทดสอบบิตและตั้งค่า - person Peter Cordes   schedule 02.09.2018ts
คุณรู้จักส่วนโค้งที่มาจากหรือไม่? หรือพวกเขากำลังใช้ชุดคำสั่งสมมุติ? - person jww   schedule 02.09.2018ts
ใน ISA ใด ๆ ส่วนใหญ่เป็น LL/SC และไม่มี RMW อะตอมมิกคำสั่งเดียว) มักเรียกว่า TAS เช่นเดียวกับที่ cmpxchg ปกติคือ CAS - person Peter Cordes   schedule 02.09.2018