Apakah test-and-set (atau operasi RMW atom lainnya) merupakan instruksi istimewa pada arsitektur apa pun?

Perangkat keras menyediakan instruksi atom seperti test-and-set, bandingkan-dan-swap, load-linked-store-conditional. Apakah ini instruksi istimewa? Artinya, hanya OS yang dapat menjalankannya (dan karenanya memerlukan panggilan sistem)?

Saya pikir mereka tidak memiliki hak istimewa dan dapat dipanggil di ruang pengguna. Tapi http://faculty.salina.k-state.edu/tim/ossg/IPC_sync/ts.html sepertinya menyarankan sebaliknya. Namun kemudian, futex(7), dalam kondisi tertentu, dapat mencapai penguncian tanpa sistem panggilan, yang berarti harus menjalankan instruksi (seperti test-and-set) tanpa hak istimewa.

Kontradiksi? Jika ya, mana yang benar?


person flow2k    schedule 02.09.2018    source sumber
comment
Saya pikir Anda perlu menyatakan arsitektur CPU. Sejauh yang saya tahu Intel tidak memiliki instruksi Test_and_Set (TS). CPU Intel memiliki atom, mereka hanya kekurangan instruksi khusus itu. Mungkin itu adalah bidang dalam register/register kontrol khusus mesin dan membaca/menulisnya dilindungi? Ping @PeterCordes.   -  person jww    schedule 02.09.2018
comment
Benar, saya yakin x86 memiliki instruksi bandingkan-swap cmpxchg. Bagaimana saya bisa mem-pingnya?   -  person flow2k    schedule 02.09.2018
comment
Anda bisa menarik perhatian saya dengan memposting pertanyaan di tag [assembly] :P   -  person Peter Cordes    schedule 02.09.2018
comment
@jww: x86 telah memiliki lock bts sejak 386. bts = Uji dan setel bit.   -  person Peter Cordes    schedule 02.09.2018
comment
Terima kasih @Peter. Penulis secara khusus menyatakan instruksinya adalah ts. Tahukah Anda dari mana lengkungan itu berasal? Atau apakah mereka menggunakan set instruksi hipotetis?   -  person jww    schedule 02.09.2018
comment
@jww: Saya rasa mereka tidak membicarakan arsitektur tertentu; mereka berbicara tentang operasi primitif (en.wikipedia.org/wiki/Test-and -set), terlepas dari bagaimana penerapannya di asm. Di C++11, hanya ini satu-satunya yang harus bebas kunci: C++: Bagaimana struktur data bebas kunci dapat diimplementasikan di C++ jika std::atomic_flag adalah satu-satunya tipe atom bebas kunci?. (Saya tidak mengetahui instruksi ts pada ISA mana pun. Sebagian besar adalah LL/SC, dan tidak memiliki RMW atom instruksi tunggal.) Ini sering disebut TAS, sama seperti cmpxchg biasanya CAS.   -  person Peter Cordes    schedule 02.09.2018
comment
Saya bertanya-tanya apakah mereka berbicara tentang ISA hipotetis, tetapi beberapa halaman di atas/sebelumnya tidak memberikan tanda-tanda akan hal itu. Ini murni C. Tapi tentu saja, Anda bisa memiliki ISA jelek hipotetis dengan instruksi TS yang diistimewakan (dan tidak ada atom primitif lainnya) yang membuatnya tidak mungkin untuk menulis kode ruang pengguna multi-utas tanpa kunci yang baik, dan sulit untuk melakukan multi-utas secara efisien.   -  person Peter Cordes    schedule 02.09.2018


Jawaban (1)


Halaman itu salah. Tampaknya ada klaim bahwa operasi atom bebas kunci merupakan hak istimewa pada ISA secara umum, tetapi bukan itu masalahnya. Saya belum pernah mendengar ada tes-dan-set atom atau operasi bebas kunci lainnya yang memerlukan mode kernel.

