অচলাবস্থা কী?


159

মাল্টি-থ্রেড অ্যাপ্লিকেশনগুলি লেখার সময়, অভিজ্ঞদের মধ্যে সবচেয়ে সাধারণ সমস্যাগুলির মধ্যে একটি হ'ল ডেডলক।

সম্প্রদায়ের কাছে আমার প্রশ্নগুলি হ'ল:

  1. অচলাবস্থা কী?

  2. আপনি তাদের সনাক্ত করতে পারেন?

  3. আপনি কি তাদের পরিচালনা করেন?

  4. এবং অবশেষে, আপনি কীভাবে তাদের সংঘটিত হতে বাধা দেন?


উত্তর:


206

যখন একাধিক প্রক্রিয়া একই সময়ে একই সংস্থান অ্যাক্সেস করার চেষ্টা করে তখন একটি লক হয়।

একটি প্রক্রিয়া হারিয়ে গেছে এবং অন্যটির সমাপ্তির জন্য অপেক্ষা করতে হবে।

অপেক্ষার প্রক্রিয়াটি এখনও অন্য সংস্থানটিতে ধরে রাখলে একটি অচলাবস্থা দেখা দেয় যা শেষ হওয়ার আগে প্রথমে প্রয়োজন।

সুতরাং, একটি উদাহরণ:

রিসোর্স এ এবং রিসোর্স বি প্রসেস এক্স এবং প্রসেস ওয়াই দ্বারা ব্যবহৃত হয়

  • এক্স এ ব্যবহার শুরু করে
  • এক্স এবং ওয়াই বি ব্যবহার শুরু করার চেষ্টা করে
  • ওয়াই 'জিতেছে' এবং প্রথমে বি পায়
  • এখন Y এর A ব্যবহার করা দরকার
  • এ এক্স দ্বারা লক করা হয়েছে, যা ওয়াইয়ের জন্য অপেক্ষা করছে

ডেডলকগুলি এড়ানোর সর্বোত্তম উপায় হ'ল প্রক্রিয়াগুলি এইভাবে অতিক্রম করা উচিত। আপনার যতটা সম্ভব লক করার প্রয়োজন হ্রাস করুন।

ডাটাবেসে কোনও একক লেনদেনে বিভিন্ন টেবিলগুলিতে প্রচুর পরিবর্তন করা এড়ানো, ট্রিগারগুলি এড়ানো এবং যতটা সম্ভব আশাবাদী / নোংরা / নলক পড়াতে স্যুইচ করুন।


9
আমি এখানে প্রক্রিয়াটিকে সাধারণীকরণ হিসাবে ব্যবহার করছি, বিশেষ করে কোনও ওএস প্রক্রিয়া নয়। এগুলি থ্রেড হতে পারে তবে সম্পূর্ণ ভিন্ন অ্যাপ্লিকেশন, বা ডাটাবেস সংযোগও হতে পারে। প্যাটার্ন একই।
কিথ

1
হাই, এই দৃশ্যটি দেওয়া: থ্রেড একটি লক সংস্থান এ এবং একটি দীর্ঘ প্রক্রিয়া চলছে। থ্রেড বি রিসোর্সটি লক করার অপেক্ষায় রয়েছে এ। সিপিইউ সময় ব্যবহার: 20%, আপনি কি এটি একটি অচলাবস্থার পরিস্থিতি বিবেচনা করতে পারেন?
রিকি প্রোগ্রামার

2
@ ক্রিকিপ্রগ্রাম না, এটি কেবল একটি নিয়মিত লক অপেক্ষা, যদিও পার্থক্যটি সামান্য একাডেমিক। বি ধীর গতিতে অপেক্ষা করা একটি লক, বি অপেক্ষা অপেক্ষার জন্য বি অপেক্ষা একটি অচলাবস্থা।
কিথ

তাই অচল
সংস্থাগুলি

2
@ ক্রাইপ্রোগ্রামার এটি একটি লক যা মুক্ত হবে না, আপনি যতক্ষণ অপেক্ষা করবেন না, বিজ্ঞপ্তি সারিটির কারণে।
কিথ

126

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

ফৌজদারি ও কপ দৃশ্য

এখানে চিত্র বর্ণনা লিখুন

সুতরাং সহজভাবে, যখন দুটি থ্রেডের দুটি পৃথক সংস্থান প্রয়োজন এবং তাদের প্রত্যেকের কাছে অন্যটির যে সংস্থান দরকার হয় তার লক থাকে, এটি একটি অচলাবস্থা।

অচলাবস্থার আরেকটি উচ্চ স্তরের ব্যাখ্যা: ভাঙা হৃদয়

আপনি একটি মেয়ের সাথে ডেটিং করছেন এবং তর্ক করার একদিন পরে, উভয় পক্ষ একে অপরের প্রতি হৃদয় ভেঙে পড়েছে এবং আমি-আমি-দুঃখিত-এবং-মিস করছি-আপনি কল করার জন্য অপেক্ষা করছেন । এই পরিস্থিতিতে, উভয় পক্ষই একে অপরের সাথে যোগাযোগ করতে চায় যদি এবং কেবলমাত্র তাদের মধ্যে একজনের পক্ষ থেকে অপর পক্ষ থেকে আই-এম-দুঃখিত কল আসে। যেহেতু উভয়েরই যোগাযোগ শুরু হবে না এবং প্যাসিভ অবস্থায় অপেক্ষা করা হবে, উভয়ই অপরটির জন্য যোগাযোগ শুরু করার অপেক্ষায় থাকবে যা একটি অচলাবস্থায় শেষ হয়।


থ্রেডগুলি বিভিন্ন প্রক্রিয়ার সাথে সম্পর্কিত ?, একই প্রক্রিয়া সম্পর্কিত থ্রেডগুলিও কোনও অচলাবস্থার কারণ হতে পারে?
লর্ডভিসি

1
@diabolicfreak থ্রেডগুলি একই প্রক্রিয়ার সাথে সম্পর্কিত কিনা তা বিবেচ্য নয়।
স্যাম মালায়েক

2
বাস্তব জীবনের আর একটি উদাহরণ চারটি গাড়ি একই সাথে দুটি দিকের দুটি সমান রাস্তা পারাপারে আসতে পারে। প্রত্যেককে ডান হাত থেকে একটি গাড়ীতে যাওয়ার প্রয়োজন, যাতে কেউ এগিয়ে যেতে পারে না।
লোবো

35

ডেডলকগুলি কেবল তখনই ঘটতে পারে যখন আপনার কাছে দুটি বা ততোধিক লক থাকে যা একই সময়ে অধিগ্রহণ করা যেতে পারে এবং সেগুলি বিভিন্ন ক্রমে ধরা পড়ে।

অচলাবস্থা না এড়ানোর উপায়গুলি:

  • তালা দেওয়া এড়ানো (সম্ভব হলে),
  • একাধিক লক থাকা এড়ানো
  • সর্বদা একই ক্রমে তালা নিতে।

অচলাবস্থা রোধের তৃতীয় বিষয়টি (সর্বদা একই ক্রমে তালা নিয়ে যাওয়া) গুরুত্বপূর্ণ, যা কোডিং অনুশীলনে ভুলে যাওয়া সহজ to
কিয়াং শু

20

অচলাবস্থা সংজ্ঞায়িত করতে, প্রথমে আমি প্রক্রিয়াটি সংজ্ঞায়িত করব।

প্রক্রিয়া : যেহেতু আমরা জানি প্রক্রিয়াটি programকার্যকর করা ছাড়া কিছুই নয় ।

