সরাসরি পর্বে যান
পর্ব ২৫ · ৫৫-এর মধ্যে · মডিউল ৪

মেমরি হায়ারার্কি, cache আর virtual memory

Memory Hierarchy — Registers, Caches, RAM, Storage, Locality and Virtual Memory

Taught in Bangla, this lesson explains the memory hierarchy: why fast memory is small and costly, the pyramid from registers through L1 to L3 cache, RAM, SSD and HDD, temporal and spatial locality, cache hits, misses and average access time, cache lines, mapping, LRU and write policies, virtual memory and paging, page files, swap and thrashing, and checking memory in Task Manager.

এই পর্বে যা শিখবেন

  • মেমরির পিরামিড — প্রতিটি স্তরের আনুমানিক আকার আর গতি, আর মানুষের সময়ের মাপে সেগুলো কত বড় পার্থক্য
  • locality কী, আর কেন মাত্র কয়েক MB-র cache কয়েক GB-র RAM-কে প্রায় নিজের গতিতে চালাতে পারে
  • cache hit, miss, hit ratio আর গড় অ্যাক্সেস টাইমের হিসাব — পরীক্ষার ধাঁচে
  • cache line, mapping, LRU, write-back — আর লুপের ক্রম বদলে কেন একই কাজ বহু গুণ ধীর হয়ে যায়
  • virtual memory, page table, MMU, page fault, swap, thrashing — আর Task Manager-এ নিজের PC-র মেমরি পড়া

১ · দ্রুত মানেই দামি — কেন একটিমাত্র মেমরি যথেষ্ট নয়

পর্ব ০৪-এ আপনি দেখেছেন, RAM হলো কম্পিউটারের কাজের টেবিল আর SSD/HDD হলো আলমারি; CPU-র ভেতরে আরও ছোট আর দ্রুত register আর cache আছে। এই পর্বে একটি প্রশ্নের গভীরে যাব: এত রকম মেমরি কেন? সবকিছু একটিমাত্র, অতি দ্রুত মেমরিতে রাখলেই তো ঝামেলা মিটে যেত।

সমস্যা হলো, পদার্থবিজ্ঞান আর টাকা — দুটোই একসাথে এমন মেমরি বানাতে দেয় না, যা একই সঙ্গে খুব দ্রুত, খুব বড় আর খুব সস্তা। দুটি কারণ দেখুন:

  • প্রতি byte-এর খরচ। cache তৈরি হয় SRAM দিয়ে — প্রতিটি bit রাখতে সাধারণত ৬টি ট্রানজিস্টর. RAM তৈরি হয় DRAM দিয়ে — প্রতি bit-এ ১টি ট্রানজিস্টর আর একটি ছোট ক্যাপাসিটর। SSD-র flash-এ একটি সেলেই কয়েকটি bit. ফলে একই টাকায় cache-এর চেয়ে বহু গুণ বেশি RAM, আর RAM-এর চেয়ে বহু গুণ বেশি SSD কেনা যায়।
  • দূরত্ব আর আকার। ৩ GHz-এর CPU-র এক ক্লক-টিকে আলো যায় মাত্র ১০ সেন্টিমিটারের মতো, চিপের তারে সংকেত আরও কম। মেমরি যত বড়, খুঁজতে আর CPU পর্যন্ত আসতে পথ তত লম্বা। তাই সবচেয়ে দ্রুত মেমরিকে হতেই হবে ছোট আর CPU-র গায়ে লাগানো।

উপমা — ছাত্রের পড়ার ব্যবস্থা: পরীক্ষার আগের রাতে আপনার হাতে একটি খাতা (register), টেবিলে খোলা ৩–৪টি বই (cache), ঘরের তাকে ৩০টি বই (RAM), বাসার স্টোররুমের ট্রাংকে পুরোনো সব বই (SSD/HDD), আর দরকারে পাড়ার লাইব্রেরি (ক্লাউড). সব বই টেবিলে রাখা অসম্ভব — টেবিল ছোট। কিন্তু চালাক ছাত্র এখন যে বই লাগছে আর শিগগির লাগবে, সেগুলোই টেবিলে রাখেন। বেশিরভাগ সময় হাত বাড়ালেই বই পান, মাঝে মাঝে তাকে যান, কালেভদ্রে স্টোররুমে। কম্পিউটারের মেমরি হায়ারার্কি ঠিক এই বুদ্ধি।

মূল ধারণা

মেমরি হায়ারার্কির লক্ষ্য একটি “ভ্রম” তৈরি করা: নিচের স্তরের মতো বড় আর সস্তা, কিন্তু ওপরের স্তরের মতো দ্রুত. কৌশল একটাই — এই মুহূর্তে আর শিগগির যে ডেটা লাগবে, সেটি ওপরের দ্রুত স্তরে রাখা। কৌশলটি কাজ করে, কারণ প্রোগ্রামগুলোর একটি স্বভাব আছে (locality, অংশ ৩). আর এর ওপরে virtual memory আরেকটি ভ্রম যোগ করে: প্রতিটি প্রোগ্রাম ভাবে, পুরো একটি বড় মেমরি শুধু তারই।

২ · মেমরির পিরামিড — register থেকে টেপ পর্যন্ত

স্তরগুলোকে একটি পিরামিডে সাজালে ছবিটা পরিষ্কার হয়। চূড়ায় সবচেয়ে ছোট আর দ্রুত, নিচে সবচেয়ে বড় আর ধীর। প্রতিটি স্তর নিচের স্তরের একটি ছোট, দ্রুত “কপি-ঘর” হিসেবে কাজ করে।

মেমরির পিরামিড

The memory hierarchy — smaller, faster and costlier per byte towards the top (latencies approximate)

মেমরির পিরামিড আটটি স্তরের পিরামিড, ওপর থেকে নিচে: Register (১ ns-এর কম), L1 cache (প্রায় ১ ns), L2 cache (প্রায় ৪ ns), L3 cache (প্রায় ১০–২০ ns), RAM (প্রায় ১০০ ns), SSD (কয়েক ডজন থেকে শতাধিক মাইক্রোসেকেন্ড), HDD (কয়েক মিলিসেকেন্ড), ক্লাউড ও টেপ (মিলিসেকেন্ড থেকে মিনিট)। ওপরে দ্রুত, দামি, ছোট; নিচে ধীর, সস্তা, বিশাল। Register L1 · ~1 ns L2 · ~4 ns L3 · ~10–20 ns RAM · ~100 ns SSD · ~50–150 µs HDD · ~5–10 ms ক্লাউড / টেপ · ms থেকে মিনিট ◀ দ্রুত · দামি · ছোট ধীর · সস্তা · বিশাল ▼
ছবি ২৫.১ — প্রতিটি স্তর নিচের স্তরের তুলনায় সাধারণত কয়েক গুণ থেকে হাজার গুণ দ্রুত, কিন্তু অনেক ছোট।

এবার প্রতিটি স্তরের আনুমানিক মাপ দেখুন। সতর্কতা: সংখ্যাগুলো আজকের সাধারণ ডেস্কটপ-ল্যাপটপের মোটামুটি ধারণা, প্রতিটি CPU আর ডিভাইসে আলাদা, আর প্রতি বছর বদলায়। মুখস্থ করার জন্য নয় — অনুপাত বোঝার জন্য।

স্তরসাধারণ আকার (আনুমানিক)একবার আনতে সময় (আনুমানিক)কে সামলায়
Registerকয়েক ডজন ঘর, মোট কয়েকশো byte থেকে কয়েক KB১ ns-এর কম (এক ক্লক-টিক)compiler আর CPU
L1 cacheপ্রতি কোরে প্রায় ৩২–৬৪ KB ডেটা + আলাদা নির্দেশ-cacheপ্রায় ১ ns (৪–৫ টিক)CPU-র hardware
L2 cacheপ্রতি কোরে প্রায় ২৫৬ KB থেকে কয়েক MBপ্রায় ৩–৫ nsCPU-র hardware
L3 cacheসব কোর মিলে প্রায় ৮ থেকে ১০০ MB-র মতোপ্রায় ১০–২০ nsCPU-র hardware
RAM (DRAM)৮ থেকে ৬৪ GBপ্রায় ৬০–১০০ nsঅপারেটিং সিস্টেম (virtual memory)
NVMe SSD২৫৬ GB থেকে কয়েক TBপ্রায় ৫০–১৫০ µs (মাইক্রোসেকেন্ড)অপারেটিং সিস্টেম (ফাইল আর page file)
HDD১ থেকে ২০ TB-র বেশিপ্রায় ৫–১০ ms (মিলিসেকেন্ড)অপারেটিং সিস্টেম
ক্লাউড / টেপকার্যত সীমাহীনইন্টারনেটে কয়েক ডজন থেকে কয়েকশো ms; টেপে কয়েক সেকেন্ড থেকে মিনিটঅ্যাপ আর ব্যবহারকারী

মানুষের সময়ে — যদি L1 cache হয় ১ সেকেন্ড

ন্যানোসেকেন্ড (ns) এত ছোট যে মন ধরতে পারে না। একটি কৌশল: সব সময়কে ১০০ কোটি দিয়ে গুণ করুন, অর্থাৎ ১ ns-কে বানান ১ সেকেন্ড। ওপরের আনুমানিক মান থেকে হিসাব (প্রতিটি সারি একটি দৃষ্টান্ত, নির্দিষ্ট মাপ নয়):

স্তরধরে নেওয়া latency× ১০০ কোটিমানুষের মাপে কেমন
Register০.৩ ns০.৩ সেকেন্ডচোখের পলক
L1 cache১ ns১ সেকেন্ডহাতের খাতায় চোখ রাখা
L2 cache৪ ns৪ সেকেন্ডটেবিলের বই টেনে নেওয়া
L3 cache১৫ ns১৫ সেকেন্ডউঠে তাক থেকে বই আনা
RAM১০০ ns১০০ সেকেন্ড ≈ পৌনে দুই মিনিটপাশের ফ্ল্যাট থেকে বই ধার আনা
NVMe SSD১০০ µs = ১,০০,০০০ nsপ্রায় ২৮ ঘণ্টাএক দিনের বেশি — অন্য জেলায় গিয়ে আনা
HDD১০ ms = ১ কোটি nsপ্রায় ১১৬ দিনপ্রায় চার মাস — জাহাজে বিদেশ থেকে আনা
ক্লাউড (ইন্টারনেটে যাওয়া-আসা)১০০ msপ্রায় ৩ বছর ২ মাসএকটি পুরো ডিগ্রি শেষ করার সময়
টেপ (খুঁজে লোড করা)প্রায় ১ মিনিটপ্রায় ১,৯০০ বছরইতিহাসের সময়-মাপ

