در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 4

2. امکانات لینوکس برای ارتباط میان پردازه ها

2.1.حافظه اشتراکی

حافظه اشتراکی یکی دیگر از امکانات IPC است که به دو پردازه ی نامرتبط این اجازه را می دهد که به یک حافظه منطقی مشابه دسترسی پیدا کنند. این تکنیک یک راه بسیار موثر برای انتقال داده بین دو پردازه در حال اجرا است.حافظه اشتراکی بازه ی خاصی از آدرس هاست که به وسیله IPC برای یک پردازه ایجاد و در فضای آدرس آن پردازه ظاهر می شود. پردازه های دیگر سپس می توانند این قطعه حافظه به اشتراک گذاشته شده را به فضای آدرس خودشان «ضمیمه» کنند. تمامی پردازه ها درست مثل اینکه حافظه به وسیله malloc تخصیص داده شده باشد، می-توانند به مکان های حافظه دسترسی داشته باشند. اگر یک پردازه درون حافظه اشتراکی بنویسد، تغییرات بالافاصله برای پردازه ی دیگری که دسترسی به حافظه اشتراکی مشابه دارد، قابل رویت خواهد بود.

همانطور که ذکر شد، حافظه اشتراکی یک روش کارآمد برای اشتراک و انتقال داده بین چندین پردازه فراهم می کند. حافظه اشتراکی خود امکانات همزمانی را برای ما فراهم نمی کند، به همین جهت شما معمولا نیاز به مکانیزم-های دیگری برای همزمان کردن دسترسی به حافظه اشتراکی دارید. برای نمونه، ممکن است شما از حافظه اشتراکی برای دسترسی بهینه به نواحی بزرگی از حافظه استفاده کنید و برای همزمان کردن دسترسی به حافظه، پیام های کوچکی را انتقال دهید. (نمونه ای از این انتقال پیام در ادامه آورده شده است.) هیچ امکان اتوماتیکی برای منع پردازه دوم از شروع عمل خواندن از حافظه قبل از اینکه پردازه اول عمل نوشتن را به پایان برساند وجود نخواهد داشت. این وظیفه برنامه نویس است که دسترسی را همزمان کند. در زیر لیست توابع موجود برای تکنیک حافظه اشتراکی آمده است:

#include <sys/shm.h>
void *shmat(int shm_id, const void *shm_addr, int shmflg);
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
int shmdt(const void *shm_addr);
int shmget(key_t key, size_t size, int shmflg);

شایان ذکر است که shm.h به طور اتوماتیک سرآیندهای systypes.h و sysipc.h را نیز شامل می شود.

shmget

حافظه اشتراکی به وسیله تابع shmget ایجاد می شود:

int shmget(key_t key, size_t size, int shmflg);

در زیر به شرح هر یک از پارامترهای این تابع می پردازیم:

  • key : این مقدار توسط برنامه ( یا بهتر است بگوییم برنامه نویس!) مشخص می شود. با این مقدار ما قطعه حافظه ی اشتراکی خود را نامگذاری می کنیم. تابع shmget یک شناسه برای ما برمی گرداند. ما از این مقدار برگشتی (شناسه حافظه اشتراکی) متعاقبا در دیگر توابع مربوطه استفاده می کنیم.
  • size : دومین پارامتر یعنی size ، میزان حافظه مورد نیاز به بایت را مشخص می کند.
  • shmflg : سومین پارامتر یعنی shmflg از نه پرچم تشکیل شده است. این پرچم ها مجوزها را مشخص می کنند و نحوه ی استفاده از آن ها مانند تعیین مجوز برای فایل است. یک بیت خاص که توسط IPC__CREAT تعیین می شود باید با مجوزها یای بیتی شود تا یک قطعه حافظه اشتراکی جدید به وجود آید. (مثلا به صورت 0666 | IPC__CREAT عمل می کنیم) اگر IPC__CREAT را ست کرده و قطعه حافظه از قبل موجود باشد، خطایی رخ نمی دهد. پرچم IPC__CREAT در مواقعی که نیازی به آن نیست، به طور اتوماتیک در نظر گرفته نمی شود.

در بحث حافظه اشتراکی، پرچم های جواز بسیار مفید هستند. زیرا به وسیله آنها می توان به پردازه هایی که توسط ایجاد کننده حافظه اشتراکی به وجود آمده اند اجازه نوشتن در حافظه را بدهیم، در حالی که دیگر پردازه ها (که به وسیله ایجاد کننده حافظه اشتراکی به وجود نیامده اند) تنها اجازه خواندن از حافظه را داشته باشند. با این کار دسترسی فقط-خواندنی کارآمدی به داده ها می توانیم ایجاد کنیم.