সংস্থান : একটি প্রোগ্রাম প্রক্রিয়া সম্পাদন করতে কিছু সংস্থান প্রয়োজন। রিসোর্স বিভাগগুলিতে মেমরি, প্রিন্টার, সিপিইউ, ওপেন ফাইল, টেপ ড্রাইভ, সিডি-আরএমএস ইত্যাদি অন্তর্ভুক্ত থাকতে পারে

ডেডলক : ডেডলক এমন পরিস্থিতি বা শর্ত হয় যখন দুই বা ততোধিক প্রক্রিয়াতে কিছু সংস্থান থাকে এবং আরও কিছু সংস্থান অর্জন করার চেষ্টা করা হয় এবং তারা সেখানে সম্পাদন শেষ না হওয়া পর্যন্ত সংস্থানগুলি ছেড়ে দিতে পারে না।

অচল অবস্থা বা পরিস্থিতি

এখানে চিত্র বর্ণনা লিখুন

উপরের চিত্রটিতে দুটি প্রক্রিয়া পি 1 এবং পি 2 রয়েছে এবং সেখানে দুটি সংস্থান আর 1 এবং আর 2 রয়েছে

রিসোর্স R1 প্রক্রিয়া বরাদ্দ করা হয় হল P1 ও রিসোর্স R2 হলো প্রক্রিয়া বরাদ্দ করা হয় P2 । প্রক্রিয়ার সম্পূর্ণ মৃত্যুদন্ড থেকে হল P1 প্রয়োজন রিসোর্স R2 হলো , তাই হল P1 জন্য অনুরোধ R2 হলো , কিন্তু R2 হলো ইতিমধ্যে বরাদ্দ করা হয় P2 এর

একই ভাবে প্রক্রিয়ায় P2 এর সম্পন্ন তার মৃত্যুদন্ড প্রয়োজন R1 কিন্তু R1 ইতিমধ্যে বরাদ্দ করা হয় হল P1

উভয় প্রক্রিয়া তাদের সম্পাদন শেষ না করা অবধি এবং তাদের উত্স প্রকাশ করতে পারে না। সুতরাং উভয়ই অন্য সংস্থার জন্য অপেক্ষা করছে এবং তারা চিরকাল অপেক্ষা করবে। সুতরাং এটি একটি অচল অবস্থা।

অচলাবস্থা দেখা দেওয়ার জন্য, চারটি শর্ত অবশ্যই সত্য হতে হবে।

  1. পারস্পরিক বর্জন - প্রতিটি সংস্থান বর্তমানে হয় একটি প্রক্রিয়াতে বরাদ্দ করা হয় বা এটি উপলব্ধ। (দুটি প্রক্রিয়া একই সাথে একই সংস্থান নিয়ন্ত্রণ করতে পারে না বা তাদের সমালোচনামূলক বিভাগে থাকতে পারে)।
  2. হোল্ড এবং অপেক্ষা করুন - বর্তমানে সংস্থানগুলি থাকা প্রক্রিয়াগুলি নতুন সংস্থানগুলির জন্য অনুরোধ করতে পারে।
  3. কোনও প্রিম্পশন নেই - একবার কোনও প্রক্রিয়া কোনও সংস্থান ধরে রাখলে , এটি অন্য কোনও প্রক্রিয়া বা কার্নেল দ্বারা কেড়ে নেওয়া যায় না।
  4. বিজ্ঞপ্তি অপেক্ষা - প্রতিটি প্রক্রিয়া এমন একটি সংস্থান প্রাপ্তির অপেক্ষায় থাকে যা অন্য প্রক্রিয়া দ্বারা অনুষ্ঠিত হয়।

এবং এই সমস্ত শর্তটি উপরের চিত্রটিতে সন্তুষ্ট।


8

কোনও অচলাবস্থার ঘটনা ঘটে যখন কোনও থ্রেড এমন কোনও জিনিসের জন্য অপেক্ষা করে যা কখনই ঘটে না।

