Copy on write(COW)

www.geeksforgeeks.org منبع عکس سلام من علی فرهادنیا هستم و میخوام درباره یه تکنیک بهینه سازی منابع به نام copy on write صحبت کنم.نکته:من متخصص این موضوع نیستم و صرفا چیزایی که میگم حاصل خوندن یه سری منابع و و برداشت شخصی من از اونه پس لطفا اگر میخواین دقیق این مبحثو یادبگیرین برین از منابع معتبر بخونید.داشتم مباحث ساختمان دادرو مرور میکردم و توی مبحث هزینه زمانی توابع بازگشتی به یه چیزی به نام copy on write برخوردم.طبق معمول وقتی به یه چیز جدید بر میخورم اول یه سرچ توی محتوای فارسی میکنم که یه دید کلی نسبت بهش پیدا کنم بعد میرم انگلیسیشو میخونم که کامل یادش بگیرم.ولی خب وقتی سرچ کردم مطلب فارسی براش پیدا نکردم و تصمیم گرفتم چیزی که ازش یادگرفتمو بنویسم و منتشر کنم که اگر فارسی زبان دیگه ای خواست یادش بگیره کمی راحت تر بشه کارش(امیدوارم:)).البته که من متخصص نیستم و صرفا چیزی که از روی یه ویدئو یوتوب دیدمو و فهمیدمو توضیح میدم و اگر شما تخصصی دارین خوشحال میشم توی کامتا اگر جاییو اشتباه میکنم یا کامل نیستو پوشش بدین .اگرم یه مطلب کامل دربارش بنویسین که چه بهتر خود منم استفاده میکنم :)اول از همه منبعی که اینارو از روش میگم این ویدئو یوتوبه که پیشنهاد میکنم ببینیدش.ویدئو منبعخب خلاصه چیزی که یاد گرفتم:ترجمه ای که خودم و مترجم گوگل برای copy on write روش توافق داریم میشه کپی در نوشتن(البته شاید کپی در هنگام نوشتن مفهومو بهتر برسونه)خلاصه ماجرا اینه که این تکنیک بهینه سازی میگه که فقط در صورتی که لازم بود یه چیزیو کپی کن و اگر لازم نبود از همون استفاده کن.خب شاید یکم قضیه گنگ باشه پس بیشتر توضیح میدم:فرض کنید یه فرایند دارین که از یه سری منابع استفاده میکنه.مثلا یه تابع دارین که داره از یه سری داده توی حافظه استفاده میکنه.حالا میخواین یه تابع دیگه بنویسین که اونم از همون منابع استفاده میکنه(مطمئن نیستم ولی فکر کنم منظور اینه این دوتا تابع همزمان دارن کار میکنن)خب برای اینکار میشه همه منابعو یه کپی ازشون گرفت و به تابع دوم اختصاص داد که هر کاری میخواد باهاشون انجام بده.ولی خب این یعنی تقریبا دوبرابر هزینه حافظه.درصورتی که یه راه ساده تر هست:اینکه بیایم بگیم به جای اینکه یه کپی از منابع بگیری کاری کن هردوتا تابع از همون منابع استفاده کنن.چقدر جالب تر شد همه چی:)ولی خب یه مشکلی هست:فرض کنید یکی از برنامه ها میخواد یه تغییری توی منابعش بده.مثلا میخواد یه چیزی اضافه یا کم کنه خب این دوتا تابع قراره توی این سناریو مستقل از هم کار کنن و این یعنی تداخل.پس تکلیف چیه؟خب برای درست کردن این موضوع اومدن گفتن وقتی که دارین از این اصل استفاده میکنید باید حالت قابل نوشتن بودن فایلو غیر فعال کنید و فقط اجازه خوند منبع و استفاده از اطلاعاتش وجود داشته باشه و امکان تغییرش وجود نداشته باشه.خب حالا ما شاید خواستیم فایلو تغییر بدیم الان تکلیف چیه؟خب این اصل میگه وقتی خواستی تغییری ایجاد کنی یه کپی از اون منبعی که میخوای میگری و از این به بعد به اون اشاره میکنی و از اون استفاده میکنی و فایلی هم که بهش اشاره میکردی و مشترک بود اگر فقط یه نفر دیگه بهش اشاره میکردو ازش استفاده میکرد باید دوباره قابل نوشتن بشه چون تداخلی ایجاد نمیکنه.برای همین این اصل میگه وقتی مجبور به نوشتن شدی فایلو کپی کن یا همون copy on writeمزیت این روش اینه که خیلی از اوقات ما فقط یه فایلو میخونیم و چیزی روش نمینویسیم و در این صورت اگر چنتا منبع داشته باشیم که از یه فایل استفاده کنن دیگه لازم نیست برای هرکدوم یه کپی از فایل بگیریم و فقط در صورتی که یکی از اون برنامه ها بخواد روی فایل بنویسه یه کپی بهش میدیم و میگیم بیا این مال تو کاری به بقیه نداشته باش.خب من فعلا همینارو فهمیدم اگر چیز جدیدی فهمیدم یا فهمیدم جاییشو اشتباه گفتم نوشترو اصلاح میکنم.اگر شما چیز بیشتری میدونید ممنون میشم توی کامنتا توضیح بدین که من و بقیه هم استفاده کنیم.ممنون که وقت گذاشتین.