এই টেবিলের সবচেয়ে বড় শিক্ষা: RAM থেকে SSD-তে নামলেই সময় প্রায় এক হাজার গুণ বেড়ে যায়, আর L1 থেকে RAM-এ নামলে প্রায় একশো গুণ। ৩ GHz-এর একটি CPU RAM-এর একটি উত্তরের জন্য অপেক্ষা করতে করতে প্রায় ৩০০টি ক্লক-টিক পার করে ফেলে। মেমরি হায়ারার্কির পুরো খেলা এই ফাঁক লুকানোর খেলা।

Latency (প্রথম জিনিসটি আসতে কত দেরি) আর bandwidth (প্রতি সেকেন্ডে কতটা আসে) আলাদা জিনিস। ঢাকা–চট্টগ্রাম মহাসড়কে ট্রাক পৌঁছাতে কয়েক ঘণ্টা লাগে (latency), কিন্তু চার লেনে একসাথে অনেক ট্রাক চলে (bandwidth). নতুন RAM-এ bandwidth অনেক বেড়েছে, কিন্তু latency দশকের পর দশক প্রায় ১০০ ns-এর আশপাশে — ভাবনার প্রশ্ন ৫ দেখুন।

৩ · Locality — cache কেন এত ভালো কাজ করে

একটি ধাঁধা: একটি সাধারণ ল্যাপটপে RAM ধরুন ১৬ GB, আর L1 cache একটি কোরে মাত্র ৪৮ KB — তিন লাখ ভাগের এক ভাগেরও কম। তবু CPU-র চাওয়া ডেটার সাধারণত ৯০% বা তারও বেশি এই ছোট্ট L1-এই পাওয়া যায়। কীভাবে? উত্তর প্রোগ্রামের স্বভাবে, যার নাম locality of reference. প্রোগ্রাম মেমরির সব জায়গা সমানভাবে ব্যবহার করে না; একটি সময়ে সে ঘুরেফিরে অল্প কিছু জায়গাতেই কাজ করে। Locality দুই রকম:

⏱️ Temporal locality — সময়ের নৈকট্য

যা এইমাত্র ব্যবহার হলো, তা খুব শিগগির আবার লাগবে। একটি লুপ ১০০০ বার ঘুরলে লুপের নির্দেশগুলো, কাউন্টার i আর যোগফল sum ১০০০ বার ব্যবহার হয়। প্রথমবার আনার পর বাকি ৯৯৯ বার cache-এ পাওয়া যায়।

temporal

📏 Spatial locality — স্থানের নৈকট্য

যে ঠিকানা ব্যবহার হলো, তার পাশের ঠিকানাও শিগগির লাগবে। অ্যারের উপাদানগুলো মেমরিতে পাশাপাশি থাকে, আর প্রোগ্রাম সাধারণত সেগুলো একটির পর একটি পড়ে। নির্দেশগুলোও পরপর সাজানো থাকে।

spatial

লাইব্রেরির উপমা: Temporal: সকালে তিনবার খোলা বইটি তাকে ফেরত না দিয়ে টেবিলেই রাখেন — বিকেলেও লাগবে। Spatial: তাক থেকে একটি বই আনতে গিয়ে পাশের দুটিও আনেন, কারণ একই বিষয়ের বই পাশাপাশি থাকে। CPU-র cache ঠিক এই দুটি কাজ করে।

“পাশের জিনিসও নিয়ে আসা” কাজটি হয় cache line দিয়ে। CPU একটি byte চাইলেও RAM থেকে cache-এ আসে পুরো একটি টুকরো — বেশিরভাগ আধুনিক x86 আর ARM CPU-তে ৬৪ byte (Apple-এর কিছু চিপে ১২৮ byte). একটি সাধারণ পূর্ণসংখ্যা (int) ৪ byte, তাই একটি লাইনে পাশাপাশি ১৬টি int. নিচের stepper-এ দেখুন, একটি অ্যারের যোগফল বের করার লুপে কী ঘটে:

লুপের কোডfor (i = 0; i < 1000; i++) sum += a[i];
i আর sumregister-এ — temporal locality
লাইন ০ (৬৪ byte)a[0] … a[15]
লাইন ১ (৬৪ byte)a[16] … a[31]
লাইন ২ (আগাম আনা)a[32] … a[47]
ফল৬৩ miss, ৯৩৭ hit
cache-এর খাতা
এখন পড়ছে
ফল
মোট (hit / miss)
  1. প্রথম উপাদান a[0] — miss. শুরুতে cache-এ অ্যারের কিছুই নেই। CPU RAM পর্যন্ত গেল (প্রায় ১০০ ns অপেক্ষা)। কিন্তু শুধু a[0]-এর ৪ byte নয়, পুরো ৬৪ byte-এর লাইন ০ এল — তাতে a[0] থেকে a[15] পর্যন্ত ১৬টি সংখ্যা।
  2. a[1] — hit. a[1] তো লাইন ০-তেই এসে বসে আছে! প্রায় ১ ns-এ পাওয়া গেল। এদিকে i আর sum প্রতিবার ব্যবহার হচ্ছে বলে সেগুলো register বা L1-এ থেকেই যায় — temporal locality. লুপের নির্দেশগুলোও প্রতিবার একই, তাই নির্দেশ-cache-এ hit.
  3. a[2] থেকে a[15] — আরও ১৪টি hit. এই হলো spatial locality-র পুরস্কার: একবার RAM-এ যাওয়ার খরচে ১৬টি উপাদান মিলল। এখন পর্যন্ত ১৫ hit, ১ miss.
  4. a[16] — আবার miss. লাইন ০ শেষ, তাই লাইন ১ (a[16]–a[31]) আনতে হলো। তবে আধুনিক CPU-র prefetcher এতক্ষণে নিয়মটা ধরে ফেলেছে — “ঠিকানা ধরে ধরে এগোচ্ছে” — তাই সে লাইন ২-ও আগেভাগে আনতে শুরু করে। বাস্তবে এভাবে অনেক miss-এর অপেক্ষাও লুকিয়ে যায়।
  5. পুরো লুপ: ১০০০টি উপাদান. ১০০০ ÷ ১৬ = ৬২.৫, অর্থাৎ ৬৩টি লাইন — প্রতিটির প্রথম উপাদানে ১টি miss, বাকি সব hit. মোট ৯৩৭ hit, ৬৩ miss, hit ratio ৯৩.৭% — prefetcher ছাড়াই।

Locality প্রাকৃতিক নিয়ম নয়, একটি পর্যবেক্ষণ। যে প্রোগ্রাম মেমরির এলোমেলো জায়গায় লাফায়, তাকে cache খুব একটা সাহায্য করতে পারে না — অংশ ৫-এর সিমুলেটরে দেখবেন।

৪ · Cache hit, miss আর গড় সময়ের হিসাব

CPU কোনো ঠিকানার ডেটা চাইলে প্রথমে cache-এ খোঁজে। পাওয়া গেলে বলে cache hit — খুশির খবর। না পেলে cache miss — পরের স্তরে যেতে হবে। আধুনিক CPU-তে তিন স্তরের cache থাকে, তাই একটি miss L1 থেকে L2, L2 থেকে L3, শেষে RAM পর্যন্ত গড়াতে পারে। নিচের stepper-এ একটি ভ্যারিয়েবল x প্রথমবার পড়ার পুরো যাত্রা দেখুন:

  1. CPU কোরload xregister-এ চাই
  2. L1~1 nsকোরের নিজের
  3. L2~4 nsকোরের নিজের
  4. L3~15 nsসব কোরের ভাগের
  5. RAM~100 nsমাদারবোর্ডে
খোঁজের খাতা (সময় আনুমানিক)
কোথায় খুঁজছে
ফল
এ পর্যন্ত মোট সময়
  1. L1-এ খোঁজ — miss. প্রোগ্রাম x পড়তে চায়। CPU সবচেয়ে কাছের L1 cache-এ খোঁজে — প্রায় ১ ns-এ উত্তর আসে: “নেই”. প্রথমবার কোনো ডেটা চাইলে এমন miss অনিবার্য; একে বলে compulsory বা cold miss.
  2. L2-তে খোঁজ — miss. এবার একটু বড় আর একটু ধীর L2. সেখানেও নেই। মোট খরচ এখন প্রায় ৫ ns.
  3. L3-তে খোঁজ — miss. L3 সব কোর ভাগ করে ব্যবহার করে — অন্য কোর সম্প্রতি x ছুঁয়ে থাকলে এখানে পাওয়া যেত। এবার পাওয়া গেল না। মোট প্রায় ২০ ns.
  4. RAM — পাওয়া গেল. মাদারবোর্ডের তার বেয়ে RAM চিপ পর্যন্ত যাত্রা, DRAM-এর সারি খোলা, ডেটা ফেরত — সব মিলিয়ে প্রায় ১০০ ns বাড়তি। এই পুরো সময় CPU-র ওই নির্দেশটি অপেক্ষায়।
  5. লাইন ভরা হলো. x-যুক্ত পুরো ৬৪ byte-এর লাইনটি L3, L2 আর L1-এ কপি হলো, x গেল register-এ। ৩ GHz-এর CPU-র হিসাবে এই একটি miss-এ গেল প্রায় ৩৬০ টিক।
  6. পরের বার — L1 hit. একটু পরে প্রোগ্রাম আবার x (বা পাশের ভ্যারিয়েবল y, যা একই লাইনে আছে) চাইল। এবার L1-এই পাওয়া গেল, প্রায় ১ ns-এ — প্রথমবারের চেয়ে প্রায় ১০০ গুণ দ্রুত।

Hit ratio আর গড় অ্যাক্সেস টাইম

মোট চাওয়ার কত ভাগ cache-এ মিলল, তাকে বলে hit ratio (h). ১০০০ বার চাওয়ায় ৯৫০ বার পাওয়া গেলে h = ৯৫০ ÷ ১০০০ = ০.৯৫ বা ৯৫%; বাকি ০.০৫ হলো miss ratio. এবার গড়ে একবার ডেটা আনতে কত সময় লাগে, তার সহজ সূত্র (average memory access time):

গড় সময় T = h × Tcache + (1 − h) × TRAM

