কীভাবে কোনও আবর্জনা সংগ্রহকারী এখানে অসীম লুপটি এড়াতে পারবেন?


101

নিম্নলিখিত সি # প্রোগ্রামটি বিবেচনা করুন, আমি লুপিং ছাড়াই একটি লুপ তৈরির উত্তর হিসাবে কোডগল্ফে জমা দিয়েছি:

class P{
    static int x=0;
    ~P(){
        System.Console.WriteLine(++x);
        new P();
    }
    static void Main(){
        new P();
    }
}

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

স্পষ্টতই এটি নির্বোধ কোড, এটি কখনই প্রদর্শিত হবে না, তবে প্রোগ্রামটি কীভাবে সম্পূর্ণ হতে পারে সে সম্পর্কে আমি আগ্রহী।

অরিজিনাল কোড গল্ফ পোস্ট :: /codegolf/33196/loop-without- লুপিং / 33218# 33218


49
আমি এটি চালাতে ভয় পাচ্ছি।
এরিক Scherrer

6
যে একটি চূড়ান্তকরণকারী বলা হয় নি অবশ্যই বৈধ আচরণের ক্ষেত্রের মধ্যে । আমি জানি না কেন এটি কয়েক হাজার পুনরাবৃত্তি চালানোর জন্য বিরক্ত হয়, আমি শূন্য প্রার্থনা আশা করি।

27
চূড়ান্তকরণকারী থ্রেডের বিরুদ্ধে সিএলআর সুরক্ষার কাজটি কখনই কাজ শেষ করতে সক্ষম হয় না। এটি 2 সেকেন্ড পরে জোর করে এটিকে বন্ধ করে দেয়।
হ্যানস প্যাস্যান্ট

2
সুতরাং শিরোনামে আপনার প্রশ্নের আসল উত্তরটি হ'ল এটি অসীম লুপটি 40 সেকেন্ডের জন্য চালিয়ে দেওয়ার পরে এড়িয়ে যায় এবং তারপরে এটি সমাপ্ত হয়।
লাসে ভি কার্লসেন

4
এটি চেষ্টা করে দেখে মনে হচ্ছে যে প্রোগ্রামটি যাইহোক 2 সেকেন্ডের পরে সবকিছু মেরে ফেলে। আসলে আপনি যদি থ্রেডগুলি
মাইকেল বি

উত্তর:


110

সি # এর মাধ্যমে সিএলআরের দ্বিতীয় সংস্করণে রিখটার অনুসারে (হ্যাঁ আমাকে আপডেট করা দরকার):

পৃষ্ঠা 478

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

সার্ভি যেমন উল্লেখ করেছেন, এর নিজস্ব থ্রেড রয়েছে।


5
এই কোডে প্রতিটি চূড়ান্তকরণ পদ্ধতিটি প্রতি বস্তুতে 40 সেকেন্ডের মধ্যে নাটকীয়ভাবে নেয়। একটি নতুন অবজেক্ট তৈরি করা হয়েছে এবং তারপরে চূড়ান্তকরণের জন্য যোগ্য বর্তমান চূড়ান্তকরণকারীর সাথে প্রাসঙ্গিক নয়।
জ্যাকব ক্রোল

2
এটি আসলে কাজটি করে না। শাটডাউনে ফাঁকে ফাঁকে ফাঁকে ফাঁকা খালি করার সময়সীমাও রয়েছে। এই কোডটি যা ব্যর্থ করে, এটি সেই সারিতে নতুন নতুন অবজেক্ট যুক্ত করে।
হ্যানস প্যাস্যান্ট

শুধু এই সম্পর্কে চিন্তা করা, ফ্রেঞ্চযোগ্য ক্যুটি একইভাবে খালি করছে না "এছাড়াও, যদি সমস্ত বস্তুর চূড়ান্তকরণ পদ্ধতিগুলি কল করতে 40 সেকেন্ড বেশি সময় লাগে তবে আবার, সিএলআর কেবল প্রক্রিয়াটি মেরে ফেলে।"
এরিক Scherrer