Jika demikian, maka diperlukan C++11 pembacaan atom bebas kunci-modifikasi- menulis operasi untuk dikompilasi ke panggilan sistem, tetapi tidak dilakukan pada x86, ARM, AArch64, MIPS, PowerPC, atau CPU normal lainnya. (cobalah di https://godbolt.org/).

Ini juga akan membuat penguncian "ringan" (yang mencoba mengambil kunci tanpa panggilan sistem) menjadi tidak mungkin. (http://preshing.com/20111124/always-use-a-lightweight-mutex/)

ISA normal memungkinkan ruang pengguna untuk melakukan operasi RMW atom, pada memori yang dibagi antar thread atau bahkan antar proses terpisah. Saya tidak mengetahui mekanisme untuk menonaktifkan RMW atom untuk ruang pengguna di x86. Sekalipun ada hal seperti itu di ISA mana pun, itu bukan mode operasi normal.

Akses baca-saja atau tulis-saja biasanya bersifat atomik pada lokasi yang selaras di semua ISA, hingga lebar tertentu (Mengapa penetapan bilangan bulat pada variabel yang disejajarkan secara alami bersifat atomik di x86?), tetapi RMW atom memerlukan dukungan perangkat keras.


Pada x86, TAS adalah lock bts, yang tidak memiliki hak istimewa. (Dokumentasi untuk awalan lock). x86 memiliki luas pilihan operasi atom lainnya, seperti lock add [mem], reg/immediate, lock cmpxchg [mem], reg, dan bahkan lock xadd [mem], reg yang mengimplementasikan fetch_add ketika nilai kembalian diperlukan. (Bisakah num++ menjadi atomik untuk 'int num'?)

Kebanyakan RISC memiliki LL/SC, termasuk ARM, MIPS, dan PowerPC, serta semua ISA RISC lama yang sudah tidak umum lagi.


futex(2) adalah panggilan sistem. Jika Anda memanggilnya, semua yang dilakukannya adalah dalam mode kernel.

Ini adalah mekanisme fallback yang digunakan dengan penguncian ringan jika ada perselisihan, yang menyediakan mode tidur/bangun dengan bantuan OS. Jadi bukan futex sendiri yang melakukan apa pun di ruang pengguna, melainkan implementasi kunci yang dibangun di sekitar futex dapat menghindari pembuatan panggilan sistem dalam kasus yang tidak diperdebatkan atau tidak diperdebatkan.

(misal, putar di ruang pengguna beberapa kali jika kunci tersedia.)

Inilah yang dijelaskan oleh halaman manual futex(7). Tapi menurut saya agak aneh menyebutnya "operasi futex" jika Anda tidak benar-benar melakukan panggilan sistem. Saya kira ini beroperasi pada memori yang mungkin dilihat oleh kode kernel atas nama thread lain yang menunggu, jadi semantik yang diperlukan untuk mengubah lokasi memori dalam kode ruang pengguna bergantung pada futex.

person Peter Cordes    schedule 02.09.2018
comment
Terima kasih @Peter atas jawaban mendetail ini! Jika futex(7) tidak memanggil futex(2) (yaitu tidak ada perselisihan), ia harus menggunakan TAS atau instruksi atom lainnya untuk menerapkan kunci, bukan? Saya belum memeriksa kode untuk futex(7)... Saya menyebutkannya dalam pertanyaan karena futex(7) adalah fungsi perpustakaan, ini berjalan di ruang pengguna, sehingga setiap TAS yang dijalankan harus berada di ruang pengguna. - person flow2k; 02.09.2018
comment
@ flow2k: Ya, RMW atom di ruang pengguna. Namun futex(7) mendokumentasikan konsep umum tentang cara membuat kunci atau operasi lain di sekitar futex(2). Tidak ada fungsi perpustakaan yang disebut futex() selain pembungkus panggilan sistem; jika ada maka akan disebut futex(3). Pokoknya ya, inti dari jawaban ini adalah futex(2) adalah cara Anda tidur jika Anda menemukan kunci sudah diambil dalam implementasi seperti spinlock asm x86 ini (yang berfungsi di ruang pengguna): Mengunci manipulasi memori melalui perakitan inline - person Peter Cordes; 02.09.2018
comment
Saya belum pernah melihat prosesor di mana pengujian bit dan operasi set merupakan instruksi istimewa. Pantas saja siswa CS begitu bingung. - person user3344003; 02.09.2018