
كيفية البدء بسرعة باستخدام VUE3.0: أدخل التعلم
عند وصول سياقات متعددة إلى SharedArrayBuffer، إذا تم تنفيذ العمليات على المخزن المؤقت في نفس الوقت، فقد تحدث مشكلات في تنافس الموارد. تسمح واجهة برمجة تطبيقات Atomics لسياقات متعددة بقراءة SharedArrayBuffer وكتابتها بأمان من خلال فرض إمكانية إجراء عملية واحدة فقط على المخزن المؤقت في المرة الواحدة.
إن طبيعة العمليات الذرية تمنع التحسينات (مثل إعادة ترتيب التعليمات) التي يؤديها نظام التشغيل أو أجهزة الكمبيوتر تلقائيًا بشكل طبيعي. تجعل العمليات الذرية أيضًا من المستحيل الوصول إلى الذاكرة بشكل متزامن، إذا تم استخدامها بشكل غير صحيح، فقد يؤدي ذلك إلى إبطاء تنفيذ البرنامج، ولهذا السبب، فإن الهدف من التصميم الأصلي لـ Atomics API هو إنشاء برامج 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 إمكانية إعادة ترتيب التعليمات غير الذرية محليًا بالنسبة إلى التحميل () والتخزين ()، ولكن إعادة الترتيب هذه لن تنتهك حدود القراءة والكتابة الذرية.
const SharedArrayBuffer = new SharedArrayBuffer(4); const view = new Unit32Array(sharedArrayBuffer); // إجراء عرض الكتابة غير الذرية[0] = 1; // يمكن ضمان اكتمال الكتابة غير الذرية قبل عملية القراءة هذه، لذلك سيتم قراءة 1console.log(Atomics.load(view,0) هنا بالتأكيد. //1 // إجراء الكتابة الذرية Atomics.store(view,0,2); // يمكن ضمان حدوث القراءة غير الذرية بعد اكتمال الكتابة الذرية، ومن المؤكد أن 2console.log(view[0]); //2
من أجل ضمان القراءة المستمرة وغير المنقطعة أولاً ثم الكتابة، توفر Atomics API طريقتين: التبادل () والمقارنة (). يقوم Atomics.exchange() بإجراء تبادل بسيط يضمن عدم مقاطعة سلاسل العمليات الأخرى للتبادل.
const SharedArrayBuffer = new SharedArrayBuffer(4); const view = new 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
في برنامج متعدد الخيوط، قد يرغب الخيط في الكتابة إلى مخزن مؤقت مشترك فقط إذا لم يقم أي خيط آخر بتعديل القيمة منذ آخر مرة تمت قراءتها فيها. إذا لم يتم تعديل القيمة، فيمكن لهذا الخيط كتابة القيمة المحدثة بأمان: إذا تم تعديل القيمة، فإن إجراء عملية كتابة سيؤدي إلى تدمير القيمة المحسوبة بواسطة سلاسل رسائل أخرى. بالنسبة لهذا النوع من المهام، توفر Atomics API طريقة مقارنة Exchange(). تنفذ هذه الطريقة عملية الكتابة فقط إذا كانت القيمة الموجودة في الفهرس الهدف تطابق القيمة المتوقعة.
بدون آلية القفل، لا يمكن للبرامج متعددة الخيوط دعم المتطلبات المعقدة. ولتحقيق هذه الغاية، توفر Atomics API أساليب تحاكي Linux Futex (كائن المزامنة السريع لمساحة المستخدم). على الرغم من أن هذه الطرق بسيطة جدًا في حد ذاتها، إلا أنها يمكن أن تكون بمثابة مكونات أساسية لآليات قفل أكثر تعقيدًا.
لا يمكن استخدام جميع عمليات Futex الذرية إلا في طرق عرض Int32Array، علاوة على ذلك، فقط داخل سلاسل العمليات العاملة.
مراسلة عبر المستندات، تسمى أحيانًا XDM (مراسلة عبر المستندات)، هي القدرة على نقل المعلومات بين سياقات التنفيذ المختلفة (مثل سلاسل العمليات المختلفة أو الصفحات من مصادر مختلفة).
Encoding API بشكل أساسي للتحويل بين السلاسل والمصفوفات النمطية.
لا تزال File API تعتمد على حقل إدخال الملف في النموذج، ولكنها تضيف القدرة على الوصول مباشرة إلى معلومات الملف. يضيف HTML5 مجموعة ملفات إلى DOM لعناصر إدخال الملف. عندما يحدد المستخدم ملفًا واحدًا أو أكثر في حقل الملف، ستحتوي مجموعة الملفات على مجموعة من كائنات الملف التي تمثل الملفات المحددة، ولكل كائن ملف بعض سمات القراءة فقط.
يمثل نوع FileReader آلية قراءة ملفات غير متزامنة. يمكنك اعتبار FileReader مشابهًا لـ XMLHttpRequest، باستثناء أنه يستخدم لقراءة الملفات من نظام الملفات بدلاً من قراءة البيانات من الخادم. يوفر نوع FileReader عدة طرق لقراءة بيانات الملف.
readAsText(file,encoding);// اقرأ محتوى النص العادي من الملف واحفظه في سمة النتيجة
readAsDataURL(file);// اقرأ الملف واحفظ URI للبيانات الخاصة بالمحتوى في سمة النتيجة
readAsBinaryString(file); // اقرأ الملف واحفظ البيانات الثنائية لكل حرف في سمة النتيجة
readAsArrayBuffer(file); // اقرأ الملف واحفظ محتوى الملف في سمة النتيجة في شكل ArrayBuffer
إصدار متزامن من نوع قارئ الملفات
في بعض الحالات، قد تحتاج إلى قراءة جزء من الملف بدلاً من الملف بأكمله، ولهذا الغرض، يوفر كائن الملف طريقة تسمى الشريحة (). تتلقى طريقة الشريحة () معلمتين: بايت البداية وعدد البايتات في منطقة Yaodu. تقوم هذه الطريقة بإرجاع مثيل Blob، وهو في الواقع فئة فائقة من File.
يمثل Blob كائنًا ثنائيًا كبيرًا، وهو نوع تغليف JavaScript للبيانات الثنائية غير القابلة للتعديل. يمكن استخدام المصفوفات التي تحتوي على سلاسل، وArrayBuffers، وArrayBufferViews، وحتى النقط الأخرى لإنشاء النقط. يمكن لمنشئ Blob تلقي معلمة خيارات وتحديد نوع MIME فيها.
تم إنشاء Streams API لحل مشكلة بسيطة ولكنها أساسية: كيف يستهلك تطبيق الويب كتل صغيرة مرتبة من المعلومات بدلاً من كتل كبيرة من المعلومات؟ هناك نوعان من سيناريوهات التطبيق الرئيسية لهذه الإمكانية.
تحدد Streams API ثلاثة تدفقات:
تيار قابل للقراءة: تدفق يمكنه قراءة كتل البيانات من خلال واجهة عامة. تدخل البيانات الدفق داخليًا من المصدر الأساسي ثم تتم معالجتها بواسطة المستهلك.
الدفق القابل للكتابة: الدفق الذي يمكن كتابة كتل البيانات إليه عبر بعض الواجهات العامة. يكتب المنتج (المستهلك) البيانات إلى الدفق، ويتم نقل البيانات داخليًا إلى فتحة البيانات الأساسية (الحوض).
دفق التحويل: يتكون من دفقين، الدفق القابل للكتابة يستخدم لتلقي البيانات، والدفق المقروء يستخدم لإخراج البيانات. إن فحوصات جودة الدفق هذه عبارة عن محولات يمكنها فحص محتوى الدفق وتعديله حسب الحاجة.
تصف Web Cryptography API مجموعة من أدوات التشفير التي توحد كيفية تنفيذ JavaScript للتشفير بطريقة آمنة وتقليدية. تتضمن هذه الأدوات إنشاء أزواج مفاتيح التشفير واستخدامها وتطبيقها، وتشفير المعلومات وفك تشفيرها، وإنشاء أرقام عشوائية بشكل موثوق.
يستخدم العديد من الأشخاص Math.random() عندما يحتاجون إلى إنشاء أرقام عشوائية. يتم تنفيذ هذه الطريقة في المتصفح كمولد أرقام عشوائية زائفة (PRNG، PseudoRandom Number Generator). يشير ما يسمى بالزائف إلى عملية توليد قيم ليست عشوائية حقًا. القيم التي تم إنشاؤها بواسطة PRNG تحاكي الخصائص العشوائية فقط. لا يستخدم PRNG الخاص بالمتصفح مصدرًا عشوائيًا حقيقيًا، ولكنه يطبق فقط خوارزمية ثابتة على الحالة الداخلية. في كل مرة يتم فيها استدعاء Math.random() ، يتم تعديل هذه الحالة الداخلية بواسطة خوارزمية، ويتم تحويل النتيجة إلى رقم عشوائي جديد. على سبيل المثال، يستخدم محرك V8 خوارزمية تسمى xorshift128+ لإجراء هذا التعديل.
نظرًا لأن الخوارزمية نفسها ثابتة ومدخلاتها هي الحالة السابقة فقط، فسيتم أيضًا تحديد التسلسل الرقمي العشوائي. يستخدم xorshift128+ حالة داخلية 128 بت، وتم تصميم الخوارزمية بحيث تولد أي حالة أولية 2 128 -1 قيمة عشوائية زائفة قبل تكرار نفسها. يُسمى هذا النوع من الحلقات بحلقة التقليب، ويسمى طول هذه الحلقة بالفترة. ومن الواضح أنه إذا كان المهاجم يعرف الحالة الداخلية لـ PRNG، فيمكنه التنبؤ بالقيم العشوائية الزائفة التي تم إنشاؤها لاحقًا. إذا استخدم المطور PRNG عن غير قصد لإنشاء مفتاح خاص للتشفير، فيمكن للمهاجم استخدام ميزة PRNG هذه لحساب المفتاح الخاص.
تُستخدم مولدات الأرقام العشوائية الزائفة بشكل أساسي لحساب الأرقام التي تبدو عشوائية بسرعة، ولكنها ليست مناسبة لخوارزميات التشفير، ولحل هذه المشكلة، يمكن إنشاء مولد أرقام عشوائية زائفة آمن تشفيرًا (CSPRNG، مولد أرقام عشوائية زائفة آمن تشفيريًا)، بالإضافة إلى إضافة إنتروبيا. المدخلات، مثل اختبار وقت الأجهزة أو خصائص النظام الأخرى ذات السلوك غير المتوقع، على الرغم من أنها ليست بنفس سرعة PRNG، إلا أن القيمة التي تم إنشاؤها تكون أكثر صعوبة في التنبؤ ويمكن استخدامها للتشفير.
تقدم Web Cryptography API CSPRNG، والذي يمكن الوصول إليه على كائن Crypto العام من خلال crypto.getRandomValues() . على عكس Math.random() الذي يُرجع رقم الفاصلة العائمة بين 0 و1، getRandomValues() يكتب قيمًا عشوائية في المصفوفة النمطية التي تم تمريرها إليها كمعلمة. لا يهم فئة المصفوفة النمطية، لأن المخزن المؤقت الأساسي سيتم ملؤه ببتات عشوائية.