23

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


যদি কোনও মূল থ্রেড বেঁচে থাকার কারণে প্রোগ্রামটি বের হওয়ার পরে যদি ফাইনালাইজারটি 40 সেকেন্ড শেষ না করে তবে এটি সমাপ্ত হবে এবং প্রক্রিয়াটি সমাপ্ত হবে। এগুলি পুরানো মানগুলি যদিও মাইক্রোসফ্ট সম্ভবত প্রকৃত সংখ্যাগুলি বা এমনকি পুরো আলগোরিদিমটিকে এতক্ষণে টুইট করতে পারে। সে ব্লগ.স্টেফেন্কিলারি.com
লাসে ভি। কার্লসেন

@ লাসেভি.কার্লসন কি সেই ভাষার নথিভুক্ত আচরণ, বা এমএস কীভাবে তাদের চূড়ান্তকরণকে বাস্তবায়নের বিশদ হিসাবে প্রয়োগ করতে বেছে নিয়েছেন? আমি পরেরটি আশা করব
পরিবেশন করুন

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

8

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

বেশিরভাগ আবর্জনা সংগ্রহকারীগুলি সাব-স্ট্রেডে প্রস্থের প্রথম প্রজন্মের মতো চালায়। বেশিরভাগ ক্ষেত্রে অবজেক্টটি পুনর্ব্যবহার করার কয়েক ঘন্টা সময় নিতে পারে।

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

ইন্টারেক্টিভ csharpপরিবেশে আমি যখন আপনার কোডটি চালিয়েছি তখন আমি পেয়েছি:

csharp>  

1
2

Unhandled Exception:
System.NotSupportedException: Stream does not support writing
  at System.IO.FileStream.Write (System.Byte[] array, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.FlushBytes () [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.FlushCore () [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0 
  at System.IO.CStreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0 
  at System.IO.CStreamWriter.Write (System.Char[] val) [0x00000] in <filename unknown>:0 
  at System.IO.CStreamWriter.Write (System.String val) [0x00000] in <filename unknown>:0 
  at System.IO.TextWriter.Write (Int32 value) [0x00000] in <filename unknown>:0 
  at System.IO.TextWriter.WriteLine (Int32 value) [0x00000] in <filename unknown>:0 
  at System.IO.SynchronizedWriter.WriteLine (Int32 value) [0x00000] in <filename unknown>:0 
  at System.Console.WriteLine (Int32 value) [0x00000] in <filename unknown>:0 
  at P.Finalize () [0x00000] in <filename unknown>:0

সুতরাং আপনার প্রোগ্রামটি ক্র্যাশ হয়ে গেছে কারণ stdoutপরিবেশের শব্দ দ্বারা অবরুদ্ধ।

Console.WriteLineপ্রোগ্রামটি মুছে ফেলা এবং হত্যার সময়। এটি পাঁচ সেকেন্ড পরে প্রোগ্রামটি শেষ হওয়ার পরে (অন্য কথায়, আবর্জনা সংগ্রাহক হাল ছেড়ে দেয় এবং কেবল চূড়ান্তর বিষয়টি বিবেচনায় না নিয়ে সমস্ত স্মৃতি মুক্ত করে দেয়)।


এটি আকর্ষণীয় যে ইন্টারেক্টিভ csharp পুরোপুরি বিভিন্ন কারণে ফুঁসে উঠেছে। আসল প্রোগ্রাম স্নিপেটে কনসোল রাইটলাইন ছিল না, আমি আগ্রহী যদি এটিও বন্ধ হয়ে যায়।
মাইকেল বি

@ মিশেলবি: আমি এটিও পরীক্ষা করেছি (নীচে মন্তব্য দেখুন)। এটি পাঁচ সেকেন্ড অপেক্ষা করে এবং তারপরে সমাপ্ত হয়। আমি অনুমান করি প্রথম Pদফার ফাইনালাইজারটি কেবল সময়সীমার বাইরে চলে গেছে।
উইলেম ভ্যান অনসেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.