উদাহরণ: h = ৯৫%, cache-এর সময় ১ ns, RAM-এর সময় ১০০ ns.
T = ০.৯৫ × ১ + ০.০৫ × ১০০ = ০.৯৫ + ৫ = ৫.৯৫ ns.
cache না থাকলে প্রতিবার লাগত ১০০ ns — অর্থাৎ cache-এর কারণে গড়ে প্রায় ১৭ গুণ দ্রুত (১০০ ÷ ৫.৯৫ ≈ ১৬.৮)।

এবার মজার অংশ। hit ratio মাত্র ৪ শতাংশ-বিন্দু বাড়িয়ে ৯৯% করলে: T = ০.৯৯ × ১ + ০.০১ × ১০০ = ০.৯৯ + ১ = ১.৯৯ ns — আগের প্রায় তিন ভাগের এক ভাগ! আর ৯৫% থেকে কমে ৯০% হলে T = ০.৯ + ১০ = ১০.৯ ns — প্রায় দ্বিগুণ ধীর। কারণ সময়ের বেশিরভাগটা খায় অল্প কয়েকটি miss. তাই প্রকৌশলীরা hit ratio-র এক-দুই শতাংশের জন্যও কঠোর পরিশ্রম করেন।

দুই রকম সূত্র — বিভ্রান্ত হবেন না। কোনো কোনো বইয়ে লেখা থাকে: গড় সময় = hit time + miss rate × miss penalty. এখানে ধরা হয়, miss হলেও আগে cache-এ খোঁজার সময়টা গেছে, তারপর বাড়তি (penalty) সময় লাগে। একই উদাহরণে: ১ + ০.০৫ × ১০০ = ৬ ns. প্রশ্নে কোন অর্থে সময় দেওয়া আছে — “RAM-এর মোট সময়” নাকি “miss-এর বাড়তি সময়” — দেখে সূত্র বাছুন। দুই উত্তর খুব কাছাকাছি, আর শিক্ষাও একই।

৫ · Cache-এর ভেতরে — line, mapping, LRU আর লেখার নিয়ম

Cache বানাতে প্রকৌশলীদের চারটি প্রশ্নের উত্তর দিতে হয়: ডেটা কোন মাপের টুকরোয় আসবে, কোন ঘরে বসবে, ঘর ভরে গেলে কাকে সরানো হবে, আর লেখার সময় কী হবে। খুব সংক্ষেপে চারটিই দেখি।

১. কোন ঘরে বসবে — mapping

RAM-এ কোটি কোটি লাইন, cache-এ মাত্র কয়েকশো বা কয়েক হাজার ঘর। একটি লাইন কোন ঘরে বসবে, তার তিনটি নীতি:

নীতিনিয়মউপমাসুবিধা / অসুবিধা
Direct-mappedপ্রতিটি লাইনের একটিমাত্র নির্দিষ্ট ঘর: লাইন নম্বর ÷ ঘরের সংখ্যা — ভাগশেষ যত, সেই ঘররোল নম্বরের শেষ অঙ্ক দেখে নির্দিষ্ট বেঞ্চে বসাখোঁজা সবচেয়ে সহজ ও দ্রুত; কিন্তু একই ঘরের দুই লাইন বারবার একে অপরকে তাড়ায় (conflict miss)
Fully associativeযেকোনো লাইন যেকোনো খালি ঘরেসিনেমা হলে যেকোনো খালি সিটে বসাজায়গার সেরা ব্যবহার; কিন্তু খুঁজতে সব ঘর একসাথে মেলাতে হয় — বড় cache-এ খুব ব্যয়বহুল
Set-associativeলাইন একটি নির্দিষ্ট দলে (set) যায়, দলের কয়েকটি ঘরের যেকোনোটিতে বসে; যেমন 8-way মানে দলে ৮টি ঘরনির্দিষ্ট সারিতে, কিন্তু সারির যেকোনো সিটেদুইয়ের মাঝামাঝি — আধুনিক CPU-র L1, L2, L3 সাধারণত এমন

ছোট একটি উদাহরণ: ৮ ঘরের direct-mapped cache-এ লাইন ৩, ১১ আর ১৯ — তিনটিরই ৮ দিয়ে ভাগশেষ ৩, তাই তিনটিই ঘর ৩-এ বসতে চায়। প্রোগ্রাম যদি পালাক্রমে এই তিনটি লাইন ব্যবহার করে, প্রতিবার miss — যদিও বাকি ৭টি ঘর খালি পড়ে আছে! Set-associative নকশা এই সমস্যা অনেকটাই কমায়।

২. ঘর ভরা থাকলে কাকে সরাবে — replacement

নতুন লাইন আনতে পুরোনো একটি সরাতে হয়। সবচেয়ে প্রচলিত ধারণা LRU (Least Recently Used): যেটি সবচেয়ে দীর্ঘ সময় ব্যবহার হয়নি, সেটি সরানো হয় — temporal locality অনুযায়ী সেটির আবার লাগার সম্ভাবনা সবচেয়ে কম। আসল CPU-তে নিখুঁত LRU ব্যয়বহুল, তাই কাছাকাছি সহজ সংস্করণ (pseudo-LRU) ব্যবহার হয়।

৩. লেখার সময় — write-through বনাম write-back

  • Write-through: cache-এ লিখলে সাথে সাথে RAM-এও লেখা। সরল, RAM সবসময় হালনাগাদ — কিন্তু প্রতিটি লেখায় ধীর RAM-এর কাছে যেতে হয়।
  • Write-back: শুধু cache-এ লিখে লাইনটিকে “বদলানো” (dirty) চিহ্ন দেওয়া; RAM-এ লেখা হয় পরে, লাইনটি cache থেকে সরানোর সময়। একই ভ্যারিয়েবল ১০০০ বার বদলালে RAM-এ যেতে হয় একবার। আধুনিক CPU-র cache সাধারণত write-back.

৪. লুপের ক্রম কেন গতি বদলে দেয়

একটি ৩২ × ৩২ ম্যাট্রিক্স (টেবিল) ভাবুন। C, C++, Python-এর NumPy (সাধারণ সেটিংয়ে) আর বেশিরভাগ ভাষায় ২-মাত্রিক অ্যারে মেমরিতে সারি ধরে (row-major) রাখা হয়: আগে সারি ০-এর ৩২টি সংখ্যা পাশাপাশি, তারপর সারি ১-এর, এভাবে। এখন সব সংখ্যা যোগ করতে দুটি উপায়:

  • সারি ধরে পড়া (প্রথমে সারি ০-এর সব কলাম, তারপর সারি ১…): ঠিকানাগুলো পাশাপাশি — spatial locality চমৎকার।
  • কলাম ধরে পড়া (প্রথমে কলাম ০-এর সব সারি…): প্রতিবার এক সারি সমান লাফ — ৩২ × ৪ = ১২৮ byte. প্রতিটি পড়া নতুন একটি cache line-এ পড়ে, আর ছোট cache-এ লাইনগুলো আবার দরকার হওয়ার আগেই বেরিয়ে যায়।

কাজ একই, যোগফলও একই — কিন্তু গতিতে বিশাল তফাত। নিচের ছোট সিমুলেটরে নিজেই দেখুন। এটি একটি খুব ছোট cache বানায় — ৮টি লাইন, প্রতিটি ৬৪ byte, LRU নিয়মে — আর তিন ধরনের ঠিকানা-ক্রম চালায়: সারি ধরে, কলাম ধরে, আর এলোমেলো (একটি নির্দিষ্ট সূত্রে তৈরি, তাই প্রতিবার একই ফল)।

function simulate(label, addrs) {        // ৮ লাইনের LRU cache, প্রতি লাইন ৬৪ byte
  const cache = []; let hits = 0;         // লাইন নম্বর; সবচেয়ে নতুনটি শেষে
  for (const a of addrs) {
    const line = Math.floor(a / 64);      // ঠিকানাটি কোন ৬৪-byte লাইনে
    const i = cache.indexOf(line);
    if (i >= 0) { hits++; cache.splice(i, 1); }       // hit
    else if (cache.length === 8) cache.shift();       // miss, cache ভরা: LRU বাদ
    cache.push(line);
  }
  const h = hits / addrs.length, t = h * 1 + (1 - h) * 100;   // hit 1 ns, miss 100 ns
  console.log(`${label}: hit ${hits}, miss ${addrs.length - hits}, hit ratio ${(h * 100).toFixed(1)}%, avg ${t.toFixed(2)} ns`);
}
const N = 32, rowWise = [], colWise = [], rnd = [];   // 32x32 int (৪ byte) ম্যাট্রিক্স
let seed = 7;
for (let r = 0; r < N; r++) for (let c = 0; c < N; c++) {
  rowWise.push((r * N + c) * 4);          // পাশাপাশি ঠিকানা
  colWise.push((c * N + r) * 4);          // প্রতিবার ১২৮ byte লাফ
  seed = (seed * 75 + 74) % 65537; rnd.push((seed % (N * N)) * 4);
}
simulate('row by row   ', rowWise);
simulate('column by col', colWise);
simulate('random       ', rnd);

Run চাপলে তিন লাইন আসে:
row by row : hit 960, miss 64, hit ratio 93.8%, avg 7.19 ns
column by col: hit 0, miss 1024, hit ratio 0.0%, avg 100.00 ns
random : hit 137, miss 887, hit ratio 13.4%, avg 86.75 ns

একই ১০২৪টি সংখ্যা, একই cache — অথচ সারি ধরে পড়লে গড় সময় প্রায় ৭ ns, কলাম ধরে পড়লে পুরো ১০০ ns: প্রায় ১৪ গুণ পার্থক্য! সারি ধরে পড়ায় প্রতিটি লাইনের প্রথম সংখ্যায় একটি miss, তারপর ১৫টি hit (১০২৪ ÷ ১৬ = ৬৪ miss). কলাম ধরে পড়ায় একটি কলামেই ৩২টি আলাদা লাইন লাগে, কিন্তু cache-এ আঁটে মাত্র ৮টি — তাই LRU প্রতিটি লাইন আবার কাজে লাগার আগেই সরিয়ে দেয়, একটিও hit হয় না। এলোমেলো ক্রমে locality প্রায় নেই, তাই hit সামান্য। কোডে cache অ্যারেটি LRU-র তালিকা: hit হলে লাইনটি শেষে (সবচেয়ে নতুন) যায়, miss-এ shift() দিয়ে প্রথমটি (সবচেয়ে পুরোনো) বাদ। আসল cache অনেক বড় আর prefetcher-ও আছে, তাই পার্থক্য সবসময় এত নাটকীয় নয় — তবে বড় ডেটায় কয়েক গুণ তফাত সাধারণ।