সাধারণত, এটি তখন ঘটে যখন কোনও থ্রেড কোনও মিটেক্স বা সেমোফোরে অপেক্ষা করে যা পূর্ববর্তী মালিকের দ্বারা প্রকাশিত হয়নি।

আপনার যখন দুটি থ্রেড এবং দুটি লক এর সাথে জড়িত পরিস্থিতি থাকে তখন এটি প্রায়শই ঘটে:

Thread 1               Thread 2

Lock1->Lock();         Lock2->Lock();
WaitForLock2();        WaitForLock1();   <-- Oops!

আপনি সাধারণত সেগুলি সনাক্ত করেন কারণ আপনি যে জিনিসগুলি প্রত্যাশা করেন সেগুলি কখনই না ঘটে বা অ্যাপ্লিকেশন পুরোপুরি স্তব্ধ হয়ে যায়।


একটি অচলাবস্থার ঘটনা ঘটে যখন কোনও থ্রেড এমন কিছুটির জন্য অপেক্ষা করে যা ঘটতে পারে না
লার্নের মারকুইস

4

বিভাগ অচলাবস্থার অধীনে আপনি এই দুর্দান্ত নিবন্ধগুলি একবার দেখে নিতে পারেন । এটি সি # তে রয়েছে তবে অন্যান্য প্ল্যাটফর্মের জন্য ধারণাটি এখনও একই। আমি এখানে সহজ পড়ার জন্য উদ্ধৃতি

একটি অচলাবস্থার ঘটনা ঘটে যখন দুটি থ্রেড একে অপরের দ্বারা পরিচালিত সংস্থানটির জন্য অপেক্ষা করে, তাই উভয়ই অগ্রসর হতে পারে না। এটি চিত্রিত করার সবচেয়ে সহজ উপায় হ'ল দুটি লক সহ:

object locker1 = new object();
object locker2 = new object();

new Thread (() => {
                    lock (locker1)
                    {
                      Thread.Sleep (1000);
                      lock (locker2);      // Deadlock
                    }
                  }).Start();
lock (locker2)
{
  Thread.Sleep (1000);
  lock (locker1);                          // Deadlock
}

4

ওএসে মাল্টিপ্রসেসিং / মাল্টিপ্রোগ্রামিং সমস্যায় ডেডলক একটি সাধারণ সমস্যা। বলুন এখানে দুটি প্রক্রিয়া রয়েছে পি 1, পি 2 এবং দুটি বিশ্বব্যাপী শেয়ারযোগ্য রিসোর্স আর 1, আর 2 এবং সমালোচনামূলক বিভাগে উভয় সংস্থান অ্যাক্সেস করা দরকার

প্রারম্ভিকভাবে, ওএস পি 1 এবং R2 কে পি 2 প্রক্রিয়া করার জন্য আর 1 প্রদান করে। উভয় প্রক্রিয়া একই সাথে চলমান থাকায় তারা তাদের কোডটি কার্যকর করতে শুরু করতে পারে তবে সমস্যাটি দেখা দেয় যখন একটি প্রক্রিয়া সমালোচনামূলক বিভাগে চলে যায়। সুতরাং প্রক্রিয়া আর 1 প্রসেস পি 2 আর 2 প্রকাশের জন্য অপেক্ষা করবে এবং এর বিপরীতে ... সুতরাং তারা চিরকাল অপেক্ষা করবে (ডিএডলক অবস্থা)।

একটি ছোট শারীরিক ...

আপনার মা (ওএস),
আপনি (পি 1),
আপনার ভাই (পি 2),
অ্যাপল (আর 1),
ছুরি (আর 2),
সমালোচনা বিভাগ (ছুরি দিয়ে আপেল কাটা)

