c# Zombies উপস্থিত আছে... নেট।




.net multithreading (6)

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

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

bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }

এবং কারণ Monitor.Enter এবং Monitor.Exit চিহ্নিত করা হয়। মনে হচ্ছে যে .NET এমন কোনও প্রক্রিয়াকরণ করে যা থ্রেডগুলিকে এমন সিস্টেম উপাদানগুলির এক্সপোজার থেকে রক্ষা করে যা এই ধরনের প্রভাব ফেলতে পারে তবে এটি সম্পূর্ণরূপে ফটকাবাজি এবং সম্ভবত কেবলমাত্র "জম্বি থ্রেড" আগে. সুতরাং, আমি আশা করছি আমি এখানে কিছু প্রতিক্রিয়া পেতে পারি:

  1. আমি কি এখানে ব্যাখ্যা করেছি তার চেয়ে একটি "জম্বি থ্রেড" এর একটি সুস্পষ্ট সংজ্ঞা আছে?
  2. Zombie থ্রেড নেটতে ঘটতে পারে? (কেন কেন না?)
  3. প্রযোজ্য হলে, কিভাবে আমি নেটতে একটি জম্বি থ্রেড তৈরি করতে বাধ্য করতে পারি?
  4. প্রযোজ্য হলে, আমি কিভাবে নেটের জম্বি থ্রেড দৃশ্যকল্প ঝুঁকি ছাড়াই লকিংয়ের সুবিধা পাব?

হালনাগাদ

আমি দুই বছর আগে একটু একটু প্রশ্ন করেছিলাম। আজ এই ঘটেছে:


আমি আমার উত্তরটি একটু পরিষ্কার করেছি, তবে রেফারেন্সের জন্য নীচের মূলটি রেখেছি

এটি প্রথমবারের মতো আমি শব্দটি শুনেছি তাই আমি তার সংজ্ঞাটি অনুমান করবো:

এটির সমস্ত সংস্থান মুক্ত না করেই একটি থ্রেড বাতিল করা হয়েছে

সুতরাং সেই সংজ্ঞাটি দেওয়া হলে, হ্যাঁ, আপনি এটি অন্য ভাষায় (সি / সি ++, জাভা) হিসাবে .NET তে করতে পারেন।

যাইহোক , আমি মনে করি না এটি একটি ভাল কারণ হিসাবে থ্রেডেড, নোট মিশন জটিল কোড লিখতে না। .NET এর বিরুদ্ধে সিদ্ধান্ত নেওয়ার অন্যান্য কারণ থাকতে পারে তবে নেটটি লিখতে পারেন কারণ আপনি কোনওভাবে জম্বি থ্রেডগুলি আমাকে বুঝতে পারবেন না। সি / সি ++ তে জুম্বার থ্রেডগুলি সম্ভাব্য (আমিও তর্কবিতর্ক করব যে এটি C তে জগাখিচুড়ি করা অনেক সহজ) এবং সিটি / সি ++ (উচ্চ ভলিউম ট্রেডিং, ডেটাবেস ইত্যাদি) অনেকগুলি সমালোচনামূলক, থ্রেডেড অ্যাপ্লিকেশন রয়েছে।

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

মূল উত্তর Zombies proper আপনি সঠিক থ্রেডিং কোড লিখতে না থাকলে বিদ্যমান থাকতে পারে। সি / সি ++ এবং জাভা মত অন্যান্য ভাষার জন্য একই। কিন্তু .NET এ থ্রেড কোড লেখার কোন কারণ নেই।

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

মিশন সমালোচনামূলক সিস্টেমের জন্য নির্ভরযোগ্য কোডটি লিখতে সহজ নয়, আপনি যে কোনও ভাষাতে আছেন। কিন্তু আমি ইতিবাচক নই এটি .NET তে সঠিকভাবে কাজ করা অসম্ভব নয়। এছাড়াও AFAIK, .NET থ্রেডিং সি / সি ++ তে থ্রেডিংয়ের থেকে ভিন্ন নয়, এটি কিছু .net নির্দিষ্ট গঠনগুলি (যেমন RWL এবং ইভেন্ট ক্লাসের হালকা ওজন সংস্করণের) ছাড়া একই সিস্টেম কলগুলি ব্যবহার করে (বা তৈরি করা) ব্যবহার করে।

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


আমি সহজেই যথেষ্ট zombie থ্রেড করতে পারেন।

var zombies = new List<Thread>();
while(true)
{
    var th = new Thread(()=>{});
    th.Start();
    zombies.Add(th);
}

এই থ্রেড হ্যান্ডলগুলি leaks ( Join() জন্য Join() )। যতক্ষণ আমরা পরিচালিত পৃথিবীতে উদ্বিগ্ন, ততক্ষণ এটি আরেকটি মেমরি লিক।