৬ · Virtual memory — প্রতিটি প্রোগ্রামের নিজের ঠিকানার জগৎ

এবার পিরামিডের নিচের দিকে যাই — RAM আর ডিস্কের সম্পর্কে। আপনার কম্পিউটারে একসাথে চলছে ব্রাউজার, Word, Facebook Messenger, অ্যান্টিভাইরাস, আর অপারেটিং সিস্টেমের নিজের অনেক প্রোগ্রাম। প্রতিটি চলমান প্রোগ্রামকে বলে একটি process (বিস্তারিত পর্ব ২৬-এ)। তিনটি সমস্যা ভাবুন:

  1. কে কোথায় থাকবে? প্রতিটি প্রোগ্রাম যদি RAM-এর আসল ঠিকানা নিজে বাছত, দুটি প্রোগ্রাম একই ঠিকানা চাইলে কী হতো?
  2. নিরাপত্তা: একটি গেম কি ব্রাউজারের মেমরি থেকে আপনার পাসওয়ার্ড পড়ে ফেলতে পারবে?
  3. জায়গা: সব প্রোগ্রাম মিলে RAM-এর চেয়ে বেশি মেমরি চাইলে কী হবে?

তিনটির একটিই সমাধান — virtual memory. প্রতিটি process পায় নিজের আলাদা, বিশাল একটি address space — ঠিকানার একটি কাল্পনিক জগৎ, যেন পুরো মেমরিটা শুধু তার। প্রোগ্রাম যে ঠিকানা ব্যবহার করে, তা virtual address; আসল RAM চিপের ঠিকানা হলো physical address. দুইয়ের মধ্যে অনুবাদ করে CPU-র ভেতরের একটি অংশ — MMU (Memory Management Unit) — প্রতিটি মেমরি-ব্যবহারে, অপারেটিং সিস্টেমের রাখা একটি টেবিল দেখে।

উপমা — আবাসিক হোটেল: প্রতিটি অতিথি জানেন “আমার রুম ১, আমার আলমারি ২”। কিন্তু হোটেলের রিসেপশনের খাতায় লেখা — রহিম সাহেবের “রুম ১” আসলে তিনতলার ৩০৭, করিম সাহেবের “রুম ১” পাঁচতলার ৫১২. অতিথিরা নিজের মতো সংখ্যা ব্যবহার করেন, রিসেপশন (MMU) আসল রুম খুঁজে দেয়, আর কেউ অন্যের রুমের চাবি পান না। কোনো অতিথির মালপত্র রুমে জায়গা না হলে হোটেল সেটি গুদামে (ডিস্কে) রাখে, চাইলে আবার এনে দেয়।

Page, frame আর page table

byte ধরে ধরে হিসাব রাখা অসম্ভব, তাই মেমরিকে সমান মাপের টুকরোয় ভাগ করা হয়। virtual memory-র টুকরোকে বলে page, আসল RAM-এর সমান মাপের ঘরকে frame. সাধারণ PC-তে page-এর মাপ ৪ KB (৪০৯৬ byte); Apple-এর M-সিরিজ চিপে macOS ১৬ KB page ব্যবহার করে, আর বড় ডেটার জন্য ২ MB-র “huge page”-ও আছে। প্রতিটি process-এর জন্য OS একটি page table রাখে, যার প্রতিটি সারিতে থাকে: এই virtual page কোন frame-এ আছে, আদৌ RAM-এ আছে কি না (present bit), আর পড়া-লেখা-চালানোর অনুমতি।

৪ KB = 212 byte, তাই একটি ঠিকানার শেষ ১২ bit — হেক্সাডেসিমালে (পর্ব ১৬) শেষ ৩টি অঙ্ক — হলো page-এর ভেতরের অবস্থান (offset); বাকি অংশ page নম্বর। অনুবাদে শুধু page নম্বর বদলায়, offset একই থাকে। নিচের stepper-এ একটি ঠিকানার অনুবাদ, তারপর একটি page fault দেখুন:

  1. প্রোগ্রামvirtual addressনিজের জগতের ঠিকানা
  2. MMU + TLBpage | offsetCPU-র ভেতরে
  3. Page tablepage → frameOS-এর খাতা, RAM-এ
  4. RAMphysical addressআসল ঘর
  5. SSDpage file / swappage fault হলে
অনুবাদের খাতা (৪ KB page)
Virtual address
Page table বলছে
Physical address
  1. প্রোগ্রাম একটি ঠিকানা চায়. ধরুন ব্রাউজারের একটি ট্যাব 0x00403A10 ঠিকানা থেকে একটি সংখ্যা পড়তে চায়। এটি virtual address — শুধু এই process-এর জগতে অর্থবহ।
  2. MMU ঠিকানা দুই ভাগ করে. শেষ ৩টি হেক্স অঙ্ক (১২ bit) A10 হলো page-এর ভেতরের offset; বাকি 0x00403 হলো page নম্বর। MMU প্রথমে নিজের ছোট দ্রুত খাতা TLB-এ দেখে — সম্প্রতি এই page-এর অনুবাদ করা থাকলে সেখানেই পাওয়া যায়। ধরা যাক এবার TLB-তে নেই।
  3. Page table দেখা. MMU এই process-এর page table-এ page 0x00403-এর সারি পড়ে: এটি RAM-এর frame 0x001F2-এ আছে (present = 1), আর এই প্রোগ্রামের পড়া-লেখার অনুমতি আছে। অনুমতি না থাকলে এখানেই থামত — নিচের “memory protection” দেখুন।
  4. Physical address তৈরি. frame নম্বরের পাশে একই offset জুড়ে দিলেই আসল ঠিকানা: 0x001F2 + A10 = 0x001F2A10. RAM (বা cache) থেকে ডেটা এল। অনুবাদটি TLB-তে রাখা হলো, যাতে এই page-এ পরের চাওয়াগুলো দ্রুত হয়।
  5. আরেকটি ঠিকানা — page fault! এবার প্রোগ্রাম চাইল 0x00407120. Page table বলছে page 0x00407 এই মুহূর্তে RAM-এ নেই — অনেকক্ষণ ব্যবহার না হওয়ায় OS আগে এটিকে ডিস্কের page file-এ সরিয়ে রেখেছিল। MMU কাজ থামিয়ে CPU-কে বলে: page fault. নিয়ন্ত্রণ যায় অপারেটিং সিস্টেমের kernel-এর কাছে।
  6. OS page নিয়ে আসে, কাজ আবার চলে. OS একটি খালি frame খোঁজে (না থাকলে কম ব্যবহৃত কোনো page সরায়), SSD থেকে ৪ KB পড়ে frame 0x002A7-এ বসায়, page table হালনাগাদ করে (present = 1), তারপর থেমে যাওয়া নির্দেশটি আবার চালায়। এবার ঠিকানা 0x002A7120 — সফল। SSD থেকে পড়ায় এই একটি ঘটনায় লেগেছে প্রায় ১০০ µs বা তার বেশি — RAM-এর চেয়ে হাজার গুণ। প্রোগ্রাম কিছুই টের পায়নি, শুধু একটু দেরি হলো।

সব page fault খারাপ নয়। নতুন প্রোগ্রাম চালু হলে OS পুরো প্রোগ্রাম একবারে RAM-এ তোলে না — যে page প্রথম দরকার হয়, তখনই page fault ঘটিয়ে আনে (একে বলে demand paging). ফলে প্রোগ্রাম দ্রুত খোলে আর অপ্রয়োজনীয় অংশ RAM দখল করে না। সমস্যা হয় বারবার ডিস্ক থেকে আনতে হলে (hard fault).

Memory protection — এক প্রোগ্রাম অন্যের মেমরি পড়তে পারে না

virtual memory-র সবচেয়ে বড় উপহার হয়তো নিরাপত্তা। প্রতিটি process-এর page table-এ শুধু তার নিজের page-গুলোর সারি থাকে। গেমটি যে ঠিকানাই লিখুক, MMU সেটি গেমের নিজের page table দিয়ে অনুবাদ করে — ব্রাউজারের frame-এ পৌঁছানোর কোনো পথই তার খাতায় নেই। আর page table-এর অনুমতি-bit দিয়ে আরও ঠিক করা যায়: কোডের page শুধু পড়া আর চালানো যাবে, লেখা যাবে না; ডেটার page লেখা যাবে, কিন্তু চালানো যাবে না; kernel-এর page সাধারণ প্রোগ্রাম ছুঁতেই পারবে না।

কোনো প্রোগ্রাম নিষিদ্ধ ঠিকানা ছুঁলে MMU আটকায়, আর OS সেই প্রোগ্রামটি বন্ধ করে দেয় — Windows-এ “access violation”, Linux-এ “segmentation fault” বার্তা এভাবেই আসে। বাকি প্রোগ্রাম আর OS নিরাপদে চলতে থাকে। এই memory protection-এর কারণেই একটি অ্যাপ ক্র্যাশ করলে পুরো কম্পিউটার আর আগের মতো বসে যায় না। তবে সুরক্ষাও নিখুঁত নয় — ২০১৮ সালে প্রকাশিত Meltdown আর Spectre দেখিয়েছিল, cache-এর সময় মেপেও তথ্য ফাঁস হতে পারে; প্রতিকার এসেছে OS, ব্রাউজার আর firmware হালনাগাদে। তাই নিরাপত্তা আপডেট নিয়মিত নিন (পর্ব ৪৩)।

৭ · Page file, swap আর thrashing — কম RAM-এর PC কেন হামাগুড়ি দেয়

RAM ভরে এলে OS কম ব্যবহৃত page ডিস্কে সরিয়ে জায়গা খালি করে — একে বলে paging বা swapping, আর ডিস্কের সেই জায়গাকে বলে page file. Windows-এ এটি C: ড্রাইভের মূলে লুকানো ফাইল pagefile.sys; Linux-এ swap partition বা swap file. এর আগে আধুনিক OS আরেকটি কৌশল চালায় — memory compression: কম ব্যবহৃত page RAM-এর ভেতরেই চেপে ছোট করে রাখে, কারণ চাপা-খোলা ডিস্কে যাওয়ার চেয়ে অনেক দ্রুত।