আপনার মা আপনাকে প্রথম দিকে আপেল এবং ছুরিটি আপনার ভাইকে দেয়।
দুজনেই খুশি এবং খেলছে (তাদের কোডগুলি কার্যকর করছে)।
আপনার যে কেউ আপেল (সমালোচনা বিভাগ) কেটে যেতে চায় wants
আপনি আপেলটি আপনার ভাইকে দিতে চান না।
আপনার ভাই আপনাকে ছুরি দিতে চায় না।
সুতরাং আপনি উভয় একটি দীর্ঘ খুব দীর্ঘ সময়ের জন্য অপেক্ষা করতে যাচ্ছেন :)


2

দুটি থ্রেড লক করে এমন দুটি থ্রেড জোগায় যখন এগুলির উভয়টিকে অগ্রগতি হতে বাধা দেয় De এগুলি এড়ানোর সর্বোত্তম উপায় হ'ল সতর্কতার সাথে বিকাশ। অনেক এমবেডেড সিস্টেমগুলি ওয়াচডগ টাইমার (এমন একটি টাইমার যা সিস্টেমকে পুনরায় সেট করে যখন এটি নির্দিষ্ট সময়ের জন্য স্তব্ধ হয়ে থাকে) ব্যবহার করে তাদের বিরুদ্ধে সুরক্ষা দেয়।


2

থ্রেড বা প্রক্রিয়াগুলির একটি বিজ্ঞপ্তি শৃঙ্খলা থাকে যখন প্রতিটি লকড সংস্থান রাখে এবং চেইনে পরবর্তী উপাদান দ্বারা পরিচালিত কোনও সংস্থান লক করার চেষ্টা করা হয় তখন একটি অচলাবস্থা ঘটে। উদাহরণস্বরূপ, দুটি থ্রেড যা যথাক্রমে এ এবং লকে বি লক করে এবং উভয়ই অন্য লকটি অর্জন করার চেষ্টা করছে।


আমি আপনাকে ভোট দিয়েছি। আপনার উত্তরটির পরে আরও সংক্ষিপ্ত কারণ তারা প্রক্রিয়া বা থ্রেড দ্বারা বিভ্রান্ত ডেডলক ঘটায়। কেউ বলে প্রক্রিয়া, কেউ বলে থ্রেড :)
হায়িংয়েন

1

ডেডলক পরিস্থিতি বোঝার জন্য একটি সর্বোত্তম এবং খুব সাধারণ প্রোগ্রাম : -

public class Lazy {

    private static boolean initialized = false;

    static {
        Thread t = new Thread(new Runnable() {
            public void run() {
                initialized = true;
            }
        });

        t.start();

        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println(initialized);
    }
}

যখন মূল থ্রেড Lazy.main কে আহ্বান জানায়, এটি পরীক্ষা করে থাকে যে অলস শ্রেণিটি আরম্ভ করা হয়েছিল এবং ক্লাসটি আরম্ভ করা শুরু করে। মূল থ্রেডটি এখন মিথ্যাতে প্রাথমিকভাবে সেট করে, একটি ব্যাকগ্রাউন্ড থ্রেড তৈরি করে এবং শুরু করে যার রান পদ্ধতিটি সত্য থেকে আরম্ভ হয় এবং ব্যাকগ্রাউন্ড থ্রেডটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে।

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


0

একটি অচলাবস্থা এমন একটি সিস্টেমের অবস্থা যেখানে কোনও একক প্রক্রিয়া / থ্রেড কোনও ক্রিয়া সম্পাদন করতে সক্ষম হয় না। অন্যদের দ্বারা উল্লিখিত হিসাবে, একটি অচলাবস্থা সাধারণত এমন একটি পরিস্থিতির ফলাফল যেখানে প্রতিটি প্রক্রিয়া / থ্রেড ইতিমধ্যে অন্য (বা এমনকি একই) প্রক্রিয়া / থ্রেড দ্বারা লক করা কোনও সংস্থার একটি লক অর্জন করতে চায়।

