Skip to content

Commit 58ceea4

Browse files
committed
deploy: cb5b8ce
1 parent 856dcc0 commit 58ceea4

File tree

2 files changed

+3
-3
lines changed

2 files changed

+3
-3
lines changed

chapter-4/feed.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4365,8 +4365,8 @@ Goroutine: مدیریت نحوه اجرای کد شما بر روی پردازن
43654365
<img src="../../assets/img/content/chapter4/profiling/6.gif" alt="stack">
43664366
</a></center>
43674367
<p>مثال بالا به شدت ساده شده است و بسیاری از جزئیات مانند مقادیر بازگشتی، اشاره‌گرهای فریم، آدرس‌های بازگشت و درون‌خطی‌سازی (inlining) توابع را حذف کرده است. در واقع، از نسخه Go 1.17 به بعد، ممکن است برنامه بالا نیازی به فضای پشته نداشته باشد، زیرا مقدار کم داده می‌تواند توسط کامپایلر با استفاده از ثبات‌های پردازنده (CPU registers) مدیریت شود. اما این مسئله مشکلی ایجاد نمی‌کند. این مدل همچنان به شما یک شهود معقول از نحوه تخصیص و حذف متغیرهای محلی در برنامه‌های پیچیده‌تر Go روی پشته می‌دهد.</p>
4368-
<p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی می‌افتد اگر فضای پشته تمام شود. در زبان‌هایی مانند C، این موضوع باعث خطای <em>سرریز پشته</em> (stack overflow) می‌شود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت می‌شود. این قابلیت به goroutineها اجازه می‌دهد که با پشته‌های بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاس‌پذیری بیشتر goroutineها نسبت به نخ‌های سیستم‌عامل همین موضوع است.</p>
4369-
<p>یکی دیگر از جنبه‌های پشته، نحوه استفاده از آن در ایجاد <em>ردیابی پشته</em> (stack trace) است. این موضوع کمی پیشرفته‌تر است، اما اگر علاقه‌مند هستید، می‌توانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p>
4368+
<p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی می‌افتد اگر فضای پشته تمام شود. در زبان‌هایی مانند C، این موضوع باعث خطای سرریز پشته (stack overflow) می‌شود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت می‌شود. این قابلیت به goroutineها اجازه می‌دهد که با پشته‌های بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاس‌پذیری بیشتر goroutineها نسبت به نخ‌های سیستم‌عامل همین موضوع است.</p>
4369+
<p>یکی دیگر از جنبه‌های پشته، نحوه استفاده از آن در ایجاد ردیابی پشته (stack trace) است. این موضوع کمی پیشرفته‌تر است، اما اگر علاقه‌مند هستید، می‌توانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p>
43704370
<h4 id="425122-هیپ-heap">
43714371
4.25.1.2.2 هیپ (Heap)
43724372
<a class="anchor" href="#425122-%d9%87%db%8c%d9%be-heap">#</a>

chapter-4/profiling/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-1-7><a style=outline:none;text-decoration:none;color:inherit href=#hl-1-7>7</a></span><span><span style=color:#8be9fd;font-style:italic>func</span> <span style=color:#50fa7b>add</span>(a, b <span style=color:#8be9fd>int</span>) <span style=color:#8be9fd>int</span> {
6363
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-1-8><a style=outline:none;text-decoration:none;color:inherit href=#hl-1-8>8</a></span><span> <span style=color:#ff79c6>return</span> a <span style=color:#ff79c6>+</span> b
6464
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-1-9><a style=outline:none;text-decoration:none;color:inherit href=#hl-1-9>9</a></span><span>}
65-
</span></span></code></pre></div><p><strong>برای درک بهتر این موضوع، به مثال زیر توجه کنید:</strong></p><p>در اینجا یک تابع <code>main()</code> داریم که با رزرو مقداری فضا روی پشته برای متغیر <code>sum</code> شروع می‌شود. وقتی تابع <code>add()</code> فراخوانی می‌شود، یک فریم مخصوص برای نگه داشتن پارامترهای محلی <code>a</code> و <code>b</code> به آن اختصاص داده می‌شود. پس از اتمام اجرای <code>add()</code>، داده‌های آن با بازگرداندن اشاره‌گر پشته به انتهای فریم تابع <code>main()</code> حذف می‌شوند و متغیر <code>sum</code> با نتیجه به‌روز می‌شود. در همین حال، مقادیر قدیمی تابع <code>add()</code> فراتر از اشاره‌گر پشته باقی می‌مانند تا با فراخوانی بعدی تابع بازنویسی شوند. در زیر یک تصویرسازی از این فرآیند آمده است:</p><center><a href=#><img src=../../assets/img/content/chapter4/profiling/6.gif alt=stack></a></center><p>مثال بالا به شدت ساده شده است و بسیاری از جزئیات مانند مقادیر بازگشتی، اشاره‌گرهای فریم، آدرس‌های بازگشت و درون‌خطی‌سازی (inlining) توابع را حذف کرده است. در واقع، از نسخه Go 1.17 به بعد، ممکن است برنامه بالا نیازی به فضای پشته نداشته باشد، زیرا مقدار کم داده می‌تواند توسط کامپایلر با استفاده از ثبات‌های پردازنده (CPU registers) مدیریت شود. اما این مسئله مشکلی ایجاد نمی‌کند. این مدل همچنان به شما یک شهود معقول از نحوه تخصیص و حذف متغیرهای محلی در برنامه‌های پیچیده‌تر Go روی پشته می‌دهد.</p><p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی می‌افتد اگر فضای پشته تمام شود. در زبان‌هایی مانند C، این موضوع باعث خطای <em>سرریز پشته</em> (stack overflow) می‌شود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت می‌شود. این قابلیت به goroutineها اجازه می‌دهد که با پشته‌های بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاس‌پذیری بیشتر goroutineها نسبت به نخ‌های سیستم‌عامل همین موضوع است.</p><p>یکی دیگر از جنبه‌های پشته، نحوه استفاده از آن در ایجاد <em>ردیابی پشته</em> (stack trace) است. این موضوع کمی پیشرفته‌تر است، اما اگر علاقه‌مند هستید، می‌توانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p><h4 id=425122-هیپ-heap>4.25.1.2.2 هیپ (Heap)
65+
</span></span></code></pre></div><p><strong>برای درک بهتر این موضوع، به مثال زیر توجه کنید:</strong></p><p>در اینجا یک تابع <code>main()</code> داریم که با رزرو مقداری فضا روی پشته برای متغیر <code>sum</code> شروع می‌شود. وقتی تابع <code>add()</code> فراخوانی می‌شود، یک فریم مخصوص برای نگه داشتن پارامترهای محلی <code>a</code> و <code>b</code> به آن اختصاص داده می‌شود. پس از اتمام اجرای <code>add()</code>، داده‌های آن با بازگرداندن اشاره‌گر پشته به انتهای فریم تابع <code>main()</code> حذف می‌شوند و متغیر <code>sum</code> با نتیجه به‌روز می‌شود. در همین حال، مقادیر قدیمی تابع <code>add()</code> فراتر از اشاره‌گر پشته باقی می‌مانند تا با فراخوانی بعدی تابع بازنویسی شوند. در زیر یک تصویرسازی از این فرآیند آمده است:</p><center><a href=#><img src=../../assets/img/content/chapter4/profiling/6.gif alt=stack></a></center><p>مثال بالا به شدت ساده شده است و بسیاری از جزئیات مانند مقادیر بازگشتی، اشاره‌گرهای فریم، آدرس‌های بازگشت و درون‌خطی‌سازی (inlining) توابع را حذف کرده است. در واقع، از نسخه Go 1.17 به بعد، ممکن است برنامه بالا نیازی به فضای پشته نداشته باشد، زیرا مقدار کم داده می‌تواند توسط کامپایلر با استفاده از ثبات‌های پردازنده (CPU registers) مدیریت شود. اما این مسئله مشکلی ایجاد نمی‌کند. این مدل همچنان به شما یک شهود معقول از نحوه تخصیص و حذف متغیرهای محلی در برنامه‌های پیچیده‌تر Go روی پشته می‌دهد.</p><p>شاید در این مرحله این سوال برای شما پیش بیاید که چه اتفاقی می‌افتد اگر فضای پشته تمام شود. در زبان‌هایی مانند C، این موضوع باعث خطای سرریز پشته (stack overflow) می‌شود. اما در Go، این مشکل به صورت خودکار با ایجاد یک نسخه کپی از پشته که دو برابر بزرگتر است، مدیریت می‌شود. این قابلیت به goroutineها اجازه می‌دهد که با پشته‌های بسیار کوچک، معمولاً 2 کیلوبایت، شروع کنند و یکی از عوامل اصلی مقیاس‌پذیری بیشتر goroutineها نسبت به نخ‌های سیستم‌عامل همین موضوع است.</p><p>یکی دیگر از جنبه‌های پشته، نحوه استفاده از آن در ایجاد ردیابی پشته (stack trace) است. این موضوع کمی پیشرفته‌تر است، اما اگر علاقه‌مند هستید، می‌توانید به مستندات «ردیابی پشته در Go» که در این مخزن موجود است، مراجعه کنید.</p><h4 id=425122-هیپ-heap>4.25.1.2.2 هیپ (Heap)
6666
<a class=anchor href=#425122-%d9%87%db%8c%d9%be-heap>#</a></h4><p>تخصیص‌های پشته عالی هستند، اما در بسیاری از موارد Go نمی‌تواند از آن‌ها استفاده کند. رایج‌ترین حالت زمانی است که باید اشاره‌گری به یک متغیر محلی از یک تابع بازگردانده شود. این موضوع را می‌توان در نسخه اصلاح‌شده مثال تابع <code>add()</code> که در بالا آمد، مشاهده کرد:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-go data-lang=go><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-2-1><a style=outline:none;text-decoration:none;color:inherit href=#hl-2-1>1</a></span><span><span style=color:#8be9fd;font-style:italic>func</span> <span style=color:#50fa7b>main</span>() {
6767
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-2-2><a style=outline:none;text-decoration:none;color:inherit href=#hl-2-2>2</a></span><span> fmt.<span style=color:#50fa7b>Println</span>(<span style=color:#ff79c6>*</span><span style=color:#50fa7b>add</span>(<span style=color:#bd93f9>23</span>, <span style=color:#bd93f9>42</span>))
6868
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f" id=hl-2-3><a style=outline:none;text-decoration:none;color:inherit href=#hl-2-3>3</a></span><span>}

0 commit comments

Comments
 (0)