যতক্ষণ সরানো page-গুলো সত্যিই অব্যবহৃত (যেমন অনেক আগে খোলা একটি ট্যাব), ততক্ষণ কোনো সমস্যা নেই — আপনি টেরও পান না। প্রতিটি প্রোগ্রাম সাম্প্রতিক সময়ে যে page-গুলো সত্যিই ব্যবহার করছে, তাদের দলকে বলে তার working set. সব চলমান প্রোগ্রামের working set মিলে RAM-এ আঁটলে কম্পিউটার স্বচ্ছন্দ। না আঁটলেই বিপদ — নিচে দেখুন:

Windows + পটভূমির সেবাপ্রায় ৩ GB
ব্রাউজার, ৫টি ট্যাবপ্রায় ২ GB
আরও ১৫টি ট্যাব + Wordআরও প্রায় ২.৫ GB
ছবি/ভিডিও এডিটরআরও প্রায় ৩ GB
RAM: ৮ GBশারীরিক সীমা
SSD-র page fileধীর গুদাম
Task Manager যা দেখাত (আনুমানিক)
দরকারি মেমরি
Memory in use
Hard page fault
Disk active time
আপনার অনুভূতি
  1. সব RAM-এ আঁটে. Windows আর একটি ব্রাউজার মিলে প্রায় ৫ GB — ৮ GB RAM-এ আরামে আঁটে। page fault প্রায় শুধু নতুন কিছু খোলার সময়। ডিস্ক প্রায় অলস।
  2. RAM প্রায় ভরা — OS সামলে নেয়. আরও ট্যাব আর Word খুললেন। OS অনেকক্ষণ না ছোঁয়া ট্যাবের page চেপে ছোট করে, কিছু page file-এ পাঠায়। পুরোনো ট্যাবে ফিরলে এক মুহূর্ত দেরি — নইলে সব স্বাভাবিক, কারণ এই মুহূর্তের working set এখনো আঁটে।
  3. Working set আর আঁটে না. এবার ভিডিও এডিটর খুললেন, আর ব্রাউজারেও কাজ চলছে। সক্রিয় page-গুলোর মোট দরকার RAM-এর চেয়ে বেশি। OS যে page সরায়, সেটিই একটু পরে আবার লাগে — hard page fault বাড়তে থাকে।
  4. Thrashing. এক প্রোগ্রামের page আনতে অন্য প্রোগ্রামের দরকারি page সরাতে হয়, সেটি আবার আনতে আরেকটি… CPU বেশিরভাগ সময় অলস বসে ডিস্কের অপেক্ষায়, ডিস্ক ১০০% ব্যস্ত, মাউস আটকে আটকে চলে। একে বলে thrashing — কম্পিউটার কাজ না করে শুধু page আনা-নেওয়া করছে। HDD-তে হলে অবস্থা আরও ভয়াবহ, কারণ HDD SSD-র চেয়েও প্রায় শতগুণ ধীর।
  5. সমাধান. এডিটর বন্ধ করলেন বা অনেক ট্যাব বন্ধ করলেন — working set আবার RAM-এ আঁটল, thrashing থামল। স্থায়ী সমাধান বেশি RAM. এ কারণেই পর্ব ০৮-এর কেনার পরামর্শে বেশিরভাগ কাজের জন্য ১৬ GB RAM (সাধারণ পড়াশোনা-অফিসে অন্তত ৮ GB) আর HDD-র বদলে SSD-কে গুরুত্ব দেওয়া হয়েছে। “Page file বড় করে দিন” ধরনের পরামর্শ thrashing সারায় না — গুদাম বড় হলেও টেবিল ছোটই থাকে।

সাবধান: ইন্টারনেটে প্রায়ই পরামর্শ দেখবেন — “page file বন্ধ করে দিন, PC দ্রুত হবে”। সাধারণ ব্যবহারে এটি ভালো পরামর্শ নয় — RAM ভরে গেলে প্রোগ্রাম হঠাৎ বন্ধ হতে পারে বা “out of memory” বার্তা আসতে পারে। Windows-কে নিজে আকার ঠিক করতে দিন। “RAM cleaner” অ্যাপও এড়িয়ে চলুন — এগুলো জোর করে RAM খালি করে OS-এর cache নষ্ট করে, পরে সব আবার ডিস্ক থেকে আনতে হয়।

৮ · নিজের কম্পিউটারে — Task Manager, dual-channel আর unified memory

Task Manager-এ মেমরি পড়তে শিখুন

Windows 10/11-এ Ctrl + Shift + Esc চেপে Task Manager খুলুন, তারপর Performance → Memory. কয়েকটি সংখ্যার মানে:

যা লেখা থাকেমানেকখন চিন্তার কারণ
In use (Compressed)প্রোগ্রাম আর OS এখন যতটা RAM ব্যবহার করছে; বন্ধনীতে যতটা চেপে রাখানিয়মিত ৮৫–৯০%-এর ওপরে থাকলে আর PC ধীর লাগলে
Availableনতুন কাজে এখনই দেওয়া যায় এমন RAM (ফাঁকা + সহজে ছাড়া যায় এমন cache)প্রায় শূন্যে নামলে
Committedপ্রোগ্রামগুলোকে মোট যত মেমরির প্রতিশ্রুতি দেওয়া হয়েছে / সর্বোচ্চ সীমা (RAM + page file) — committed memoryপ্রথম সংখ্যাটি RAM-এর চেয়ে অনেক বেশি আর সীমার কাছাকাছি হলে
Cachedসম্প্রতি পড়া ফাইলের কপি, যা RAM-এ রাখা আছে যাতে আবার খুললে দ্রুত হয় — দরকারে সাথে সাথে ছেড়ে দেওয়া যায়চিন্তার কিছু নয় — অলস RAM নষ্ট RAM
Speed, Slots usedRAM-এর গতি (যেমন 3200 বা 5600 MT/s) আর কয়টি স্লটের কয়টি ভরা“Slots used: 1 of 2” — dual-channel হচ্ছে না (নিচে দেখুন)

পাশের Processes ট্যাবে Memory কলামে ক্লিক করলে কোন প্রোগ্রাম কত RAM নিচ্ছে, বড় থেকে ছোট সাজানো দেখবেন। আর Linux-এ টার্মিনালে free -h চালালে total, used, free, buff/cache, available আর Swap-এর সারি দেখায় (টার্মিনাল চালানোর পরিচয় পর্ব ২৯-এ)। মনে রাখুন: RAM অনেকটা ভরা দেখানো খারাপ নয়; চিন্তার বিষয় হলো ধীরগতির সাথে ডিস্কের অবিরাম ব্যস্ততা — thrashing-এর লক্ষণ।

Dual-channel — একই RAM, দ্বিগুণ রাস্তা

বেশিরভাগ ডেস্কটপ আর ল্যাপটপের মাদারবোর্ডে CPU আর RAM-এর মধ্যে দুটি আলাদা মেমরি-পথ (channel) থাকে। দুটি স্টিক সঠিক স্লটে বসালে দুই পথে একসাথে ডেটা চলে — dual-channel, bandwidth প্রায় দ্বিগুণ। latency কমে না, কিন্তু একসাথে বেশি ডেটা আসে। একটি ১৬ GB স্টিকের চেয়ে দুটি ৮ GB স্টিক তাই প্রায়ই দ্রুত — বিশেষ করে যে ল্যাপটপে আলাদা গ্রাফিক্স কার্ড নেই, কারণ সেখানে CPU-র ভেতরের গ্রাফিক্সও এই RAM থেকেই ডেটা খায়। কোন দুটি স্লটে বসাতে হবে, তা মাদারবোর্ডের ম্যানুয়ালে লেখা থাকে।

Unified memory — ফোন আর Apple চিপে

ফোনের SoC-তে CPU, GPU, AI-এর জন্য NPU আর ক্যামেরার প্রসেসর — সবাই একটিই RAM ভাগ করে ব্যবহার করে; আলাদা ভিডিও মেমরি নেই। Apple ২০২০ সালের M1 চিপ থেকে Mac-এও এই নকশা জনপ্রিয় করেছে, নাম দিয়েছে unified memory: RAM চিপগুলো প্রসেসরের একই প্যাকেজে, খুব কাছে বসানো। সুবিধা — CPU আর GPU-কে একই ডেটা এক জায়গা থেকে আরেক জায়গায় কপি করতে হয় না, bandwidth বেশি, বিদ্যুৎ কম। অসুবিধা — RAM পরে আর বাড়ানো যায় না, আর “৮ GB”-এর মধ্যেই গ্রাফিক্সের ভাগও। তাই এমন ডিভাইস কেনার সময় ভবিষ্যতের কথা ভেবে RAM বাছাই আরও গুরুত্বপূর্ণ।

পরীক্ষা ও ইন্টারভিউতে — এ ধরনের প্রশ্ন প্রায়ই আসে:

  • দ্রুত থেকে ধীর ক্রমে সাজান: Register → Cache (L1 → L2 → L3) → RAM → SSD → HDD → টেপ. ধারণক্ষমতা ঠিক উল্টো ক্রমে বাড়ে।
  • Cache memory-র কাজ কী? CPU আর RAM-এর গতির ফাঁক কমানো — ঘন ঘন দরকারি ডেটা ও নির্দেশ CPU-র কাছে দ্রুত SRAM-এ রেখে দেওয়া।
  • Virtual memory কী? OS আর MMU-র কৌশল, যাতে প্রতিটি প্রোগ্রাম নিজস্ব বড় address space পায়; page table দিয়ে ঠিকানা RAM-এ অনুবাদ হয়, আর RAM কম পড়লে ডিস্কের অংশ (page file/swap) ব্যবহার হয়।
  • Hit ratio ৯০%, cache ২ ns, RAM ৫০ ns — গড় সময়? ০.৯ × ২ + ০.১ × ৫০ = ১.৮ + ৫ = ৬.৮ ns.
  • Page fault আর thrashing-এর পার্থক্য? page fault = চাওয়া page RAM-এ নেই (স্বাভাবিক ঘটনা); thrashing = এত বেশি page fault যে কম্পিউটার কাজের বদলে শুধু page আনা-নেওয়া করে।