এখন, এমন একটি থ্রেডকে হত্যা করা যা আসলে লকগুলি ধরে রাখে তবে পিছনে কিন্তু সম্ভব। অন্য লোকের ExitThread() কাজ করে। তিনি পাওয়া যায়, ফাইল হ্যান্ডেল জিসি দ্বারা পরিষ্কার করা হয়েছে কিন্তু একটি বস্তুর চারপাশে একটি lock হবে না। কিন্তু আপনি কেন তা করবেন?


  • আমি কি এখানে ব্যাখ্যা করেছি তার চেয়ে একটি "জম্বি থ্রেড" এর একটি সুস্পষ্ট সংজ্ঞা আছে?

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

  • Zombie থ্রেড নেটতে ঘটতে পারে? (কেন কেন না?)
  • প্রযোজ্য হলে, কিভাবে আমি নেটতে একটি জম্বি থ্রেড তৈরি করতে বাধ্য করতে পারি?

তারা নিশ্চিত, চেহারা, আমি এক তৈরি!

[DllImport("kernel32.dll")]
private static extern void ExitThread(uint dwExitCode);

static void Main(string[] args)
{
    new Thread(Target).Start();
    Console.ReadLine();
}

private static void Target()
{
    using (var file = File.Open("test.txt", FileMode.OpenOrCreate))
    {
        ExitThread(0);
    }
}

এই প্রোগ্রামটি একটি থ্রেড Target শুরু করে যা একটি ফাইল ExitThread এবং তারপরে তাড়াতাড়ি ExitThread ব্যবহার করে নিজেকে হত্যা করে। ফলে জম্বি থ্রেড "test.txt" ফাইলটিতে হ্যান্ডেলটি ছেড়ে দেবে না এবং প্রোগ্রামটি শেষ না হওয়া পর্যন্ত ফাইলটি খোলা থাকবে (আপনি প্রক্রিয়া এক্সপ্লোরার বা অনুরূপের সাথে চেক করতে পারেন)। "Test.txt" এ হ্যান্ডেলটি GC.Collect বলা না হওয়া পর্যন্ত মুক্তি পাবে না - এটি সক্রিয় করে তোলে যে এটি হ্যান্ডলগুলি পরিচালনা করে এমন একটি জম্বি থ্রেড তৈরি করার চেয়ে আরও কঠিন।

  • প্রযোজ্য হলে, আমি কিভাবে নেটের জম্বি থ্রেড দৃশ্যকল্প ঝুঁকি ছাড়াই লকিংয়ের সুবিধা পাব?

আমি যা করেছি তা করো না!

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

আসলে এটি আসলেই একটি জম্বি থ্রেড তৈরি করার জন্য আশ্চর্যজনকভাবে কঠিন (আমাকে P / একটি ফাংশনে ডাকা হয়েছিল যা ডকুমেন্টেশনে আপনাকে বলে দেয় যে এটি C এর বাইরে না বলা)। উদাহরণস্বরূপ নিম্নলিখিত (ভয়ানক) কোড আসলে একটি zombie থ্রেড তৈরি করে না।

static void Main(string[] args)
{
    var thread = new Thread(Target);
    thread.Start();
    // Ugh, never call Abort...
    thread.Abort();
    Console.ReadLine();
}

private static void Target()
{
    // Ouch, open file which isn't closed...
    var file = File.Open("test.txt", FileMode.OpenOrCreate);
    while (true)
    {
        Thread.Sleep(1);
    }
    GC.KeepAlive(file);
}

কিছু চমত্কার ভয়ানক ভুল সত্ত্বেও, "test.txt" এ হ্যান্ডেলটি এখনও অর্ট্ট বলা হয়ে থাকে ( file জন্য চূড়ান্তকারীর অংশ হিসাবে যা কভারের অধীনে SafeFileHandle ব্যবহার করে তার ফাইল হ্যান্ডেল মোড়ানো)

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

আরো দেখুন


গুরুতর লোডের অধীনে সমালোচনামূলক সিস্টেমে, লক-ফ্রি কোডটি লিখিতভাবে কার্য সম্পাদনের কারণে প্রাথমিকভাবে ভাল। LMAX মতো LMAX এবং এটি কীভাবে মহান আলোচনাগুলির জন্য "যান্ত্রিক সহানুভূতি" সরবরাহ করে। যদিও zombie থ্রেড সম্পর্কে উদ্বিগ্ন? আমি মনে করি এটি একটি প্রান্ত কেস যা কেবল একটি বাগকে লোহা করাতে হবে এবং lock ব্যবহার না করার পক্ষে যথেষ্ট ভাল কারণ নয়।

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


এটি জাম্বোড থ্রেড সম্পর্কে নয়, তবে বই কার্যকর আই # এর আইডিসপোজেবল প্রয়োগ করার একটি বিভাগ রয়েছে, (আইটেম 17), যা জুম্বিয়া বস্তুর কথা বলে যা আমি মনে করি আপনি আকর্ষণীয় হতে পারেন।

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

এটি নীচের অনুরূপ একটি উদাহরণ দেয়:

internal class Zombie
{
    private static readonly List<Zombie> _undead = new List<Zombie>();

    ~Zombie()
    {
        _undead.Add(this);
    }
}

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

