Cara cepat memulai VUE3.0: Masuk Pembelajaran
Ketika beberapa konteks mengakses SharedArrayBuffer, jika operasi dilakukan pada buffer pada saat yang sama, masalah pertikaian sumber daya mungkin terjadi. Atomics API memungkinkan beberapa konteks untuk membaca dan menulis SharedArrayBuffer dengan aman dengan memaksa hanya satu operasi yang dapat dilakukan pada buffer dalam satu waktu.
Sifat operasi atomik menghalangi optimasi (seperti penyusunan ulang instruksi) yang biasanya dilakukan secara otomatis oleh sistem operasi atau perangkat keras komputer. Operasi atom juga membuat akses memori secara bersamaan tidak mungkin dilakukan. Jika digunakan secara tidak benar, hal ini dapat menyebabkan eksekusi program melambat. Oleh karena itu, tujuan desain awal Atomics API adalah untuk membangun program JavaScript multi-utas yang kompleks berdasarkan minimal namun stabil. perilaku atom.
Atomics API menyediakan serangkaian metode sederhana untuk melakukan operasi modifikasi di tempat. Dalam spesifikasi ECMA, metode ini didefinisikan sebagai operasi AtomicReadModifyWrite. Di balik terpal, metode ini membaca nilai dari suatu lokasi di SharedArrayBuffer, melakukan operasi aritmatika dan bitwise, dan akhirnya menulis hasilnya ke lokasi yang sama. Sifat atomik dari operasi ini berarti bahwa operasi baca, modifikasi, dan tulis kembali yang dijelaskan di atas akan dijalankan secara berurutan dan tidak akan diganggu oleh thread lain.
//Buat buffer berukuran 1 let sharedArrayBuffer = new SharedArrayBuffer(1); //Buat Unit8Arraylet berdasarkan buffer typedArray = new Unit8Array(sharedArrayBuffer); //Semua ArrayBuffers diinisialisasi ke 0console.log(typedArray); //Unit8Array[0] //Lakukan penambahan atom sebesar 10 ke nilai pada indeks 0Atomics.add(typedArray,0,10); //Unit8Array[10] //Lakukan pengurangan atom sebesar 10 pada nilai di indeks 0Atomics.sub(typedArray,0,10); //Unit8Array[0]
Kompiler JavaScript browser dan arsitektur CPU itu sendiri memiliki wewenang untuk mengatur ulang instruksi guna meningkatkan efisiensi eksekusi program. Dalam keadaan normal, lingkungan single-thread JavaScript dapat melakukan pengoptimalan ini kapan saja, namun penataan ulang instruksi dalam multi-thread dapat menyebabkan pertikaian sumber daya dan sangat sulit untuk memecahkan masalah.
Atomics API memecahkan masalah ini dengan dua cara utama:
Urutan semua instruksi atom yang berhubungan satu sama lain tidak pernah diatur ulang.
Menggunakan pembacaan atau penulisan atom menjamin bahwa semua instruksi tidak disusun ulang relatif terhadap pembacaan dan penulisan atom.
Selain membaca dan menulis nilai buffer, Atomics.load() dan Atomics.store() juga dapat membuat "pagar kode". Mesin JavaScript memastikan bahwa instruksi non-atom dapat diatur ulang secara lokal relatif terhadap load() dan store(), namun penataan ulang ini tidak akan melanggar batasan pembacaan dan penulisan atom.
const sharedArrayBuffer = baru SharedArrayBuffer(4); tampilan const = Unit32Array baru(sharedArrayBuffer); //Lakukan tampilan tulis non-atomik[0] = 1; //Penulisan non-atom dijamin selesai sebelum operasi pembacaan ini, jadi 1console.log(Atomics.load(view,0)); //1 //Lakukan penulisan atom Atomics.store(view,0,2); //Pembacaan non-atom dijamin akan terjadi setelah penulisan atom selesai, dan 2console.log(view[0]); //2
Untuk memastikan pembacaan dan penulisan yang berkelanjutan dan tidak terputus, Atomics API menyediakan dua metode: exchange() dan CompareExchange(). Atomics.exchange() melakukan pertukaran sederhana yang menjamin bahwa thread lain tidak akan mengganggu pertukaran.
const sharedArrayBuffer = baru SharedArrayBuffer(4); tampilan const = Unit32Array baru(sharedArrayBuffer); //Tulis 10Atomics.store(view,0,10) pada indeks 0; //Baca nilai dari indeks 0 dan tulis 5 di indeks 0console.log(Atomics.exchange(view,0,5)); //10 //Baca nilai dari indeks 0 console.log(Atomics.load(view,0)); //5
Dalam program multi-thread, sebuah thread mungkin hanya ingin menulis ke buffer bersama jika tidak ada thread lain yang mengubah nilainya sejak terakhir kali dibaca. Jika nilai belum diubah, thread ini dapat dengan aman menulis nilai yang diperbarui: jika nilai telah diubah, melakukan operasi tulis akan menghancurkan nilai yang dihitung oleh thread lain. Untuk tugas semacam ini, Atomics API menyediakan metode bandingkan-Exchange(). Metode ini hanya melakukan operasi tulis jika nilai pada indeks target sesuai dengan nilai yang diharapkan.
Tanpa semacam mekanisme penguncian, program multi-thread tidak dapat mendukung persyaratan yang rumit. Untuk tujuan ini, Atomics API menyediakan metode yang meniru Linux Futex (mutex ruang pengguna cepat). Metode-metode ini, walaupun sangat sederhana, dapat berfungsi sebagai komponen dasar untuk mekanisme penguncian yang lebih kompleks.
Semua operasi atom Futex hanya dapat digunakan pada tampilan Int32Array, dan terlebih lagi, hanya dalam thread pekerja.
Pesan lintas dokumen, terkadang juga disebut XDM (pesan lintas dokumen), adalah kemampuan untuk mentransfer informasi antara konteks eksekusi yang berbeda (seperti thread pekerja yang berbeda atau halaman dari sumber yang berbeda).
Encoding API terutama digunakan untuk mengkonversi antara string dan array stereotip.
File API masih berdasarkan pada kolom input file di formulir, tetapi menambahkan kemampuan untuk mengakses informasi file secara langsung. HTML5 menambahkan koleksi file ke DOM untuk elemen input file. Ketika pengguna memilih satu atau lebih file di bidang file, kumpulan file akan berisi sekumpulan objek File yang mewakili file yang dipilih. Setiap objek File memiliki beberapa atribut read-only.
Tipe FileReader mewakili mekanisme pembacaan file asinkron. Anda dapat menganggap FileReader mirip dengan XMLHttpRequest, kecuali digunakan untuk membaca file dari sistem file alih-alih membaca data dari server. Tipe FileReader menyediakan beberapa metode untuk membaca data file.
readAsText(file,encoding);//Baca konten teks biasa dari file dan simpan di atribut hasil
readAsDataURL(file);//Baca file dan simpan URI data konten di atribut hasil
readAsBinaryString(file); / /Baca file dan simpan data biner setiap karakter dalam atribut hasil
readAsArrayBuffer(file); //Baca file dan simpan konten file dalam atribut hasil dalam bentuk ArrayBuffer
Versi sinkron dari Jenis Pembaca File.
Dalam beberapa kasus, Anda mungkin perlu membaca sebagian file, bukan keseluruhan file. Untuk tujuan ini, objek File menyediakan metode yang disebut irisan(). Metode irisan() menerima dua parameter: byte awal dan jumlah byte di area Yaodu. Metode ini mengembalikan instance Blob, yang sebenarnya merupakan superkelas File.
Blob mewakili objek biner besar, yang merupakan tipe enkapsulasi JavaScript untuk data biner yang tidak dapat dimodifikasi. Array yang berisi string, ArrayBuffers, ArrayBufferViews, dan bahkan blob lainnya dapat digunakan untuk membuat blob. Konstruktor Blob dapat menerima parameter opsi dan menentukan tipe MIME di dalamnya.
Streams API lahir untuk memecahkan masalah sederhana namun mendasar: Bagaimana aplikasi web menggunakan blok informasi yang kecil dan bukannya blok informasi yang besar? Ada dua skenario aplikasi utama untuk kemampuan ini.
Streams API mendefinisikan tiga aliran:
Aliran yang dapat dibaca: Aliran yang dapat membaca blok data melalui antarmuka publik. Data memasuki aliran secara internal dari sumber yang mendasarinya dan kemudian diproses oleh konsumen.
Aliran yang dapat ditulis: Aliran ke mana blok data dapat ditulis melalui beberapa antarmuka publik. Produsen (konsumen) menulis data ke aliran, dan data ditransfer secara internal ke slot data yang mendasarinya (sink).
Aliran konversi: Terdiri dari dua aliran, aliran yang dapat ditulis digunakan untuk menerima data, dan aliran yang dapat dibaca digunakan untuk mengeluarkan data. Kedua pemeriksaan kualitas aliran ini merupakan transformator yang dapat memeriksa dan memodifikasi konten aliran sesuai kebutuhan.
Web Kriptografi API menjelaskan seperangkat alat kriptografi yang menstandarkan bagaimana JavaScript mengimplementasikan enkripsi dengan cara yang aman dan konvensional. Alat-alat ini mencakup menghasilkan, menggunakan, dan menerapkan pasangan kunci kriptografi, mengenkripsi dan mendekripsi informasi, dan menghasilkan angka acak dengan andal.
Banyak orang menggunakan Math.random()
ketika mereka perlu menghasilkan angka acak. Metode ini diimplementasikan di browser sebagai penghasil angka acak semu (PRNG, PseudoRandom Number Generator). Yang disebut semu mengacu pada proses menghasilkan nilai yang tidak benar-benar acak. Nilai yang dihasilkan PRNG hanya mensimulasikan karakteristik acak. PRNG browser tidak menggunakan sumber acak yang sebenarnya, tetapi hanya menerapkan algoritma tetap pada keadaan internal. Setiap kali Math.random()
dipanggil, keadaan internal ini diubah oleh suatu algoritma, dan hasilnya diubah menjadi bilangan acak baru. Misalnya, mesin V8 menggunakan algoritma yang disebut xorshift128+
untuk melakukan modifikasi ini.
Karena algoritme itu sendiri tetap dan masukannya hanya berupa keadaan sebelumnya, urutan bilangan acak juga ditentukan. xorshift128+
menggunakan status internal 128-bit, dan algoritme dirancang sedemikian rupa sehingga setiap status awal menghasilkan 2.128 -1 nilai pseudo-acak sebelum terulang kembali. Perulangan semacam ini disebut perulangan permutasi, dan panjang perulangan ini disebut periode. Jelas bahwa jika penyerang mengetahui keadaan internal PRNG, dia dapat memprediksi nilai pseudo-acak yang dihasilkan selanjutnya. Jika pengembang secara tidak sengaja menggunakan PRNG untuk menghasilkan kunci pribadi untuk enkripsi, penyerang dapat menggunakan fitur PRNG ini untuk menghitung kunci pribadi.
Generator bilangan acak semu terutama digunakan untuk menghitung dengan cepat bilangan yang tampaknya acak, tetapi tidak cocok untuk algoritma enkripsi. Untuk mengatasi masalah ini, generator bilangan acak semu yang aman secara kriptografis (CSPRNG, Penghasil Angka PseudoRandom yang Aman Secara Kriptografis), juga menambahkan entropi sebagai input, seperti pengujian waktu perangkat keras atau karakteristik sistem lainnya dengan perilaku yang tidak dapat diprediksi, meskipun tidak secepat PRNG, nilai yang dihasilkan lebih sulit diprediksi dan dapat digunakan untuk enkripsi.
API Kriptografi Web memperkenalkan CSPRNG, yang dapat diakses pada objek Crypto
global melalui crypto.getRandomValues()
. Tidak seperti Math.random()
yang mengembalikan angka floating point antara 0 dan 1, getRandomValues()
menulis nilai acak ke dalam array stereotip yang diteruskan ke sana sebagai parameter. Kelas array stereotip tidak menjadi masalah karena buffer yang mendasarinya akan diisi dengan bit acak.