এগুলি খুঁজতে এবং এড়াতে বিভিন্ন পদ্ধতি রয়েছে। একজন খুব কঠোর এবং / অথবা প্রচুর জিনিস চেষ্টা করছে। তবে, সমান্তরালতার সাথে মোকাবিলা করা কুখ্যাতভাবে কঠিন এবং বেশিরভাগ (সমস্ত না থাকলে) লোকেরা সমস্যাগুলি পুরোপুরি এড়াতে সক্ষম হবে না।

আপনি যদি এই ধরণের সমস্যাগুলি মোকাবেলায় গুরুতর হন তবে আরও কিছু আনুষ্ঠানিক পদ্ধতি কার্যকর হতে পারে। আমি সবচেয়ে ব্যবহারিক পদ্ধতি সম্পর্কে অবগত যা হ'ল প্রক্রিয়া তাত্ত্বিক পদ্ধতির ব্যবহার। এখানে আপনি কিছু প্রক্রিয়া ভাষায় আপনার সিস্টেমকে মডেল করুন (যেমন, সিসিএস, সিএসপি, এসিপি, এমসিআরএল 2, লোটস) এবং উপলব্ধ সরঞ্জামগুলি (মডেল-) ডেডলকগুলি পরীক্ষা করতে (এবং সম্ভবত কিছু অন্যান্য বৈশিষ্ট্যও) ব্যবহার করুন। টুলসেট ব্যবহারের উদাহরণগুলি হ'ল এফডিআর, এমসিআরএল 2, সিএডিপি এবং আপ্পাল। কিছু সাহসী আত্মা এমনকি সম্পূর্ণরূপে প্রতীকী পদ্ধতিগুলি ব্যবহার করে (সিস্টেমের প্রমান করছে; ওভিকি-গ্রিজের সন্ধান করুন) ব্যবহার করে তাদের সিস্টেমগুলি অচলাবস্থা মুক্ত প্রমাণ করতে পারে।

যাইহোক, এই আনুষ্ঠানিক পদ্ধতিগুলিতে সাধারণত কিছু প্রচেষ্টা প্রয়োজন হয় (উদাহরণস্বরূপ প্রক্রিয়া তত্ত্বের বেসিকগুলি শেখা)। তবে আমি অনুমান করি যে এই সমস্যাগুলি খুব কঠিন যে সত্যের একটি পরিণতি।


0

বিভিন্ন প্রক্রিয়া দ্বারা অনুরোধ করা হ'ল উপলভ্য সংখ্যার কম সংখ্যক উপস্থিতি থাকলে ডিডলক এমন পরিস্থিতি হয়। এর অর্থ হ'ল যখন উপলব্ধ সংস্থানগুলির ব্যবহারকারীর দ্বারা অনুরোধ করা তার চেয়ে কম হয়ে যায় তখন সেই সময় প্রক্রিয়াটি অপেক্ষার অবস্থায় চলে যায় ome কিছু সময় অপেক্ষার পরিমাণ আরও বেড়ে যায় এবং তখন সংস্থানগুলির অভাবজনিত সমস্যাটি খুঁজে পাওয়ার কোনও সুযোগ নেই is এই পরিস্থিতি অচলাবস্থা হিসাবে পরিচিত। আসলে, অচলাবস্থা আমাদের জন্য একটি বড় সমস্যা এবং এটি কেবলমাত্র মাল্টিটাস্কিং অপারেটিং সিস্টেমে ঘটে .ডেডলকটি একক টাস্কিং অপারেটিং সিস্টেমে ঘটতে পারে না কারণ সমস্ত সংস্থান কেবলমাত্র সেই কাজটির জন্য উপস্থিত রয়েছে যা বর্তমানে চলছে running


0

উপরে কিছু ব্যাখ্যা সুন্দর। আশা করি এটি কার্যকরও হতে পারে: https://ora-data.blogspot.in/2017/04/deadlock-in-oracle.html

