পাঠ ৪৩ · ৫৭-এর মধ্যে · মডিউল ৯
Home / Courses / Computer Architecture & Digital Logic / RAM টেকনোলজি

RAM টেকনোলজি — SRAM বনাম DRAM

RAM technology — SRAM vs DRAM
৭ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • SRAM ও DRAM-এর ভেতরের সার্কিট — ফ্লিপ-ফ্লপ বনাম ক্যাপাসিটর — এবং এর ফলাফল
  • কেন DRAM-কে পর্যায়ক্রমে "রিফ্রেশ" করতে হয়, আর SRAM-কে কেন হয় না
  • গতি/খরচ ট্রেড-অফ কীভাবে সিদ্ধান্ত নেয় কোথায় কোন টেকনোলজি ব্যবহার হবে (ক্যাশ বনাম মেইন মেমরি)
  • রিফ্রেশ মিস হলে DRAM-এ কী ঘটে তার একটি সরল সিমুলেশন

১ · SRAM — ফ্লিপ-ফ্লপ ভিত্তিক মেমরি

SRAM (Static RAM) প্রতিটি বিট ধরে রাখে M3/L14-এ শেখা ফ্লিপ-ফ্লপ সার্কিটের একটি ছোট রূপ দিয়ে — "স্ট্যাটিক" নাম এসেছে এই কারণে যে, পাওয়ার সরবরাহ থাকা পর্যন্ত এটি নিজের মান ধরে রাখে, কোনো পর্যায়ক্রমিক রিফ্রেশের দরকার হয় না। কিন্তু এই স্থিতিশীলতার একটি বাস্তব খরচ আছে — প্রতিটি SRAM বিট-সেল বানাতে সাধারণত ৬টি ট্রানজিস্টর দরকার হয় (ক্রস-কাপলড ইনভার্টার জোড়া প্লাস অ্যাক্সেস ট্রানজিস্টর), যা প্রতি বিটকে তুলনামূলক ব্যয়বহুল ও পাওয়ার-ক্ষুধার্ত করে তোলে। এই কারণেই SRAM ব্যবহৃত হয় শুধু M8-এর ক্যাশের মতো ছোট, দ্রুত মেমরিতে — যেখানে ছোট আকারই খরচ সামলানো সম্ভব করে।

২ · DRAM — ক্যাপাসিটর ভিত্তিক মেমরি

DRAM (Dynamic RAM) সম্পূর্ণ ভিন্ন, সরল একটি সার্কিট ব্যবহার করে — প্রতিটি বিট ধরে রাখা হয় একটি ক্ষুদ্র ক্যাপাসিটরে বৈদ্যুতিক চার্জ হিসেবে, মাত্র ১টি ট্রানজিস্টর + ১টি ক্যাপাসিটর দিয়ে। এত কম উপাদান মানে একই চিপের জায়গায় অনেক বেশি বিট ধরানো যায় — তাই DRAM প্রতি বিটে অনেক সস্তা ও ঘন। কিন্তু একটি বাস্তব সমস্যা আছে — ক্যাপাসিটরের চার্জ স্বাভাবিকভাবেই ধীরে ধীরে "ফুটো" হয়ে যায় (leak করে), তাই প্রতি কয়েক মিলিসেকেন্ড পরপর প্রতিটি বিট পড়ে আবার লিখে (রিফ্রেশ করে) দিতে হয়, নাহলে সংরক্ষিত ডেটা হারিয়ে যায়। এই রিফ্রেশের প্রয়োজনীয়তার কারণেই একে "ডাইনামিক" বলা হয় — এবং এই একই কারণে DRAM কিছুটা ধীর, কারণ রিফ্রেশ সাইকেলগুলো নিয়মিত রিড/রাইট অ্যাক্সেসের সাথে হার্ডওয়্যার শেয়ার করে প্রতিদ্বন্দ্বিতা করে। এই গতি/খরচ ট্রেড-অফের কারণেই DRAM ব্যবহৃত হয় M8-এর "RAM" স্তরের মতো বড় মেইন মেমরিতে, যেখানে SRAM ব্যবহার করলে খরচ প্রায় অসম্ভব হয়ে যেত।