আরও গভীরে: cache-এ ঠিকানাকে tag, index আর offset-এ ভাগ করার হিসাব, set-associative cache-এর নকশা, multi-level cache-এর গড় সময় আর multi-core-এ cache coherence — সব আছে আমাদের Computer Architecture কোর্সে; শুরু করুন memory hierarchy আর locality পর্ব দিয়ে। page table-এর বহুস্তর নকশা, TLB, page replacement-এর FIFO/LRU/Optimal অ্যালগরিদম আর working-set মডেল পাবেন Operating Systems কোর্সে, যেমন paging পর্ব.

৯ · AI-এর যুগে — latency আর cache-এর সংখ্যা যাচাই করুন

AI চ্যাটবট মেমরি হায়ারার্কির ধারণা খুব গুছিয়ে ব্যাখ্যা করে। কিন্তু সংখ্যার বেলায় সাবধান। AI-এর শেখার ডেটায় পুরোনো লেখা প্রচুর — যেমন ২০০০-এর দশকের “latency numbers”-এর তালিকা, যেখানে ডিস্ক বলতে HDD আর SSD-র সংখ্যা আজকের তুলনায় অনেক ধীর। আবার নির্দিষ্ট কোনো CPU-র L2/L3 cache কত বা কোন ফোনে কত RAM — এমন তথ্য AI প্রায়ই আত্মবিশ্বাসের সাথে ভুল বলে, বা দুটি মডেল গুলিয়ে ফেলে।

AI-এর সাধারণ ভুলকীভাবে ধরবেন
নির্দিষ্ট CPU-র cache-এর আকার ভুল বা অন্য প্রজন্মের সাথে গুলিয়ে ফেলানির্মাতার (Intel ARK, AMD, Apple, Qualcomm) অফিসিয়াল spec পাতায় মডেল নম্বর ধরে মিলিয়ে নিন
পুরোনো latency সংখ্যাকে আজকের বলে চালানো (যেমন SSD-কে মিলিসেকেন্ড বলা)উত্তরে বছর আর উৎস চান; সংখ্যাকে “আনুমানিক” ধরুন, অনুপাতটুকু (১০০ গুণ, ১০০০ গুণ) মনে রাখুন
hit ratio-র হিসাবে দুই সূত্র মিশিয়ে ফেলানিজে হাতে একবার গুণ-যোগ করুন; T = h × Tc + (1 − h) × Tm সূত্রে মান বসিয়ে দেখুন
“page file বন্ধ করুন”, “RAM cleaner ব্যবহার করুন” জাতীয় পুরোনো টিপসMicrosoft-এর নিজস্ব ডকুমেন্টেশন দেখুন; সাধারণ ব্যবহারে Windows-কে নিজে সামলাতে দিন

নিচের prompt-টি কপি করে নিজের প্রশ্ন বসিয়ে ব্যবহার করুন। খেয়াল করুন, AI-কে সংখ্যার উৎস আর অনিশ্চয়তা জানাতে বলা হয়েছে:

আমি কম্পিউটারের মেমরি হায়ারার্কি শিখছি। আমার প্রশ্ন: [এখানে লেখো, যেমন “আমার ল্যাপটপ ৮ GB RAM-এ Chrome-এ ২০টি ট্যাব খুললে খুব ধীর হয় কেন?”] ১. register, cache, RAM, SSD — কোন স্তরের ভূমিকা কী, সহজ বাংলায় ব্যাখ্যা দাও। ২. latency বা cache-এর আকারের যে সংখ্যা দেবে, প্রতিটিকে “আনুমানিক” লিখবে আর বলবে কোন বছরের/কোন ধরনের হার্ডওয়্যারের হিসাব। ৩. কোনো নির্দিষ্ট CPU বা ফোনের spec নিশ্চিত না জানলে স্পষ্ট বলো, অনুমান করবে না; কোথায় অফিসিয়াল তথ্য মিলবে তা বলো। ৪. hit ratio বা গড় সময়ের হিসাব থাকলে প্রতিটি ধাপের গুণ-যোগ দেখাও। ৫. Task Manager-এ কোন কোন সংখ্যা দেখে আমি নিজে সমস্যা যাচাই করতে পারব, তা লিখে দাও।

AI-এর উত্তর হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। cache আর virtual memory-র জন্মের গল্পগুলো দেখায়, আজকের প্রতিটি ফোন আর ল্যাপটপ কয়েকটি পুরোনো, সাহসী ধারণার ওপর দাঁড়িয়ে।

প্র ০১১৯৬৫ সালে Maurice Wilkes-এর একটি ছোট্ট প্রবন্ধ “slave memory”-র কথা বলেছিল। কেন একে cache-এর জন্ম ধরা হয়?

Maurice Wilkes ছিলেন কেমব্রিজ বিশ্ববিদ্যালয়ের কম্পিউটার বিজ্ঞানী — ১৯৪৯ সালে চালু হওয়া EDSAC, অর্থাৎ প্রথম দিকের stored-program কম্পিউটারগুলোর একটি, তাঁর নেতৃত্বে তৈরি। ১৯৬৫ সালে IEEE Transactions on Electronic Computers-এ তাঁর মাত্র দুই পাতার একটি প্রবন্ধ প্রকাশিত হয়: “Slave Memories and Dynamic Storage Allocation”. তখনকার মূল মেমরি ছিল ধীর আর দামি magnetic core. Wilkes প্রস্তাব দেন: মূল (master) মেমরির পাশে একটি ছোট কিন্তু অনেক দ্রুত মেমরি রাখা হোক, যা নিজে থেকেই সম্প্রতি ব্যবহৃত শব্দগুলোর কপি রাখবে — একটি “slave” মেমরি, যার অস্তিত্ব প্রোগ্রামারকে জানতেই হবে না।

এই শেষ অংশটিই বিপ্লবী। আগে দ্রুত আর ধীর মেমরির মধ্যে ডেটা সরানোর দায়িত্ব ছিল প্রোগ্রামারের — কোন ডেটা কখন কোথায় যাবে, নিজে লিখতে হতো। Wilkes-এর ধারণায় hardware নিজেই সিদ্ধান্ত নেবে, আর প্রোগ্রাম আগের মতোই লেখা যাবে। আজ যাকে আমরা “transparent cache” বলি, তার মূল কথা এটাই — এই পর্বের অ্যারে-যোগের লুপে cache-এর নামও ছিল না, তবু সে দ্রুত চলেছে।

ধারণাটি বাস্তবে আসে কয়েক বছরের মধ্যে। IBM-এর System/360 Model 85 (১৯৬৮ সালে ঘোষিত) প্রথম বাণিজ্যিক কম্পিউটারগুলোর একটি, যাতে এমন দ্রুত বাফার-মেমরি ছিল। প্রচলিত বিবরণ অনুযায়ী, “cache” নামটিও এই সময় IBM-এর একটি গবেষণা-প্রবন্ধ প্রকাশের প্রস্তুতিতে বেছে নেওয়া হয় — ফরাসি শব্দ, অর্থ লুকানো ভান্ডার, কারণ এটি প্রোগ্রামারের চোখের আড়ালে থাকে। ১৯৮০-র দশকের শেষে cache মাইক্রোপ্রসেসরের চিপের ভেতরেই ঢুকে পড়ে (যেমন Intel-এর 80486, ১৯৮৯), পরে এক স্তর থেকে দুই, তিন স্তর হয়।

Wilkes ১৯৬৭ সালে Turing Award পান (দ্বিতীয় প্রাপক হিসেবে)। আজ প্রায় প্রতিটি প্রসেসরে, আপনার ফোনেও, তাঁর “slave memory”-র উত্তরসূরি কাজ করছে।

মূল উপলব্ধি: ভালো ধারণা প্রায়ই জটিলতাকে মানুষের কাছ থেকে যন্ত্রের কাছে সরিয়ে দেয়। cache সফল হয়েছে কারণ এটি স্বয়ংক্রিয় আর অদৃশ্য — প্রোগ্রামারকে কিছু না বদলেই দ্রুত হয়। তবে অদৃশ্য মানে অপ্রাসঙ্গিক নয়: যিনি locality বোঝেন, তাঁর কোড একই cache থেকে অনেক বেশি সুবিধা পায়।

প্র ০২১৯৬২ সালের ব্রিটিশ Atlas কম্পিউটারকে virtual memory-র জন্মস্থান বলা হয়। তখনকার কোন সমস্যা মেটাতে paging উদ্ভাবিত হয়েছিল?

Atlas তৈরি হয় ইংল্যান্ডের ম্যানচেস্টার বিশ্ববিদ্যালয়ে, Tom Kilburn-এর নেতৃত্বে, Ferranti কোম্পানির সাথে মিলে; ১৯৬২ সালে চালু হয়। তখন কম্পিউটারের দ্রুত মূল মেমরি (magnetic core) ছিল খুব ছোট আর দামি, আর তার পেছনে ছিল বড় কিন্তু ধীর magnetic drum — ঘুরন্ত চুম্বকের সিলিন্ডার। বড় প্রোগ্রাম চালাতে হলে প্রোগ্রামারকে নিজে কোড লিখতে হতো: কোন অংশ কখন drum থেকে core-এ আনা হবে, কোনটি ফেরত যাবে। এই কাজকে বলা হতো “overlay” — সময়সাপেক্ষ আর ভুলপ্রবণ।

Atlas-এর দল একটি সাহসী সমাধান দেন, নাম দেন “one-level store” — এক-স্তরের ভান্ডার। প্রোগ্রামার core আর drum-কে আলাদা দেখবেন না; তাঁর সামনে থাকবে একটিই বড় ঠিকানার জগৎ। মেমরিকে সমান মাপের page-এ ভাগ করা হলো (প্রতিটি ৫১২ শব্দ), core-এর প্রতিটি page-ঘরের পাশে hardware-এ একটি করে রেজিস্টার রাখা হলো, যাতে লেখা থাকত সেই ঘরে এখন কোন page আছে। প্রোগ্রাম কোনো ঠিকানা চাইলে hardware সব রেজিস্টার একসাথে মিলিয়ে দেখত; page core-এ না থাকলে একটি বিঘ্ন (interrupt) ঘটত, আর supervisor নামের প্রোগ্রাম — আজকের OS-এর পূর্বসূরি — drum থেকে page এনে দিত। এটাই আজকের page fault, এই পর্বের stepper-এর ঠিক সেই ধাপগুলো।

