فراخوانی سیستمی کیست؟ توضیح بده.
امروزه قابلیت‌های بسیار متنوعی از سمت سیستم‌های عامل در اختیار برنامه‌های سیستمی است و برنامه‌های بزرگ که کاربران زیادی از آن‌ها استفاده می‌کنند برای پیشرفت و افزایش کارایی خود باید این قابلیت‌ها را در نظر بگیرند. به عنوان مثال ۲ برنامه را تصور کنید: یک برنامه وظیفه‌اش خواندن یک پرونده از جنس فیلم و نمایش آن است و برنامه دیگر وظیفه‌اش آن است که پخش زنده‌ای که داده‌هایش از یک دوربین دریافت می‌شود را در اینترنت بارگزاری کند و نمایش دهد.در سیستم عامل لینوکس یک فراخوانی سیستمی تحت عنوان codice_1 وجود دارد که به سیستم عامل رهنمودهایی دربارهٔ الگوی ارجاع برنامه به بخش‌های مختلف حافظه می‌دهد. در برنامهٔ اول برنامه‌نویس می‌تواند با این فراخوانی سیستمی اعلام کند که ارجاع به حافظه به صورت پشت سر هم و به ترتیب است، بنابراین سیستم عامل می‌تواند بخش‌های مختلف پروندهٔ فرد را قبل از دسترسی به آن در حافظه آورده تا در آیندهٔ نزدیک برنامه به آن دسترسی پیدا کند که به این عمل می‌گویند. برخلاف برنامهٔ اول، در برنامهٔ دوم عملاً نمی‌دانیم که دسترسی به حافظه چگونه است، زیرا به صورت زنده داده‌ها دریافت می‌شود و جلوخوانی در دسترسی به حافظه کمکی به برنامه نمی‌کند. حال فرض کنید که بخواهیم در سیستم عامل این امکان را فراهم کنیم که یک پردازه بتواند این سیاست‌ها را برای پردازه‌ای دیگر مشخص کند.در نسخهٔ ۵٫۱۰ لینوکس یک فراخوانی سیستمی با عنوان codice_2 به مجموعه فراخوانی‌های سیستمی اضافه شده‌است که این نیاز را برای کاربر برطرف می‌کند.ساختار.این فراخوانی سیستمی ساختاری به صورت زیر داردssize_t process_madvise(int pidfd, const struct iovec *iovec, size_t vlen, int advice, unsigned int flags);برای آن که متوجه شویم این فراخوانی سیستمی چه کاری انجام می‌دهد ابتدا باید کمی با مفهوم توصیف کنندهٔ فایل شناسه پردازه (process id file descriptor) یا [./https://en.wikipedia.org/wiki/Pidfd pidfd] آشنا شویم.می‌دانیم که در سیستم‌های عامل از جمله لینوکس، پردازه‌ها با یک شناسهٔ عددی مشخص می‌شوند. همچنین این شناسه‌ها بازهٔ محدودی دارند؛ مثلاً در هستهٔ لینوکس مقدار پیشفرض برای تعداد پردازه‌ها ۳۲۷۶۸ است.این موضوع باعث می‌شود که سیستم عامل هنگامی که یک پردازه با شناسه پردازه‌ای خاص به اتمام رسید، شناسهٔ آن را برای پردازه‌های بعدی استفاده کند.این یعنی ممکن است پردازه codice_3، پردازه ای دیگر مانند codice_4 را با شناسه اش که codice_5 است در نظر بگیرد و پردازهٔ codice_4 به اتمام برسد و بعد از مدتی پردازه‌ای جدید مانند codice_7 با همان شناسه پردازه یعنی codice_5 ایجاد شود. در این حالت پردازه codice_3 فقط codice_5 را دارد و فکر می‌کند که این شناسه متناظر با codice_4 است، حال آن که codice_5 اکنون codice_7 را مشخص می‌کند؛ بنابراین اگر codice_3 هدفش ارتباط با codice_4 بوده ممکن است به اشتباه با codice_7 ارتباط برقرار کند. این موضوع ممکن است باعث بروز خطاهایی شود و گاهی امنیت را به خطر بیندازد.مفهوم pidfd برای حل این مشکل ایجاد شده و هر پردازه به‌طور یکتا با pidfd متناظر خود شناخته می‌شود.بنابراین ورودی اصلی codice_17 یک pidfd است که پردازهٔ هدف را به‌طور یکتا مشخص می‌کند.فایده.فرض کنید که در سیستم عامل تعدادی برنامه وجود دارد که خودشان اطلاعی از الگوهای استفاده‌شان از حافظه ندارند، ولی پردازهٔ دیگری وجود دارد که در نقش مدیر می‌تواند این الگوها را به دست بیاورد (چنین عملکردی به‌طور خاص در سیستم عامل اندروید وجود دارد). در چنین شرایطی می‌توان با استفاده از این فراخوانی سیستمی عملکرد پردازه‌های مختلف و همچنین کل سامانه را بهبود داد تا با بهترین سیاست از حافظه استفاده کنند.عملکرد.در حال حاضر این فراخوانی سیستمی تنها ۲ پرچم به عنوان راهنمای پردازهٔ هدف (codice_18) دارد: