কম্পিউটার টিউটোরিয়াল

DBMS-এ ডেডলক (Deadlocks)


একটি ডেডলক ঘটে যখন দুটি বা ততোধিক প্রসেস তাদের এক্সিকিউশন पूरा করার জন্য কিছু রিসোর্স দরকার করে যা অন্য প্রসেস দ্বারা ধারিত রয়েছে। DBMS-এ ডেডলক (Deadlocks)

উপরের ডায়াগ্রামে, প্রসেস 1-র রিসোর্স 1 আছে এবং রিসোর্স 2 দরকার। একইভাবে প্রসেস 2-র রিসোর্স 2 আছে এবং রিসোর্স 1 দরকার। এই প্রসেসগুলোকে একে অপরের রিসোর্স দরকার কাজ শেষ করতে কিন্তু কেউ তাদের রিসোর্স ছাড়তে চায় না। তাই, প্রসেস 1 এবং প্রসেস 2 ডেডলকে পড়ে।

কফম্যান শর্তাবলী (Coffman Conditions)

একটি ডেডলক তখনই ঘটবে যখন চারটি কফম্যান শর্তাবলী সত্য হবে। এই শর্তাবলীগুলোর পেরমুচুয়ালি এক্সক্লুসিভ হওয়া বাধ্যতামূলক নয়। তারা হলো:

পারস্পরিক বর্জন (Mutual Exclusion)

একটি রিসোর্স থাকা উচিত যা একবারে শুধু একটি প্রসেস ধারণ করতে পারে। নিচের ডায়াগ্রামে, রিসোর্স R1-র একটি একক ইনস্ট্যান্স আছে এবং সেটি প্রসেস P1-ই ধারণ করছে।

DBMS-এ ডেডলক (Deadlocks)

হোল্ড অ্যান্ড ওয়েট (Hold and Wait)

একটি প্রসেস একাধিক রিসোর্স ধারণ করতে পারে এবং এখনও অন্য প্রসেস থেকে আরও রিসোর্স অনুরোধ করতে পারে যারা সেগুলো ধারণ করছে। নিচের ডায়াগ্রামে, প্রসেস P1 রিসোর্স R1 এবং R2 ধারণ করছে এবং রিসোর্স R3 অনুরোধ করছে যা প্রসেস P2 ধারণ করছে।

DBMS-এ ডেডলক (Deadlocks)

নো প্রিম্পশন (No Preemption)

একটি রিসোর্স জোর করে কোনো প্রসেস থেকে প্রিম্পট করা যায় না। একটি প্রসেস শুধু স্বেচ্ছায় একটি রিসোর্স মুক্ত করতে পারে। নিচের ডায়াগ্রামে, প্রসেস P1 প্রসেস P2 থেকে রিসোর্স R3 প্রিম্পট করতে পারে না। এটি শুধু তখন মুক্ত হবে যখন P2 এক্সিকিউশন শেষে স্বেচ্ছায় ছাড়বে।

DBMS-এ ডেডলক (Deadlocks)

সার্কুলার ওয়েট (Circular Wait)

একটি প্রসেক দ্বিতীয় প্রসেস দ্বারা ধারিত রিসোর্সের জন্য অপেক্ষা করছে, দ্বিতীয় প্রসেস তৃতীয় প্রসেস দ্বারা ধারিত রিসোর্সের জন্য অপেক্ষা করছে এবং এভাবে চলতে চলতে শেষ প্রসেস প্রথম প্রসেস দ্বারা ধারিত রিসোর্সের জন্য অপেক্ষা করছে। এটি একটি সার্কুলার চেইন গঠন করে। উদাহরণস্বরূপ: প্রসেস P1-র রিসোর্স R1 অ্যালোকেট করা আছে এবং সেটি রিসোর্স R2 অনুরোধ করছে। একইভাবে, প্রসেস P2-র রিসোর্স R2 অ্যালোকেট করা আছে এবং সেটি রিসোর্স R1 অনুরোধ করছে। এটি একটি সার্কুলার ওয়েট লুপ গঠন করে।

একটি প্রসেস দ্বিতীয় প্রসেস দ্বারা ধারিত রিসোর্সের জন্য অপেক্ষা করছে, দ্বিতীয় প্রসেস তৃতীয় প্রসেস দ্বারা ধারিত রিসোর্সের জন্য অপেক্ষা করছে এবং এভাবে চলতে চলতে শেষ প্রসেস প্রথম প্রসেস দ্বারা ধারিত রিসোর্সের জন্য অপেক্ষা করছে। এটি একটি সার্কুলার চেইন গঠন করে। উদাহরণস্বরূপ: প্রসেস P1-র রিসোর্স R1 অ্যালোকেট করা আছে এবং সেটি রিসোর্স R2 অনুরোধ করছে। একইভাবে, প্রসেস P2-র রিসোর্স R2 অ্যালোকেট করা আছে এবং সেটি রিসোর্স R1 অনুরোধ করছে। এটি একটি সার্কুলার ওয়েট লুপ গঠন করে।

DBMS-এ ডেডলক (Deadlocks)

ডেডলক ডিটেকশন (Deadlock Detection)

