কাঁটাচামচ () ততক্ষণে লিনাক্সে পুরো প্রক্রিয়াটির হিপিটি অনুলিপি করে?


30

একটি fork()সিস্টেম কল চলমান প্রক্রিয়া থেকে একটি শিশু প্রক্রিয়া ক্লোন করে। দুটি পিআইডি বাদে দুটি প্রক্রিয়া অভিন্ন।

স্বাভাবিকভাবেই, যদি প্রক্রিয়াগুলি কেবল সেগুলি লেখার পরিবর্তে তাদের গাদা থেকে পড়ে থাকে তবে গাদাটি অনুলিপি করা স্মৃতিশক্তিটির একটি বিশাল অপচয় waste

পুরো প্রক্রিয়াটি কপি করা আছে? এটি কী এমনভাবে অনুকূলিত হয়েছে যে কেবল লেখার ফলে হিপি অনুলিপি চালু হয়?

উত্তর:


19

সম্পূর্ণতা এর fork()mmap ব্যবহার বাস্তবায়িত হয় / লেখা উপর কপি করুন।

এটি কেবল স্তূপকে প্রভাবিত করে না, তবে লাইব্রেরি, স্ট্যাক, বিএসএস অঞ্চলগুলিও ভাগ করে দেয়।

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

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

এমনকি execve()মূলত "দয়া করে বাইনারি / এলডি.এসো / হোয়াট নোট এমএম্যাপ করুন, তারপরে এক্সিকিউট করুন" - এবং ভিএম প্রক্রিয়াটির আসল লোডকে র‌্যাম এবং এক্সিকিউশনে পরিচালনা করে। স্থানীয় অবিচ্ছিন্ন ভেরিয়েবলগুলি একটি 'শূন্য পৃষ্ঠা' থেকে এমএমএপ করা শেষ হয় - বিশেষ পঠনযোগ্য কেবল-অনুলিপি-র শিরোনামে লেখা পৃষ্ঠাগুলি, স্থানীয় প্রাথমিক ভেরিয়েবলগুলি বাইনারি ফাইল থেকে নিজেই এমএমপি করা (অনুলিপি-অন-রাইটিং) হয়ে যায়, প্রভৃতি


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

24

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

যদি কেবল একটি পঠন পাতায় একটি লেখা সম্পাদিত হয় তবে তা অনুলিপি করা হয়, কারণ স্মৃতি আর দুটি প্রক্রিয়ার মধ্যে আর অভিন্ন নয়। সুতরাং, যদি কেবল পঠন-অপারেশনগুলি সম্পাদন করা হয় তবে পৃষ্ঠাগুলি মোটেই অনুলিপি করা হবে না।


1
+1 ধন্যবাদ! 1. আপনি দয়া করে রেফারেন্স লিঙ্ক সরবরাহ করতে পারেন? 2. গাদাটি সম্পূর্ণরূপে অনুলিপি করা হয়েছে, বা কিছু অংশে?
অ্যাডাম মতান

4
২ - পৃষ্ঠাগুলিতে :) "গাদা" কী তা কার্নেলের খুব কমই বোঝা যায় - কার্নেলের জন্য, এটি কেবল এমএম্যাপ করা ব্যক্তিগত পৃষ্ঠাগুলির একগুচ্ছ, যেটি libc বরাদ্দকারীরা যেমন খুশি তাই পরিচালনা করে।
qdot

এটি কি আসলেই অগত্যা একটি কাঁটাচামচ? আমার কাছে মনে হয় বর্তমান প্রক্রিয়াটিকে দৃking় করার পরিবর্তে, এই কোডটি একই প্রোগ্রামের আরও উদাহরণ তৈরি করবে যা fork()কল করার পরে পরবর্তী নির্দেশনা না দিয়ে শুরু থেকেই কার্যকর করে ।
sherrellbc

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

@Celada। হুম। আমি এটি কোথাও পড়েছি এবং কার্নেলের যে সংস্করণটি এটি উল্লেখ করা হয়েছে তা সম্ভবত মনে নেই (সম্ভবত কোনও পুরানো?), সুতরাং এটি আর বৈধ হতে পারে না।
এমএমকে

10

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.