Rumah >Java >javaTutorial >Penjelasan terperinci dengan gambar dan teks! Apakah model memori Java
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.
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.
Untuk menjawab soalan ini, kita perlu terlebih dahulu memahami seni bina ingatan perkakasan komputer tradisional. Okay, saya akan mula melukis.
(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.
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.
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.
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.
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.
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.
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 使用内存屏障
.
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.
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.
Ia boleh dilihat daripada rajah bahawa tindanan dan timbunan wujud dalam kedua-dua cache dan ingatan utama, jadi tidak ada hubungan langsung antara keduanya.
Model memori Java ialah spesifikasi yang mentakrifkan banyak perkara:
Membaca teks terlalu membosankan, saya melukis gambar lain:
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.
Untuk mengawal interaksi antara memori utama dan memori tempatan dengan lebih baik, model memori Java mentakrifkan lapan operasi untuk dilaksanakan:
Nota: Ingatan kerja juga bermaksud ingatan tempatan.
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!