Atomics হল JavaScript এর একটি low-level API যা shared memory এবং multithreaded programming এ atomic operations সম্পাদন করতে ব্যবহৃত হয়। এটি থ্রেডগুলোর মধ্যে ডেটা শেয়ার করার সময় data consistency এবং synchronization নিশ্চিত করে। এর কাজ মূলত SharedArrayBuffer এর উপর ভিত্তি করে পরিচালিত হয়, যা একাধিক থ্রেডের মধ্যে মেমোরি শেয়ার করতে ব্যবহৃত হয়।
Atomics এর মূল ধারণা
১. Atomic অপারেশন কী?
Atomic অপারেশন হল এমন একটি কার্যপ্রণালী যা সম্পূর্ণভাবে "অখণ্ড" (indivisible)। অর্থাৎ, অপারেশনটি সম্পূর্ণ বা একেবারেই হয় না। এর ফলে একাধিক থ্রেড একসঙ্গে কাজ করলেও ডেটার অবস্থান সঠিক এবং নিরাপদ থাকে।
উদাহরণ: একটি ভ্যারিয়েবলের মান ১০ থেকে ১৫ এ পরিবর্তন করার সময় অন্য কোনো থ্রেড এই ডেটার মান পরিবর্তন করতে পারবে না যতক্ষণ না প্রথম অপারেশনটি সম্পূর্ণ হয়।
২. Shared Memory
Atomics API SharedArrayBuffer ব্যবহার করে shared memory এ কাজ করে। Shared memory একাধিক থ্রেডের মধ্যে ডেটা শেয়ার এবং সমন্বয়ের একটি কার্যকর পদ্ধতি।
৩. Thread Synchronization
Atomics ডেটার উপর একাধিক থ্রেডের একযোগে কাজ করার সময় synchronization বজায় রাখে। এটি নিশ্চিত করে যে, একটি থ্রেড ডেটা পড়া বা পরিবর্তন করার সময় অন্য থ্রেড এর সাথে হস্তক্ষেপ করতে পারবে না।
৪. Lock-Free Programming
Atomics API ব্যবহার করে lock-free (লক-মুক্ত) প্রোগ্রামিং করা যায়। এটি লক এবং মিউটেক্সের পরিবর্তে ডেটা সুরক্ষার জন্য সরাসরি atomic অপারেশন সরবরাহ করে, যা পারফরম্যান্স বৃদ্ধি করে।
Atomics এর মূল কনসেপ্ট
১. Indivisibility (অবিভাজ্যতা)
Atomics অপারেশনগুলো "অখণ্ড" হয়। অর্থাৎ, একটি অপারেশন সম্পন্ন হওয়ার আগে অন্য কোনো থ্রেড এই অপারেশনে বাধা দিতে পারে না।
২. Thread Safety (থ্রেড সেফটি)
Atomics API নিশ্চিত করে যে, একাধিক থ্রেড একই সময়ে ডেটা অ্যাক্সেস বা পরিবর্তন করলেও কোনো ডেটা দুর্নীতি (data corruption) হবে না।
৩. Synchronization (সিঙ্ক্রোনাইজেশন)
Atomics ডেটার উপর সিঙ্ক্রোনাইজেশন বজায় রাখে। এটি wait এবং notify মেকানিজমের মাধ্যমে থ্রেডগুলোর মধ্যে সমন্বয় সাধন করে।
৪. Consistency (ডেটার সঠিকতা)
Atomics ডেটা কনসিস্টেন্সি নিশ্চিত করে, যাতে প্রতিটি থ্রেডের কাছে সর্বদা সঠিক ডেটা থাকে।
৫. Non-blocking Operation
Atomics ব্যবহার করে ব্লকিং ছাড়া ডেটার উপর কাজ করা যায়, যা মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে পারফরম্যান্স বৃদ্ধি করে।
Atomics এর ফাংশনগুলোর ভূমিকা
Atomics API বিভিন্ন ফাংশন সরবরাহ করে, যা মূলত SharedArrayBuffer এর উপরে কাজ করে। এই ফাংশনগুলোর মাধ্যমে atomic reads, writes, এবং modifications সম্পন্ন করা যায়।
Atomic Operations:
- Reading Data:
Atomics.load(typedArray, index)
নির্দিষ্ট index থেকে ডেটা পড়ে। - Writing Data:
Atomics.store(typedArray, index, value)
নির্দিষ্ট index এ একটি ভ্যালু সংরক্ষণ করে। - Updating Data:
Atomics.add(),Atomics.sub(),Atomics.and(),Atomics.or(), ইত্যাদি।
ডেটার উপর নির্ধারিত অপারেশন সম্পাদন করে এবং পুরোনো মান রিটার্ন করে। - Synchronization:
Atomics.wait(),Atomics.notify()
থ্রেডগুলোর মধ্যে ডেটা আপডেটের সময় সমন্বয় বজায় রাখে।
উদাহরণ: Atomics এর মূল ধারণা
// Shared Memory তৈরি
const sharedBuffer = new SharedArrayBuffer(1024); // 1KB মেমোরি বরাদ্দ
const typedArray = new Int32Array(sharedBuffer);
// Atomics.store() ব্যবহার করে ডেটা সেট করা
Atomics.store(typedArray, 0, 42); // Index 0 এ 42 সেট করা
// Atomics.load() ব্যবহার করে ডেটা পড়া
const value = Atomics.load(typedArray, 0);
console.log(value); // আউটপুট: 42
// Atomics.add() ব্যবহার করে ডেটা আপডেট
Atomics.add(typedArray, 0, 10); // Index 0 এর মান 10 যোগ করে আপডেট
console.log(Atomics.load(typedArray, 0)); // আউটপুট: 52
Atomics এর সুবিধা
- Concurrency Control: একই সময়ে একাধিক থ্রেড কাজ করলেও ডেটা সঠিক থাকে।
- Performance Optimization: লক-মুক্ত অপারেশনের মাধ্যমে থ্রেডের কার্যক্ষমতা বৃদ্ধি করে।
- Synchronization Mechanism: থ্রেডগুলোর মধ্যে সমন্বয় বজায় রাখে।
- Deadlock-Free Programming: লক ব্যবহার ছাড়া ডেটা পরিচালনা করা যায়।
Atomics এর সীমাবদ্ধতা
- Complex API: নতুন ব্যবহারকারীদের জন্য এটি জটিল হতে পারে।
- Limited Scope: শুধুমাত্র SharedArrayBuffer এবং TypedArray এর সাথে কাজ করে।
- Browser Compatibility: কিছু ব্রাউজারে SharedArrayBuffer এবং Atomics সাপোর্ট সীমিত হতে পারে।
Atomics এর মূল ধারণা হল ডেটা ম্যানিপুলেশনে সঠিকতা এবং নিরাপত্তা নিশ্চিত করা, বিশেষ করে মাল্টি-থ্রেডেড পরিবেশে। এটি থ্রেডগুলোর মধ্যে সমন্বয় বজায় রেখে ডেটা হস্তক্ষেপ এবং ভুল এড়াতে কার্যকর।