language - rust مدينة




ماذا لدى Rust بدلاً من أداة تجميع النفايات؟ (2)

أفهم أن Rust لا يوجد به جامع للقمامة وأتساءل كيف يتم تحرير الذاكرة عندما يخرج الربط عن نطاقه.

لذلك في هذا المثال ، أفهم أن Rust يستعيد الذاكرة المخصصة لـ "a" عندما يخرج عن نطاقه.

{
    let a = 4
}

المشكلة التي أواجهها في هذا الأمر هي أولاً كيف يحدث هذا ، وثانياً ، هل هذا نوع من جمع القمامة؟ كيف تختلف عن جمع القمامة "النموذجي"؟


الفكرة الأساسية لإدارة الموارد (بما في ذلك الذاكرة) في أي برنامج ، أيا كانت الاستراتيجية ، هي أن الموارد المرتبطة بـ "الكائنات" التي يتعذر الوصول إليها يمكن استعادتها. خارج الذاكرة ، يمكن أن تكون هذه الموارد أقفال مزامنة ومقابض الملفات ومآخذ التوصيل واتصالات قاعدة البيانات ...

تقوم اللغات التي تحتوي على أداة تجميع مجمعي البيانات المهملة بفحص الذاكرة بشكل دوري (بطريقة أو بأخرى) للعثور على كائنات غير مستخدمة ، ثم حرر الموارد المرتبطة بها ، وأخيراً حرر الذاكرة التي تستخدمها هذه الكائنات.

الصدأ ليس لديه GC ، كيف يدير؟

الصدأ لديه الملكية. باستخدام نظام نوع القرابة ، فإنه يتعقب المتغير الذي لا يزال متمسكًا بكائن ما ، وعندما يخرج هذا المتغير عن نطاقه ، يستدعي مدمره. يمكنك أن ترى نظام نوع affine ساري المفعول بسهولة:

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 ) ، يمكن تكوين دورات من المراجع وبالتالي حدوث تسرب للذاكرة ، وفي هذه الحالة قد لا يتم إطلاق الموارد المرتبطة بالدورة.


عادةً ما يتم استخدام تجميع البيانات المهملة بشكل دوري أو بناءً على الطلب ، مثل ما إذا كانت الكومة قريبة من المليء أو أعلى من بعض الحدود. ثم يبحث عن المتغيرات غير المستخدمة ويحرر ذاكرتهم ، اعتمادًا على algorithm .

يعرف الصدأ متى يخرج المتغير عن نطاقه أو ينتهي عمره في وقت التحويل البرمجي ، وبالتالي يدرج إرشادات LLVM / التجميع المقابلة لتحرير الذاكرة.

الصدأ يسمح أيضا نوعا من جمع القمامة ، مثل المرجع الذري العد على الرغم من.





rust