রিসোর্স শিডিউলার ডেডলক ডিটেক্ট করতে পারে কারণ এটি সকল রিসোর্স ট্র্যাক করে যা বিভিন্ন প্রসেসের জন্য অ্যালোকেট করা আছে। ডেডলক ডিটেক্ট হওয়ার পর, নিম্নলিখিত পদ্ধতিতে সমাধান করা যায়:

  • ডেডলকে জড়িত সকল প্রসেস টার্মিনেট করা। এটি ভালো পদ্ধতি নয় কারণ প্রসেসগুলো দ্বারা অর্জিত সব প্রগতি ধ্বস্ত হয়।
  • কিছু প্রসেস থেকে রিসোর্স প্রিম্পট করে অন্যদের দেওয়া যতক্ষণ না ডেডলক সমাধান হয়।

ডেডলк প্রিভেনশন (Deadlock Prevention)

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

কিছু ডেডলক প্রিভেনশন স্কিম রয়েছে যা টাইমস্ট্যাম্প ব্যবহার করে ডেডলক না ঘটতে নিশ্চিত করে। তারা হলো:

  • ওয়েট-ডাই স্কিম (Wait - Die Scheme)

    ওয়েট-ডাই স্কিমে, যদি একটি ট্রানজ্যাকশন T1 এমন একটি রিসোর্স অনুরোধ করে যা ট্রানজ্যাকশন T2 দ্বারা ধারিত, তবে নিম্নলিখিত দুটি সম্ভাবনা ঘটতে পারে:

    • TS(T1) < TS(T2) - যদি T1, T2-র চেয়ে পুরানো হয় অর্থাৎ T1 সিস্টেমে T2-র আগে এল, তবে সেটি রিসোর্সের জন্য অপেক্ষা করতে দেওয়া হয় যা T2 এক্সিকিউশন শেষে মুক্ত হবে।
    • TS(T1) > TS(T2) - যদি T1, T2-র চেয়ে যুবক হয় অর্থাৎ T1 সিস্টেমে T2-র পরে এল, তবে T1 কিল করা হয়। সেটি পরবর্তীতে একই টাইমস্ট্যাম্পের সাথে রিস্টার্ট করা হয়।

  • ওন্ড-ওয়েট স্কিম (Wound - Wait Scheme)

    ওন্ড-ওয়েট স্কিমে, যদি একটি ট্রানজ্যাকশন T1 এমন একটি রিসোর্স অনুরোধ করে যা ট্রানজ্যাকশন T2 দ্বারা ধারিত, তবে নিম্নলিখিত দুটি সম্ভাবনা ঘটতে পারে:

    • TS(T1) < TS(T2) - যদি T1, T2-র চেয়ে পুরানো হয় অর্থাৎ T1 সিস্টেমে T2-র আগে এল, তবে সেটি T2-র রোল ব্যাক বা ওন্ড করার অনুমতি পায়। তারপর T1 রিসোর্স নেয় এবং এক্সিকিউশন সম্পন্ন করে। T2 পরবর্তীতে একই টাইমস্ট্যাম্পের সাথে রিস্টার্ট করা হয়।
    • TS(T1) > TS(T2) - যদি T1, T2-র চেয়ে যুবক হয় অর্থাৎ T1 সিস্টেমে T2-র পরে এল, তবে সেটি রিসোর্সের জন্য অপেক্ষা করতে দেওয়া হয় যা T2 এক্সিকিউশন শেষে মুক্ত হবে।

ডেডলক এভয়েডেন্স (Deadlock Avoidance)

ডেডলক ঘটার পর ব্যবস্থা নেওয়ার চেয়ে ডেডলক এভয়েড করা ভালো। ওয়েট-ফর গ্রাফ ডেডলক এভয়েডেন্সের জন্য ব্যবহার করা যেতে পারে। তবে এটি কেবল ছোট ডাটাবেসের জন্য কার্যকর কারণ বড় ডাটাবেসে এটি খুব জটিল হতে পারে।

ওয়েট-ফর গ্রাফ (Wait for graph)

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

DBMS-এ ডেডলক (Deadlocks)

ডেডলক উপেক্ষা - অস্ট্রিচ অ্যালগরিদম (Ignore Deadlock - Ostrich Algorithm)

অস্ট্রিচ অ্যালগরिदম মানে ডেডলককে সাদা উপেক্ষা করা এবং ধরে নেওয়া যে এটি কখনো হবে না। এটি করা হয় কারণ কিছু সিস্টেমে ডেডলক হ্যান্ডল করার খরচ উপেক্ষা করার চেয়ে অনেক বেশি যেহেতু এটি খুবই বিরল ঘটে। তাই, সادামাত্র ধরে নেওয়া হয় যে ডেডলক কখনো হবে না এবং যদি যেকোনো কারণে হয় তবে সিস্টেম রিবুট করা হয়।


  1. DBMS-এ এক-से-এক সম্পর্ক

  2. DBMS-এ এক-से-বহু বা বহু-से-এক সম্পর্ক

  3. DBMS-এ ডেটা ডিকশনারি

  4. DBMS-এ ফাংশনাল নির্ভরতা