ورود

View Full Version : سوال: سیستم کال select چیکار میکنه؟



maarek
دوشنبه 27 خرداد 1398, 22:27 عصر
سلام،
دوستان همانطور که در عنوان پست مشخص است در رابطه با system call به نام select اطلاعات میخواستم. کسی میتونه برام توضیح بده که چیکار میکنه و کجاها استفاده میشه؟

http://man7.org/linux/man-pages/man2/select.2.html
خواهش میکنم نیاید لینک بدید، اگر تجربه کار باهاش دارید توضیح بدید چون خوندم متوجه نشدم!

farhad_shiri_ex
سه شنبه 28 خرداد 1398, 09:00 صبح
سلام،
دوستان همانطور که در عنوان پست مشخص است در رابطه با system call به نام select اطلاعات میخواستم. کسی میتونه برام توضیح بده که چیکار میکنه و کجاها استفاده میشه؟

http://man7.org/linux/man-pages/man2/select.2.html
خواهش میکنم نیاید لینک بدید، اگر تجربه کار باهاش دارید توضیح بدید چون خوندم متوجه نشدم!

تصور کنید که یک سوکت آماده برای ارسال اطلاعات دارید جهت تشخیص این موضوع که سوکت مورد نظر آمادگی ارسال اطلاعات را دارد می توانید از select استفاده کنید.یعنی هم میتوانید تا زمان اعلام آمادگی سوکت فرآیند مورد نظر را بلاک کنید وهم می توانید از یک تایم مشخص برای این کار استفاده کنید.
تقریبا اگر از استانداردهای posix استفاده میکنید قطعا باید از چنین دستورات کنترلی I/O هم استفاده کنید
البته می توانید تمامی عملیاتهای I/O در سیستم عامل لینوکس را کنترل کنید.
یک مثال ساده...

struct timeval tWait;


tWait.tv_sec= nTimeOut / 1000;
tWait.tv_usec= (nTimeOut - tWait.tv_sec * 1000) * 1000;


fd_set writefds;
FD_ZERO(&writefds);
FD_SET(m_Sock,&writefds);
select(m_Sock+1,NULL,&writefds,NULL,&tWait);
if(! FD_ISSET(m_Sock,&writefds)){
return(-1);
}


if(sendto(m_Sock,...){
//...
}

pe32_64
سه شنبه 18 تیر 1398, 23:59 عصر
سلام،
دوستان همانطور که در عنوان پست مشخص است در رابطه با system call به نام select اطلاعات میخواستم. کسی میتونه برام توضیح بده که چیکار میکنه و کجاها استفاده میشه؟

http://man7.org/linux/man-pages/man2/select.2.html
خواهش میکنم نیاید لینک بدید، اگر تجربه کار باهاش دارید توضیح بدید چون خوندم متوجه نشدم!
برای هر عملیات I/O قابله استفاده هستش. مثل برنامه نويسي شبکه.
در عمليات I/O ، هميشه شرايط برا خوندن از فايل يا مثلا نوشتن در شبکه مناسب نيست و در صورت اجراي system call خوندن و يا نوشتن برنامه ما بلاک ميشه
تا فراهم شدن شرايط .
کاربرد به اين صورت هست کهselect برا شما بررسي ميکنه که آيا امکان انجام عمليات I/O بدون بلاک شدن هستش يا نه .

sedamorde
چهارشنبه 19 تیر 1398, 22:26 عصر
سلام، در ادامه صحبت دوستان نکات پایه‌ای را اضافه می‌کنم.

مبنای سیستم عامل‌های یونیکس و شبه یونیکس «لینوکس» فایل است. مثلاً هر سوکت که در شبکه ایجاد می‌شود برای آن یک فایل توسط سیستم عامل ایجاد می‌شود. در برنامه نویسی، کنترل این فایل توسط Linux file descriptor انجام می‌‌شود که فقط یک عدد است که به فایل اشاره دارد.
به صورت استاندارد در لینوکس فایل 0 فایل اصلی برنامه است، فایل 1 ورودی برنامه و فایل 2 خروجی برنامه است. هر فایل دیگری که ایجاد شود از 3 تا n خواهد بود.

حالا تصور کنید که شما یک سرور دارید که قراره هزاران سوکت را مدیریت کنه، یعنی هزاران فایل. یا مثلاً می‌خواهید یک فولدر را مونیتور کنید و هرزمان که فایلی در آن تغییر کرد متوجه شوید، باز هم کلی فایل.
زمانی که تعداد این فایل‌ها زیاد باشه کنترل آن‌ها سخت میشه. اینجاست که دستوراتی مثل select, poll و epoll به کار می‌آیند.

این دستورات مانند یک آرایه هستند که file descriptorها در آن‌ها ذخیره می‌شوند تا هر زمان که تغییری در یکی از فایل‌ها ایجاد شد به صورت Notification یک رویداد جدید را به برنامه اطلاع دهند. در حقیقت select یک صف از فایل‌های آماده به کار است که در زمان خواندن یا نوشتن یا بسته شدن فایل ما را آگاه می‌کند. سپس ما می‌توانیم کاری که می‌خواهیم را انجام دهیم و دوباره منتظر Event بعدی باشیم، یا فایل را از صف خارج کنیم...

وب سرورهایی مثل Nginx یا NodeJS - کتابخانه Libuv با زبان سی برای NodeJS‌ نوشته شده - از این روش استفاده می‌کنند تا بتوانند سوکت‌ها را به صورت Keep-Alive‌ برای طولانی مدت نگهدارند. در این وضعیت با کم‌ترین سربار اضافی میلیون‌ها فایل را می‌شود مدیریت کرد.

اضافه کنم که select محدودیت دارد، اگر اشتباه نکنم بیشتر از 1000 فایل ذخیره نمی‌کند. به علاوه چون از آرایه استفاده می‌کند هربار باید کل صف را بررسی کند. اما epoll فوق‌العاده سریع است، من به صورت آزمایشی در آن تا 500.000 فایل به سادگی ذخیره کردم، و البته برای این کار نیاز به تغییراتی در تنظیم محدودیت‌ها در سیستم عامل دارید. ولی epoll فقط در لینوکس کار می‌کند و به جای آن از poll می‌توانید در سیستم عامل‌های دیگر اضافه کنید. اما select که اول برای FreeBSD نوشته شد همه‌جا کار می‌کند.

منتها فراموش نکنید که کنترل نوشتن برنامه‌های event-driven کار آسانی نیست. سختی‌ها تازه بعد از select شروع می‌شود ;)

موفق باشید.