اگر حافظه اشتراکی با موفقیت ایجاد شود، یک عدد صحیح نامنفی که همان شناسه حافظه اشتراکی است، برگردانده می شود. در صورت شکست، مقدار 1- برگردانده می شود.

shmat

وقتی برای اولین بار یک قطعه حافظه اشتراکی را ایجاد می کنید، این قطعه حافظه قابل دسترس برای هیچ پردازه ای نیست. برای فعال کردن دسترسی به حافظه اشتراکی، باید آن را به فضای آدرس یک پردازه ضمیمه کنید. این کار به وسیله تابع shmat انجام می شود:

void *shmat(int shm_id, const void *shm_addr, int shmflg);

پارامترهای تابع:

  • shm__id : این پارمتر شناسه حافظه اشتراکی است که توسط تابع shmget برگردانده می شود.
  • shm__addr : آدرسی است که حافظه ی اشتراکی باید خود را به آن ضمیمه کند. این مقدار همیشه باید یک اشاره گر تهی باشد تا سیستم خود آدرس جایی که حافظه ظاهر می شود را انتخاب کند.
  • shmflg : مجموعه ای از پرچم های بیتی است. دو مقدار ممکن SHM__RND و SHM__RDONLY هستند. SHM__RND به همراه shm__addr آدرس جایی که حافظه استراکی به آن ضمیمه شده است را کنترل می کند. SHM__RDONLY حافظه ضمیمه شده را فقط-خواندنی می کند. بسیار کم پیش می آید که شما نیاز به کنترل آدرسی داشته باشید که حافظه اشتراکی به آن ضمیمه شده است؛ در حالت عادی شما باید وظیفه انتخاب آدرس را به عهده سیستم بگذارید.

در صورت فراخوانی موفقیت آمیز shmat، یک اشاره گر که به اولین بایت حافظه اشتراکی اشاره می کند، برگردانده می شود. در صورت شکست این تابع 1- را برمی گرداند.

shmdt

تابع shmdt حافظه اشتراکی را از پردازه ی جاری جدا می کند. این تابع یک اشاره گر به حافظه (همان اشاره-گری که توسط shmat برگردانده شد) را به عنوان پارامتر دریافت می کند. در صورت موفقیت 0 و در صورت بروز خطا 1- برگردانده می شود. توجه کنید که جدا کردن حافظه اشتراکی باعث حذف آن نمی شود. این تابع تنها حافظه را از دسترس پردازه جاری خارج می کند.

shmctl

با این تابع می توان بر روی حافظه اشتراکی کنترل داشت.

int shmctl(int shm_id, int command, struct shmid_ds *buf);

پارامترهای تابع:

    • shm__id: شناسه حافظه اشتراکی است که از مقدار برگشتی تابع shmget به دست می آید.
    • command : کاری است که باید انجام گیرد. این پارامتر سه مقدار می تواند به خود بگیرد. این مقادیر در زیر نشان داده شده اند.
      1. IPC__STAT : اطلاعات موجود در ساختمان داده کرنل که مرتبط با shm__id است را به درون یک ساختمان از نوع shmid__ds کپی می کند. (سومین پارامتر یعنی buf به چنین ساختمانی اشاره می کند). در این حالت فراخوانی کننده باید اجازه خواندن از حافظه اشتراکی را داشته باشد.
      2. IPC__SET : مقادیر اعضای ساختمان داده shmid__ds را درون آن بخش از ساختمان داده کرنل که مربوط به این قطعه حافظه اشتراکی است، می نویسد.
      3. IPC__RMID : قطعه حافظه اشتراکی را حذف می کند.
    • buf : بالاخره سومین پارامتر یعنی buf، یک اشاره گر به ساختمان داده ای است که حالات و مجوزهای حافظه اشتراکی را شامل می شود. این ساختمان داده shmid_ds نام داشته و به صورت زیر تعریف شده است.
struct shmid_ds {
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
}

در صورت اجرای موفقیت آمیز این تابع، 0 و در صورت شکست 1- برگردانده می شود.


در مقاله بعد چگونگی استفاده از صف های پیام در لینوکس را بررسی می کنیم. ItPro باشید!

نویسنده: رامین غلامی تقی زاده

منبع: انجمن تخصصی فناوری اطلاعات ایران

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

عنوان
1 IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 1 رایگان
2 IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 2 رایگان
3 IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 3 رایگان
4 IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 4 رایگان
5 IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 5 رایگان
6 IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 6 رایگان
7 IPC چیست؟ معرفی ارتباط بین پردازه ای در لینوکس قسمت 7 رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....