একটি ডাটাবেসে, যখন একটি অধিবেশন (যেমন ওরা) অন্য সেশনের (উদাহরণস্বরূপ ডেটা) দ্বারা পরিচালিত একটি সংস্থান চায়, তবে সেই অধিবেশন (ডেটা) এছাড়াও এমন একটি সংস্থান চায় যা প্রথম অধিবেশন (ওরা) দ্বারা অনুষ্ঠিত হয়। আরও 2 টি অধিবেশন জড়িত থাকতে পারে তবে ধারণা একই হবে। আসলে, ডেডলকগুলি কিছু লেনদেনের কাজ চালিয়ে যাওয়া থেকে বাধা দেয়। উদাহরণস্বরূপ: ধরুন, ওআরএ-ডেটা লক এ ধারণ করে এবং বি লক করার অনুরোধ করে এবং এসকিউ লক বি ধারণ করে এবং লক এ অনুরোধ করে requests

ধন্যবাদ,


0

যখন কোনও থ্রেড অন্য থ্রেডটি শেষ হওয়ার অপেক্ষায় থাকে এবং তদ্বিপরীত হয় তখন ডেডলক হয়।

কিভাবে এড়াতে?
- নেস্টেড লকগুলি এড়ানো - অযৌক্তিক লকগুলি
এড়িয়ে চলুন
- থ্রেড জয়েন্ট () ব্যবহার করুন

আপনি এটি কীভাবে সনাক্ত করবেন?
সেমিডিতে এই কমান্ডটি চালান:

jcmd $PID Thread.print

রেফারেন্স : geeksforgeeks


0

ডেডলকগুলি কেবল লকগুলির সাথে ঘটে না, যদিও এটি সর্বাধিক ঘন কারণ। সি ++ এ, আপনি প্রতিটি থ্রেড কলকে (অন্য) স্ট্যান্ড :: থ্রেড অবজেক্টে যোগদান করে কেবল দুটি থ্রেড সহ কোনও লক তৈরি করতে পারবেন না create


0

লক-ভিত্তিক সম্মতি নিয়ন্ত্রণ

ভাগ করা সংস্থানগুলিতে অ্যাক্সেস নিয়ন্ত্রণের জন্য লক ব্যবহার করা ডেডলকগুলির ঝুঁকিপূর্ণ এবং লেনদেনের শিডিয়ুলার একাই তাদের সংঘটনগুলি আটকাতে পারে না।

উদাহরণস্বরূপ, রিলেশনাল ডাটাবেস সিস্টেমগুলি লেনদেনের এসআইডি বৈশিষ্ট্যের গ্যারান্টি দিতে বিভিন্ন লক ব্যবহার করে

কোন ব্যাপার কি রিলেশনাল ডাটাবেস সিস্টেম আপনি ব্যবহার করছেন, কেশ সবসময় যখন (যেমন, পরিবর্তন অর্জিত হবে UPDATEবা DELETE) একটি নির্দিষ্ট টেবিল রেকর্ড। বর্তমানে চলমান লেনদেনের মাধ্যমে সংশোধিত কোনও সারি লক না করে পারমাণবিকতা আপস করা হবে

অচলাবস্থা কী?

যেমনটি আমি এই নিবন্ধে ব্যাখ্যা করেছি , দুটি অবিচ্ছিন্ন লেনদেন অগ্রগতি করতে না পারলে একটি অচলাবস্থা ঘটে কারণ প্রত্যেকটি একে অপরের জন্য লক প্রকাশের অপেক্ষায় থাকে, যেমনটি নিম্নলিখিত চিত্রটিতে চিত্রিত হয়েছে।

এখানে চিত্র বর্ণনা লিখুন

উভয় লেনদেনই লক অধিগ্রহণের পর্যায়ে রয়েছে তাই, পরবর্তী একটিটি অর্জনের আগে কেউই একটি লক প্রকাশ করে না।

অচলাবস্থা থেকে পুনরুদ্ধার

