<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های بهنام محمدزاده</title>
        <link>https://virgool.io/feed/@behnambm</link>
        <description>برنامه نویس ساده و تازه کار وب و کاربر لینوکس</description>
        <language>fa</language>
        <pubDate>2026-04-15 09:52:47</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/42663/avatar/yudkZR.jpg?height=120&amp;width=120</url>
            <title>بهنام محمدزاده</title>
            <link>https://virgool.io/@behnambm</link>
        </image>

                    <item>
                <title>بررسی عملکرد Asynchronous Preemption در زبان Go</title>
                <link>https://virgool.io/@behnambm/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-asynchronous-preemption-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-go-kyjqpunbezsj</link>
                <description>اگر تو زبان Go عمیق شده باشین و سعی کرده باشین با نحوه عملکرد Scheduler آشنا بشین احتمالا Asynchronous Preemption به گوشتون خورده. تو این پست میخوام توضیح بدم که این اتفاق چطور میافته و نحوه عملکردش به چه شکله.برای شروع شاید بد نباشه که بدونیم asynchronous preemption برای چی به وجود اومد و اصلا چه مشکلی رو حل میکنه؛ به همین منظور با یه مثال پیش میرم. زمانی که GC میخواد اجرا بشه نیاز به (STW)Stop the World داره که تو این وضعیت باید همه گوروتین ها تو یه safe point متوقف بشن؛ کال شدن فانکشن یک safe point هست که گوروتین در این نقطه میتونه متوقف بشه تا GC کارش رو بدرستی انجام بده. ولی بعضی از گوروتین ها ممکنه موقع اجرا اصلا فانکشن کال نداشته باشن که به این حالت میگن tight loop.  کد پایین نمونه‌ای از tight loop هست: تو این حالت گوروتین وقتی ۱۰ میلی ثانیه اجرا شد یه ترد به اسم sysmon که همیشه بصورت مستقل اجرا میشه میاد تشخیص میده که فلان گوروتین زیادی داره اجرا میشه و باید متوقف بشه تا نوبت به بقیه هم برسه و برای اینکه اون گوروتین رو متوقف کنه یه سیگنال SIGURG میفرسته.از اونطرف یه گوروتین به اسم gSignal که هر ترد(M) یکی مخصوص خودش رو داره و میاد این سیگنال‌ها رو دریافت و هندل می‌کنه. در تصویر پایین هم میتونید ساختار M رو ببینید. وقتی gSignal میبینه سیگنال دریافتی از نوع SIGURG هست متوجه میشه که باید preemption اتفاق بیافته و میاد چک میکنه که آیا این اتفاق باید بیافته یا نه؟ (از لینک پایین هم میتونید این فانکشن رو ببینید)https://github.com/golang/go/blob/391dde29a37f3fd450f7d61e3f220930e0164b89/src/runtime/preempt.go#L342بعدش میاد چک کنه ببینه که اگه preempt کنیم مشکلی پیش میاد یا نه؟ پس این فانکشن رو کال میکنه https://github.com/golang/go/blob/391dde29a37f3fd450f7d61e3f220930e0164b89/src/runtime/preempt.go#L363دلیلش هم اینه که ممکنه این گوروتین در حال کال کردن بعضی از فانکشن های runtime باشه که نباید وسط اجرای اون فانکشن ها preemption اتفاق بیافته؛ و همچنین چک میکنه ببینه stack فضای کافی داره یا نه(چون مرحله بعد بهش نیاز داره).حالا که به یه safe point رسیدیم میاد و کار خفن اصلی رو انجام میده. همونطور که قبلا دیدیم tight loop هیچ فانکشن کالی نداره! پس چجوری باید گوروتین رو مجبور به اینکار کرد؟ جواب، پوش کردن یک function call instruction به stack frame و تغییر PC هست! 🤯 این فانکشن این کار رو انجام میده:https://github.com/golang/go/blob/391dde29a37f3fd450f7d61e3f220930e0164b89/src/runtime/signal_amd64.go#L80این فانکشن اول میاد برای یک instruction جدید داخل stack frame جا باز میکنه و بعد رجیسترهای RSP و RIP رو دستکاری میکنه تا PC به asyncPreempt تغییر کنه و بعد از اینکه اون اجرا شد کد قبلی بطور نرمال مثل گذشته به کارش ادامه بده. </description>
                <category>بهنام محمدزاده</category>
                <author>بهنام محمدزاده</author>
                <pubDate>Thu, 10 Apr 2025 15:55:24 +0330</pubDate>
            </item>
                    <item>
                <title>رفع مشکل exited در تور لینوکس</title>
                <link>https://virgool.io/@behnambm/%D8%B1%D9%81%D8%B9-%D9%85%D8%B4%DA%A9%D9%84-exited-%D8%AF%D8%B1-%D8%AA%D9%88%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-i0d01dgaruhz</link>
                <description>این مشکل روی توزیع هایی که از systemd استفاده میکنن هست. (من مینت دارم و این مشکلو داشتم)برای رفع مشکل باید دستور زیرو وارد کنید:cat /etc/systemd/system/multi-user.target.wants/tor.serviceاگه خروجی زیرو دریافت کردید پس مشکل دارید : [Unit]
Description=Anonymizing overlay network for TCP (multi-instance-master)
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
ExecReload=/bin/true
[Install]
WantedBy=multi-user.targetبرای رفع مشکل فایل زیرو با یه ادیتور باز کنید : (vi یا هر چیز دیگه که راحتید ) :sudo vi /etc/systemd/system/multi-user.target.wants/tor.serviceو فایل رو به این صورت تغییر بدید :[Unit]
Description=Anonymizing overlay network for TCP (multi-instance-master)

[Service]
User=debian-tor
Type=simple
RemainAfterExit=yes
ExecStart=/usr/bin/tor -f /etc/tor/torrc
ExecReload=/usr/bin/kill -HUP $MAINPID
KillSignal=SIGINT
LimitNOFILE=8192
PrivateDevices=yes

[Install]
WantedBy=multi-user.targetو بعد دستورات زیرو وارد کنید : sudo systemctl daemon-reload
sudo systemctl restart tor.serviceمنبع: وبلاگ مهندس مولایی https://molaei.org/tor-ubuntu</description>
                <category>بهنام محمدزاده</category>
                <author>بهنام محمدزاده</author>
                <pubDate>Sun, 09 Jun 2019 22:40:03 +0430</pubDate>
            </item>
            </channel>
</rss>