SRAM বিট-সেল ৬টি ট্রানজিস্টর (ক্রস-কাপলড ফ্লিপ-ফ্লপ) রিফ্রেশ লাগে না দ্রুত · ব্যয়বহুল · ক্যাশে ব্যবহৃত DRAM বিট-সেল ১টি ট্রানজিস্টর + ১টি ক্যাপাসিটর পর্যায়ক্রমিক রিফ্রেশ লাগে সস্তা · ঘন · মেইন মেমরিতে ব্যবহৃত
একই কাজ (১ বিট ধরে রাখা) — সম্পূর্ণ ভিন্ন সার্কিট, ভিন্ন গতি/খরচ/রিফ্রেশ-প্রয়োজনীয়তার ট্রেড-অফ।
ট্রানজিস্টর/বিট
SRAM: ৬ · DRAM: ১ (+ক্যাপাসিটর)
রিফ্রেশ
SRAM: দরকার নেই · DRAM: প্রতি কয়েক মিলিসেকেন্ডে দরকার
গতি ও খরচ
SRAM: দ্রুত, ব্যয়বহুল · DRAM: ধীর, সস্তা ও ঘন
Python
# SRAM বনাম DRAM -- বৈশিষ্ট্য তুলনা টেবিল + রিফ্রেশ না হলে DRAM-এ কী ঘটে তার সিমুলেশন
memory_tech = {
    "SRAM": {
        "transistors_per_bit": 6,
        "needs_refresh": False,
        "relative_speed": "খুব দ্রুত (CPU ক্লকের কাছাকাছি)",
        "relative_cost_per_bit": "বেশি",
        "typical_use": "ক্যাশ (L1/L2/L3)",
    },
    "DRAM": {
        "transistors_per_bit": 1,
        "needs_refresh": True,
        "relative_speed": "তুলনামূলক ধীর",
        "relative_cost_per_bit": "কম",
        "typical_use": "মেইন মেমরি (RAM)",
    },
}

print(f"{'ধরন':<8}{'ট্রানজিস্টর/বিট':<18}{'রিফ্রেশ দরকার?':<18}{'সাধারণ ব্যবহার'}")
print("-" * 60)
for name, props in memory_tech.items():
    print(f"{name:<8}{props['transistors_per_bit']:<18}{str(props['needs_refresh']):<18}{props['typical_use']}")

print()

class SRAMSimulation:
    """ফ্লিপ-ফ্লপ ভিত্তিক -- পাওয়ার থাকলে সময় যতই যাক, ডেটা অক্ষত"""
    def access(self, current_time):
        return "ডেটা অক্ষত (ফ্লিপ-ফ্লপ রিফ্রেশ ছাড়াই ধরে রাখে)"

class DRAMSimulation:
    """ক্যাপাসিটর ভিত্তিক -- refresh_interval পার হয়ে গেলে চার্জ ফুটো হয়ে ডেটা হারায়"""
    def __init__(self, refresh_interval):
        self.refresh_interval = refresh_interval
        self.last_refresh = 0

    def refresh(self, current_time):
        self.last_refresh = current_time

    def access(self, current_time):
        elapsed = current_time - self.last_refresh
        if elapsed > self.refresh_interval:
            return f"ডেটা হারিয়ে গেছে! (শেষ রিফ্রেশের {elapsed} একক পর, সীমা ছিল {self.refresh_interval})"
        return f"ডেটা অক্ষত (শেষ রিফ্রেশের {elapsed} একক পর, সীমার মধ্যে)"

sram = SRAMSimulation()
dram = DRAMSimulation(refresh_interval=64)

print("SRAM, সময়=10000 এ অ্যাক্সেস:", sram.access(current_time=10_000))
print("DRAM, সময়=30 এ অ্যাক্সেস (রিফ্রেশের মধ্যে):", dram.access(current_time=30))
print("DRAM, সময়=100 এ অ্যাক্সেস (রিফ্রেশ ছাড়াই):", dram.access(current_time=100))

    
লক্ষ্য করুন — SRAM সিমুলেশনে সময় যতই বড় হোক (এমনকি ১০,০০০ একক), ডেটা কখনো হারায় না, কারণ ফ্লিপ-ফ্লপ ভিত্তিক সার্কিটে কোনো "ফুটো" হওয়ার প্রক্রিয়া নেই। কিন্তু DRAM সিমুলেশনে refresh_interval (৬৪ একক) পার হয়ে গেলেই ডেটা হারিয়ে যাওয়ার সতর্কতা আসে — বাস্তব হার্ডওয়্যারে এই কাজটাই মেমরি কন্ট্রোলার স্বয়ংক্রিয়ভাবে, প্রতিটি রিফ্রেশ ইন্টারভাল শেষ হওয়ার আগেই, ব্যাকগ্রাউন্ডে করে রাখে যাতে প্রোগ্রামারকে এ নিয়ে ভাবতেই না হয়।
মূল কথা · Key takeaway

SRAM ও DRAM একই কাজ (১ বিট মেমরি) সমাধান করে সম্পূর্ণ ভিন্ন সার্কিট দিয়ে — ফ্লিপ-ফ্লপ বনাম ক্যাপাসিটর। এই নকশাগত পার্থক্যই সরাসরি গতি, খরচ ও রিফ্রেশ-প্রয়োজনীয়তা নির্ধারণ করে, এবং সেই কারণেই একটি বাস্তব কম্পিউটারে দুটোই একসাথে থাকে — দ্রুত-ব্যয়বহুল SRAM ছোট ক্যাশে, সস্তা-ধীর DRAM বড় মেইন মেমরিতে।

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

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ যদি DRAM এত ঝামেলার (রিফ্রেশ দরকার, ধীর) হয়, তাহলে পুরো মেইন মেমরিটাই কেন SRAM দিয়ে বানানো হয় না?

খরচের কারণে। SRAM-এর প্রতি বিটে ৬টি ট্রানজিস্টর দরকার, DRAM-এর মাত্র ১টি। একটি আধুনিক কম্পিউটারের মেইন মেমরি কয়েক গিগাবাইট থেকে শুরু হয় — এই পরিমাণ মেমরি যদি SRAM দিয়ে বানানো হতো, চিপের আকার ও দাম এত বেড়ে যেত যে সাধারণ ব্যবহারকারীর জন্য অসম্ভব হয়ে যেত। DRAM-এর রিফ্রেশ-ঝামেলা মেনে নেওয়াটাই বাস্তবসম্মত ট্রেড-অফ, যেখানে SRAM শুধু ছোট, পারফরম্যান্স-ক্রিটিক্যাল জায়গায় (ক্যাশ) সংরক্ষিত থাকে।

প্র ০২ DRAM-এর রিফ্রেশ প্রক্রিয়া চলাকালীন সময়ে CPU কি সেই মেমরি ব্যবহার করতে পারে?

না, রিফ্রেশ চলাকালীন সেই নির্দিষ্ট মেমরি সারি (row) সাময়িকভাবে সাধারণ রিড/রাইট অ্যাক্সেসের জন্য উপলব্ধ থাকে না — এটাই ঠিক সেই কারণ যা এই পাঠে বলা হয়েছে DRAM-কে SRAM-এর চেয়ে "কিছুটা ধীর" করে তোলে। মেমরি কন্ট্রোলার রিফ্রেশ ও স্বাভাবিক অ্যাক্সেসের মধ্যে সময় ভাগাভাগি করে (time-sharing) পরিচালনা করে, যাতে সামগ্রিকভাবে ডেটা কখনো না হারায়, কিন্তু এই ভাগাভাগির খরচটাই DRAM-এর গতিতে সামান্য প্রভাব ফেলে।

প্র ০৩ উপরের কোড সেলে DRAMSimulation.access() মেথডটি নিজে থেকেই রিফ্রেশ করে দেয় না কেন — শুধু "ডেটা হারিয়ে গেছে" বার্তা দেয়?

এটি ইচ্ছাকৃতভাবে সরল রাখা হয়েছে যাতে রিফ্রেশ-না-হওয়ার বাস্তব পরিণতিটা স্পষ্ট দেখা যায় — বাস্তব DRAM-এ একটি আলাদা, স্বয়ংক্রিয় হার্ডওয়্যার মেকানিজম (মেমরি কন্ট্রোলারের রিফ্রেশ টাইমার) থাকে যা refresh_interval পার হওয়ার আগেই প্রতিটি সারি রিফ্রেশ করে দেয়, কখনো সেই সীমা পার হতে দেয় না। এই সিমুলেশনটি বরং সেই মেকানিজম যদি ব্যর্থ হয় (বা না থাকত) তাহলে কী ঘটত তা দেখানোর জন্য — বাস্তব সিস্টেমে এই "ডেটা হারানো" অবস্থা স্বাভাবিক পরিস্থিতিতে কখনো ঘটে না।

অনুশীলন

  1. হিসাব করুন: উপরের কোড সেলে DRAMSimulation(refresh_interval=64)-এ যদি refresh() সময়=৫০-এ কল করা হয়, তারপর সময়=৯০-এ access() কল করা হয় — ডেটা অক্ষত থাকবে নাকি হারিয়ে যাবে?

    অক্ষত থাকবে। refresh(50) কল করার পর last_refresh = 50 হয়ে যায়। সময়=৯০-এ অ্যাক্সেস করলে elapsed = ৯০ - ৫০ = ৪০, যা refresh_interval (৬৪)-এর চেয়ে কম — তাই ডেটা অক্ষত থাকবে। এটাই দেখায় বাস্তব হার্ডওয়্যারে সময়মতো রিফ্রেশ করাটাই ডেটা হারানো এড়ানোর মূল চাবিকাঠি।

  2. চিন্তা করুন: ক্যাশের জন্য SRAM ব্যবহারের সিদ্ধান্তটা M8-এর AMAT সূত্রের (L41-L42) সাথে কীভাবে সরাসরি যুক্ত?

    AMAT সূত্রে HitTime একটি গুরুত্বপূর্ণ উপাদান — এটি যত কম হয়, সামগ্রিক AMAT তত কম হয়। যদি ক্যাশ DRAM দিয়ে বানানো হতো, HitTime অনেক বেশি হতো (DRAM ধীর), এবং L42-এর ২.৫-সাইকেল ফলাফলের মতো চমৎকার AMAT পাওয়া সম্ভব হতো না। SRAM-এর উচ্চ গতি (কম HitTime) সরাসরি ক্যাশের মূল উদ্দেশ্যকেই সম্ভব করে তোলে — এই কারণেই খরচ বেশি হওয়া সত্ত্বেও ক্যাশে SRAM-ই একমাত্র বাস্তবসম্মত পছন্দ।

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

আগের পাঠ
মাল্টি-লেভেল ক্যাশ (L1/L2/L3)