আপনি যদি কনকুরেন্সি নিয়ন্ত্রণ অ্যালগরিদম ব্যবহার করেন যা লকগুলিতে নির্ভর করে তবে সর্বদা অচল অবস্থায় পড়ার ঝুঁকি থাকে। ডেডলকগুলি কোনও ডাটাবেস সিস্টেমে নয়, যে কোনও একযোগে পরিবেশে ঘটতে পারে।

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

এমনকি Threadশ্রেণি যদি কোনও stopপদ্ধতি প্রকাশ করে তবে জাভা ১.১ থেকে এই পদ্ধতিটি অবমূল্যায়ন করা হয়েছে কারণ এটি থ্রেড বন্ধ হওয়ার পরে অবজেক্টগুলিকে অসামঞ্জস্য অবস্থায় রেখে যেতে পারে। পরিবর্তে, জাভা একটি সংজ্ঞায়িতinterrupt পদ্ধতি , যা থ্রেড হিসাবে ইঙ্গিত হিসাবে কাজ করে যা বাধা হয়ে যায় সহজেই বাধা উপেক্ষা করতে পারে এবং এর কার্যকারিতা চালিয়ে যেতে পারে।

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

যাইহোক, একটি ডাটাবেস সিস্টেম একটি প্রদত্ত লক অধিগ্রহণ আদেশ কার্যকর করতে পারে না যেহেতু নির্দিষ্ট লেনদেনের অন্যান্য লকগুলি কী আরও অধিগ্রহণ করতে চাইবে তা লক করা অসম্ভব। লক অর্ডার সংরক্ষণ করা ডেটা অ্যাক্সেস লেয়ারের দায়িত্ব হয়ে যায় এবং ডেটাবেস কেবল অচলাবস্থার পরিস্থিতি থেকে পুনরুদ্ধারে সহায়তা করতে পারে।

ডাটাবেস ইঞ্জিনটি একটি পৃথক প্রক্রিয়া চালায় যা লক-ওয়েক্ট চক্রের জন্য বর্তমান দ্বন্দ্বের গ্রাফটি স্ক্যান করে (যা ডেডলকের কারণে ঘটে)। যখন একটি চক্র সনাক্ত হয়, ডাটাবেস ইঞ্জিনটি একটি লেনদেন বাছাই করে এটিকে বাতিল করে দেয়, যার ফলে এটির লকগুলি প্রকাশিত হয়, যাতে অন্য লেনদেন অগ্রগতি করতে পারে।

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

এই বিষয় সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটিও পরীক্ষা করে দেখুন ।


-2

মূলত মিটেক্স হ'ল একটি লক, যা ভাগ করা সংস্থানগুলিতে সুরক্ষিত অ্যাক্সেস সরবরাহ করে। লিনাক্সের অধীনে, থ্রেড মিটেক্স ডেটা টাইপটি হল pthread_mutex_t। ব্যবহারের আগে, এটি আরম্ভ করুন।

ভাগ করা সংস্থানগুলিতে অ্যাক্সেস করতে আপনাকে মিউটেক্সটি লক করতে হবে। যদি ইতিমধ্যে লকটিতে থাকা মিউটেক্স থাকে তবে কলটি থ্রেডটিকে ব্লক করে দেবে যতক্ষণ না মুটেেক্স আনলক করা থাকে। ভাগ করা সংস্থানগুলিতে পরিদর্শন শেষে, আপনাকে সেগুলি আনলক করতে হবে।

সামগ্রিকভাবে কয়েকটি অলিখিত লিখিত নীতি রয়েছে:

  • ভাগ করা সংস্থানগুলি ব্যবহার করার আগে লকটি পান।

  • যতটা সম্ভব অল্প সময়ের জন্য লকটি ধরে রাখা।

  • থ্রেড যদি ত্রুটি ফিরে দেয় তবে লকটি ছেড়ে দিন।


3
এটি কোনও অচল নয়, একটি লককে বর্ণনা করে।
লার্নের মারকুইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.