তাঁরা আরও একটি সমস্যায় পড়েন — কোন page সরানো হবে? Atlas-এ একটি “learning program” ছিল, যা page-গুলোর ব্যবহারের ধরন দেখে সিদ্ধান্ত নিত — replacement নীতির প্রথম দিকের একটি রূপ। শুরুতে অনেকে সন্দিহান ছিলেন, কিন্তু অভিজ্ঞতা দেখাল — ঠিকমতো নকশা করলে স্বয়ংক্রিয় paging হাতে লেখা overlay-এর সমান কাজ দেয়, আর প্রোগ্রামারের সময় বাঁচে অনেক। ১৯৭০-এর দশকে IBM-এর বড় কম্পিউটার আর DEC-এর VAX-এ virtual memory মূলধারায় আসে; আজ প্রতিটি PC, ফোন আর সার্ভারে এটি অপরিহার্য।

মূল উপলব্ধি: virtual memory-র জন্ম গতির জন্য নয়, মানুষের সময় বাঁচানোর জন্য — একটি বিমূর্ততা (abstraction, পর্ব ২৩) যা জটিল মেমরি-ব্যবস্থাকে “একটিই বড় মেমরি” হিসেবে দেখায়। নিরাপত্তা আর একাধিক প্রোগ্রাম একসাথে চালানোর সুবিধা এসেছে পরে, একই ধারণার স্বাভাবিক ফল হিসেবে।

প্র ০৩১৯৬০-এর দশকের কিছু কম্পিউটারে আরও প্রোগ্রাম চালু করলে মোট কাজ বাড়ার বদলে হঠাৎ প্রায় শূন্যে নেমে যেত। Peter Denning-এর working set মডেল কীভাবে এর ব্যাখ্যা আর সমাধান দিল?

Virtual memory আর multiprogramming (একসাথে কয়েকটি প্রোগ্রাম চালানো) মিলে ১৯৬০-এর দশকে একটি অদ্ভুত সমস্যা দেখা দেয়। যুক্তি ছিল: যত বেশি প্রোগ্রাম একসাথে চলবে, CPU তত কম অলস থাকবে, মোট কাজ তত বাড়বে। প্রথমে তা-ই হতো। কিন্তু একটি সীমা পার হলেই কাজের পরিমাণ হঠাৎ ধসে পড়ত — CPU প্রায় পুরো সময় অলস, আর ডিস্ক-ড্রাম অবিরাম page আনা-নেওয়ায় ব্যস্ত। প্রকৌশলীরা এর নাম দেন thrashing — এই পর্বের অংশ ৭-এর stepper-এ যা দেখেছেন।

MIT-তে পিএইচডি করার সময় তরুণ Peter Denning এর একটি পরিষ্কার তত্ত্ব দেন। ১৯৬৮ সালে Communications of the ACM-এ প্রকাশিত তাঁর প্রবন্ধ “The Working Set Model for Program Behavior” বলে: প্রতিটি প্রোগ্রামের, যেকোনো মুহূর্তে, সাম্প্রতিক একটি সময়-জানালায় ব্যবহৃত page-গুলোর একটি দল আছে — তার working set. locality-র কারণে এই দল প্রোগ্রামের মোট আকারের চেয়ে অনেক ছোট, আর ধীরে ধীরে বদলায়। একটি প্রোগ্রাম ভালোভাবে চলতে পারে শুধু তখন, যখন তার working set RAM-এ থাকে। একই বছর আরেকটি প্রবন্ধে (“Thrashing: Its Causes and Prevention”) তিনি দেখান, thrashing ঘটে যখন সব চলমান প্রোগ্রামের working set যোগ করলে RAM-এর চেয়ে বড় হয় — তখন প্রতিটি প্রোগ্রাম অন্যের দরকারি page সরিয়ে দেয়, আর একটি page fault ডেকে আনে আরেকটিকে।

সমাধানটিও তত্ত্ব থেকেই আসে: কোনো প্রোগ্রামকে চলতে দেওয়া হবে শুধু তখন, যখন তার পুরো working set-এর জায়গা RAM-এ আছে; না থাকলে কয়েকটি প্রোগ্রামকে সাময়িকভাবে পুরোপুরি থামিয়ে রাখা হবে (suspend). কম প্রোগ্রাম চালিয়ে বেশি কাজ — অর্ধেক জিনিস নিয়ে দশজন রাঁধুনির চেয়ে পুরো জিনিস নিয়ে পাঁচজন বেশি রান্না করেন। আজকের OS-এ page fault-এর হার দেখে মেমরি ভাগ করা আর ফোনে পটভূমির অ্যাপ বন্ধ করে দেওয়ায় এই চিন্তার ছাপ আছে।

মূল উপলব্ধি: সম্পদ ভাগাভাগিতে একটি “ভাঙন-বিন্দু” থাকে — তার ওপারে আরও লোড দিলে মোট কাজ কমে যায়। Denning-এর অবদান ছিল এই বিন্দুটিকে মাপা যায় এমন একটি ধারণায় (working set) বাঁধা। কম RAM-এর ল্যাপটপে ১০টি প্রোগ্রাম একসাথে খোলার চেয়ে একটি-দুটি করে কাজ শেষ করা কেন দ্রুত — এটাই তার দৈনন্দিন শিক্ষা।

প্র ০৪“প্রত্যেক প্রোগ্রামারের জানা উচিত latency-র সংখ্যা” — Jeff Dean-এর জনপ্রিয় করা এই তালিকা কেন আজও প্রাসঙ্গিক, যদিও সংখ্যাগুলো বদলে গেছে?

Google-এর প্রকৌশলী Jeff Dean — যিনি MapReduce, Bigtable-এর মতো বিশাল সিস্টেমের নকশাকারীদের একজন — ২০০৯–২০১০ সালের দিকে কয়েকটি বক্তৃতায় একটি ছোট তালিকা দেখাতেন: “Numbers Everyone Should Know”. তাতে ছিল L1 cache থেকে পড়া (আধা ন্যানোসেকেন্ডের মতো), RAM থেকে পড়া (প্রায় ১০০ ns), SSD থেকে ছোট একটি টুকরো পড়া (শত মাইক্রোসেকেন্ডের ঘরে), ডিস্কে একবার খোঁজা (প্রায় ১০ ms), আর ক্যালিফোর্নিয়া থেকে নেদারল্যান্ডস হয়ে ফিরে আসা একটি নেটওয়ার্ক প্যাকেট (প্রায় ১৫০ ms). এমন তালিকার পূর্বসূরি ছিল Peter Norvig-এর ২০০১ সালের প্রবন্ধ “Teach Yourself Programming in Ten Years”.

তারপর NVMe SSD আর ডেটা সেন্টারের নেটওয়ার্ক অনেক দ্রুত হয়েছে। কিন্তু RAM-এর latency এখনো ১০০ ns-এর আশপাশে, আর আলোর গতি বদলায়নি — ঢাকা থেকে আমেরিকা গিয়ে ফেরার ন্যূনতম সময় পদার্থবিজ্ঞানই ঠিক করে দিয়েছে।

তালিকাটির আসল মূল্য তাই নির্দিষ্ট সংখ্যায় নয়, মাত্রায় (order of magnitude). কোনো সিস্টেমের নকশা করার সময় প্রকৌশলী মুখে মুখে হিসাব করতে পারেন: “প্রতিটি অনুরোধে যদি ডেটাবেস থেকে ১০০টি জিনিস আলাদা আলাদা নেটওয়ার্ক-যাত্রায় আনি, প্রতিটি ১ ms হলে ১০০ ms — ব্যবহারকারী দেরি টের পাবেন। একবারে সব আনলে ১ ms.” কোড লেখার আগেই ভুল নকশা ধরা পড়ে। এই পর্বের মানুষের-সময় টেবিলও একই কাজ করে: RAM “দুই মিনিট” আর SSD “এক দিন” — তাহলে বারবার SSD-তে যাওয়া প্রোগ্রাম কেন ধীর, তা আর ব্যাখ্যা লাগে না।

মূল উপলব্ধি: সঠিক সংখ্যা মুখস্থ নয়, অনুপাতটা মাথায় রাখুন — cache থেকে RAM প্রায় ১০০ গুণ, RAM থেকে SSD প্রায় ১০০০ গুণ, নেটওয়ার্ক আরও বহু গুণ। আর নির্দিষ্ট সংখ্যা লাগলে সবসময় বর্তমান হার্ডওয়্যারের উৎস দেখুন।

প্র ০৫“Memory wall” কী? CPU যত দ্রুত হয়েছে RAM তত দ্রুত হয়নি — আধুনিক চিপগুলো এই দেয়াল কীভাবে টপকানোর চেষ্টা করছে?

১৯৮০ থেকে ২০০০-এর দশকের মাঝামাঝি পর্যন্ত মাইক্রোপ্রসেসরের কর্মক্ষমতা বছরে মোটামুটি ৫০% হারে বেড়েছে — প্রতি দুই বছরে দ্বিগুণের বেশি। কিন্তু DRAM-এর latency কমেছে খুব ধীরে, বছরে মাত্র কয়েক শতাংশ। ১৯৯৫ সালে William Wulf আর Sally McKee একটি ছোট প্রবন্ধে (“Hitting the Memory Wall: Implications of the Obvious”) হিসাব করে দেখান: এভাবে চললে একসময় CPU-র গতি আর কোনো কাজেই আসবে না, কারণ প্রায় পুরো সময়ই যাবে মেমরির অপেক্ষায় — একটি “দেয়াল”। এই memory wall নামটিই টিকে গেছে।

দেয়াল টপকানোর প্রথম অস্ত্র ছিল এই পর্বেরই বিষয়: আরও বড়, আরও বেশি স্তরের cache, আর চতুর prefetcher. AMD ২০২২ সালে Ryzen 7 5800X3D-এ cache-এর ওপর আরেক তলা cache বসিয়ে (3D V-Cache) L3-কে ৯৬ MB-তে নিয়ে যায় — গেমের মতো কাজে বড় লাভ। দ্বিতীয় অস্ত্র latency লুকানো: miss-এর অপেক্ষায় না থেমে পরের স্বাধীন নির্দেশ চালানো।

তৃতীয় অস্ত্র bandwidth আর দূরত্ব: HBM (High Bandwidth Memory) DRAM চিপগুলো তলার পর তলা সাজিয়ে প্রসেসরের একদম পাশে, একই প্যাকেজে বসায়, আর হাজারো সরু সংযোগে একসাথে বিপুল ডেটা পাঠায়। ২০১৩ সালে এর মান (JEDEC standard) প্রকাশিত হয়, ২০১৫ সালে AMD-র গ্রাফিক্স কার্ডে প্রথম বাজারে আসে; আজ AI প্রশিক্ষণের বড় GPU-গুলোর প্রাণ এটাই — বড় ভাষা-মডেল চালানোর গতি প্রায়ই হিসাবের ক্ষমতা নয়, মেমরির bandwidth-ই ঠিক করে। Apple-এর unified memory-ও একই চিন্তার ফল: RAM প্রসেসরের প্যাকেজে, CPU-GPU-র মধ্যে কপি নেই।

