Как быстро приступить к работе с VUE3.0: Начало обучения
При доступе к SharedArrayBuffer из нескольких контекстов одновременно могут возникнуть проблемы с конкуренцией за ресурсы. API Atomics позволяет нескольким контекстам безопасно читать и записывать SharedArrayBuffer, заставляя одновременно выполнять только одну операцию с буфером.
Природа атомарных операций исключает оптимизацию (например, изменение порядка инструкций), которую операционная система или компьютерное оборудование обычно выполняют автоматически. Атомарные операции также делают невозможным одновременный доступ к памяти. При неправильном использовании это может привести к замедлению выполнения программы. По этой причине первоначальная цель разработки API Atomics заключается в создании сложных многопоточных программ JavaScript на основе минимальных, но стабильных. атомное поведение.
Atomics API предоставляет набор простых методов для выполнения операций модификации на месте. В спецификации ECMA эти методы определены как операции AtomicReadModifyWrite. Внутри эти методы считывают значение из места в SharedArrayBuffer, выполняют арифметические и побитовые операции и, наконец, записывают результат в то же место. Атомарная природа этих операций означает, что операции чтения, изменения и обратной записи, описанные выше, будут выполняться по порядку и не будут прерываться другими потоками.
//Создаем буфер размером 1 let SharedArrayBuffer = new SharedArrayBuffer(1); //Создаем Unit8Arraylet на основе буфера typedArray = new Unit8Array(sharedArrayBuffer); //Все ArrayBuffers инициализируются значением 0console.log(typedArray); //Unit8Array[0] //Выполняем атомарное добавление 10 к значению по индексу 0Atomics.add(typedArray,0,10); //Unit8Array[10] //Выполняем атомарное вычитание 10 для значения по индексу 0Atomics.sub(typedArray,0,10); //Unit8Array[0]
Компилятор JavaScript браузера и сама архитектура ЦП имеют право переупорядочивать инструкции для повышения эффективности выполнения программы. В обычных обстоятельствах однопоточная среда JavaScript может выполнить эту оптимизацию в любое время, но перестановка инструкций в многопоточной среде может привести к конкуренции за ресурсы, и устранить неполадки чрезвычайно сложно.
Atomics API решает эту проблему двумя основными способами:
порядок всех атомарных инструкций относительно друг друга никогда не меняется.
Использование атомарных операций чтения или записи гарантирует, что все инструкции не будут переупорядочены относительно атомарных операций чтения и записи.
Помимо чтения и записи значений буфера, Atomics.load() и Atomics.store() также могут создавать «ограждения кода». Движок JavaScript гарантирует, что неатомарные инструкции могут быть перегруппированы локально относительно load() и store(), но эта перестановка не нарушит границы атомарных операций чтения и записи.
const SharedArrayBuffer = новый SharedArrayBuffer (4); const view = новый Unit32Array (sharedArrayBuffer); //Выполняем неатомарную запись view[0] = 1; //Неатомарная запись может быть гарантированно завершена до этой операции чтения, поэтому 1console.log(Atomics.load(view,0)); здесь обязательно будет прочитано. //1 //Выполняем атомарную запись Atomics.store(view,0,2); //Неатомарное чтение может гарантированно произойти после завершения атомарной записи, и здесь обязательно будет прочитано 2console.log(view[0]); //2
Чтобы обеспечить непрерывное и бесперебойное сначала чтение, а затем запись, API Atomics предоставляет два метода: обмен() и сравнениеОбмен(). Atomics.exchange() выполняет простой обмен, гарантирующий, что другие потоки не будут прерывать обмен.
const SharedArrayBuffer = новый SharedArrayBuffer (4); const view = новый Unit32Array (sharedArrayBuffer); //Записываем 10Atomics.store(view,0,10) по индексу 0; //Читаем значение из индекса 0 и записываем 5 в индекс 0console.log(Atomics.exchange(view,0,5)); //10 //Читаем значение из индекса 0 console.log(Atomics.load(view,0)); //5
В многопоточной программе поток может захотеть выполнить запись в общий буфер только в том случае, если ни один другой поток не изменил значение с момента последнего чтения. Если значение не было изменено, этот поток может безопасно записать обновленное значение: если значение было изменено, выполнение операции записи уничтожит значение, вычисленное другими потоками. Для задач такого рода API Atomics предоставляет метод Compare-Exchange(). Этот метод выполняет операцию записи только в том случае, если значение целевого индекса соответствует ожидаемому значению.
Без какого-либо механизма блокировки многопоточные программы не могут поддерживать сложные требования. С этой целью API Atomics предоставляет методы, имитирующие Linux Futex (быстрый мьютекс в пользовательском пространстве). Эти методы, хотя сами по себе очень простые, могут служить базовыми компонентами для более сложных запирающих механизмов.
Все атомарные операции Futex можно использовать только в представлениях Int32Array и, более того, только в рабочих потоках.
Междокументный обмен сообщениями, иногда также называемый XDM (междокументный обмен сообщениями), представляет собой возможность передавать информацию между различными контекстами выполнения (например, разными рабочими потоками или страницами из разных источников).
API кодирования в основном используется для преобразования строк в стереотипные массивы.
API файлов по-прежнему основан на поле ввода файла в форме, но добавляет возможность прямого доступа к информации о файле. HTML5 добавляет в DOM коллекцию файлов для элементов ввода файлов. Когда пользователь выбирает один или несколько файлов в поле «Файл», коллекция файлов будет содержать набор объектов «Файл», представляющих выбранные файлы. Каждый объект «Файл» имеет некоторые атрибуты, доступные только для чтения.
Тип FileReader представляет собой механизм асинхронного чтения файлов. FileReader можно рассматривать как аналог XMLHttpRequest, за исключением того, что он используется для чтения файлов из файловой системы, а не для чтения данных с сервера. Тип FileReader предоставляет несколько методов для чтения данных файла.
readAsText(file,encoding);//Читаем обычный текстовый контент из файла и сохраняем его в атрибуте результата
readAsDataURL(file);//Читаем файл и сохраняем URI данных содержимого в атрибуте результата
readAsBinaryString(file); //Читаем файл и сохраняем двоичные данные каждого символа в атрибуте результата
readAsArrayBuffer(file); //Читаем файл и сохраняем содержимое файла в атрибуте результата в виде ArrayBuffer
Синхронная версия Тип FileReader.
В некоторых случаях вам может потребоваться прочитать часть файла, а не весь файл. Для этой цели объект File предоставляет метод среза(). Метод среза() получает два параметра: начальный байт и количество байтов в области Yaodu. Этот метод возвращает экземпляр Blob, который на самом деле является суперклассом File.
Blob представляет собой большой двоичный объект, который является типом инкапсуляции JavaScript для неизменяемых двоичных данных. Для создания больших двоичных объектов можно использовать массивы, содержащие строки, ArrayBuffers, ArrayBufferViews и даже другие большие двоичные объекты. Конструктор Blob может получить параметр options и указать в нем тип MIME.
Streams API был создан для решения простой, но фундаментальной проблемы: как веб-приложение потребляет упорядоченные небольшие блоки информации вместо больших блоков информации? Существует два основных сценария применения этой возможности.
API Streams определяет три потока:
Читаемый поток: поток, который может читать блоки данных через общедоступный интерфейс. Данные поступают в поток изнутри из базового источника, а затем обрабатываются потребителем.
Доступный для записи поток: поток, в который блоки данных могут быть записаны через какой-либо общедоступный интерфейс. Производитель (потребитель) записывает данные в поток, и данные передаются внутри базового слота данных (приемника).
Поток преобразования: он состоит из двух потоков: записываемый поток используется для получения данных, а читаемый поток используется для вывода данных. Эти две проверки качества потока представляют собой преобразователи, которые могут проверять и изменять содержимое потока по мере необходимости.
API веб-криптографии описывает набор инструментов криптографии, которые стандартизируют то, как JavaScript реализует шифрование безопасным и традиционным способом. Эти инструменты включают в себя генерацию, использование и применение пар криптографических ключей, шифрование и дешифрование информации, а также надежную генерацию случайных чисел.
Многие люди используют Math.random()
когда им нужно генерировать случайные числа. Этот метод реализован в браузере как генератор псевдослучайных чисел (PRNG, PseudoRandom Number Generator). Так называемый псевдо относится к процессу генерации значений, который не является по-настоящему случайным. Значения, генерируемые PRNG, моделируют только случайные характеристики. PRNG браузера не использует настоящий случайный источник, а применяет только фиксированный алгоритм к внутреннему состоянию. Каждый раз, когда вызывается Math.random()
, это внутреннее состояние изменяется алгоритмом, и результат преобразуется в новое случайное число. Например, движок V8 использует алгоритм xorshift128+
для выполнения этой модификации.
Поскольку сам алгоритм фиксирован и его входными данными является только предыдущее состояние, последовательность случайных чисел также определяется. xorshift128+
использует 128-битное внутреннее состояние, а алгоритм устроен так, что любое начальное состояние генерирует 2 128 -1 псевдослучайных значений перед тем, как повториться. Этот тип цикла называется циклом перестановки, а длина этого цикла называется периодом. Очевидно, что если злоумышленник знает внутреннее состояние ГПСЧ, он может предсказать генерируемые впоследствии псевдослучайные значения. Если разработчик случайно использует PRNG для генерации закрытого ключа для шифрования, злоумышленник может использовать эту функцию PRNG для вычисления закрытого ключа.
Генераторы псевдослучайных чисел в основном используются для быстрого вычисления, казалось бы, случайных чисел, но не подходят для алгоритмов шифрования. Для решения этой проблемы используется криптографически безопасный генератор псевдослучайных чисел (CSPRNG, Cryptographically Secure PseudoRandom Number Generator), дополнительно добавляющий энтропию как. входные данные, такие как тестирование аппаратного времени или других характеристик системы с непредсказуемым поведением, хотя и не так быстро, как PRNG, сгенерированное значение сложнее предсказать, и его можно использовать для шифрования.
API веб-криптографии представляет CSPRNG, доступ к которому можно получить в глобальном объекте Crypto
через crypto.getRandomValues()
. В отличие от Math.random()
который возвращает число с плавающей запятой от 0 до 1, getRandomValues()
записывает случайные значения в стереотипный массив, передаваемый ему в качестве параметра. Класс стереотипного массива не имеет значения, поскольку базовый буфер будет заполнен случайными битами.