Rumah  >  Artikel  >  Java  >  Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java

Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java

WBOY
WBOYke hadapan
2022-03-22 18:00:411583semak imbas

Artikel ini membawa anda pengetahuan tentang java, yang terutamanya memperkenalkan isu yang berkaitan dengan model memori, termasuk sebab terdapat model memori, pengaturcaraan serentak dan hubungan antara kawasan memori dan memori perkakasan Tunggu, Saya harap ia membantu semua orang.

Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java

Kajian yang disyorkan: "tutorial java"

Dalam temu bual, penemuduga selalunya suka bertanya: "Beritahu saya apa itu Java" Model Memori (JMM)? 』

Pewawancara sangat teruja Dia baru sahaja menghafal soalan ini: "Memori Java terutamanya dibahagikan kepada lima bahagian utama: timbunan, kawasan kaedah, timbunan mesin maya, timbunan kaedah tempatan, daftar PC, balabala... "

Pewawancara tersenyum dengan sedar dan menampakkan sinar: "Baiklah, temuduga hari ini datang dahulu, balik dan tunggu pemberitahuan"

Biasanya apabila anda mendengar frasa "tunggu pemberitahuan ", temuduga ini mempunyai kebarangkalian yang tinggi. Ia hanya sejuk. kenapa? Kerana penemuduga salah faham konsep, penemuduga ingin menguji JMM, tetapi sebaik sahaja penemuduga mendengar kata kunci Java内存, dia mula membaca karangan berkaki lapan. Terdapat perbezaan besar antara Model Memori Java (JMM) dan kawasan ingatan masa jalan Java Jangan pergi dan teruskan membaca.

1. Kenapa ada model memori?

Untuk menjawab soalan ini, kita perlu terlebih dahulu memahami seni bina ingatan perkakasan komputer tradisional. Okay, saya akan mula melukis.

1.1. Seni bina memori perkakasan

Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java
(1) CPU

Pelajar yang pernah ke bilik komputer tahu bahawa berbilang pelayan biasanya dikonfigurasikan pada besar pelayan, setiap CPU juga akan mempunyai berbilang , yang bermaksud berbilang CPU atau berbilang teras boleh berfungsi pada masa yang sama (secara serentak). Jika anda menggunakan Java untuk memulakan tugas berbilang benang, kemungkinan besar setiap CPU akan menjalankan utas, dan kemudian tugas anda akan benar-benar dilaksanakan serentak pada masa tertentu.

(2) Daftar CPU

Daftar CPU ialah daftar CPU. Daftar CPU disepadukan di dalam CPU, dan kecekapan melaksanakan operasi pada daftar adalah beberapa susunan magnitud yang lebih tinggi daripada memori utama.

(3) Memori Cache CPU

Memori Cache CPU ialah cache CPU Berbanding dengan daftar, ia biasanya juga boleh menjadi cache tahap 2 L2. Berbanding dengan kelajuan membaca cakera keras, kecekapan bacaan memori adalah sangat tinggi, tetapi ia masih susunan magnitud yang berbeza daripada CPU Oleh itu, cache berbilang peringkat diperkenalkan antara CPU dan memori utama untuk tujuan tersebut daripada penimbal.

(4) Memori Utama

Memori Utama ialah ingatan utama, yang jauh lebih besar daripada cache L1 dan L2.

Nota: Sesetengah mesin mewah juga mempunyai cache tahap 3 L3.

1.2. Masalah ketekalan cache

Disebabkan oleh susunan jurang magnitud antara memori utama dan kuasa pengkomputeran pemproses CPU, cache diperkenalkan sebagai ingatan utama dalam memori komputer tradisional seni bina Dalam penimbal antara CPU dan pemproses, CPU meletakkan data yang biasa digunakan dalam cache Selepas operasi selesai, CPU menyegerakkan hasil operasi ke memori utama.

Menggunakan cache menyelesaikan masalah ketidakpadanan CPU dan kadar memori utama, tetapi ia juga memperkenalkan satu lagi masalah baharu: masalah ketekalan cache.
Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java
Dalam sistem berbilang CPU (atau sistem berbilang teras CPU tunggal), setiap teras CPU mempunyai cache sendiri dan ia berkongsi memori utama yang sama (Memori Utama). Apabila tugas pengkomputeran berbilang CPU melibatkan kawasan memori utama yang sama, CPU akan membaca data ke dalam cache untuk pengkomputeran, yang mungkin menyebabkan data cache masing-masing tidak konsisten.