মূল উপলব্ধি: আধুনিক কম্পিউটারের গতি এখন অনেকাংশে “কত দ্রুত হিসাব করে” নয়, “কত দ্রুত ডেটা এনে দিতে পারে” — তার প্রশ্ন। তাই চিপ-নকশায় মেমরি হায়ারার্কি পার্শ্বচরিত্র নয়, প্রধান চরিত্র; আর AI-এর যুগে এই দেয়ালই হয়ে উঠেছে সবচেয়ে বড় প্রকৌশল-চ্যালেঞ্জগুলোর একটি।

অনুশীলন

প্রথম দুটি খাতা-কলমের হিসাব, তৃতীয়টি নিজের কম্পিউটারে পর্যবেক্ষণ, শেষটিতে ওপরের সিমুলেটরের একটি সংখ্যা বদলাতে হবে।

  1. Hit ratio-র হিসাব: একটি প্রোগ্রাম মেমরি থেকে ২,০০০ বার ডেটা চাইল; তার মধ্যে ১,৮০০ বার cache-এ পাওয়া গেল। cache-এর সময় ২ ns, RAM-এর সময় ৮০ ns. (ক) hit ratio কত? (খ) সূত্র T = h × Tc + (1 − h) × Tm দিয়ে গড় সময় কত? (গ) cache না থাকার তুলনায় এটি কত গুণ দ্রুত?

    (ক) h = ১,৮০০ ÷ ২,০০০ = ০.৯ বা ৯০%; miss ratio ০.১.

    (খ) T = ০.৯ × ২ + ০.১ × ৮০ = ১.৮ + ৮ = ৯.৮ ns.

    (গ) cache ছাড়া প্রতিবার ৮০ ns; ৮০ ÷ ৯.৮ ≈ ৮.২ গুণ দ্রুত। লক্ষ করুন, গড় সময়ের ৯.৮ ns-এর ৮ ns-ই এসেছে মাত্র ১০% miss থেকে — miss কমানোই আসল লাভ।

  2. দুই স্তরের cache (একটু উচ্চতর): L1-এ খুঁজতে ১ ns, L1-এর miss ratio ১০%. L1-এ না পেলে L2-তে খুঁজতে বাড়তি ১০ ns, আর L2-তে যা চাওয়া হয় তার ২০% সেখানেও মেলে না। তখন RAM থেকে আনতে বাড়তি ১০০ ns. সূত্র “hit time + miss rate × miss penalty” স্তর ধরে ধরে প্রয়োগ করে গড় সময় বের করুন।

    ভেতর থেকে বাইরে যান। L2-এর দিক থেকে: L1-এর একটি miss-এর গড় খরচ = ১০ + ০.২০ × ১০০ = ১০ + ২০ = ৩০ ns.

    এবার L1: গড় সময় = ১ + ০.১০ × ৩০ = ১ + ৩ = ৪ ns. RAM-এর ১০০ ns-এর তুলনায় ২৫ গুণ দ্রুত। L2 না থাকলে হতো ১ + ০.১০ × ১০০ = ১১ ns — অর্থাৎ মাঝের স্তরটি গড় সময় প্রায় তিন ভাগের এক ভাগে নামিয়েছে। এ কারণেই CPU-তে একাধিক স্তরের cache.

  3. নিজের PC পর্যবেক্ষণ: Task Manager → Performance → Memory খুলুন। In use, Available, Committed, Cached আর Slots used লিখে রাখুন। এবার ব্রাউজারে ১৫–২০টি ভারী ট্যাব (ভিডিও, ম্যাপ) খুলে আবার দেখুন। কোন সংখ্যা কতটা বদলাল? তারপর ট্যাবগুলো বন্ধ করে দেখুন। আপনার কম্পিউটার dual-channel-এ চলছে কি না, বলতে পারবেন?

    সাধারণত In use আর Committed দুটোই বাড়বে, Available কমবে। ট্যাব বন্ধ করলে In use কমে, কিন্তু Cached হয়তো বেশিই থাকে — OS ফাঁকা RAM-কে ফাইলের cache হিসেবে ব্যবহার করছে, যা দরকারে সাথে সাথে ছেড়ে দেবে।

    Slots used “2 of 2” বা “2 of 4” হলে সম্ভবত dual-channel (ডেস্কটপে সঠিক স্লটে বসানো থাকলে); “1 of 2” হলে single-channel — তখন একই মাপের আরেকটি স্টিক যোগ করলে bandwidth বাড়বে।

  4. সিমুলেটরে cache বড় করুন: ওপরের JavaScript সিমুলেটরে cache.length === 8-এর ৮ বদলে প্রথমে ১৬, তারপর ৬৪ করে Run চাপুন। কলাম-ধরে-পড়ার ফল কখন বদলায়, আর কেন? Run চাপার আগে অনুমান লিখে রাখুন।

    ১৬ লাইনে: কলাম ধরে পড়ায় এখনো hit 0, miss 1024 — কারণ একটি কলামে ৩২টি আলাদা লাইন লাগে, ১৬টিতে আঁটে না, LRU আবারও প্রতিটি লাইন কাজে লাগার আগে সরিয়ে দেয়। এলোমেলো ক্রমে hit বেড়ে ২৭৪ (২৬.৮%) — বড় cache-এ কাকতালীয় মিল বাড়ে। সারি ধরে পড়া আগের মতোই ৯৬০ hit.

    ৬৪ লাইনে: পুরো ম্যাট্রিক্স (৩২ × ৩২ × ৪ = ৪০৯৬ byte = ৬৪টি লাইন) cache-এ এঁটে যায়। তখন তিন ক্রমেই ফল একই: hit 960, miss 64, hit ratio 93.8% — প্রতিটি লাইন একবার আনতে একটি করে অনিবার্য (compulsory) miss, তারপর সব hit. শিক্ষা: ডেটা cache-এর চেয়ে বড় হলেই পড়ার ক্রম গুরুত্বপূর্ণ হয়ে ওঠে — আর বাস্তবে ছবি, ভিডিও, বড় টেবিল, AI মডেল — প্রায় সব আকর্ষণীয় ডেটাই cache-এর চেয়ে অনেক বড়।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমমেমরির স্তরগুলো সবচেয়ে দ্রুত থেকে সবচেয়ে ধীর ক্রমে সাজান (▲▼ চেপে সরান)

  1. ⚙️ Register
  2. 1️⃣ L1 cache
  3. 2️⃣ L2 cache
  4. 3️⃣ L3 cache
  5. 🧠 RAM (DRAM)
  6. 💾 SSD

কম্পিউটারের মেমরি-স্তরগুলোর মধ্যে কোনটি সবচেয়ে দ্রুত?

  • L1 cache
  • Register
  • RAM
  • NVMe SSD

একটি সিস্টেমে cache-এর hit ratio ৯০%, cache-এর সময় ২ ns আর RAM-এর সময় ৫০ ns. T = h × Tc + (1 − h) × Tm সূত্রে গড় অ্যাক্সেস টাইম কত?

  • ১.৮ ns
  • ২৬ ns
  • ৬.৮ ns
  • ৪৫ ns

একটি প্রোগ্রাম অ্যারের উপাদানগুলো a[0], a[1], a[2]… এভাবে পরপর পড়ছে। cache এখানে মূলত কোন বৈশিষ্ট্যের সুবিধা নিচ্ছে?

  • Spatial locality
  • Temporal locality
  • Thrashing
  • Memory protection

Virtual address-কে physical address-এ অনুবাদ করে CPU-র কোন অংশ?

  • ALU
  • L3 cache
  • DMA কন্ট্রোলার
  • MMU

“Page fault” ঘটে কখন?

  • RAM চিপ নষ্ট হয়ে গেলে
  • প্রোগ্রাম এমন page চাইলে যা এই মুহূর্তে RAM-এ নেই
  • L1 cache-এ ডেটা না পেলে
  • হার্ডডিস্ক পুরো ভরে গেলে

কম RAM-এর একটি কম্পিউটারে অনেক প্রোগ্রাম একসাথে চালালে সেটি প্রায় থেমে যায়, আর ডিস্ক অবিরাম ব্যস্ত থাকে। এই অবস্থার নাম কী?

  • Prefetching
  • Cache hit
  • Thrashing
  • Write-back

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. মেমরি হায়ারার্কি: register → L1 → L2 → L3 → RAM → SSD → HDD → ক্লাউড/টেপ; ওপরে দ্রুত-দামি-ছোট, নিচে ধীর-সস্তা-বড়। L1 থেকে RAM প্রায় ১০০ গুণ, RAM থেকে SSD প্রায় ১০০০ গুণ ধীর (আনুমানিক)।
  2. Locality — temporal (আবার লাগবে) আর spatial (পাশেরটা লাগবে) — এর জোরেই ছোট cache কাজ করে; ডেটা আসে ৬৪ byte-এর cache line-এ।
  3. গড় সময় = h × Tc + (1 − h) × Tm; সময়ের বেশিরভাগ খায় অল্প কয়েকটি miss, তাই hit ratio-র সামান্য উন্নতিও বড় লাভ।
  4. Virtual memory: প্রতিটি process-এর আলাদা address space; ৪ KB page, page table আর MMU (সাথে TLB) ঠিকানা অনুবাদ করে আর অন্যের মেমরিতে ঢুকতে দেয় না।
  5. Page fault স্বাভাবিক, কিন্তু working set RAM-এ না আঁটলে thrashing — সমাধান কম প্রোগ্রাম বা বেশি RAM, page file বন্ধ করা নয়।

পরের পর্বে: এই পর্বে বারবার “অপারেটিং সিস্টেম page আনে, সরায়, টেবিল রাখে” বলেছি। এবার সেই অপারেটিং সিস্টেমের ভেতরে ঢুকব — process কীভাবে তৈরি হয়, একটিমাত্র CPU কীভাবে একসাথে অনেক প্রোগ্রাম চালানোর ভ্রম দেয় (scheduling), আর ফাইলগুলো ডিস্কে আসলে কীভাবে সাজানো থাকে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান