ROM ও ফ্ল্যাশ মেমরি
এই পাঠে যা শিখবেন
- Volatile বনাম non-volatile মেমরির পার্থক্য এবং কেন এটি সবচেয়ে গুরুত্বপূর্ণ ব্যবহারিক বৈশিষ্ট্য
- ROM-এর ঐতিহাসিক বিবর্তন — মাস্ক ROM থেকে EEPROM পর্যন্ত রিরাইটেবিলিটির দিকে যাত্রা
- ফ্ল্যাশ মেমরি কীভাবে কাজ করে এবং কেন এটি ব্লক-ভিত্তিক ইরেজ ব্যবহার করে
- ফ্ল্যাশ সেলের সীমিত জীবনকাল কেন ঘটে — এবং OS কোর্সের wear-leveling সমাধানের সাথে সংক্ষিপ্ত সংযোগ
১ · ROM — Non-volatile মেমরি
L43-এ দেখা SRAM ও DRAM দুটোরই একটি সাধারণ দুর্বলতা আছে — পাওয়ার বন্ধ হয়ে গেলে সংরক্ষিত সব ডেটা মুহূর্তেই হারিয়ে যায় (এদের বলা হয় volatile মেমরি)। কিন্তু একটি কম্পিউটার প্রথম চালু হওয়ার মুহূর্তে — যখন এখনো কোনো অপারেটিং সিস্টেম লোড হয়নি, RAM-ও এখনো প্রস্তুত হয়নি — তখন প্রথম নির্দেশনাগুলো কোথা থেকে আসে? এই প্রশ্নের উত্তরই ROM (Read-Only Memory) — এমন মেমরি যা পাওয়ার ছাড়াও ডেটা ধরে রাখে (non-volatile)। ঐতিহাসিকভাবে মাস্ক ROM প্রস্তুতকালেই স্থায়ীভাবে প্রোগ্রাম করা হতো — উৎপাদনের পর একেবারেই পরিবর্তনযোগ্য ছিল না। এই non-volatility-ই এর একমাত্র গুরুত্ব নয়, বরং সবচেয়ে গুরুত্বপূর্ণ বাস্তবিক গুণ — যা দিয়ে বুট/ফার্মওয়্যার কোড নির্ভরযোগ্যভাবে সংরক্ষণ করা যায়, যা কম্পিউটার চালু হওয়ার প্রথম মুহূর্তেই প্রস্তুত থাকতে হয়।
২ · রিরাইটেবিলিটির দিকে বিবর্তন — PROM, EPROM, EEPROM
মাস্ক ROM-এর "একবারই তৈরি, কখনো বদলানো যায় না" সীমাবদ্ধতা কাটিয়ে ওঠার জন্য ধাপে ধাপে উন্নতি হয়েছে —
- PROM (Programmable ROM): উৎপাদনের পর একবার প্রোগ্রাম করা যায় — এরপর আর বদলানো যায় না।
- EPROM (Erasable PROM): UV আলোর সংস্পর্শে এনে মোছা যায় (আক্ষরিক অর্থে একটি ছোট স্বচ্ছ জানালা দিয়ে UV আলো ফেলে), তারপর নতুন করে প্রোগ্রাম করা যায়।
- EEPROM (Electrically-Erasable PROM): কোনো বিশেষ যন্ত্রপাতি বা UV আলো ছাড়াই, শুধুমাত্র বৈদ্যুতিক সিগন্যাল দিয়েই মোছা ও পুনরায় লেখা যায় — আধুনিক ফ্ল্যাশ মেমরির সরাসরি পূর্বসূরি।
৩ · ফ্ল্যাশ মেমরি — আধুনিক non-volatile স্টোরেজ
ফ্ল্যাশ মেমরি EEPROM-এর মতোই সেল ব্যবহার করে, কিন্তু একটি গুরুত্বপূর্ণ ডিজাইন পার্থক্যসহ — একক বাইট নয়, বরং বড় ব্লক একসাথে দ্রুত ইরেজ/রাইট করার জন্য অপ্টিমাইজড (একক-বাইট ইরেজ EEPROM-এ ধীর হতো)। এই ব্লক-ভিত্তিক নকশাই ফ্ল্যাশকে USB ড্রাইভ, SSD এবং এমবেডেড ডিভাইস স্টোরেজে ব্যবহারযোগ্য করে তুলেছে — যেখানে বড় পরিমাণ ডেটা দ্রুত লেখা/মোছার দরকার হয়।
একটি গুরুত্বপূর্ণ বাস্তব সীমাবদ্ধতা: প্রতিটি ফ্ল্যাশ সেল সীমিত সংখ্যক রাইট/ইরেজ সাইকেলের পর নষ্ট
হয়ে যায় — কারণ প্রতিটি ইরেজ সাইকেল সেলের ভেতরের ইনসুলেটিং স্তরের উপর প্রকৃত ভৌত চাপ ফেলে, যা সময়ের সাথে সাথে
জমতে থাকে। ../operating-systems/ কোর্সের SSD পাঠে এই সীমাবদ্ধতা মোকাবিলার সফটওয়্যার-স্তরের সমাধান
(wear leveling — লেখা সব সেলে সমানভাবে ছড়িয়ে দেওয়া) কভার করা হয়েছে; এখানে আমরা শুধু বুঝছি কেন এই সীমা
আসলে অস্তিত্বশীল — এটি একটি হার্ডওয়্যার-স্তরের সত্য যা সফটওয়্যার সমাধানের প্রয়োজনীয়তা তৈরি করে।
# চারটি মেমরি টেকনোলজির তুলনা -- volatile/non-volatile পার্থক্যটাই সবচেয়ে গুরুত্বপূর্ণ কলাম
memory_types = {
"ROM": {"volatile": False, "rewritable": "না (বা EEPROM/ফ্ল্যাশ ভ্যারিয়েন্টে সীমিতভাবে)", "typical_use": "বুট/ফার্মওয়্যার কোড"},
"Flash": {"volatile": False, "rewritable": "হ্যাঁ (ব্লক-ভিত্তিক, সীমিত রাইট-সাইকেল)", "typical_use": "USB ড্রাইভ, SSD, এমবেডেড স্টোরেজ"},
"SRAM": {"volatile": True, "rewritable": "হ্যাঁ (সীমাহীন, পাওয়ার থাকা পর্যন্ত)", "typical_use": "ক্যাশ (L1/L2/L3)"},
"DRAM": {"volatile": True, "rewritable": "হ্যাঁ (সীমাহীন, পাওয়ার থাকা পর্যন্ত)", "typical_use": "মেইন মেমরি (RAM)"},
}
print(f"{'ধরন':<8}{'Volatile?':<12}{'Rewritable':<45}{'সাধারণ ব্যবহার'}")
print("-" * 95)
for name, props in memory_types.items():
flag = "হ্যাঁ (পাওয়ার ছাড়া ডেটা হারায়)" if props["volatile"] else "না (পাওয়ার ছাড়াও ডেটা থাকে)"
print(f"{name:<8}{flag:<12}{props['rewritable']:<45}{props['typical_use']}")
print()
# ফ্ল্যাশ সেলের সীমিত জীবনকাল -- একটি সরল সিমুলেশন
class FlashCell:
def __init__(self, max_erase_cycles):
self.max_erase_cycles = max_erase_cycles
self.erase_count = 0
def erase_and_write(self):
if self.erase_count >= self.max_erase_cycles:
return "লেখা ব্যর্থ! সেল ক্ষয়প্রাপ্ত (max_erase_cycles ছাড়িয়ে গেছে)"
self.erase_count += 1
return f"সফলভাবে লেখা হলো (মোট ইরেজ সাইকেল: {self.erase_count}/{self.max_erase_cycles})"
cell = FlashCell(max_erase_cycles=3)
for attempt in range(1, 5):
print(f"চেষ্টা {attempt}:", cell.erase_and_write())
max_erase_cycles সাধারণত কয়েক হাজার থেকে কয়েক লক্ষ পর্যন্ত হয় (উপরের কোডে
উদাহরণের জন্য মাত্র ৩ ব্যবহার করা হয়েছে যাতে ব্যর্থতা দ্রুত দেখা যায়) — কিন্তু নীতিটি একই: প্রতিটি ইরেজ সাইকেল
সেলের জীবনকাল থেকে একধাপ কমিয়ে দেয়। এই কারণেই SSD কন্ট্রোলার wear leveling ব্যবহার করে (OS কোর্সে বিস্তারিত) —
যাতে একই সেল বারবার ইরেজ না হয়ে, লেখা সব সেলে ছড়িয়ে যায়।
ROM ও ফ্ল্যাশ উভয়েই non-volatile — পাওয়ার ছাড়াও ডেটা টিকে থাকে, যা SRAM/DRAM-এর সম্পূর্ণ বিপরীত বৈশিষ্ট্য। মাস্ক ROM থেকে ফ্ল্যাশ পর্যন্ত ঐতিহাসিক যাত্রাটা মূলত রিরাইটেবিলিটি বাড়ানোর যাত্রা, কিন্তু ফ্ল্যাশের ব্লক-ভিত্তিক দ্রুত-রাইট সুবিধারও একটি বাস্তব খরচ আছে — সীমিত সেল জীবনকাল, যা সফটওয়্যার-স্তরে wear leveling দিয়ে সামলাতে হয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি ফ্ল্যাশ মেমরিও EEPROM-এর মতো বৈদ্যুতিকভাবে রিরাইটেবল, তাহলে ফ্ল্যাশকে আলাদা টেকনোলজি হিসেবে গণ্য করা হয় কেন?
মূল পার্থক্যটা রাইট/ইরেজের একক নিয়ে — সাধারণ EEPROM একবারে একটি বাইট মোছা/লেখার জন্য ডিজাইন করা, যা বড় পরিমাণ ডেটার জন্য ধীর। ফ্ল্যাশ মেমরি ইচ্ছাকৃতভাবে বড় ব্লক (যেমন কয়েক কিলোবাইট) একসাথে ইরেজ করার জন্য অপ্টিমাইজড করা হয়েছে — এই একটি ডিজাইন সিদ্ধান্তই ফ্ল্যাশকে USB ড্রাইভ বা SSD-এর মতো বড়-পরিমাণ স্টোরেজে ব্যবহারযোগ্য গতি দেয়, যেখানে সাধারণ EEPROM ব্যবহার করলে সেই গতি সম্ভব হতো না।
প্র ০২ একটি কম্পিউটারের BIOS/ফার্মওয়্যার আজকাল প্রায়ই ফ্ল্যাশ মেমরিতে রাখা হয়, পুরনো মাস্ক ROM-এ নয়। এটি কেন একটি বাস্তবিক উন্নতি?
মাস্ক ROM-এ থাকা ফার্মওয়্যার একবার তৈরি হয়ে গেলে আর কখনো আপডেট করা যেত না — কোনো বাগ পাওয়া গেলে বা নিরাপত্তা দুর্বলতা ধরা পড়লে পুরো চিপ বদলাতে হতো। ফ্ল্যাশে রাখলে (একে বলা হয় "ফ্ল্যাশেবল BIOS") নির্মাতা সফটওয়্যার আপডেটের মাধ্যমেই ফার্মওয়্যার পুনরায় লিখতে পারে — একটি non-volatile মেমরির স্থায়িত্ব আর রিরাইটেবিলিটির সুবিধা একসাথে পাওয়া যায়, যদিও (এই পাঠের সীমিত-সাইকেল আলোচনা অনুযায়ী) এই আপডেট অসীমবার করা যায় না।
প্র ০৩
উপরের কোড সেলে FlashCell(max_erase_cycles=3)-এর ৪র্থ চেষ্টায় লেখা ব্যর্থ হয় কেন, ঠিক ৩য় বার নয়?
কারণ প্রথম তিনটি সফল চেষ্টা (attempt ১, ২, ৩) প্রতিবার erase_count-কে ০→১→২→৩
বাড়িয়েছে, ঠিক max_erase_cycles=3-এর সীমা পর্যন্ত পৌঁছেছে কিন্তু অতিক্রম করেনি। ৪র্থ চেষ্টার
শুরুতে erase_count ইতিমধ্যেই ৩, যা >= max_erase_cycles শর্তকে সত্য করে তোলে —
তাই সেই চেষ্টাতেই ব্যর্থতা ঘটে। এটি একটি সাধারণ "অফ-বাই-ওয়ান" যাচাইয়ের ভালো উদাহরণ যা বাস্তব সেল-জীবনকাল
ট্র্যাকিং লজিকে সঠিকভাবে হ্যান্ডল করতে হয়।
অনুশীলন
-
চিন্তা করুন: একটি ডিজিটাল ক্যামেরার ফার্মওয়্যার (যা কখনো বদলানোর দরকার নেই বলে নির্মাতা ধরে নিয়েছেন) বনাম একটি স্মার্টফোনের ফার্মওয়্যার (যেখানে ঘন ঘন সিকিউরিটি আপডেট দরকার) — কোনটাতে মাস্ক ROM আর কোনটাতে ফ্ল্যাশ ব্যবহার করা যুক্তিসঙ্গত?
ডিজিটাল ক্যামেরার সরল, কম-আপডেট-প্রয়োজনীয় ফার্মওয়্যারে মাস্ক ROM ব্যবহার যুক্তিসঙ্গত হতে পারে (কম খরচ, এবং নির্মাতা নিশ্চিত যে বদলানোর দরকার হবে না)। স্মার্টফোনের ফার্মওয়্যারে অবশ্যই ফ্ল্যাশ প্রয়োজন, কারণ নিয়মিত সিকিউরিটি প্যাচ ও ফিচার আপডেট আসতেই থাকে — রিরাইটেবিলিটি ছাড়া এগুলো সম্ভবই হতো না। বাস্তবে অবশ্য আজকাল প্রায় সব ডিভাইসেই ফ্ল্যাশ ব্যবহৃত হয়, কারণ আপডেট-প্রয়োজনীয়তা ভবিষ্যদ্বাণী করা কঠিন।
-
পরীক্ষা করুন: উপরের কোড সেলে
memory_typesডিকশনারিতে যদি একটি নতুন এন্ট্রি "EEPROM" যোগ করতে হয় (volatile=False, ছোট আকারে বাইট-লেভেল রিরাইটেবল, ব্যবহার: ছোট কনফিগারেশন ডেটা সংরক্ষণ), এটি ফ্ল্যাশের থেকে কীভাবে আলাদা হবে তার মূল একটি পার্থক্য লিখুন (এখনই কোড পরিবর্তন করবেন না)।মূল পার্থক্য হবে ইরেজ/রাইট-এর একক — EEPROM একবারে একটি বাইট মুছে/লিখতে পারে (ধীর কিন্তু নমনীয়), যেখানে ফ্ল্যাশ বড় ব্লক একসাথে মোছে (দ্রুত কিন্তু কম নমনীয়, কারণ একটি বাইট বদলাতে হলেও পুরো ব্লক পুনরায় লিখতে হতে পারে)। এই কারণেই EEPROM এখনো ছোট, কম-ঘন-ঘন-পরিবর্তিত কনফিগারেশন ডেটার জন্য ব্যবহৃত হয়, আর ফ্ল্যাশ বড় আকারের স্টোরেজে (SSD, USB) ব্যবহৃত হয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ পরবর্তী পাঠ — মেমরি অর্গানাইজেশন ও ইন্টারলিভিং: একাধিক মেমরি ব্যাংক দিয়ে ব্যান্ডউইথ বাড়ানো।
- Operating Systems কোর্স সহোদর কোর্স SSD-বনাম-HDD-এর স্টোরেজ-ডিভাইস-স্তরের তুলনা ও wear-leveling সেখানে বিস্তারিত কভার করা হয়েছে — এই পাঠ শুধু ফ্ল্যাশের হার্ডওয়্যার মেকানিজম কভার করে।