طرز کار os-level multithreading و sync در کامند‌لاین

سلام.
طبق معمول عنوان تاپیکم زیاد خوب نیست و عنوان بهتری براش به ذهنم نرسید :grin:

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

cp some/heavy/file some/destination/
sync
# or
cp some/heavy/file some/destination/ && sync

میخواستم بدونم که مثلا cp اینجا چیکار میکنه که به لینوکس میفهمونه «من کارم طول میکشه. شما برید من خودمو میرسونم» و دستور sync دقیقا چیکار میکنه.


سوال:

  1. احتمالی که میتونم بدم اینه که یه سیستم multi threading در لایه‌ی سیستم‌عامل به وجود میاد همونطور که مثلا با & میتونیم اینکارو انجام بدیم (مثلا cp file1 file2 & apt update) و لینوکس، اون تسک رو میفرسته به یه thread دیگه و مشخصات اون تسک رو توی یه فایل (یا یه استک که توی کرنل تعریف شده) نگه‌میداره و sync میتونه بعدا بره اونو بخونه.
    آیا این درسته؟

  2. و سوال دیگه‌ای که داشتم اینه که نرم‌افزار ما چطوری به لینوکس میگه که «من کارم طول میکشه شماها برید»؟
    آیا با یه return code مخصوص اینکارو انجام میده؟ مثل ruturn 0 که به معنی «اجرای برنامه با موفقیت انجام شد.»، یه کدی هم داریم به معنی «من کار سنگین با io دارم. منتظر نمونید»؟

  3. در نهایت (اگه توی ۲تا سوال بالا پاسخ ندادید) کار sync دقیقا چطوریه؟ میره یه فایل که تسکها توش نوشته شدن رو چک میکنه؟ میره به کرنل میگه «من از tty4 میام، اونجا چیزی رو به بکگراند فرستادی؟»؟ یا همچین چیزی؟ یا مثلا از طریق dbus با نرم‌افزار ما ارتباط برقرار میکنه (که بعید میدونم)؟

وقتی شما چیزی رو روی دیستک می نویسید یا تغییر می دید تغییرات شما مستقیما رو دیسک اعمال نمی شه. بلکه روی یه بافر تو مموری این اتفاق می افته. sync میاد fsync که یه سیستم کال هست رو صدا می زنه. این سیستم کال همه بافر های IO رو flush می کنه روی دیست و نطمئن می شه که بافر های dirty روی مموری وجود ندارن. اگر sync رو صدا نزنید این اتفاق توسط یه تردی که io scheduler شما ایجاد می کنه به صورت async تیکه تیکه می افته

1 پسندیده

پس امکانش نیست که من یه برنامه بنویسم و از سیستم‌عامل بخوام thread منو بفرسته به بکگراند؟
منظورم استفاده از os-level multi threading توی نرم‌افزارهامون هست.

منظورت رو متوجه نمی شم. ترد و پروسس در کل os level هستند. این گرین ترد و این جور کانسپت ها فقط user space هستند. شما وقتی یه ترد درست می کنین کرنل براتون اون ترد رو درست می کنه

1 پسندیده

من میخواستم بدونم سیستم کارش چطوریه (که توضیحتون کامل بود و فهمیدم) و میخوام بدونم وقتی یه نرم‌افزار cli میسازم، چطور میشه مثل cd ترمینال رو آزاد کنم.
مثلا همینکه میره توی یه بافر. چطوری میتونم کارهای io رو بفرستم توی بافر. اصلا دست منه یا سیستم عامل خودش میفهمه. یا اصلا چیزیه که مخصوص یه سری نرم‌افزار خاص مثل cd هست.

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

1 پسندیده