Oleh itu, setiap CPU perlu mengikut protokol tertentu semasa mengakses cache, beroperasi mengikut protokol semasa membaca dan menulis data, dan bersama-sama mengekalkan konsistensi cache. Protokol tersebut termasuk MSI, MESI, MOSI, dan Protokol Naga.

1.3. Pengoptimuman pemproses dan penyusunan semula arahan

Untuk meningkatkan prestasi, cache ditambah antara CPU dan memori utama, tetapi ia mungkin ditemui dalam senario serentak berbilang benang缓存一致性问题 . Adakah terdapat cara untuk meningkatkan lagi kecekapan pelaksanaan CPU? Jawapannya ialah: pengoptimuman pemproses.

Untuk memaksimumkan penggunaan penuh unit pengkomputeran di dalam pemproses, pemproses akan melaksanakan kod input di luar susunan Ini adalah pengoptimuman pemproses.

Selain pemproses yang mengoptimumkan kod, banyak penyusun bahasa pengaturcaraan moden juga akan melakukan pengoptimuman yang serupa Contohnya, pengkompil tepat dalam masa (JIT) Java akan melakukan penyusunan semula arahan.
Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java

Pengoptimuman pemproses sebenarnya adalah sejenis penyusunan semula, secara ringkasnya, penyusunan semula boleh dibahagikan kepada tiga jenis:

  • Penyusunan semula dioptimumkan pengkompil. Pengkompil boleh menyusun semula susunan pelaksanaan penyataan tanpa mengubah semantik program berbenang tunggal.
  • Penyusunan semula selari peringkat arahan. Pemproses moden menggunakan paralelisme peringkat arahan untuk pertindihan pelaksanaan berbilang arahan. Jika tiada kebergantungan data, pemproses boleh menukar susunan pernyataan yang sepadan dengan arahan mesin.
  • Penyusunan semula sistem memori. Oleh kerana pemproses menggunakan cache dan penimbal baca dan tulis, ini boleh menyebabkan operasi pemuatan dan stor kelihatan tidak terurus.

2. Isu dengan pengaturcaraan serentak

Banyak perkara yang berkaitan dengan perkakasan telah dibincangkan di atas. perkara ini tidak berkaitan dengan Adakah model memori Java penting? Jangan risau, mari kita lihat ke bawah perlahan-lahan.

Pelajar yang biasa dengan Java concurrency mesti biasa dengan tiga isu ini: "isu keterlihatan", "isu atomicity" dan "isu pesanan". Jika anda melihat tiga masalah ini dari peringkat yang lebih mendalam, ia sebenarnya disebabkan oleh "konsistensi cache", "pengoptimuman pemproses" dan "penyusunan semula arahan" yang dinyatakan di atas.

Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java
Masalah ketekalan cache sebenarnya adalah masalah keterlihatan pemproses boleh menyebabkan masalah atomicity, dan pesanan semula arahan akan menyebabkan masalah pesanan.

Masalah sentiasa perlu diselesaikan, jadi apakah penyelesaiannya? Pertama sekali, saya memikirkan cara yang mudah dan kasar Mematikan cache dan membiarkan CPU berinteraksi secara langsung dengan memori utama menyelesaikan masalah keterlihatan Melumpuhkan pengoptimuman pemproses dan penyusunan semula arahan menyelesaikan masalah atomicity dan pesanan, tetapi ini akan kembali ke sebelumnya. pembebasan semalaman , jelas tidak diingini.

Jadi, senior teknikal berfikir untuk mentakrifkan satu set model memori pada mesin fizikal untuk menyeragamkan operasi baca dan tulis memori. Model memori terutamanya menggunakan dua cara untuk menyelesaikan masalah konkurensi: 限制处理器优化 dan 使用内存屏障.

3. Model memori Java

Dengan set spesifikasi model memori yang sama, bahasa yang berbeza mungkin mempunyai beberapa perbezaan dalam pelaksanaan. Seterusnya, kami akan memberi tumpuan kepada prinsip pelaksanaan model memori Java.

3.1. Hubungan antara kawasan memori runtime Java dan memori perkakasan

Pelajar yang telah mengetahui tentang JVM tahu bahawa kawasan memori runtime JVM adalah berpecah-belah dan dibahagikan kepada tindanan, timbunan, dsb. , Ini adalah konsep logik yang ditakrifkan oleh JVM. Dalam seni bina ingatan perkakasan tradisional, tiada konsep timbunan dan timbunan.
Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java
Ia boleh dilihat daripada rajah bahawa tindanan dan timbunan wujud dalam kedua-dua cache dan ingatan utama, jadi tidak ada hubungan langsung antara keduanya.

3.2. Hubungan antara benang Java dan ingatan utama

