ฉันต้องการรู้เกี่ยวกับทรัพยากรที่ไม่มีการจัดการ ใครช่วยได้โปรดให้แนวคิดเบื้องต้นแก่ฉัน
ฉันต้องการรู้เกี่ยวกับทรัพยากรที่ไม่มีการจัดการ ใครช่วยได้โปรดให้แนวคิดเบื้องต้นแก่ฉัน
คำตอบ:
ทรัพยากรที่มีการจัดการโดยทั่วไปหมายถึง "หน่วยความจำที่มีการจัดการ" ซึ่งจัดการโดยตัวรวบรวมขยะ เมื่อคุณไม่มีการอ้างอิงไปยังวัตถุที่มีการจัดการ (ซึ่งใช้หน่วยความจำที่มีการจัดการ) แล้วตัวรวบรวมขยะจะ (ในที่สุด) ปล่อยหน่วยความจำนั้นให้คุณ
ทรัพยากรที่ไม่มีการจัดการคือทุกสิ่งที่ตัวรวบรวมขยะไม่รู้จัก ตัวอย่างเช่น:
โดยปกติคุณต้องการปล่อยทรัพยากรที่ไม่มีการจัดการเหล่านั้นก่อนที่คุณจะสูญเสียการอ้างอิงทั้งหมดที่คุณมีกับวัตถุที่จัดการพวกเขา คุณทำได้โดยการโทรหาDispose
วัตถุนั้นหรือ (ใน C #) โดยใช้using
คำสั่งที่จะจัดการกับการโทรDispose
หาคุณ
หากคุณเพิกเฉยต่อDispose
ทรัพยากรที่ไม่มีการจัดการอย่างถูกต้องตัวเก็บรวบรวมขยะจะจัดการกับคุณในที่สุดเมื่อวัตถุที่มีทรัพยากรนั้นเก็บรวบรวมขยะ (นี่คือ "การสรุป") แต่เนื่องจากตัวรวบรวมขยะไม่ทราบเกี่ยวกับทรัพยากรที่ไม่มีการจัดการจึงไม่สามารถบอกได้ว่าจำเป็นต้องปล่อยทรัพยากรอย่างไม่ดีดังนั้นจึงเป็นไปได้ที่โปรแกรมของคุณจะทำงานได้ไม่ดีหรือหมดทรัพยากร
หากคุณใช้คลาสด้วยตัวเองที่จัดการทรัพยากรที่ไม่มีการจัดการมันขึ้นอยู่กับคุณที่จะนำไปใช้Dispose
และFinalize
ถูกต้อง
Dispose
using
IDisposable
ดำเนินการ ถ้าชั้นไม่ใช้IDisposable
แล้วคุณควรทิ้งกรณีของชั้นเรียนที่มีusing
หรือDispose()
เมื่อคุณทำกับพวกเขา จากสิ่งนี้การสนทนาของคุณจะถูกเก็บไว้: หากชั้นเรียนดำเนินการIDisposable
แล้วก็อาจมีทรัพยากรที่ไม่มีการจัดการภายใน
ผู้ใช้บางรายจัดอันดับไฟล์ที่เปิดอยู่, การเชื่อมต่อฐานข้อมูล, หน่วยความจำที่จัดสรร, บิตแมป, สตรีมไฟล์ ฯลฯ ในบรรดาทรัพยากรที่มีการจัดการ, อื่น ๆ ที่ไม่มีการจัดการ ดังนั้นพวกเขาจัดการหรือไม่มีการจัดการ?
ความคิดเห็นของฉันคือการตอบสนองมีความซับซ้อนมากขึ้น: เมื่อคุณเปิดไฟล์ใน. NET คุณอาจใช้คลาส System.IO.File, FileStream หรือบางอย่างในตัว เนื่องจากเป็นคลาส NET ปกติจึงมีการจัดการ แต่มันเป็นเสื้อคลุมซึ่งภายในจะ "งานสกปรก" (สื่อสารกับระบบปฏิบัติการโดยใช้ Win32 DLLs เรียกฟังก์ชั่นระดับต่ำหรือแม้กระทั่งคำแนะนำแอสเซมเบลอร์) ซึ่งจริงๆแล้วเปิดไฟล์ และนี่คือสิ่งที่. NET ไม่รู้เกี่ยวกับการจัดการ แต่คุณสามารถเปิดไฟล์ได้ด้วยตัวเองโดยใช้คำสั่งแอสเซมเบลอร์และฟังก์ชันไฟล์บายพาส. NET จากนั้นหมายเลขอ้างอิงและไฟล์ที่เปิดเป็นทรัพยากรที่ไม่มีการจัดการ
เช่นเดียวกันกับฐานข้อมูล: ถ้าคุณใช้ชุดประกอบ DB บางตัวคุณมีคลาสเช่น DbConnection เป็นต้นพวกเขาจะรู้จัก. NET และมีการจัดการ แต่พวกเขาห่อ "งานสกปรก" ซึ่งไม่มีการจัดการ (จัดสรรหน่วยความจำบนเซิร์ฟเวอร์สร้างการเชื่อมต่อกับมัน ... ) หากคุณไม่ได้ใช้คลาส wrapper นี้และเปิดซ็อกเก็ตเครือข่ายด้วยตัวเองและสื่อสารกับฐานข้อมูลแปลก ๆ ของคุณโดยใช้คำสั่งบางอย่างมันจะไม่ได้รับการจัดการ
คลาส wrapper เหล่านี้ (ไฟล์, DbConnection และอื่น ๆ ) ได้รับการจัดการ แต่พวกมันใช้ทรัพยากรที่ไม่มีการจัดการในลักษณะเดียวกับคุณถ้าคุณไม่ใช้ wrapper และทำ "สกปรก" ด้วยตัวเอง และด้วยเหตุนี้โปรแกรมเสริมเหล่านี้จึงใช้รูปแบบการกำจัด / จบ เป็นความรับผิดชอบของพวกเขาในการอนุญาตให้โปรแกรมเมอร์ปล่อยทรัพยากรที่ไม่ได้รับการจัดการเมื่อไม่จำเป็นต้องใช้ wrapper อีกต่อไปและเพื่อปลดปล่อยพวกมันเมื่อ wrapper ถูกเก็บรวบรวมขยะ wrapper จะเป็นขยะที่ถูกรวบรวมโดยตัวเก็บขยะอย่างถูกต้อง แต่ทรัพยากรที่ไม่มีการจัดการภายในจะถูกรวบรวมโดยใช้รูปแบบการกำจัด / จบ
หากคุณไม่ได้ใช้คลาส. NET หรือบุคคลที่สาม wrapper และเปิดไฟล์โดยคำแนะนำของแอสเซมเบลอร์ ฯลฯ ในชั้นเรียนของคุณไฟล์ที่เปิดเหล่านี้จะไม่ได้รับการจัดการและคุณต้องใช้รูปแบบการกำจัด / จบ หากคุณไม่ทำเช่นนั้นจะมีหน่วยความจำรั่วทรัพยากรที่ถูกล็อคตลอดไป ฯลฯ แม้ว่าคุณจะไม่ได้ใช้งานอีกต่อไป (การทำงานของไฟล์เสร็จสมบูรณ์) หรือแม้กระทั่งหลังจากที่แอปพลิเคชันของคุณถูกยกเลิก
แต่ความรับผิดชอบของคุณก็คือเมื่อใช้โปรแกรมเสริมเหล่านี้ สำหรับผู้ที่ใช้การกำจัด / จบ (คุณจำได้ว่าพวกเขาใช้ IDisposable) ยังใช้รูปแบบการกำจัด / จบของคุณและกำจัดแม้กระทั่งเครื่องห่อเหล่านี้หรือให้สัญญาณเพื่อปล่อยทรัพยากรที่ไม่มีการจัดการของพวกเขา หากคุณไม่ทำเช่นนั้นทรัพยากรจะเป็นไปตามเวลาที่กำหนดไม่ จำกัด แต่ก็สะอาดที่จะปล่อยทันที (ปิดไฟล์ทันทีและไม่ปล่อยให้เปิดและปิดกั้นโดยการสุ่มหลายนาที / ชั่วโมง) ดังนั้นในวิธีการกำจัดชั้นเรียนของคุณที่คุณเรียกวิธีการกำจัดของ wrappers ที่ใช้ทั้งหมดของคุณ
unmanaged vs managed resources
ทรัพยากรที่ไม่มีการจัดการคือทรัพยากรที่ทำงานนอก. NET runtime (CLR) (หรือที่เรียกว่าไม่ใช่รหัส NET) ตัวอย่างเช่นการเรียกใช้ DLL ใน Win32 API หรือการเรียกไปยัง. dll ที่เขียนใน C ++
"ทรัพยากรที่ไม่มีการจัดการ" ไม่ใช่เรื่อง แต่เป็นความรับผิดชอบ หากวัตถุเป็นเจ้าของทรัพยากรที่ไม่มีการจัดการนั่นหมายถึง (1) บางเอนทิตี้ภายนอกถูกจัดการในลักษณะที่อาจทำให้เกิดปัญหาหากไม่ได้ล้างข้อมูลและ (2) วัตถุนั้นมีข้อมูลที่จำเป็นในการล้างข้อมูลดังกล่าวและรับผิดชอบ สำหรับการทำมัน
แม้ว่าทรัพยากรที่ไม่มีการจัดการหลายประเภทจะเกี่ยวข้องอย่างมากกับเอนทิตีของระบบปฏิบัติการหลายประเภท (ไฟล์, GDI จัดการ, บล็อกหน่วยความจำที่จัดสรร ฯลฯ ) ไม่มีเอนทิตีประเภทเดียวที่แชร์โดยพวกเขาทั้งหมดนอกเหนือจากความรับผิดชอบของ ทำความสะอาด. โดยทั่วไปหากวัตถุใดมีความรับผิดชอบในการดำเนินการล้างข้อมูลนั้นจะมีวิธีการกำจัดซึ่งจะสั่งให้ดำเนินการล้างข้อมูลทั้งหมดที่รับผิดชอบ
ในบางกรณีวัตถุจะให้ความช่วยเหลือสำหรับความเป็นไปได้ที่พวกเขาอาจถูกทอดทิ้งโดยไม่มีใครเรียกว่าการกำจัดก่อน GC อนุญาตให้วัตถุขอการแจ้งเตือนว่าถูกทิ้ง (โดยเรียกรูทีนที่เรียกว่า Finalize) และวัตถุอาจใช้การแจ้งเตือนนี้เพื่อทำการล้างข้อมูลด้วยตนเอง
คำเช่น "ทรัพยากรที่มีการจัดการ" และ "ทรัพยากรที่ไม่มีการจัดการ" เป็นสิ่งที่น่าเสียดายที่คนอื่นใช้เพื่อหมายถึงสิ่งต่าง ๆ ตรงไปตรงมาคิดว่ามันมีประโยชน์มากกว่าที่จะคิดในแง่ของวัตถุที่ไม่มีความรับผิดชอบในการทำความสะอาดใด ๆ มีความรับผิดชอบในการทำความสะอาดที่จะได้รับการดูแลถ้าเรียกว่าการกำจัดหรือมีความรับผิดชอบในการทำความสะอาด ยังได้รับการดูแลโดย Finalize
ความแตกต่างพื้นฐานระหว่างทรัพยากรที่มีการจัดการและที่ไม่มีการจัดการคือตัวรวบรวมข้อมูลขยะรู้เกี่ยวกับทรัพยากรที่มีการจัดการทั้งหมด ณ เวลาใดเวลาหนึ่ง GC จะเข้ามาและล้างหน่วยความจำและทรัพยากรทั้งหมดที่เกี่ยวข้องกับวัตถุที่ได้รับการจัดการ GC ไม่ทราบเกี่ยวกับทรัพยากรที่ไม่ได้รับการจัดการเช่นไฟล์สตรีมและการจัดการดังนั้นหากคุณไม่ล้างข้อมูลเหล่านั้นในรหัสของคุณอย่างชัดเจนคุณจะต้องพบกับหน่วยความจำรั่วไหลและทรัพยากรที่ถูกล็อค
ถูกขโมยจากที่นี่โปรดอ่านโพสต์ทั้งหมด
ทรัพยากรใด ๆ ที่มีการจัดสรรหน่วยความจำใน. NET ที่ได้รับการจัดการฮีปคือทรัพยากรที่มีการจัดการ CLR รับรู้ถึงหน่วยความจำประเภทนี้อย่างสมบูรณ์และจะทำทุกอย่างเพื่อให้แน่ใจว่ามันจะไม่ได้ถูกนำไปใช้งาน สิ่งอื่นใดที่ไม่มีการจัดการ ตัวอย่างเช่นการสอดแทรกด้วย COM อาจสร้างวัตถุในพื้นที่หน่วยความจำที่ประมวลผล แต่ CLR จะไม่ดูแล ในกรณีนี้วัตถุที่มีการจัดการที่ทำให้การโทรข้ามเขตแดนที่มีการจัดการควรเป็นเจ้าของความรับผิดชอบสำหรับสิ่งอื่น ๆ นอกเหนือจากนั้น
ให้เราเข้าใจก่อนว่าโปรแกรม VB6 หรือ C ++ (แอปพลิเคชันที่ไม่ใช่ Dotnet) ใช้ในการดำเนินการอย่างไร เรารู้ว่าคอมพิวเตอร์เข้าใจรหัสระดับเครื่องเท่านั้น รหัสระดับเครื่องจะเรียกว่าเป็นรหัสดั้งเดิมหรือไบนารี ดังนั้นเมื่อเรารันโปรแกรม VB6 หรือ C ++ คอมไพเลอร์ภาษานั้นจะรวบรวมซอร์สโค้ดภาษาตามลำดับให้เป็นเนทีฟโค้ดซึ่งสามารถเข้าใจได้จากระบบปฏิบัติการและฮาร์ดแวร์
รหัสเนทีฟ (Unmanaged Code) เป็นรหัสเฉพาะ (เนทีฟ) สำหรับระบบปฏิบัติการที่สร้างขึ้น หากคุณใช้โค้ดเนทีฟที่คอมไพล์แล้วและพยายามเรียกใช้บนระบบปฏิบัติการอื่นมันจะล้มเหลว ดังนั้นปัญหาของการใช้โปรแกรมในลักษณะนี้ก็คือมันไม่สามารถพกพาได้จากแพลตฟอร์มหนึ่งไปสู่อีกแพลตฟอร์มหนึ่ง
ให้เราเข้าใจว่าโปรแกรม. Net ดำเนินการอย่างไร การใช้ dotnet เราสามารถสร้างแอปพลิเคชั่นประเภทต่างๆ แอปพลิเคชั่น. NET ที่พบได้ทั่วไปบางประเภท ได้แก่ Web, Windows, Console และ Mobile Applications โดยไม่คำนึงถึงประเภทของแอปพลิเคชันเมื่อคุณรันแอปพลิเคชัน. NET ใด ๆ จะเกิดสิ่งต่อไปนี้
แอปพลิเคชั่น. NET ได้รับการรวบรวมเป็นภาษาระดับกลาง (IL) IL เรียกอีกอย่างหนึ่งว่าภาษากลางสามัญ (CIL) และ Microsoft Intermediate language (MSIL) ทั้งแอปพลิเคชั่น. NET และที่ไม่ใช่. NET สร้างแอสเซมบลี แอสเซมบลีมีนามสกุลเป็น. DLL หรือ. EXE ตัวอย่างเช่นถ้าคุณรวบรวมแอปพลิเคชัน windows หรือ Console คุณจะได้รับ. EXE โดยที่เมื่อเรารวบรวมเว็บหรือโครงการห้องสมุด Class ที่เราได้รับเป็น. DLL ความแตกต่างระหว่างแอสเซมบลี. NET และ NON .NET คือแอสเซมบลี DOTNET อยู่ในรูปแบบภาษากลางซึ่งเป็นแอสเซมบลีที่ไม่ใช่ DOTNET ในรูปแบบรหัสเนทิฟ
แอปพลิเคชั่นที่ไม่ใช่ DOTNET สามารถเรียกใช้โดยตรงที่ด้านบนของระบบปฏิบัติการซึ่งเป็นแอปพลิเคชัน DOTNET ที่ทำงานบนสภาพแวดล้อมเสมือนจริงที่เรียกว่า Common Language Runtime (CLR) CLR มีส่วนประกอบที่เรียกว่า Just In-Time Compiler (JIT) ซึ่งจะแปลงภาษาระดับกลางเป็นโค้ดเนทีฟซึ่งระบบปฏิบัติการพื้นฐานสามารถเข้าใจได้
ดังนั้นใน. NET การประมวลผลแอปพลิเคชันประกอบด้วย 2 ขั้นตอน 1. คอมไพเลอร์ภาษารวบรวมซอร์สโค้ดเป็นภาษากลาง (IL) 2. คอมไพเลอร์ JIT ใน CLR แปลง IL เป็นโค้ดเนทีฟซึ่งสามารถทำงานบนระบบปฏิบัติการพื้นฐาน .
เนื่องจากแอสเซมบลี. NET อยู่ในรูปแบบ Intermedaite Language และไม่ใช่โค้ดเนทีฟแอสเซมบลี. NET จึงสามารถพกพาไปยังแพลตฟอร์มใด ๆ ได้ตราบใดที่แพลตฟอร์มเป้าหมายมี Common Language Runtime (CLR) CLR ของแพลตฟอร์มเป้าหมายแปลงภาษา Intermedaite เป็นโค้ดเนมที่ระบบปฏิบัติการพื้นฐานสามารถเข้าใจได้ Languge ระดับกลางจะเรียกว่าเป็นรหัสที่ได้รับการจัดการ นี่เป็นเพราะ CLR จัดการรหัสที่ทำงานอยู่ภายใน ตัวอย่างเช่นในโปรแกรม VB6 ผู้พัฒนามีหน้าที่ในการจัดสรรหน่วยความจำที่ใช้โดยวัตถุ หากโปรแกรมเมอร์ลืมที่จะจัดสรรหน่วยความจำเราอาจพบว่ายากที่จะแยกหน่วยความจำออกจากข้อยกเว้น ในทางกลับกันโปรแกรมเมอร์. NET ไม่จำเป็นต้องกังวลเกี่ยวกับการยกเลิกการจัดสรรหน่วยความจำที่ใช้โดยวัตถุ การจัดการหน่วยความจำอัตโนมัติหรือที่เรียกว่าการรวบรวม grabage มีให้โดย CLR ออกจากกัน จากการรวบรวมขยะมีประโยชน์อื่น ๆ อีกมากมายโดย CLR ซึ่งเราจะหารือในเซสชั่นในภายหลัง เนื่องจาก CLR กำลังจัดการและดำเนินการ Intermediate Language จึงเรียกว่าเป็นรหัสที่ได้รับการจัดการ
.NET รองรับภาษาโปรแกรมต่าง ๆ เช่น C #, VB, J # และ C ++ C #, VB และ J # สามารถสร้างรหัสที่ได้รับการจัดการ (IL) เท่านั้นโดยที่ C ++ สามารถสร้างทั้งรหัสที่ได้รับการจัดการ (IL) และรหัสที่ไม่ได้รับการจัดการ (รหัสเนทีฟ)
รหัสเนทีฟจะไม่ถูกจัดเก็บอย่างถาวรที่ใดก็ได้หลังจากที่เราปิดโปรแกรมแล้วโค้ดเนทีฟจะถูกส่งออกไป เมื่อเรารันโปรแกรมอีกครั้งรหัสเนทีฟจะถูกสร้างขึ้นอีกครั้ง
โปรแกรม. NET นั้นคล้ายกับการทำงานของโปรแกรมจาวา ในจาวาเรามีรหัสไบต์และ JVM (Java Virtual Machine) โดยที่ใน. NET เราภาษาระดับกลางและ CLR (Common Language Runtime)
นี่มาจากลิงก์นี้ - เขาเป็นติวเตอร์ที่ยอดเยี่ยม http://csharp-video-tutorials.blogspot.in/2012/07/net-program-execution-part-1.html