একটি সম্পূর্ণ উদাহরণ নিচে। ফোরাম লুপটি পৌঁছানোর সময়, আপনার কাছে থাকা প্রতিটি 150 টি অবজেক্ট রয়েছে যা প্রতিটি ইমেজ ধারণ করে তবে ছবিটি GC'd হয়েছে এবং যদি আপনি এটি ব্যবহার করার চেষ্টা করেন তবে আপনার ব্যতিক্রম হবে। এই উদাহরণে, আমি যখন চিত্রটি দিয়ে চেষ্টা করি এবং কিছু করি, তখন আমি একটি ArgumentException (পরামিতি বৈধ নয়) পেয়েছি, আমি এটি সংরক্ষণ করার চেষ্টা করছি কিনা, এমনকি উচ্চতা ও প্রস্থের মতো মাত্রা দেখতেও পারি:

class Program
{
    static void Main(string[] args)
    {
        for (var i = 0; i < 150; i++)
        {
            CreateImage();
        }

        GC.Collect();

        //Something to do while the GC runs
        FindPrimeNumber(1000000);

        foreach (var zombie in Zombie.Undead)
        {
            //object is still accessable, image isn't
            zombie.Image.Save(@"C:\temp\x.png");
        }

        Console.ReadLine();
    }

    //Borrowed from here
    //http://.com/a/13001749/969613
    public static long FindPrimeNumber(int n)
    {
        int count = 0;
        long a = 2;
        while (count < n)
        {
            long b = 2;
            int prime = 1;// to check if found a prime
            while (b * b <= a)
            {
                if (a % b == 0)
                {
                    prime = 0;
                    break;
                }
                b++;
            }
            if (prime > 0)
                count++;
            a++;
        }
        return (--a);
    }

    private static void CreateImage()
    {
        var zombie = new Zombie(new Bitmap(@"C:\temp\a.png"));
        zombie.Image.Save(@"C:\temp\b.png");
    }
}

internal class Zombie
{
    public static readonly List<Zombie> Undead = new List<Zombie>();

    public Zombie(Image image)
    {
        Image = image;
    }

    public Image Image { get; private set; }

    ~Zombie()
    {
        Undead.Add(this);
    }
}

আবার, আমি জুম্বি থ্রেড সম্পর্কে বিশেষভাবে জিজ্ঞাসা করেছি, কিন্তু প্রশ্ন শিরোনামটি .net এর মধ্যে zombies সম্পর্কে, এবং আমাকে মনে করিয়ে দেওয়া হয়েছিল এবং অন্যরা এটি আকর্ষণীয় মনে করতে পারে!


1. আমি কি এখানে ব্যাখ্যা করেছি তার চেয়ে "জম্বি থ্রেড" এর একটি পরিষ্কার সংজ্ঞা আছে?

আমি সম্মত হচ্ছি যে "জুম্বোম থ্রেড" বিদ্যমান, এটি এমন একটি শব্দ যা হ'ল থ্রেডগুলির সাথে যা ঘটে তা বোঝায় যা সম্পদগুলির সাথে বাকি আছে এবং তারা সম্পূর্ণরূপে মরে না, তাই এই নামটি "জম্বি", তাই আপনার নাম এই রেফারেল ব্যাখ্যা টাকা ঠিক চমত্কার!

2. জম্বি থ্রেড নেটতে ঘটতে পারে? (কেন কেন না?)

হ্যাঁ তারা ঘটতে পারে। এটি একটি রেফারেন্স এবং প্রকৃতপক্ষে উইন্ডোজ দ্বারা "জম্বি" হিসাবে উল্লেখ করা হয়েছে: এমএসডিএন ডেড প্রসেস / থ্রেডের জন্য শব্দ "Zombie" শব্দটি ব্যবহার করে

ঘন ঘন এটি একটি অন্য গল্প, এবং আপনার কোডিং কৌশল এবং অনুশীলন উপর নির্ভর করে, আপনার জন্য থ্রেড লকিং মত এবং কিছু সময়ের জন্য এটা করেছি যে আমি যে দৃশ্যকল্প ঘটছে সম্পর্কে এমনকি চিন্তা করবেন না।

এবং হ্যাঁ, @ কেভিনপ্যাঙ্কো মন্তব্যগুলিতে সঠিকভাবে উল্লেখ করেছেন, "জুম্বোম থ্রেড" ইউনিক্স থেকে এসেছে তাই তারা এক্সকোড-অবজেক্টিভ-এ ব্যবহৃত হয় এবং "এনএসজোব্বি" হিসাবে পরিচিত এবং ডিবাগিংয়ের জন্য ব্যবহৃত হয়। এটি প্রায় একই রকম আচরণ করে ... শুধুমাত্র পার্থক্যটি এমন একটি বস্তু যা "মৃত্যুর" উচিত "Zombie Zombie", "Zombie Thread" এর পরিবর্তে ডিবাগিংয়ের জন্য হয়ে থাকে যা আপনার কোডের সম্ভাব্য সমস্যা হতে পারে।







zombie-process