Model memori Java ialah spesifikasi yang mentakrifkan banyak perkara:

  • Semua pembolehubah disimpan dalam utama ingatan Dalam Ingatan Utama.
  • Setiap utas mempunyai memori setempat peribadi (Memori Tempatan), yang menyimpan salinan pembolehubah kongsi baca/tulis utas itu.
  • Semua operasi pada pembolehubah mengikut benang mesti dilakukan dalam memori tempatan dan tidak boleh terus membaca atau menulis memori utama.
  • Benang yang berbeza tidak boleh mengakses pembolehubah secara langsung dalam memori tempatan masing-masing.

Membaca teks terlalu membosankan, saya melukis gambar lain:
Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java

3.3. Komunikasi antara benang

Jika dua utas Semuanya beroperasi pada pembolehubah kongsi Nilai awal pembolehubah dikongsi ialah 1. Setiap utas menambah pembolehubah sebanyak 1. Nilai jangkaan pembolehubah dikongsi ialah 3. Terdapat beberapa siri operasi di bawah spesifikasi JMM.
Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java
Untuk mengawal interaksi antara memori utama dan memori tempatan dengan lebih baik, model memori Java mentakrifkan lapan operasi untuk dilaksanakan:

  • kunci: Kunci. Bertindak pada pembolehubah dalam ingatan utama, menandakan pembolehubah sebagai eksklusif untuk benang.
  • buka kunci: Buka kunci. Bertindak pada pembolehubah memori utama untuk melepaskan pembolehubah terkunci supaya pembolehubah yang dikeluarkan boleh dikunci oleh benang lain.
  • baca: baca. Bertindak pada pembolehubah memori utama dan memindahkan nilai pembolehubah dari memori utama ke memori kerja benang untuk tindakan pemuatan seterusnya Gunakan
  • beban: untuk memuatkan. Bertindak pada pembolehubah dalam memori kerja, yang meletakkan nilai pembolehubah yang diperoleh daripada memori utama oleh operasi baca ke dalam salinan pembolehubah dalam memori kerja.
  • guna: guna. Pembolehubah yang bertindak pada memori kerja menghantar nilai pembolehubah dalam memori kerja ke enjin pelaksanaan Operasi ini akan dilakukan apabila mesin maya menemui arahan kod bait yang memerlukan nilai pembolehubah.
  • tugaskan: tugasan. Bertindak pada pembolehubah dalam memori kerja, yang memberikan nilai yang diterima daripada enjin pelaksanaan kepada pembolehubah dalam memori kerja Operasi ini dilakukan setiap kali mesin maya menemui arahan kod bait yang memberikan nilai kepada pembolehubah.
  • kedai: storan. Bertindak pada pembolehubah dalam memori kerja dan memindahkan nilai pembolehubah dalam memori kerja ke memori utama untuk operasi tulis seterusnya.
  • tulis: tulis. Bertindak pada pembolehubah dalam memori utama, yang memindahkan operasi stor daripada nilai pembolehubah dalam memori kerja kepada pembolehubah dalam memori utama.

Nota: Ingatan kerja juga bermaksud ingatan tempatan.

4. Ringkasan sikap

Memandangkan terdapat susunan perbezaan kelajuan magnitud antara CPU dan memori utama, saya terfikir untuk memperkenalkan seni bina memori perkakasan tradisional dengan pelbagai peringkat cache untuk menyelesaikan masalah Cache tahap bertindak sebagai penimbal antara CPU dan enjin utama untuk meningkatkan prestasi keseluruhan. Ia menyelesaikan masalah kelajuan yang lemah, tetapi juga membawa masalah konsistensi cache.

Data wujud dalam kedua-dua cache dan ingatan utama Jika ia tidak dikawal, ia pasti akan menyebabkan bencana, jadi model memori diabstrakkan pada mesin tradisional.

Bahasa Java telah melancarkan spesifikasi JMM berdasarkan mengikut model memori Tujuannya adalah untuk menyelesaikan masalah ketidakkonsistenan data memori tempatan dan penyusunan semula pengkompil dan pemprosesan arahan kod apabila berbilang benang berkomunikasi melalui memori dikongsi. Pemproses akan menyebabkan masalah seperti pelaksanaan kod yang tidak tertib.

Untuk mengawal interaksi antara memori kerja dan ingatan utama dengan lebih tepat, JMM juga mentakrifkan lapan operasi: lock, unlock, read, load, use, assign , store, write.

Pembelajaran yang disyorkan: "Tutorial pembelajaran java"

Atas ialah kandungan terperinci Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam