ময়লা আবর্জনা সংগ্রহকারীর পরিবর্তে কী আছে?


95

আমি বুঝতে পারি যে মরিচের আবর্জনা সংগ্রহকারী নেই এবং ভাবছি যে যখন কোনও বাঁধাই সুযোগের বাইরে চলে যায় তখন স্মৃতি কীভাবে মুক্তি পায়।

সুতরাং এই উদাহরণে, আমি বুঝতে পারি যে জাস্ট যখন সুযোগের বাইরে চলে যায় তখন 'ক' তে বরাদ্দকৃত স্মৃতি পুনরায় দাবি করে।

{
    let a = 4
}

আমার যে সমস্যাটি হচ্ছে তা হ'ল প্রথমত এটি কীভাবে হয় এবং দ্বিতীয়ত এটি কোনও ধরণের আবর্জনা সংগ্রহ নয়? এটি 'সাধারণ' আবর্জনা সংগ্রহের থেকে কীভাবে আলাদা?


12
"নির্ধারিত বস্তুর জীবনকাল"। সি ++ এর মতোই।
ব্যবহারকারী 2864740

@ user2864740 এই গাইডটির মেয়াদোত্তীর্ণ। আধুনিক প্রতিস্থাপনটি সম্ভবত doc.rust-lang.org/book/references-and- browing.html হবে
Veedrac

উত্তর:


74

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

মরিচা জানবে কখন পরিবর্তনশীল সুযোগের বাইরে চলে যায় বা তার জীবনকাল সংকলনের সময় শেষ হয় এবং এভাবে স্মৃতি মুক্ত করার জন্য সংশ্লিষ্ট এলএলভিএম / অ্যাসেম্বলি নির্দেশাবলী সন্নিবেশ করায়।

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


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

4
তার প্রশ্নটি কীভাবে জাস্টের পদ্ধতির একটি সাধারণ জিসি থেকে আলাদা হয়। সুতরাং আমি বুঝিয়েছিলাম যে একটি জিসি কী এবং জাস্টি জাস্টি ছাড়া এটি কীভাবে কাজ করে।
অায়োনিক্স

4
doc.rust-lang.org/book/the-stack-and-the-heap.html এটিকে বেশ ভালভাবে ব্যাখ্যা করেছে। হ্যাঁ, অনেকগুলি জিনিস স্ট্যাকের মধ্যে রয়েছে তবে কেবলমাত্র পর্যাপ্ত সূচক নেই (বাক্স দেখুন)। সরলতার জন্য আমি এটিকে ছেড়ে দিয়েছি, যেহেতু প্রশ্নটি সাধারণত জিজ্ঞাসা করা হত
অায়োনিক্স

4
@ আমমম আসলে মরিচা new()সি এর মতো কোনও অভিষিক্ত ফাংশন রাখে না , এগুলি কেবল স্থির ফাংশন, এবং বিশেষত let x = MyStruct::new()স্ট্যাকের উপর এর বস্তু তৈরির মতো কিছু । বাস্তব গাদা বরাদ্দ এর সূচক Box::new()(অথবা কাঠামো যে বক্স উপর নির্ভর করে কোন)।
মারিও কার্নেরিও

4
অন্য কোন ভাষা মর্টির পরিচালনা একইভাবে মরিচা পরিচালনা করে?
এখনও_ড্রিমিং_1

43

কোনও প্রোগ্রামে সংস্থান (মেমরি সহ) পরিচালনার প্রাথমিক ধারণাটি যাই হোক না কেন কৌশলই হ'ল অ্যাক্সেসযোগ্য "অবজেক্টস" এর সাথে আবদ্ধ সংস্থানগুলি পুনরুদ্ধার করা যায়। মেমরির বাইরে, এই সংস্থানগুলি মুটেক্স লক, ফাইল হ্যান্ডলগুলি, সকেট, ডাটাবেস সংযোগগুলি হতে পারে ...

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

মরিচাটির একটি জিসি নেই, এটি কীভাবে পরিচালনা করবে?

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

fn main() {
    let s: String = "Hello, World!".into();
    let t = s;
    println!("{}", s);
}

উৎপাদনের:

<anon>:4:24: 4:25 error: use of moved value: `s` [E0382]
<anon>:4         println!("{}", s);

<anon>:3:13: 3:14 note: `s` moved here because it has type `collections::string::String`, which is moved by default
<anon>:3         let t = s;
                     ^

যা নিখুঁতভাবে চিত্রিত করে যে সময়ে যে কোনও সময়ে, ভাষা পর্যায়ে, মালিকানা ট্র্যাক করা হয়।

এই মালিকানাটি পুনরাবৃত্তভাবে কাজ করে: আপনার যদি একটি Vec<String>(যেমন, স্ট্রিংগুলির একটি গতিশীল অ্যারে) থাকে, তবে প্রতিটি Stringস্বত্বের মালিকানাধীন Vecযা নিজেই একটি ভেরিয়েবল বা অন্য কোনও বস্তুর মালিকানাধীন, ইত্যাদি ... সুতরাং, যখন কোনও ভেরিয়েবল সুযোগের বাইরে চলে যায়, এমনকি এটি অপ্রত্যক্ষভাবে এমনকি এটি অনুষ্ঠিত সমস্ত সম্পদকে পুনরাবৃত্তভাবে মুক্ত করে। এর ক্ষেত্রে এর Vec<String>অর্থ:

  1. প্রতিটি সম্পর্কিত মেমরি বাফার মুক্তি String
  2. Vecনিজের সাথে সম্পর্কিত মেমরি বাফার প্রকাশ করা

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

দ্রষ্টব্য: এটি কিছুটা আশাবাদী, রেফারেন্স গণনা ব্যবহার করে ( Rcবা Arc) রেফারেন্সের চক্র গঠন করা এবং এভাবে মেমরি ফাঁসের কারণ হতে পারে, সেক্ষেত্রে চক্রের সাথে জড়িত সংস্থানগুলি কখনই প্রকাশিত হতে পারে না।


4
"একটি আবর্জনা সংগ্রাহক সহ ভাষা পর্যায়ক্রমে মেমরিটি স্ক্যান করে (এক উপায় বা অন্য)"। অনেকেই করেন তবে সাধারণভাবে তা সত্য নয়। রিয়েল-টাইম আবর্জনা সংগ্রহকারীরা পর্যায়ক্রমে পরিবর্তনের পরিবর্তে স্ক্যান করে। ম্যাথমেটিকার মতো রেফারেন্স গণনা ভাষাগুলি মোটেই স্ক্যান করে না।
জেডি

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

4
"আমি রেফারেন্স-গণনা একটি সম্পূর্ণ আবর্জনা সংগ্রহ পদ্ধতি হিসাবে গণনা করি না কারণ এটি চক্র ফাঁস এড়ানোর জন্য এটি পরিপূরক হতে হবে"। আরসি প্রচলিতভাবে জিসির একটি রূপ হিসাবে বিবেচিত হয়। উদাহরণস্বরূপ, ম্যাথমেটিকা ​​এবং এরলংয়ে, চক্র ডিজাইন দ্বারা তৈরি করা যায় না তাই আরসি ফাঁস হয় না। উচ্চ-স্তরের দৃষ্টিভঙ্গির জন্য, "আবর্জনা সংগ্রহের একীভূত তত্ত্ব" দেখুন cs.virginia.edu/~cs415/reading/bacon-garbage.pdf
জেডি

@ জনহরপ: সত্য, যদি কোনও চক্র সম্ভব না হয় তবে আরসি ফাঁস করতে পারবেন না।
ম্যাথিউ এম।

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

6

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

ব্যবহারিক দৃষ্টিকোণ থেকে, এই অসাবধানতা মেমরি ক্লিনিংটি স্বয়ংক্রিয় মেমরি স্টোরেজের একটি মাধ্যম হিসাবে ব্যবহৃত হয় যা ফাংশনের পরিধি শেষে সাফ হয়ে যায়।

এখানে আরও তথ্য পাওয়া যায়: https://doc.rust-lang.org/book/the-stack-and-the-heap.html


4
স্ট্যাকটি ব্যবহার করা সহজ, ডিটারমিনিস্টিক অবজেক্টের লাইফটাইমগুলি এখনও পরিচালনা করা যেতে পারে যদি সমস্ত মানগুলি 'গাদাতে তৈরি করা' হত। সুতরাং এটি একটি বাস্তবায়ন বিশদ; অগত্যা একটি ভাষা কৌশল।
ব্যবহারকারী 2864740

4
আপনি এই শব্দটি ব্যবহার করতে থাকুন। আপনি মনে করেন না এটির অর্থ কী।
সুইস

মানে যা আমি প্রকাশ করতে চাই ; অ-নিরস্তক জীবনকাল বিপরীত হচ্ছে। একটি ভাল বাক্যাংশ জন্য একটি প্রস্তাব করুন।
ব্যবহারকারী 2864740

উত্তরের জন্য ধন্যবাদ, আমি প্রথমটি পয়েন্টগুলি কেবলমাত্র জমা দেওয়ার কারণে দিয়েছি। তথ্য যেমন দরকারী এবং বৈধ।
রিক্স

@ ইউজার ২6464740৪০ নির্ণায়ক বস্তুটির লাইফটাইম বলতে বোঝাতে সক্ষম হ'ল অবজেক্টের স্মৃতিশক্তি কখন তার ডিস্ট্রাক্টর বলা হয়ে গেলে সাফ হয়ে যায়। সেই ধ্বংসকারীকে প্রথম স্থানে ডাকা হয় তার সাথে এর কোনও সম্পর্ক নেই। প্রশ্নটির প্রত্যক্ষ তাত্পর্য না থাকলেও আপনি বার বার একই শব্দটিকে সামনে রেখে চলেছেন।
সুইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.