উত্তর:
আমি আমার নিজের ব্যাখ্যা লিখতে যাচ্ছিলাম তবে এই উইকিপিডিয়া নিবন্ধটি এটির যথেষ্ট পরিমাণে সমষ্টি করে।
মূল ধারণাটি এখানে:
অনুলিপি (কখনও কখনও "COW" হিসাবে পরিচিত) কম্পিউটার প্রোগ্রামিংয়ে ব্যবহৃত একটি অনুকূলিতকরণ কৌশল। মৌলিক ধারণাটি হ'ল যদি একাধিক কলকারীরা প্রাথমিকভাবে অবিচ্ছেদ্য যে সংস্থানগুলির জন্য জিজ্ঞাসা করেন, আপনি তাদের একই সংস্থানটিতে পয়েন্টার দিতে পারেন। একজন কলার সম্পদটির "অনুলিপি" সংশোধন করার চেষ্টা না করা পর্যন্ত এই ফাংশনটি বজায় রাখা যেতে পারে, যার পরিবর্তে প্রত্যেকের কাছে দৃশ্যমান পরিবর্তনগুলি প্রতিরোধ করতে সত্যিকারের ব্যক্তিগত অনুলিপি তৈরি করা হয়। এই সমস্ত কলকারীদের স্বচ্ছভাবে ঘটে। প্রাথমিক সুবিধাটি হ'ল যদি কোনও কলার কখনও কোনও পরিবর্তন না করে তবে কোনও ব্যক্তিগত অনুলিপি তৈরি করার প্রয়োজন নেই।
এছাড়াও এখানে COW এর সাধারণ ব্যবহারের একটি প্রয়োগ রয়েছে:
মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৫ এর মতো ডাটাবেস সার্ভারগুলিতে তাত্ক্ষণিক স্ন্যাপশট রক্ষণাবেক্ষণে COW ধারণাটিও ব্যবহার করা হয় Inst তাত্ক্ষণিক স্ন্যাপশটগুলি ব্যবহারের জন্য বা মুহুর্ত-নির্ভর রিপোর্টগুলি পরীক্ষার জন্য ব্যবহৃত হয় এবং ব্যাকআপগুলি প্রতিস্থাপনের জন্য ব্যবহার করা উচিত নয়।
clone()প্রয়োগ করার সময় এটি ব্যবহার করে fork()- পিতামাতার প্রক্রিয়াটির স্মৃতি শিশুর জন্য COWed হয়।
"লেখার অনুলিপি" এর অর্থ কম বেশি যা বোঝায় তা হ'ল: প্রত্যেকের একই ডেটার লিখিত হওয়া অবধি একক ভাগ করা কপি থাকে এবং তারপরে একটি অনুলিপি তৈরি করা হয়। সাধারণত, অনুলিপি বিভিন্ন ধরণের সমস্যা সমাধানের জন্য ব্যবহৃত হয়। ইন ZFS , উদাহরণস্বরূপ, ডিস্কে ডাটা ব্লক কপি-অন-লেখ বরাদ্দ করা হয়; যতক্ষণ না কোনও পরিবর্তন নেই, আপনি মূল ব্লকগুলি রাখবেন; একটি পরিবর্তন কেবল প্রভাবিত ব্লককে পরিবর্তন করেছে। এর অর্থ নতুন ব্লকের সর্বনিম্ন সংখ্যা বরাদ্দ করা হয়েছে।
এই পরিবর্তনগুলি সাধারণত লেনদেনের জন্য প্রয়োগ করা হয় , অর্থাত্ তাদের এসিডি বৈশিষ্ট্য রয়েছে। এটি কিছু সম্মতিযুক্ত সমস্যাগুলি দূর করে, কারণ তারপরে আপনি গ্যারান্টিযুক্ত যে সমস্ত আপডেট পারমাণবিক।
A। প্রক্রিয়া 1, 2, 3, 4প্রতিটি চান এটি একটি অনুলিপি তৈরি করুন এবং "লেখ উপর কপি করো" সিস্টেম কিছুই অনুলিপি করা হয়েছে এখনো সবকিছু এখনও পড়া হয় এটা পড়া, একটি শুরু করার A। প্রক্রিয়া এখন 3এর অনুলিপিটিতে পরিবর্তন আনতে চায় A, প্রক্রিয়াটি 3আসলে প্রকৃতপক্ষে একটি অনুলিপি Aতৈরি করবে এবং ডাকা তথ্যের একটি নতুন ব্লক তৈরি করবে B। প্রক্রিয়া 1, 2, 4এখনও ব্লক পড়ছেন Aপ্রক্রিয়া 3এখন পড়ছেন হয় B।
Aএমন একটি নতুন অনুলিপি তৈরি করা উচিত। যদি আপনি যদি জিজ্ঞাসা করছেন যে পুরোপুরি নতুন প্রক্রিয়াটি যদি আসে এবং পরিবর্তিত হয় Aতবে আমার ব্যাখ্যাটি সেটির জন্য যথেষ্ট বিশদে যায় না। এটি বাস্তবায়ন সুনির্দিষ্ট হবে এবং আপনি কীভাবে ফাইল-ডেটা লকিং ইত্যাদির মতো বাকি বাস্তবায়নটি কাজ করতে চান তা সম্পর্কে জ্ঞানের প্রয়োজন হবে
আমি অনুলিপি করে অনুলিপি করব না not আমি মনে করি অ্যান্ড্রুয়ের উত্তর এবং চার্লির উত্তর ইতিমধ্যে এটি খুব স্পষ্ট করে দিয়েছে। আমি আপনাকে ওএস জগতের একটি উদাহরণ দেব, কেবলমাত্র এই ধারণাটি কীভাবে ব্যবহৃত হয়েছে তা উল্লেখ করার জন্য।
আমরা ব্যবহার করতে পারি fork()বা vfork()একটি নতুন প্রক্রিয়া তৈরি করতে পারি । vfork অনুলিপি অনুলিপি অনুসরণ করে। উদাহরণস্বরূপ, ভিফোর্কের তৈরি শিশু প্রক্রিয়া পিতামাতার প্রক্রিয়াটির সাথে ডেটা এবং কোড বিভাগকে ভাগ করবে। এটি ভ্রমন সময়কে গতি দেয়। আপনি যদি vfork এর পরে এক্সিকিউট করে থাকেন তবে vfork ব্যবহার করা হবে বলে আশা করা হচ্ছে। সুতরাং ভিফোর্ক চাইল্ড প্রক্রিয়া তৈরি করবে যা ডেটা এবং কোড বিভাগটি তার পিতামাতার সাথে ভাগ করবে কিন্তু আমরা যখন এক্সিকিউটিভ কল করব তখন এটি শিশু প্রক্রিয়াটির ঠিকানার জায়গায় নতুন এক্সিকিউটেবলের চিত্র লোড করবে।
vforkমাংস ব্যবহার করে না। আসলে যদি শিশুটি কিছু লিখেন, তবে এটি অনির্ধারিত আচরণের ফলে এবং পৃষ্ঠাগুলির অনুলিপি না করার ফলে ঘটতে পারে !! আসলে, আপনি বলতে পারেন অন্যভাবে রাউন্ডটি কিছুটা সত্য। COW vforkভাগ করে নেওয়া জায়গায় কোনও কিছু সংশোধন না করা পর্যন্ত কাজ করে !
অন্য একটি উদাহরণ দেওয়ার জন্য, মার্চুরিয়াল স্থানীয় সংগ্রহস্থলগুলিকে ক্লোনিংয়ের সত্যিকারের "সস্তা" অপারেশন করতে অনুলিপি ব্যবহার করে।
নীতিটি অন্যান্য উদাহরণগুলির মতো একই, আপনি মেমরির বস্তুগুলির পরিবর্তে শারীরিক ফাইলগুলির বিষয়ে কথা বলছেন। প্রাথমিকভাবে, একটি ক্লোনটি সদৃশ নয় তবে মূলটির একটি শক্ত লিঙ্ক । আপনি ক্লোনটিতে ফাইলগুলি পরিবর্তন করার সাথে সাথে নতুন সংস্করণ উপস্থাপনের জন্য অনুলিপিগুলি লেখা হয়।
আমি পিএইচপি-তে জাভাল সম্পর্কে এই ভাল নিবন্ধটি পেয়েছি , যা COW উল্লেখ করেছে:
অনুলিপি অন লেখুন ('COW' হিসাবে সংক্ষিপ্ত) স্মৃতি সংরক্ষণ করার জন্য ডিজাইন করা একটি কৌশল। এটি সফটওয়্যার ইঞ্জিনিয়ারিংয়ে বেশি ব্যবহৃত হয়। এর অর্থ হ'ল পিএইচপি মেমরিটি অনুলিপি করবে (বা নতুন মেমরি অঞ্চল বরাদ্দ দেবে) আপনি যখন কোনও প্রতীকটিতে লিখবেন, যদি এটি ইতিমধ্যে কোনও জভালকে নির্দেশ করে।
একটি ভাল উদাহরণ গিট, যা ব্লবগুলি সঞ্চয় করার কৌশল ব্যবহার করে। কেন এটি হ্যাশ ব্যবহার করে? আংশিক কারণ এগুলিতে পার্থক্য সম্পাদন করা আরও সহজ, তবে এটি একটি COW কৌশলকে অনুকূল করা সহজ করে তোলে। যখন আপনি কয়েকটি ফাইলের সাথে একটি নতুন প্রতিশ্রুতিবদ্ধ করেন তখন বিশাল সংখ্যক অবজেক্ট এবং গাছের পরিবর্তন হবে না। অতএব প্রতিশ্রুতিবদ্ধ হ্যাশ রেফারেন্স দিয়ে তৈরি বিভিন্ন পয়েন্টারগুলির মাধ্যমে ইতিমধ্যে বিদ্যমান একগুচ্ছ অবজেক্ট যা পুরো ইতিহাসকে অনেক ছোট রাখার জন্য প্রয়োজনীয় স্টোরেজ স্পেস তৈরি করে।
এখানে ডেকরেটার ডিজাইনের প্যাটার্নটি ব্যবহার করে একটি অনুলিপি (সিওডাব্লু) পাইথন বাস্তবায়ন । Valueএকটি পরিবর্তনীয় CowValueঅবজেক্টের একটি রেফারেন্স একটি পরিবর্তনীয় অবজেক্ট (সজ্জাকারী) দ্বারা অনুষ্ঠিত হয় । CowValueবস্তুর সামনে সব অপরিবর্তনীয় অনুরোধ পড়া Valueএকটি নতুন অপরিবর্তনীয় তৈরি করে বস্তু এবং বিবৃতি সব লেখার অনুরোধ Valueসঠিক রাষ্ট্রের সঙ্গে অবজেক্ট। CowValueবস্তুর অগভীর ভেরিয়েবল মধ্যে কপি করা আবশ্যক ভাগ করার অনুমতি Valueঅবজেক্ট।
import abc
import copy
class BaseValue(abc.ABC):
@abc.abstractmethod
def read(self):
raise NotImplementedError
@abc.abstractmethod
def write(self, data):
raise NotImplementedError
class Value(BaseValue):
def __init__(self, data):
self.data = data
def read(self):
return self.data
def write(self, data):
pass
class CowValue(BaseValue):
def __init__(self, data):
self.value = Value(data)
def read(self):
return self.value.read()
def write(self, data):
self.value = Value(data)
v = CowValue(1)
w = copy.copy(v) # shares the immutable Value object
assert v.read() == w.read()
assert id(v.value) == id(w.value)
w.write(2) # creates a new immutable Value object with the correct state
assert v.read() != w.read()
assert id(v.value) != id(w.value)