تابع sleep() یکی از مفاهیم بنیادی در برنامهنویسی همروند (Concurrent Programming) و مدیریت زمان در سیستمعاملهاست.
تشریح تابع sleep() در C/C++
تابع sleep() برای متوقف کردن اجرای یک ریسه (Thread) یا فرآیند (Process) برای یک مدت زمان مشخص استفاده میشود. این کار باعث میشود که منابع CPU به طور موقت آزاد شده و برای کارهای دیگر در دسترس قرار گیرند.
۱. استانداردها و کتابخانهها
نحوه استفاده از sleep() بستگی به سیستمعامل و استانداردی دارد که از آن استفاده میکنید:
استاندارد POSIX (سیستمهای شبه یونیکس مانند لینوکس و macOS):
تابع: sleep(unsigned int seconds)
کتابخانه: <unistd.h>
واحد زمان: ثانیه (integer).
استاندارد ویندوز (Windows API):
تابع: Sleep(DWORD dwMilliseconds)
کتابخانه: <windows.h>
واحد زمان: میلیثانیه (DWORD یک عدد صحیح بدون علامت ۳۲ بیتی است).
استاندارد C++ مدرن (C++11 به بعد):
توصیه میشود از این روش استفاده کنید چون پلتفرم-مستقل (Platform-Independent) است.
تابع: std::this_thread::sleep_for(const chrono::duration& rel_time)
کتابخانه: <thread> و <chrono>
واحد زمان: هر واحد زمانی دلخواه (مثلاً نانوثانیه، میکروثانیه، میلیثانیه) که توسط std::chrono::duration مشخص میشود.
۲. مکانیسم کارکرد (در سطح سیستمعامل)
هنگامی که یک ریسه تابع sleep() را فراخوانی میکند، هسته سیستمعامل (Kernel) کار زیر را انجام میدهد:
انتقال به حالت انتظار (Waiting State): ریسه فراخواننده از لیست ریسههای “آماده اجرا” (Runnable) خارج شده و به لیست ریسههای “در انتظار” (Waiting/Sleeping) منتقل میشود.
آزادسازی زمانبند: زمانبند سیستمعامل (Scheduler) متوجه میشود که این ریسه فعلاً نیازی به منابع CPU ندارد و میتواند به ریسههای آماده دیگر فرصت اجرا دهد.
تایمر و بیدار شدن: هسته یک شمارنده زمانی داخلی برای آن ریسه تنظیم میکند. پس از سپری شدن مدت زمان مشخص شده، هسته ریسه را از حالت انتظار خارج کرده و آن را به لیست “آماده اجرا” برمیگرداند.
. تفاوت با تأخیر فعال (Busy Waiting)
تأخیر فعال (Active Waiting/Busy Waiting): شامل حلقههایی است که به طور مداوم شرطی را بررسی میکنند .
while (true) {
// CPU به طور مداوم در اینجا مشغول چک کردن است.
}
این روش باعث میشود CPU ۱۰۰٪ برای یک کار بیفایده مصرف شود.
استفاده از sleep(): این تابع به ریسه اجازه میدهد تا کاملاً از اجرای CPU خارج شود و تنها زمانی مجدداً فعال شود که زمان مقرر فرا برسد. این رویکرد بسیار کارآمدتر و استاندارد است، خصوصاً در سیستمهای چندوظیفهای (Multitasking).