CodeCrafters
775 subscribers
90 photos
50 videos
41 files
170 links
Download Telegram
وب سایت کانال https://codecrafters.ir

لیست هشتک‌ها در کانال رو در زیر براتون خواهم گذاشت و آپدیت خواهد شد


#design_patterns الگوهای طراحی

#postgresql پستگرس

#k8s کوبرنتیز

#agile اجایل
#scrum

#algorithm الگوریتم

#video

#meeting متینگ‌

#principles اصول کدنویسی

#project_managment_system مدیریت تیم

#free خارج از مبحث کامپیوتر


#app برنامه‌های کاربردی

#Git #actions مباحث مربوط به گیت و گیتلب

#conda #env کار با

#Docker مباحث مربوط به داکر

#AI #ML مباحث هوش مصنوعی

#book معرفی کتاب

#monitoring بررسی وضعیت سیستم و کد

#concurrency همزمانی کتاب grokking concurrency


#blovkchain #web3

#DDD #domain_driven_design

#BDD #behavior_driven_development

#soa #sso #microservice


@Code_Crafters

Git Hub:
https://github.com/CodeCrafters-ir/
👍1
با یکی از دوستان در حال خوندن این کتاب هستیم و خلاصه‌ای از هر بخش و مهمترین مباحث رو در طی سلسه پست‌هایی با هشتک مشخص براتون میزاریم

این کتاب به مسائل مهمی میپردازد مانند همزمانی در رشته، ناهمزمانی ،پردازش موازی و شناخت سخت افزاری تا حدودی ، شناخت سیستم و چگونه ایجاد کردن سیستم‌های توزیع پذیر و پیاده سازی تسک‌های مستقل ، رفع بن بست و گرفتگی‌های نرم افزار و ....



سعی میکنم تا جای ممکن کامل و جامع توضیحات اون رو بهتون برسونم


لینک وبسایت

#book
#concurrency

@code_crafters
👍5🔥5
کتاب همزمانی (concurrency) از جمله کتاب‌های خیلی باحاله

یک مقداری در اوایل کتاب موضوعات رو موشکافی نکرده و پیش رفته که حقیقتا نمیشه بهش ایراد گرفت چون اصل موضوعیت کتاب بر روی برنامه نویسی هستش نه بر روی یکسری توضیحات سخت افزاری منتها جایی لازم بود و من در حد توان و سوادم موارد رو بهش اضافه میکنم

تصویر اول در کامنت‌هارو ببینید در این کتاب قراره تا حد امکان راجب موضوعات این تصویر حرف بزنیم


همزمانی در مهندسی نرم افزار بسیار موضوع حیاتی هست با افزایش تقاضا برای برنامه‌های کاربردی با توانایی بالا و رشد سریع سیستم‌ها (افزایش تعداد هسته‌ها و منابع) همزمانی بیشتر و عمیقتر در باطن مهندسین جا گرفت تا جایی که امروز تقاضای شرکت‌ها برای مهندسینی که به همزمانی تسلط داشته باشن بسیار حائز اهمیت هستش

موضوعی که در همزمانی بشدت مورد توجه قرار گرفت افزایش توان عملیاتی هستش که در این کتاب بر روی این موضوع تمرکز شده



با این سوال پیش بریم
ما اگر نیاز به عملکرد بهتری داریم چرا سخت افزارهای بهتری نخریم، خب اینکاری هست که قبلا انجام دادیم اما محدودیت اون تا جایی بود که سخت افزار پیشرفت کرده بود و فراتر از اون امکان پذیر نبود


جناب مور (نقطه عطف تغییر مسیر)
از بنیانگذاران اینتل پی برد که نسل‌های جدید پردازنده‌ها ترانزیستورهای بیشتری نسبت به قبل دارن که این موجب افزایش سرعت میشه ، بعنوان یک مهندس نرم افزار فقط کافیه بشینم نسل بعدی پردازنده بیاد تا با سرعت بیشتر روبرو بشم (بهش میگیم قانون مور)
ترانزیستور چکاری میکنه؟؟؟
ما در طی مسیر برد واحدهایی رو قرار میدیم که موجب افزایش سرعت پالس الکتریکی میشه

-همون فرکانس پردازنده (سرعت پردازش) که موقع خرید دنبالش میگردیم


اما چندی نگذشت که جناب جدیدی کشفی کرد که قانون رو تغییر داد

جناب هرب
این جناب که از افراد تاثیرگذار بر روی ++c هستش پی برد که رابطه مستقیمی بین اندازه پردازنده و فرکانس پردازنده وجود دارد

زمان انجام یک عملیات به طول مدار و سرعت نور بستگی دارد ما تا زمانی میتوانیم ترانزیستور اضافه کنیم که فضای خالی داشته باشیم که البته باید افزایش دما رو هم در نظر بگیریم، بهبود عملکرد بهتر نمیتواند تنها به افزایش فرکانس پردازنده مربوط شود
این جناب با فرمودن این حرف ساده موجب ایجاد بحران چند هسته‌ای شد


جناب هرب گفت دوست عزیز وقتی میری موبایل بخری یا سیستم فقط به فرکانس پردازش بالا دقت نکن، قطر پردازنده هم تاثیر گذاره که هرچه قطرش همون نانومتر پردازنده پایینتر باشه بهبود عملکرد داریم


پیشرفت پردازنده‌ها از نظر سرعت کلاک بابت محدودیت های جدید متوقف و کاهش پیدا کرد سخت افزار سمت سیستم‌های جدید چند پردازنده متعدد رفتن

ولی مگه کارفرماها دست از سر مهندسین نرم افزار و توسعه دهندگان کشیدن؟؟؟ مجبورمون کردن خودمون رو با سیستم جدید تطبیق دهیم

تصویر دوم در کامنت‌هارو نکاه کنید
کلاک سرعتی که ریزپردازنده می‌تواند یک دستورالعمل را طی یک زمان خاص اجرا کند

-خب تا اینجا راجب توان پردازشی حرف زدیم راجب زمان و ... حرف زدیم وقتی بهتون میگیم گولنگ زاده دوران تایمینگ و کلاک هست باید درک‌ کنید منظورمون چیه دقیقا و چطور و چرا این بچه خودش خیلی از این موارد رو به بهترین شکل ممکن هندل میکنه



لینک وبسایت

#concurrency

@code_crafters
10👍3🔥1
در ادامه مبحث کتاب همزمانی

زمان تاخیر (latency) و توان عملیاتی

بسته به نگاه ما میتوان عملکرد سیستم را به گونه‌های مختلفی ارزیابی و بررسی کرد، یکی از راه‌های افزایش عملکرد کاهش زمان تسک‌های تکی می باشد

با یک مثال پیش بریم
شما میخواهید از نقطه A به نقطه B بروید شما میتونید این فاصله رو پیاده برید یا با یک موتور، در حالت دوم با استفاده از موتور شما زمان کمتری رو مصرف میکنید

حالا اگه بخواید چند نفر رو در بین این دو نقطه جابجا کنید الزاما شما از یک اتوبوس استفاده خواهید کرد ، در این حالت دیگه شما بفکر زمان نیستید بلکه بفکر جابجایی نفرات بیشتر هستید، به این سناریو توان عملیاتی گفته میشه: تعداد وظایفی که یک سیستم در یک بازه زمانی میتونه انجام بده


درسته یک موتور سریعتر از اتوبوس هستش اما اتوبوس بار عملیاتیش چند برابر موتوره، اگر موتور این مسافت رو یک ساعته بره، اتوبوس دو ساعته میره ، اما موتور یک نفر رو جابجا میکنه اتوبوس ۳۰ نفر رو ،در واقع در ازای هر ساعت اتوبوس ما ۱۵ نفر رو جابجا کرده‌ایم

درک تفاوت تاخیر و توان عملیاتی بسیار مهم هستش

به عبارت دیگر، توان عملیاتی بیشتر سیستم لزوماً به معنای تأخیر کمتر نیست.
هنگام بهینه سازی عملکرد، بهبود یک عامل (مانند توان عملیاتی) ممکن است منجر به بدتر شدن عامل دیگر (مانند تأخیر) شود


همزمانی میتواند تاخیر را کاهش دهد، با شکستن یک تسک طولانی مدت به چند تسک کوچکتر و اجرای آنها بصورت موازی ،موجب کاهش کلی زمان اجرایی میشود ،همزمان همچنین میتواند با اجازه دادن به پردازش چندکار بطور همزمان به افزایش توان عملیاتی کمک کند، علاوه بر این میتواند تاخیر را پنهان کند(خوندن سلسله پست‌های این آموزش در اتوبوس بالا)

بنابراین، استفاده از همزمانی می تواند عملکرد سیستم را به سه روش اصلی بهبود بخشد:

 -کاهش تاخیر (یعنی یک واحد کار را سریعتر کند)

-پنهان کردن تاخیر(یعنی به سیستم اجازه دهد تا در طی عملیاتی با تأخیر بالا چیز دیگری را انجام دهد)

-افزایش توان عملیاتی (یعنی سیستم را قادر به انجام کارهای بیشتر کند)

همزمانی چطور در سیستم‌های پیچیده و بزرگ موثر است؟؟؟

حل مسائل بزرگ و پیچیده‌ که هنگام توسعه سیستم با اون سروکار داریم بدون استفاده از یک سیستم ترتیبی غیر ممکن است. پیچیدگی می تواند ناشی از اندازه مشکل یا سختی درک بخشی از سیستم هایی باشد که توسعه می دهیم.


مقیاس پذیری(scalability)
اندازه یک مشکل شامل مقیاس پذیری یا ویژگی یک سیستم است که میتواند با افزودن منابع بیشتر عملکرد را افزایش دهد

اسکیل کردن به دو صورت عمودی و افقی هست

اسکیل عمودی
که شامل بروز رسانی سخت افزاری و افزایش منابع سخت افزاری هستش، هسته قویتر، حافظه بیشتر و ...
که خب همیشه محدودیت داریم و تا جایی میتونیم این کار رو ادامه بدیم

اسکیل افقی
این قسمت بیشتر سمت مهمدسین نرم افزار و توسعه دهندگان هستش که شامل کاهش زمان انجام یک کار خاص و کوچک کردن سیستم‌های خودمون، اسکیل افقی در واقع افزایش عملکرد سیستم با توزیع بار بین منابع موجود هستش اینکار بشدت سختتر و زمانبرتر از اسکیل عمودی هستش

روند ناشی از تقاضای سیستم‌های بلادرنگ، حجم بالای داده، قابلیت اطمینان از طریق افزونگی و بهبود استفاده از طریق استراک‌گذاری منابع به دلیل مهاحرت به محیط‌های ابری (SaaS)، این صنعت تصمیم به رویکرد اسکیل افقی گرفت

جداسازی (decoupling)
موضوع مورد مناقشه بعدی پیچیدگی هستش، که بدون تلاش مهندسان نرم افزار هیچگاه کاهش پیدا نمیکند

وقتی شروع میکنید یک سیستم رو قدرتمندتر و کاربردی تر کنید پیچیدگی اجتناب ناپذیر میشه بالاخص در بیس کد هاتون، زیرساختتون و همچین نگهداری اون سیستم

در نهایت باید یک رویکرد بیابیم که سیستم رو به واحدهای ارتباطی ساده‌تر پیاده سازی کند
معماری میکروسرویس و معماری DDD اینکار رو برامون انجام میدن اما همانطور که دیدیم پیچیدگی درونشون هم اجتناب ناپذیر هست
اصل تقسیم و تسخیر در مهندسی موجب پدید اومدن سیستم‌هایی شده که باهم جفت میشن ، بابت همین در مخمدسی نرم افزار همیشه از تفکیک وظایف استقبال میشه

گروه بندی کدهای مرتبط (tightly coupled components) و جداسازی کدهای نامرتبط (loosely coupled components) درک و آزمایش برنامه ها و تعداد باگ‌ها رو در تئوری کاهش میده


همزمانی استراتژی جداسازی هستش، تقسیم وظایف بین ماژولها یا واحدهای همزمان موجب تمرکز قطعات روی عملکردهای خاص میشه قابلیت نگهداری رو بالا میبره و پیچیدگی رو کاهش میده
مهندسین آنچه را انجام میشود از زمانی که انجام میشود تفکیک میکنند این بشکل چشمگیری موجب افزایش عملکرد، مقیاس پذیری، قایلیت اطمینان و ساختار داخلی رو بهبود میده

لینک وبسایت

#concurrency

@code_crafters
👍3🔥1👏1
همزمانی جایگاه ویژه و مورد استفاده گسترده‌ای در سیستم‌های محاسباتی مدرن، سیستم عامل و خوشه های توزیع پذیر دارد، این مدل سازی از دیدگاه کاربران و توسعه دهندگان کارایی سیستم رو افزایش میده و به توسعه دهندگان اجازه میده تا مشکلات و پیچیدگی رو حل کنن

لایه‌های همزمانی
تصویر اول در کامنت‌ها
مانند اکثر مشکلات پیچیده طراحی، همزمانی با استفاده از چندین لایه ساخته میشود

در یک معماری چند لایه، یک مفهوم متناقض یا منحصر بفرد ممکن در سطوح مختلفی بصورت همزمان وجود و یا دیده بشه

هر لایه فرآیند یکسانی را در سطوح مختلف توصیف می کند، اما جزئیات متفاوت و گاهی متناقضی داره

تصویر دوم در کامنت‌ها رو ببینید

این اتفاق در همزمانی هم روی میده:
در لایه سخت افزار ما با دستورات ماشینی روبرو‌ هستیم که با استفاده از سیگنالها میتوانیم به دیگر تجهیزات جانبی متصل به سخت افزار دسترسی پیدا کنیم ،معماری مدرن پیچیدگی خاص خودش رو داره به همین دلیل بهینه سازی عملکرد برنامه در این معماری نیاز به درک عمیقی از تعاملات برنامه با سخت افزار داریم


لایه سیستم زمان اجرا، با توجه به قرار گیری الگوریتم‌های زمان بندی ،فراخوانهای سیستمی و درایورها در این لایه تاثیر شگرفی بر همزمانی خواهد داشت این لایه توسط سیستم عامل نشان داده میشه و نیاز به درک کاملی از آن داریم

در نهایت، در لایه کاربرد، انتزاعاتی که از نظر روحی به نحوه عملکرد دنیای فیزیکی نزدیک‌تر هستند، در دسترس قرار می‌گیرند. مهندسان نرم افزار کد منبعی را می نویسند که می تواند الگوریتم های پیچیده را پیاده سازی کند و منطق تجاری را نشان دهد. این کد همچنین می تواند جریان اجرا را با استفاده از ویژگی های زبان برنامه نویسی تغییر دهد و به طور کلی مفاهیم بسیار انتزاعی را نشان می دهد که فقط یک مهندس نرم افزار می تواند به آن فکر کند.


لینک وبسایت

#concurrency

@code_crafters
👍4🔥21
فصل دوم کتاب از فصل‌های بشدت محبوب برای من هستش که سعی داره هر اصطلاحی رو در برنامه بنویس بصورت دقیق توصیف کنه


اجرای سریالی و موازی سازی

از بزرگترین معضلات همزمانی و دنیای مهندسی کامپیوتر میتوان به نام گذاری های بد برای توصیف‌ها اشاره کرد ،اسامی نامربوط یا چند اسم داشتن یک موضوع
قبل از بررسی اجرا لازم است خود آنچه اجرا میشود و اصطلاحات مربوط به آن را بشناسیم

یک برنامه بطور کل به مجموعه‌ای از دستورالعمل‌ها گفته میشود که بصورت متوالی اجرا میشود

پردازنده قدرت تحلیل معنایی ندارد، نمیتواند یک جستجو با معنی انجام دهد یا نمیتواند مرتب سازی کند، پردازنده فقط میتونه محدود کارهای ساده‌ای رو انجام بده و تمام تفکر حاصل اون رو برنامه شما مشخص میکنه، تبدیل یک کار به مجموعه‌ای از دستورالعمل‌ها جهت اجرا کاریست که یک توسعه دهنده انجام میدهد

توسعه دهندگان از زبانهای مختلفی جهت پیش برد اهداف خود استفاده میکنن اما پردازنده درکی از کد منبع شما ندارد و تنها زبان ماشین را میفهمد پس لازم هست بیس کدهای شما بوسیله کامپایلر به زبان مناسبی برای پردازنده تبدیل گردد، پردازنده هنگام اجرای کد ماشین میتواند چندین رویکرد داشته باشد که اساسی ترین آن جهت اجرای یک مجموعه دستورالعمل بصورت سریالی است

اجرای سریالی
یک برنامه لیستی از دستورالعمل هاست و البته ترتیب اجرای آن مهم هست

در خصوص برنامه نویسی هم به همین روال هست یک مسئله رو ابتدا به وظایف کوچکی تقسیم میکنیم و سپس آنرا بصورت یکی پس از دیگری یا بصورت سریالی اجرا خواهیم کرد

برنامه نویسی بصورت وظیفه این امکان رو بهمون میده که بصورت مستقل از زبان ماشین محاسبات خود را انجام دهیم که به آن برنامه نویسی ماژولار میگوییم

یک تسک میتواند بخشی از یک کار باشد، اگر جامعه کلامی ما پردازنده باشد میتونیم اون رو یک دستورالعمل بنامیم
یک تسک میتونه یک توالی از عملیات باشه که انتزاعی از یک مدل در دنیای واقعی هست (مثه نوشتن متن در یک فایل)

اما در نهایت میتونیم task رو بعنوان یک واحد اجرا از انتزاع کلی دانست تصویر اول

اجرای سریالی مجموعه‌ای از تسک‌ها هستش که بصورت زنجیروار قرار گرفتن تسک دوم تسک اول رو دنبال میکنه، و تسک دوم توسط تسک سوم دنبال میشه


محاسبات متوالی
برای توصیف پدیده‌های پویا مرتبط با زمان از اصطلاح متوالی استفاده میکنیم تصویر دوم کامنت‌ها برای درک بیشتر یک بازی دونفره رو تصور کنید که نفرات به نوبت و پس از بازی نفر دیگری حق بازی دارند برای درک بهتر بازی شطرنج رو تصور کنید

برنامه دارای مراحل سریال برای حل مشکل است. هر مرحله متکی به نتیجه مرحله قبل است. از این رو، هر مرحله مانع از اجرای مراحل بعدی می شود. ما فقط می توانیم چنین برنامه ای را با استفاده از رویکرد برنامه نویسی متوالی پیاده سازی کنیم. وابستگی آشکاری بین وظایف وجود دارد که به هیچ وجه قابل تجزیه نیست

نقطه مقابل برنامه نویسی متوالی، برنامه ریزی همزمان است. همزمانی بر این ایده استوار است که محاسبات مستقلی وجود دارد که می‌توانند به ترتیب دلخواه با نتیجه یکسان اجرا شوند.

مزایا و معایب محاسبات متوالی
سادگی: هر برنامه ای را میتوان در این پارادایم نوشت یک مفهوم ساده و قابل پیش بینی و رایج است
محاسبات متوالی یک رویکرد ساده با محمچعه‌ای واضح از دستورالعمل‌های گام به گام در مورد اینکه چه باید کرد و در چه زمانی انجام داد هستش

مقیاس پذیری: توانایی یک سیستم برای رسیدگی به مقدار فزاینده‌ای از کار، یا پتانسیل افزایش توانایی سیستم برای رسیدگی به کار برای سازگاری با رشد، با افزودن منابع سخت افزاری اگر بهبودی در سیستم دیده شود سیستم مقیاس پذیر می‌باشد ،اسکیل عمودی تنها راه افزایش مقیاس در محاسبات متوالی هستش

سربار: در محاسبات متوالی هیچ‌ ارتباط یا هماهنگی بین مراحل برنامه مورد نیاز نیست اما یک سربار وجود دارد که ممکن هست از همه منابع استفاده نکنیم


اجرای موازی(parallel)
همانطور که دیدیم، در اجرای سریال، تنها یک دستور در یک زمان اجرا می شود.
برنامه نویسی متوالی همان چیزی است که بیشتر مردم ابتدا یاد می گیرند و اکثر برنامه ها به این صورت نوشته می شوند: اجرا از ابتدای تابع اصلی شروع می شود و به صورت سریالی ادامه می یابد، یک کار/تابع، فراخوانی/عملیات در یک زمان.

وقتی این فرض را حذف می‌کنیم که می‌توانیم فقط یک کار را در یک زمان انجام دهیم، امکان کار موازی را باز می‌کنیم

لینک وب‌سایت

#concurrency

@code_crafters
👍21
تصور کنید با شما تماس گرفته و باید سریع به مسافرت برید چهار دست لباس دارید که باید شسته بشن میتونید شروع به شستن کنید اما اگر در نزدیکی شما یک خشکشویی وجود داشته باشد چه؟؟؟سریع به آنجا میروید و همه لباس‌هاتون رو باهم توسط دستگاه‌های متعدد آماده میکنن

در برنامه نویسی زمان لازم برای برای اجرای برنامه متوالی به سرعت پردازنده و سرعت اجرای ان سری از دستورالعمل‌ها محدود میشود مانند شستن لباس توسط خودتون، اما اگر خشکویی وجود داشته باشه چی؟؟؟همه لباس‌ها بصورت موازی شستشو داده میشوند توان عملیاتی شما افزایش می یابد ،در اینجا همان رویکرد اسکیل افقی رو در پیش گرفتیم

اجرای موازی به این معنی است که اجرای کار از نظر فیزیکی همزمان است. اجرای موازی برعکس اجرای سریال است. موازی بودن را می توان با تعداد کارهایی که می توان به صورت موازی اجرا کرد اندازه گیری کرد تصویر اول در کامنت‌ها

استقلال وظیفه در مبحث محاسبات متوالی ما فقط نیاز به پردازنده با کلاک بالاتر بودیم، اما در محاسبات موازی عمدتاً برای کاهش تأخیر با تقسیم یک مسئله به وظایفی که می‌توانند به طور همزمان و مستقل از یکدیگر اجرا شوند، استفاده می‌شود.

استفاده از محاسبات موازی مشکل خاصی است. برای اعمال محاسبات موازی برای یک مسئله، باید این امکان وجود داشته باشد که مسئله به مجموعه ای از وظایف مستقل تجزیه شود تا هر منبع پردازش بتواند بخشی از الگوریتم را به طور همزمان با بقیه اجرا کند. استقلال در اینجا به این معنی است که منابع پردازش می توانند وظایف را به هر ترتیبی که دوست دارند و هر کجا که دوست دارند پردازش کنند، تا زمانی که نتیجه یکسان باشد.
عدم انطباق با این الزام، مشکل را غیرقابل موازی سازی می کند.
کلید درک اینکه آیا یک برنامه می تواند به صورت موازی اجرا شود این است که تجزیه و تحلیل شود که کدام وظایف را می توان تجزیه کرد و کدام وظایف را می توان به طور مستقل اجرا کرد
 برنامه ای که می تواند به صورت موازی اجرا شود، همیشه می تواند متوالی شود، اما یک برنامه متوالی همیشه نمی تواند موازی شود
استقلال کار همیشه امکان پذیر نیست زیرا هر برنامه یا الگوریتمی را نمی توان از ابتدا تا انتها به وظایف مستقل تقسیم کرد. برخی از کارها می توانند مستقل باشند، و برخی نمی توانند اگر به وظایفی که قبلاً اجرا شده اند وابسته باشند.این امر به توسعه دهندگان نیاز دارد تا قطعات مختلف وابسته یک برنامه را برای به دست آوردن نتایج صحیح همگام سازی کنند
همگام سازی به معنای مسدود کردن اجرای وظیفه در انتظار وابستگی است(مثال بازی شطرنج)
هماهنگ کردن محاسبات موازی وابسته به هم از طریق همگام سازی می تواند موازی بودن برنامه را به شدت محدود کند و چالش مهمی را در نوشتن برنامه های موازی در مقایسه با برنامه های متوالی ساده ایجاد می کند.

پشتیبانی سخت افزاری محاسبات موازی نیاز به پشتیبانی سخت افزاری دارد. برنامه های موازی به سخت افزار با منابع پردازشی متعدد نیاز دارند. بدون حداقل دو منبع پردازش، ما نمی توانیم به موازی کاری واقعی دست یابیم

محاسبات موازی
محاسبات موازی از تجزیه برای تقسیم مسائل بزرگ یا پیچیده به وظایف کوچک استفاده می کند و سپس از اجرای موازی سیستم زمان اجرا برای حل موثر آنها استفاده می کند.(برای مثال رویکرد معروف به brute-force)

قانون امدال
اگر فکر میکنید با افزودن منابع بیشتر و موازی سازی کردن بیشتر سرعت رو مدام و مدام افزایش میدهید سخت در اشتباه هستید
تصور کنید سه تسک دارید که زمان اجرایی آنها متفاوت هستش (۱,۴,۳) تسک ۴ رو میتونید به دو تسک دوتایی بشکنید و موازی کنید اما تسک ۳ یک تسک متوالی هست پس هرکاری کنید نمیتونید زمان برنامه رو به کمتر از ۳ برسونید

یک برنامه موازی به سرعت کندترین قسمت متوالی آن اجرا می شود یک فرمول هم داره در تصویر دوم کامنت‌ها

قانون گوستافسون
قانون امدال نباید شما رو نا امید کنه، گوستافسون دیدگاه خوش بینانه تری از محدودیت های موازی ارائه می دهد. اگر مدام حجم کار را افزایش دهیم، قسمت های متوالی اثر کمتر و کمتری خواهند داشت و متناسب با تعداد پردازنده هایی که در اختیار داریم، می توانیم سرعت را مشاهده کنیم
بنابراین اگر زمانی شنیدید که قانون امدال به عنوان دلیلی برای عدم کارایی موازی در مورد شما ذکر شده است، می توانید مشاهده کنید که گوستافسون توضیحی برای آنچه باید انجام دهید داشت.

همزمانی (concurrency) و موازی سازی (parallelism)

همزمانی در مورد وظایف متعددی است که بدون ترتیب خاصی در بازه های زمانی همپوشانی شروع، اجرا و تکمیل میشند

موازی بودن یک ویژگی اجرایی است. این اجرای فیزیکی همزمان وظایف در زمان اجرا است و به سخت افزار با منابع محاسباتی متعدد نیاز دارد روی لایه سخت افزاری قرار دارد

همزمانی و موازی بودن یک چیز نیستند

لینک وب‌سایت

#concurrency

@code_crafters
4👍2
فصل سوم کتاب همزمانی در پایتون

در این فصل نگاهی عمیقتر به سخت افزار بالاخص cpu انداخته

در سیستم‌های قدیمی پردازنده بسیار ساده بود اما امروز در ساده ترین دستگاه‌ها چند پردازنده وجود دارد، این مارو سوق میده تا برنامه‌های موازی بنویسیم ،لذا درک پردازنده به ما کمک شایانی خواهد کرد تا بتونیم برنامه‌های کاراتری بنویسیم

پردازنده (CPU)
پردازنده‌ها قدیمی مدارهایی بودن که کارهای متفاوتی رو انجام میدادن و عملیات برای دستگاه‌های جانبی پیش میبردن
اما امروز به شکل مدرنتر خودش بر وظیفه اصلی خودش که همون اجرای دستورالعمل‌ هاست متمرکز شده، پردازنده از اجزای مختلفی تشکیل شده
واحدکنترل CU که وظیفه تفسیر دستورالعمل‌های ماشین را دارد

واحد منطق حسابی ALU عملیات حسابی و بیتی رو انجام میده

به لطف این دو بخش پردازنده امروزی برنامه‌های پیچیده‌تری رو پردازش میکنه

علاوه بر این واحد cache نیز که موجب افزایش بیشتر سرعت در پردازنده شده


زمانیکه یک برنامه رو اجرا میکنید داده‌های اون بر روی RAM قرار میگیرد که در اتصال با پردازنده هستش اما پردازنده بطور مستقیم به RAM دسترسی ندارد توانایی پردازنده برای محاسبه بسیار سریعتر از توانایی RAM برای انتقال داده به پردازنده هستش، به همین دلیل در پردازنده‌های مدرن یک یا چند سطح حافظه کش برای افزایش سرعت قرار دارد
در پست‌های قبلی گفتیم که هنگام خرید دستگاهی اندازه پردازنده یکی از عوامل مهم و تاثیر گذار در قدرت اون دستگاه در کنار فرکانس پردازنده هستش، یکی دیگر از موارد مهم در هنگام خرید همین کش هستش که با نمادهای L1,L2,L3 بر روی دستگاه‌ها نوشته شده و بالا بودن مقدار آن که مقداری مگابایتی هستش یکی موضوعات حائز اهمیت در انتخاب دستگاه بهتر به شمار می رود

کش بعنوان یک میز کار برای پردازنده در نظر بگیرید تصویر اول در کامنت‌ها

کش بسیار سریعتر از RAM هستش و بر روی تراشه پرادزنده قرار دارد ، دستورالعملها رو جهت اجرا در پردازنده را در خود نگه میدارد آنها را بررسی و تحزیه و تحلیل میکند و در صورت نیاز از RAM بازیابی و در حافظه پنهان خود نگه میدارد

تمام دسترسی‌ها و انتقالات موجب تاخیر میشود و کش بابت کاهش این تاخیر قرار گرفته

چرخه اجرای پردازنده
پردازنده یک فرایند مداوم از اجرای دستورالعمل را در مراحل مختلف انجام میده که به عنوان چرخه پردازنده شناخته میشه و در ساده ترین شکل خود در چهار مرحله مختلف به شکل زیر هستش تصویر دوم در کامنت‌ها
۱- واکشی.  CU دستورالعمل را از RAM یا کش واکشی می کند و آن را در CPU کپی می کند.  در این فرآیند، CU از شمارنده‌های مختلفی استفاده می‌کند تا بفهمد چه دستورالعملی باید واکشی شود و کجا آن را پیدا کند

۲- دستورالعمل که قبلاً واکشی شده رمزگشایی شده و برای پردازش ارسال می شود
انواع مختلف دستورالعمل ها کارهای متفاوتی انجام می دهند، بنابراین بسته به نوع دستورالعمل و کد عملیات، باید بدانیم دستورالعمل ها به کدام واحدهای پردازشی ارسال می شود

۳- سپس دستور محاسبات به ALU منتقل می شود و اجرا را شروع می کند

۴- پس از تکمیل دستورالعمل، نتیجه در RAM نوشته می شود و دستور بعدی اجرای خود را آغاز می کند

سپس پردازنده به مرحله 1 برمی گردد تا زمانی که دیگر دستورالعملی برای واکشی باقی نماند

توسعه دهندگان دوست دارن همه چیز رو خودشون کنترل کنن(سخت افزار، خطاها، مدیریت‌ها و اشتراک منابع)
با توجه به رشد سخت افزار متناسب با مدیریت‌های گوناگون اینکار به یک مسئله پیچیده تبدیل شده، لذا امروزه ما از یک مدیر سیستم عامل که یک رابط بین توسعه دهنده و سخت افزار هست بهره میبریم به مجموعه این رابط‌ها فراخوانی سیستم مینامیم که با در اختیار گذاشتن خدمات و ابزارهایی که با سخت افزار در تعامل هستند برنامه‌های کاربردی میتوانند از آن استفاده کنند

سیستم عامل از طریق گذرگاه به منابع سخت افزاری دسترسی دارد، ما دو نوع سطح دسترسی داری فضای کاربر که در اختیار کاربر است و فضای سیستم عامل که زیر آن سخت افزار قرار دارد ، کاربر و برنامه های کاربر نمیتوانند مستقیم با سخت افزار ارتباط بگیرن سخت افزار بشکل کامل در کنترل و احاطه کرنل می باشد


با این درک بیایید نگاهی به ساختار موازی سخت افزار بندازیم، پردازنده دارای تعداد زیادی ALU هستش که میتوانند عملیات حسابی رو شکسته و تجزیه کرده و بصورت موازی با هم پیش ببرند گاهی این موازی سازی در سطح عمیقتر تا یک بیت هم پیش میرود

پردازنده چند هسته‌ای نوعی دیگر از همزمانی هستش که هسته‌ها درون یک تراشه هستند و عملکرد انها جدا از هم هستش حتی هنگام دسترسی به حافظه، سیستم عامل هرکدام را مستقل میبیند تفاوت جزیی با چندپردازندگی دارد و در طول این متن‌ها هردو رو یکسان در نظر میگیریم تصویر سوم کامنت‌ها

لینک وبسایت

#concurrency

@code_crafters
👍2
معماری متقارن چند پردازشی SMP
حافظه معمولا سرعت پایینتری نسبت به پردازنده‌ها دارن که این خود موجب تاخیر میشود به همین دلیل امروزه از سیستم‌های چندپردازنده‌ای از SMP استفاده میکنند که با یک فضای آدرس واحد به حافظه مشترک متصل شده و تحت یک سیستم عامل کار میکند، در این معماری پردازنده‌ها توسط یک شبکه ارتباطی از طریق گذرگاه سیستم به هم متصل میشن، هرچند این شبکه‌ها سریع هستن اما اگه پردازنده‌ها نیاز به تبادل با هم داشته باشند از طریق چندکانال صورت میگیرد که انی نیست و در صورت افزایش تعداد منابع در حال تعامل فاصله بینشون موجب تاخیر میشه مجدد، بنابراین در این معماری هر پردازنده کش خصوصی خود را دارد تا ترافیک system bus را کاهش داده و تاخیر کمتری روی میده تصویر اول در کامنت‌ها
جالب ترین ویژگی SMP این است که وجود چندین پردازنده برای کاربر نهایی شفاف است.  سیستم عامل از زمان‌بندی فرآیندها در تک تک پردازنده‌ها و همگام‌سازی بین آن پردازنده‌ها مراقبت می‌کند، با این حال، در چنین سیستم هایی، افزایش تعداد پردازنده های متصل به یک گذرگاه سیستم مشترک، آن را به یک گلوگاه تبدیل می کند.  این مشکل با انسجام کش بدتر می شود، جایی که چندین هسته پردازشگر سلسله مراتب حافظه یکسانی را به اشتراک می گذارند اما کش های داده و دستورالعمل L1 خود را دارند

توسعه پروتکل MESI مشکل انسجام حافظه رو حل کرد ،با ردیابی وضعیت هر کش موجب میشه همه پردازنده‌ها دید ثابتی از داده داشته باشند


تنها راه فراتر رفتن از SMP سیستم‌های توزیع شده هست که در یک شبکه باهم در ارتباط داشته باشند و بدین شکل هر سیستم بعنوان یک خوشه حافظه و کش خودش رو داره و بر بقیه تاثیر نمیزاره


تصویر دوم در کامنت‌ها
طبقه بندی رایانه های موازی بر اساس دستورالعمل ها و جریان داده ها.
دو دسته SISD , MISD مناسب مواری سازی نیستند کار کرده انها بگونه‌ای هستش که یک بلوک از دستورالعمل‌هارو میگیرن و تنها همون رو پیش میبرند

در دسته سوم، یک دستورالعمل، داده های متعدد (SIMD) است که دارای واحدهای کنترل مشترک در چندین هسته است، با این طراحی، تنها یک دستور را می توان به طور همزمان بر روی تمام منابع پردازشی موجود اجرا کرد، که اجازه می دهد همان عملیات روی مجموعه بزرگی از عناصر داده به طور همزمان انجام شود، با این حال، مجموعه دستورالعمل در ماشین‌های SIMD محدود است، و آنها را برای حل مسائل خاصی که نیاز به قدرت محاسباتی بالایی دارند اما تطبیق‌پذیری زیادی ندارند، مناسب می‌سازد، واحدهای پردازش گرافیکی (GPU) نمونه شناخته شده SIMD امروزه هستند
دسته چهارم دستورالعمل های چندگانه، داده های چندگانه (MIMD) است، در اینجا، هر منبع پردازش یک واحد کنترل مستقل دارد
بنابراین، به انواع خاصی از دستورالعمل ها محدود نمی شود و دستورالعمل های مختلف را به طور مستقل بر روی یک بلوک جداگانه از داده ها اجرا می کند، بنابراین، شامل معماری هایی با چندین هسته، چندین CPU یا حتی چندین ماشین می شود تا وظایف مختلف را بتوان به طور همزمان در چندین دستگاه مختلف اجرا کرد

پردازنده‌های گرافیکی برای کارهای محاسباتی تکراری و موازی مانند پردازش تصویر و ویدئو، یادگیری ماشین، شبیه‌سازی‌های مالی و بسیاری دیگر از محاسبات علمی مناسب هستند. عملیاتی مانند جمع و ضرب ماتریس به راحتی با استفاده از یک GPU انجام می شود زیرا اکثر این عملیات در سلول های ماتریس مستقل از یکدیگر و مشابه هستند و بنابراین می توان آنها را موازی کرد تصویر سوم در کامنت‌ها



لینک وبسایت

#concurrency

@code_crafters
👍1
فصل چهارم کتاب

ساخت بلوک‌های همزمانی
همزمانی شامل تجزیه برنامه به واحدهای مستقل است، در فصول قبل سخت افزار رو بررسی کردیم و در سیستم‌های مدرن برای همزمانی با استفاده از انتزاعی که سیستم عامل بر روی سخت افزار انجام میدهد میتوانیم همزمانی رو پیش ببریم، در این فصل به این موضوع میپردازیم که توسعه دهندگان برنامه خود را چطور با کمک سیستم عامل در استفاده بهینه از سخت افزار ساختار می‌دهند

مراحل برنامه نویسی همزمان
برنامه نویسی همزمان مجموعه‌ای از انتزاع‌ها است که به توسعه دهندگان این اجازه رو میده تا برنامه خودشون رو به وظابفی کوچک و مستقل ساختار داده و از طریق سیستم زمان اجرا (system runtime) جهت اجرا در صف انتقال دهند، سیستم زمان اجرا منابع رو برای استفاده بهینه هماهنگ کرده و وظایف رو برای اجرا در منابع ارسال میکند، دو انتزاع برای اینکار در همزمانی وجود دارد فرآیندها و رشته‌ها

فرایندها(processes)
فرآیند خود یک برنامه است که روی دیسک مینشیند یک مجموعه دستورالعمل‌ها رو نشون میده که منتظر اجرا هستند، سیستم عامل این دستورالعمل هارو میگیره به حالت اجرا میبره و به یک برنامه با ارزش تبدیل میکند

سورس کدها بجز یکسری دستورالعمل چیزی نیستند و بخودی خود هیچ ارزشی ندارن مگر اینکه اجرا شده و با انتزاع منابع عمل میکند

توسعه دهندگان هنگام نوشتن کد حافظه‌ای رو برای ذخیره، فایلهایی جهت خواندن و نوشتن و سخت افزارهایی برای ارسال سیگنال به آنرا ندارند

منابع واقعی باید در زمان اجرا فراهم شوند، انتزاع ارائه شده توسط سیستم عامل برای یک برنامه در حال اجرا همان چیزیست که ما بهش فرآیند میگوییم

در سطح دستورالعمل ماشین هیچ مفهومی از فرآیند وجود ندارد

هدف از فرآیندها در سیستم عامل، جداسازی وظایف و تخصیص منابع جهت اجرای انهاست، تمام لرآیندها منابع مشترک دارند و توسط سیستم عامل مدیریت میشوند جهت اطلاع سیستم عامل از رابطه بین فرآیندها و منابع، هر فرآیند باید فضای آدرس مستقل و جدول فایل خود را داشته باشد
فرآیندها واحد تخصیص منابع در سیستم عامل هستند

سیستم عامل برای فرآیندها توهم مالکیت کامل رایانه رو ایجاد میکنند حتی اگر بطور همزمان اجرا شوند ،مزیت فرآیندها استقلال کامل و جداسازی اجرای انها از بقیه سیستم، جلوگیری از تداخل و عدم تاثیر گذاری خرابی یکی بر بقیه است
اما یک ضعف دارد اگر فرایندی نیاز به ارتباط با فرآیند دیگر داشته باشد ذاتا فرآیندها این رو ندارن و این موجب میشه از یکسری مکانیسم استفاده کنیم که معمولا چندین مرتبه از دسترسی مستقیم به داده‌ها کندتر است

نگاهی به درون فرآیند تصویر اول در کامنت‌ها
فرایند فقط یک برنامه در حال اجرا است، که با دسترسی به سیستم
داده هایی که فرآیند می خواند یا می نویسد در حافظه ذخیره می شود.  بنابراین، حافظه ای که فرآیند می تواند ببیند یا به آن دسترسی داشته باشد (فضای آدرس) بخشی از فرآیند در حال اجرا است.
• فایل اجرایی با تمام دستورالعمل های ماشین بخشی از فرآیند است.
• فرآیند همچنین به یک شناسه نیاز دارد: یک نام منحصر به فرد که فرآیند را می توان با آن شناسایی کرد. به آن شناسه فرآیند (PID) می گویند.
• در نهایت، برنامه ها اغلب به دیسک ها، منابع شبکه یا سایر دستگاه های شخص ثالث دسترسی دارند. چنین اطلاعاتی باید شامل فهرستی از فایل‌هایی باشد که در حال حاضر توسط فرآیند باز می‌شوند، اتصالات شبکه باز و هرگونه اطلاعات اضافی درباره منابعی که استفاده می‌کند.

بنابراین، یک فرآیند چیزهای زیادی را در بر می گیرد: یک فایل اجرایی، مجموعه منابع مورد استفاده (فایل ها، اتصالات و غیره) و فضای آدرس با متغیرهای داخلی. به همه اینها زمینه اجرا می گویند. شروع فرآیند همیشه یک‌ کار سنگین بوده است
فرآیندها معمولاً توسط سیستم عامل ایجاد می شوند. علاوه بر ایجاد فرآیندها، سیستم عامل مسئولیت خاتمه فرآیند را نیز بر عهده دارد.  این یک کار پیش پا افتاده نیست.  سیستم عامل باید بفهمد که فرآیند به پایان رسیده است - یا کار کامل شده است، فرآیند ناموفق است و زمان پاکسازی آن فرا رسیده است، یا فرآیند والد تمام شده است. ایجاد یا خاتمه یک فرآیند نسبتاً پرهزینه است زیرا همانطور که دیدیم، یک فرآیند منابع زیادی به آن متصل است و باید ایجاد یا آزاد شوند.  انجام این کار به زمان سیستم نیاز دارد و تاخیر اضافی را معرفی می کند.


یک فرآیند میتواند فرآیندهای خود را اجرا کند که به آنها فرآیندها فرزند میگویند و کامل مستقل هستند حافظه و و فضای نام خود را دارند تصویر دوم در کامنت‌ها

درک این موضوع در کد راحتتر از تئوری آن است کدهای فرآیند در کامنت‌ها


لینک وب‌سایت

#concurrency

@code_crafters
رشته‌ها threads
اشتراک گذاری حافظه بین فرآیندها در اکثر سیستم عامل ها امکان پذیر است، اما به موارد اضافی نیاز دارد که تلاش بیشتری طلب میکند، اما یک مفهوم دیگر که در اشتراک حافظه یک بیت بیشتر به ما کمک میکند وحود دارد:رشته

یک برنامه به سادگی مجموعه ای از دستورالعمل های ماشین است که باید پشت سر هم اجرا شوند برای تحقق این امر سیستم عامل از مفهوم رشته استفاده میکند
گفتیم یک فرآیند یک برنامه در حال اجرا به اضافه منابع است، اگر برنامه را به اجزای جداگانه تقسیم کنیم، یک فرآیند محفظه ای از منابع (فضای آدرس، فایل ها، اتصالات و غیره) است و یک رشته یک بخش پویا است - دنباله ای از دستورالعمل ها که در داخل این ظرف اجرا می شوند.  بنابراین، در زمینه سیستم عامل، یک فرآیند را می توان به عنوان واحدی از منابع در نظر گرفت، در حالی که یک رشته را می توان به عنوان واحد اجرا مشاهده کرد


رشته‌ها با این ایده متولد شدن که کارآمدترین راه برای اشتراک گذاری فضای ادرس مشترک هستند تصویر اول در کامنت‌ها
رشته‌ها در یک فرآیند واحد، مانند فرآیندهایی هستند که میتوانند به راحتی منابع را با یکدیگر و فرآیند اصلی خود به اشتراک بگذارند

رشته‌ها وضعیت خود را حفظ میکنند تا مستقل از بقیه اجرا شوند، همچنین رشته‌ها از حضور بقیه رشته‌ها بی اطلاع هستند مگر اینکه باهم تداخلی داشته باشند
سیستم عامل رشته‌ها رو مدیریت میکند و میتواند بین چند پردازنده آنها را اجرا کند بنابراین رشته‌ها گزینه خوبی برای اجرای همزمانی هستند
 اکثر سازندگان سخت افزار از Pthreads استفاده می کنند، که یک استادارد IEEE می باشد
در این استاندارد، هر برنامه ای که اجرا می کنیم باعث می شود سیستم عامل یک فرآیند ایجاد کند و هر فرآیند حداقل یک رشته دارد. یک فرآیند بدون رشته نمی تواند وجود داشته باشد. هر رشته همچنین زمینه اجرای مستقل خود را حفظ می کند تا اطمینان حاصل شود که دستورالعمل های آن به طور ایمن و مستقل اجرا می شوند


مزایای استفاده از رشته‌ها نسبت به فرآیندها
۱: فرآیندها کاملاً مستقل هستند، هر کدام دارای فضای آدرس، مجموعه‌ای از رشته‌ها و کپی‌هایی از متغیرها هستند که کاملاً مستقل از همان متغیرها در سایر فرآیندها هستند رشته ها نسبت به عملکرد استاندارد fork() سربار حافظه کمتری دارند زیرا رشته والد کپی نمی شود رشته ها از همان فرآیند استفاده می کنند.به همین دلیل، رشته ها را گاهی اوقات فرآیندهای سبک وزن نیز می نامند
در نتیجه، ما می‌توانیم رشته‌های بیشتری نسبت به فرآیندهای روی یک سیستم ایجاد کنیم
ایجاد و پایان دادن به رشته ها سریعتر از فرآیندها است زیرا زمان کمتری را برای سیستم عامل برای تخصیص و مدیریت منابع نخ نیاز دارد.به همین دلیل، می‌توانیم هر زمان که در برنامه‌ای منطقی بود، رشته‌هایی ایجاد کنیم و نگران اتلاف زمان و حافظه پردازنده نباشیم

۲: هزینه ارتباط کمتر، هر فرآیند با حافظه خاص خود کار می کند.فرآیندها فقط می توانند چیزی را از طریق یک مکانیسم ارتباطی فرآیندی مبادله کنند
رشته‌ها از فضای آدرس یکسانی استفاده می‌کنند و بنابراین می‌توانند با نوشتن و خواندن در فضای آدرس مشترک فرآیند والد خود بدون هیچ مشکلی یا سربار با یکدیگر ارتباط برقرار کنند: هر چیزی که توسط یک رشته تغییر کند بلافاصله در دسترس همه است
از این رو، برای سیستم های SMP که به طور گسترده مورد استفاده قرار می گیرند، گاهی اوقات استفاده از رشته ها بسیار راحت تر از فرآیندها است


ضعف رشته‌ها
فرایندها در سطح سیستم عامل کاملا مستقل از همدیگه هستند، در صورت خراب شدن یکی بر دیگری تاثیری نمی‌گذارد، اما رشته‌ها چون در یک فرآیند اجرا میشوند در صورت خرابی یکی ممکنه موجب خرابی بقیه هم بشه، لذا برنامه نویسان باید در دسترسی به منابع بین رشته‌ها همگام سازی کنند و کنترل بیشتری بر رفتار آنها اعمال کنند

کد رشته‌ها در کامنت

لینک وبسایت

#concurrency

@code_crafters
فصل پنجم کتاب همزمانی

ارتباط بین فرآیندی

ما نمیتونیم همیشه تضمین کنیم که همیشه وظایف همزمان در سیستم مستقل هست، گاهی وقت یک اجرای یک وظیفه وابسته به خروجی وظیفه دیگری است،اگر همچین مسئله‌ای روی بده برنامه باید بداند چه وقتی کار کند، ارتباط بین وظایف بخش جدایی ناپذیر سیستم‌های همزمانی است و اگر نتوانیم این مورد رو هندل کنیم دستاوردی نداشتیم در این فصل به این مسئله میپردازیم


انواع ارتباط
سیستم عامل مکانیزم‌هایی براتون فراهم میکنه تا بتونید در فرآیندها و رشته‌ها امکان ارتباط گرفتن رو ایجاد کنید این مکانیسم رو با نام IPC میشناسیم

( خب IPC مجموعه‌ای از روش‌ها برای تبادل اطلاعات بین چندین فرآیند یا رشته در حال اجرا در یک سیستم عامل است. این فرآیندها می‌توانند در یک یا چند رایانه متصل به هم توسط یک شبکه اجرا شوند.)
خود IPC به معنای ارتباط بین فرآیندی هستش اما این به این معنا نیست که فقط در فرآیند مورد استفاده هست، در واقع هر فرآیند حداقل یک رشته دارد و ارتباط هم فقط توسط رشته ها صورت میگیرد

در فصول گذشته راجب نام گذاری‌های اشتباه و بد در کامپیوتر حرف زدیم در اینجا هم دقیقا این موضوع صحت داره ،لذا ما از نام task یا همون وظیفه برای انتزاع آن استفاده میکنیم تا از سردرگمی معنایی خارج بشیم


محبوبترین نوع‌های IPC دو مورد هستند، اشتراک حافظه (shared memory) و ارسال پیام (message passing)


اشتراک حافظه:
ساده‌ترین راه برای برقراری ارتباط بین وظایف استفاده از حافظه مشترک هستش، حافظه مشترک به یک یا چند کار اجازه میده تا از طریق حافظه مشترک که در همه فضاهای ادرس مجازی اونها ظاهر میشه، ارتباط برقرار کنند انگار که در حال خوندن و نوشتن برای متغییرهای محلی هستند که بخشی از فضای آدرس اونها هستند، بنابراین تغییرات ایجاد شده توسط یک فرآیند یا رشته، بلافاصله بدون تعامل با سیستم عامل در سایر فرآیندها منعکس بشه

اگر دو‌پردازنده در یک رایانه به مکان حافظه فیزیکی یکسانی اشاره داشته باشند یا زمانی که در رشته‌های درون یک برنامه اشیا مشابهی را به اشتراک میگذراند IPC حافظه مشترک یافت میشه کدها در کامنت


اشتراک‌گذاری حافظه مزایا و معایب خودش رو داره

مزایا
این رویکرد سریع‌ترین و کم مصرف ترین ارتباط ممکن رو فراهم میکنه، اگرچه سیستم عامل به تخصیص خافظه مشترک کمک میکمند اما در ارتباط بین وظایف شرکت نمیکند، در این حالت سیستم عامل بطور کامل حذف شده و موجب سرعت بالاتر و کپی داده کمتر میشود
تصور اول در کامنت ها


معایب
لزوما امن‌ترین ارتباط بین وظایف نیست ،سیستم عامل حفاظت از حافظه مشترک را فراهم نمیکند برای مثال ممکن هست دو تسک همزمان بهواهند به حافظه مشترک برای تغییر دادن یا خواندن اقدام کنند، به دلیل این روش بیشتر مستعد خطاست و توسعه دهندگان باید با محافظت از آن مجدد کد بنویسند

مورد دیگر این است که حافظه مسترک برای کارهای محلی قابل استفاده است و در سیستم‌های پراکنده بزرگ مشکل ساز است که داده‌های مورد پردازش نمیتوانند در یک ماشین قرار بگیرند، اما برای سیستم‌های معماری کتقارن چند پردازشی (SMP) مناسب است (در این سیستم‌ها تمام فرایندها و رشته‌ها در در پردازنده‌های مختلف، یک فضای آدرس منطقی منحصر بفرد نگاشت شده و به حافظه فیزیکی را به اشتراک میگذارد)


ارسال پیام
پرکاربردترین مکانیسم که توسط تمامی سیستم‌عامل ها پشتیبانی میشود، هر وظیفه با یک نام منحصر بفرد شناسایی میشود و وظایف با ارسال و دریافت پیام به و از وظایف نامگذاری شده تعامل دارند ،سیستم عامل یک کانال ارتباطی ایجاد میکند و فراخوانی‌های سیستمی مناسبی را برای وظایف در این رویکرد از طریق این کانال را فراهم میکند

مزیت این رویکرد این است که سیستم عامل کانال را مدیریت می‌کند و رابط‌هایی با کاربری آسان برای ارسال و دریافت داده‌ها بدون درگیری فراهم می‌کند.از سوی دیگر، هزینه ارتباطی هنگفتی وجود دارد.برای انتقال هر گونه اطلاعات بین کارها، باید از فضای کاربر وظیفه از طریق تماس های سیستمی به کانال سیستم عامل کپی شود و سپس به فضای آدرس وظیفه دریافت کننده کپی شود
همچنین می‌توان آن را به راحتی فراتر از یک دستگاه به سیستم‌های توزیع‌شده تقسیم کرد


فلسفه زبان گولنگ اشتراک گذاری حافظه از طریق ارتباط است و با این شعار (از طریق اشتراک حافظه، ارتباط برقرار کنید، بلکه با برقراری ارتباط، حافظه را به اشتراک بگذارید)


حالا درک میکنید چرا میگیم گولنگ، این بچه زاده دوران تایمینگ و کلاک هستش
تکنولوژی‌های زیادی برای این مکانیسم وجود دارد که رایج ترین انها در سیستم‌عامل‌های مدرن شامل لوله‌ها pipes، سوکت‌ها و صف‌های پیام
شاید براتون جالب باشه که بدونید سلری از همین مکانیزم تبادل پیام در بین اجزای خودش استفاده میکنه


ادامه مبحث در وبسایت...

لینک وب‌سایت

#concurrency

@code_crafters
3