نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

کاربرد. مبانی اکشن اسکریپت

برای اینکه بتوان منطق را در برنامه پیاده سازی کرد، از دستورات شرطی استفاده می شود. از نظر گمانه‌زنی، این عملگرها را می‌توان به‌عنوان نقاط گره‌ای نشان داد که با رسیدن به آن‌ها برنامه انتخاب می‌کند که در کدام یک از جهت‌های ممکن حرکت کند. به عنوان مثال، شما می خواهید تعیین کنید که آیا یک متغیر arg دارای یک عدد مثبت یا منفی است و یک پیام مربوطه را روی صفحه نمایش دهید. برای این کار می توانید از دستور if استفاده کنید که بررسی های مشابهی را انجام می دهد.

در بسیار مورد سادهنحو دستور if به صورت زیر است:

اگر (بیان)

اگر مقدار پارامتر عبارت true باشد، دستور اجرا می شود، در غیر این صورت توسط برنامه حذف می شود. لازم به ذکر است که «بیان» است بیان شرطی، که در آن شرایط خاصی بررسی می شود. روی میز 2.1 گزینه های ساده را ارائه می دهد عبارات منطقیاگر بیانیه

جدول 2.1. عبارات بولی ساده

در اینجا مثالی از استفاده از عملگر if شعبه آورده شده است. برنامه زیر به شما امکان می دهد علامت متغیر وارد شده را تعیین کنید.

فهرست 2.1. اولین برنامه برای تعیین علامت عدد وارد شده.

#عبارتند از
int main()
{
شناور x;
printf("شماره را وارد کنید:");
scanf("%f"،&x);
if(x>= 0)

بازگشت 0;
}

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

اگر (بیان)

که این گونه تعبیر می شود. اگر "expression" درست باشد، "statement1" اجرا می شود، در غیر این صورت "statement2" اجرا می شود. بیایید مثال قبل از تعیین علامت یک عدد را با استفاده از این ساختار بازنویسی کنیم.

لیست 2.2. برنامه دوم برای تعیین علامت عدد وارد شده.

#عبارتند از
int main()
{
شناور x;
printf("شماره را وارد کنید:");
scanf("%f"،&x);
if(x printf("عدد وارد شده %f منفی است.\n"، x);
دیگر
printf("عدد وارد شده %f غیر منفی است.\n"، x);

بازگشت 0;
}

در مثال های ارائه شده، بعد از دستور if و else تنها یک مورد وجود دارد تابع printf(). در مواردی که در صورت احراز شرط، نوشتن بیش از یک عبارت ضروری است، استفاده از آن ضروری است بریس ها، یعنی از ساختاری مانند استفاده کنید

اگر (بیان)
{

}
دیگر
{

لازم به ذکر است که پس از کلمه کلیدیدر غیر این صورت، به طور رسمی، می‌توانیم عملگر دیگری شرط اگر قرار دهیم، در نتیجه ساختاری حتی انعطاف‌پذیرتر از انتقال‌های شرطی دریافت می‌کنیم:

if (expression1)
else if (expression2)
دیگر

لیست 2.3 برنامه ای را نشان می دهد که ساختار پرش شرطی اخیر را اجرا می کند.

لیست 2.3. برنامه سوم برای تعیین علامت عدد وارد شده.

#عبارتند از
int main()
{
شناور x;
printf("شماره را وارد کنید:");
scanf("%f"،&x);
if(x printf("عدد وارد شده %f منفی است.\n"، x);
else if (x > 0)
printf("عدد وارد شده %f مثبت است.\n"، x);
دیگر
printf("عدد وارد شده %f غیر منفی است.\n",x);

بازگشت 0;
}

تا اینجا در نظر گرفتیم شرایط ساده x && را تایپ کنید - AND منطقی
|| - منطقی یا
! - نه منطقی

بر اساس این سه عملیات منطقی می توان شرایط پیچیده تری ایجاد کرد. به عنوان مثال، اگر سه متغیر exp1، exp2 و exp3 وجود داشته باشد، آنها می توانند ساختارهای منطقی ارائه شده در جدول را تشکیل دهند. 2.2.

جدول 2.2. نمونه ای از عبارات منطقی مرکب

مشابه عملیات ضرب و جمع در ریاضیات، عملیات منطقیو یا نه نیز اولویت های خود را دارند. عملیات NO بالاترین اولویت را دارد، یعنی. این عملیات ابتدا انجام می شود. عملیات AND کمترین اولویت را دارد و در نهایت عملیات OR کمترین اولویت را دارد. این اولویت ها باید در هنگام ترسیم شرایط پیچیده در نظر گرفته شوند. مثلاً شرط

if(4 6 || 5 از این طریق بررسی می شود. اگر 4 6 یا 5 if(4 6 || 5 عملیات مشروطاگر نوشتن برنامه هایی را که در آنها نیاز به انتخاب دارید آسان تر می کند تعداد کمی گزینه های ممکن. با این حال، گاهی اوقات در یک برنامه لازم است که یک گزینه از بسیاری از گزینه های ممکن انتخاب شود. به طور رسمی، می توانید از ساختار if else if ... else برای این کار استفاده کنید. با این حال، در بسیاری از موارد استفاده از دستور سوئیچ C++ راحت‌تر است. سینتکس این عملگر به صورت زیر است:

سوئیچ (متغیر)
{
حالت ثابت 1:

ثابت مورد2:

...
پیش فرض:

این عملگر به صورت متوالی برابری را بررسی می کند متغیر به ثابت، بعد از مورد کلمه کلیدی قرار می گیرد. اگر هیچ یک از ثابت ها با مقدار متغیر برابر نباشد، عبارات بعد از کلمه پیش فرض اجرا می شوند. دستور switch دارای ویژگی زیر است. فرض کنید مقدار متغیر برابر با مقدار ثابت1 باشد و عبارات بعد از اولین مورد کلمه کلیدی اجرا شوند. پس از این، اجرای برنامه با بررسی متغیر برای برابری یک ثابت2 ادامه خواهد یافت، که اغلب منجر به اتلاف غیر قابل توجیه منابع رایانه می شود. برای جلوگیری از این وضعیت، باید استفاده کنید اپراتور شکستنبرای انتقال برنامه به عبارت بعدی بعد از سوئیچ.

لیست 2.4 یک مثال برنامه نویسی را نشان می دهد عملگر شرطیتعویض.

لیست 2.4. نمونه ای از استفاده از دستور switch.

#عبارتند از
int main()
{
int x;
printf("شماره را وارد کنید:");
scanf("%d"،&x);
سوئیچ (x)
{
case 1: printf("شماره 1\n وارد شده"); break;
case 2: printf("شماره 2\n وارد شده"); زنگ تفريح؛
پیش‌فرض: printf ("عدد دیگری وارد شده\n");
}
char ch;
printf("نویسه را وارد کنید:");
scanf("%c"،&ch);
سوئیچ (ch)
{
case 'a' : printf("نویسه a\n وارد شده است"); زنگ تفريح؛
case 'b' : printf("شخصیت b\n وارد شده است"); زنگ تفريح؛
پیش‌فرض: printf("یک کاراکتر وارد شده\n");
}
بازگشت 0;
}

این مثالدو را نشان می دهد گزینه های مختلفبا استفاده از عبارت switch در حالت اول رقم وارد شده و در حالت دوم نماد وارد شده آنالیز می شود. لازم به ذکر است که این اپراتورمی تواند تنها بر اساس برابری آرگومان خود با یکی از مقادیر موردی فهرست شده، یعنی. بررسی عباراتی مانند x

شما می توانید دانش در مورد همکار خود یا هر چیز دیگری را ذخیره کنید اطلاعات متنی. اکنون، هنگام نوشتن الگوها، می توانید از 13 متغیر با هدف از پیش تعیین شده و 100 متغیر "رایگان" استفاده کنید که صاحبان اطلاعات می توانند به صلاحدید خود از آنها استفاده کنند.
متغیرهایی با هدف معین دارای نام های «گفتنی» هستند. مثلا، ٪نام کاربریمتغیری است که برای ذخیره نام مخاطب طراحی شده است. به نام او استفاده می شود کلمات انگلیسیکاربر ("کاربر") و نام ("نام"). چنین متغیرهایی به طور فعال توسط توسعه دهندگان هنگام ایجاد یک پایگاه داده از الگوهای اطلاعات استاندارد استفاده می شود که بر اساس آن تمام اطلاعات کاربر در پروژه ایجاد می شود.
طول عمر چنین متغیرهایی محدود نیست، به عنوان مثال. معانی آنها بین مکالمات فردی به خاطر سپرده و ذخیره می شود.

آنچه در قالب ها نوشته شده است مثال دیالوگ
نام را به خاطر بسپار:
$ نام من است *
# از ملاقات شما خوشبختم. [%user_name="[*1]"]
مهمان:نام من واسیا است
اطلاعات:یک بار برای ملاقات با شما.
ما نام مخاطب را در اطلاعات پاسخ نمایش می دهیم:
$ خداحافظ، inf.
# خداحافظ [%user_name]
مهمان:خداحافظ، inf.
اطلاعات:خداحافظ واسیا.
ما پاسخ را بسته به مقدار متغیر %user_name انتخاب می کنیم:
$ اسم منو یادت هست؟
# (البته. شما [%user_name] هستید.)
# (نه. اسمت را به من نگفتی.)
مهمان:اسم مرا به خاطر داری؟
اطلاعات:قطعا. تو واسیا هستی
یا
مهمان:اسم مرا به خاطر داری؟
اطلاعات:خیر اسمتو نگفتی
ما دیگر نمی‌خواهیم نام مخاطب را ذخیره کنیم، بنابراین متغیر را بازنشانی می‌کنیم
$تو احمقی.
# همین، من دیگر با شما دوست نیستم و نام شما را فراموش کردم. [%user_name=""]
مهمان:تو یه احمقی.
اطلاعات:تمام شد، من دیگر با شما دوست نیستم و نام شما را فراموش کردم.

اختصاص یک مقدار به یک متغیر و پاک کردن متغیر

می توانید مقداری را به یک متغیر اختصاص دهید یا در پاسخ ها آن را صفر کنید.

نحو:[%variable = "value"]
دستور انتساب متغیر همیشه با براکت های مربع احاطه می شود که در اینجا کاراکترهای سرویس هستند. مقدار یک متغیر همیشه در گیومه است.
نمونه هایی از تخصیص ارزش:
$ من راک اند رول می رقصم.
# من حسودم. Inf ها نمی توانند برقصند [%var1="رقصیدن"]

$*نفرت*رقص*
$*رقص* نفرت*
$ *نرقص *
# حیف شد. اگر آدم بودم حتما می رقصیدم. [%var1="رقصیدن را دوست ندارد"]

$ من ** ساله هستم.
# سن باحال! [%user_age="[*1]"]

مثالی از تنظیم مجدد یک متغیر:
$ من نمی خواهم در مورد سن من صحبت کنید.
# هر چه شما بگویید [%user_age=""]

با استفاده از تابع set یک مقدار را به یک متغیر اختصاص دهید

تابع مجموعه ("Argument1"، "Argument2"، "Argument3") Argument2 را در جای خود جایگزین می کند و مقدار آن را به متغیر مشخص شده در Argument1 اختصاص می دهد. Argument3 به صورت پیش فرض رشته خالی است. اگر آن را به عنوان متفاوت از خط خالی، سپس در جای خود توابع را تنظیم کنیدهیچ متنی درج نخواهد شد و فقط مقدار متغیر به آن اختصاص داده خواهد شد.

مثلا،
$ نام من است **
#از آشنایی با شما خوشحالم، [@set("user_name", "[@ ("[*1]")]")]!

مهمان:نام من واسیا است
اطلاعات:از آشنایی با شما خوشحالم، واسیا!

یا:
$ نام من است **
#نامت را به خاطر خواهم آورد. [@set("user_name"، "[@ ("[*1]")]، "1")]

$ * چیست * نام * من *
# شما [%user_name] هستید.

مهمان:اسم من لنا است
اطلاعات:اسمت را به خاطر خواهم آورد
مهمان:خب اسم من چیه
اطلاعات:تو لنا هستی

نمایش مقدار یک متغیر در پاسخ infa

برای اینکه اطلاعات مقدار یک متغیر را در پاسخ "صدا" کند، فقط باید این متغیر را در پاسخ بنویسید.
نحو:[٪متغیر]
براکت های مربعی مورد نیاز است.

مثال:
$ خداحافظ ربات!
# خداحافظ، [%user_name]!

یک متغیر شرط می تواند برای پیاده سازی روابط همگام سازی ذکر شده در بالا استفاده شود: شروع-شروع (CC)، پایان-شروع (FS)، شروع-پایان (SF) و پایان-پایان (FF). این روابط می تواند بین رشته هایی از فرآیندهای مشابه یا متفاوت وجود داشته باشد. لیست های 5.4 و 5.5 نمونه هایی از پیاده سازی روابط همگام سازی FS و FF را ارائه می دهند. هر مثال دو mutexe را تعریف می کند. یکی از mutex برای همگام سازی دسترسی به داده های مشترک و دیگری برای همگام سازی اجرای کد استفاده می شود.

// فهرست 5.4. روابط همگام سازی FS بین

// دو رشته

pthread_t ThreadA,ThreadB;

رویداد pthread_cond_t.

خالی * کارگر 1(باطل *X) (

for(int Count = l;Count

pthread_mutex_lock(&Mutex);

pthread_mutex_unlock(&Mutex);

if(تعداد == 50)(

pthread_cond_signal(&Event);

خالی * کارگر 2(باطل *X) (

pthread_mutex_lock(&EventMutex);

pthread_cond_wait(&Event,&EventMutex);

for(int Count = 1;Count

pthread_mutex_lock(&Mutex);

عدد = عدد + 20;

pthread_mutex_unlock(&Mutex);

cout ""Function worker2 اجرا را به پایان رساند." "endl; بازگشت (0);

بین المللی اصلی(int argc، char *argv) (

pthread_mutex_init(&Mutex,NULL);

pthread_mutex_init(&EventMutex,NULL);

pthread_cond_init(&Event, NULL);

pthread_create(&ThreadA, NULL, workerl, NULL);

pthread_create(&ThreadB، NULL، worker2، NULL);

فهرست 5.4 نمونه ای از اجرای روابط همگام سازی FS را نشان می دهد. ThreadA نمی تواند تا زمانی که ThreadB شروع شود خاتمه یابد. اگر Number 50 شود، ThreadA این را به ThreadB سیگنال می دهد. اکنون می تواند تا انتها اجرا را ادامه دهد ThreadB تا زمانی که سیگنالی از ThreadA دریافت نکند نمی تواند اجرا را شروع کند. ThreadB از یک شی EventMutex به همراه یک متغیر شرط Event استفاده می کند. یک شی Mutex برای همگام سازی دسترسی برای نوشتن مقدار متغیر مشترک Number استفاده می شود. یک کار می تواند از چندین mutexe برای همگام سازی رویدادهای مختلف و دسترسی به بخش های حیاتی استفاده کند.

نمونه ای از اجرای روابط همگام سازی FF در فهرست 5.5 نشان داده شده است.

// فهرست 5.5. رابطه همگام سازی FF بین // دو رشته

pthread_t ThreadA, ThreadB ;

pthread_mutex_t Mutex، EventMutex;

رویداد pthread_cond_t.

void *workerl(void *X) (

for(int Count = l;Count

pthread_mu tex_l ock (&Mutex);

pthread_mutex_unlock(&Mutex);

cout ""workerl: عدد است"

pthread_mutex_lock(&EventMutex) ,-

cout "عملکرد workerl در انتظار است. " "endl;

pthread_cond_wait (&Event، &EventMutex) ;

pthread_mutex_unlock(&EventMutex);

void *worker2 (باطل *X) (

for(int Count = l;Count

pthread_mutex_lock(&Mutex) ;

عدد = عدد * 2 ;

pthread_mutex_unlock(&Mutex) ;

cout " "worker2: عدد " "شماره " endl;

pthread_cond_signal (&Event);

cout ""عملکرد worker2 یک سیگنال ارسال کرد" "endl;return(0);

int main(int argc، char *argv) (

pthread_mutex_init (&Mutex,NULL) ;

pthread_mutex_init (&EventMutex,NULL) ;

pthread_cond_init (&Event, NULL) ;

pthread_create(&ThreadA, NULL,workerl, NULL);

pthread_create (&ThreadB، NULL، worker2، NULL) ;

در فهرست 5.5، ThreadA نمی تواند تا زمانی که ThreadB خاتمه یابد، خاتمه یابد. ThreadA باید حلقه را 10 بار تکمیل کند و ThreadB باید حلقه را 100 بار تکمیل کند.

روابط همگام سازی CC و SF را نمی توان پیاده سازی کرد به روشی مشابه. از این روش ها برای همگام سازی منافذ استفاده می شود منزمان اجرا منفرآیندها

TAU - تئوری کنترل خودکار

TS - سیستم فنی

OU - شیء کنترلی

UU - دستگاه کنترل

CS – سیستم کنترل

دستگاه اجرایی - دستگاه اجرایی

IU - محرک

D - سنسور

سیستم عامل - بازخورد

PC – ضریب انتقال

TF - تابع انتقال

AFC - پاسخ فرکانس دامنه فاز

پاسخ فرکانس - پاسخ دامنه فرکانس

LFC - مشخصه دامنه-فرکانس لگاریتمی

PFC - پاسخ فرکانس فاز

2. قراردادهای متغیرها و توابع اصلی

ایکس(تی) – سیگنال ورودی عنصر سیستم کنترل، سیگنال خروجی آپ امپ و سیستم کنترل (کمیت کنترل شده)

y(تی) - سیگنال خروجی عنصر سیستم کنترل، سیگنال ورودی op-amp (عمل کنترل)

ایکس z ( تی) - تأثیر تنظیم سیستم کنترل

z(تی) - تأثیر مزاحم بر سیستم کنترل

(تی) - سیگنال خطا (عدم تطابق) در سیستم کنترل

1(تی) – تاثیر تک مرحله ای

(تی) - عمل تک تکانه

ایکس متر ,y مترمقادیر دامنهسیگنال ها ایکس(تی) و y(تی)

پ – عملگر لاپلاس، عملگر تمایز

 - فرکانس دایره ای، عملگر تبدیل فوریه

ایکس(پ) - تصویر یک سیگنال پیوسته ایکس(تی) به گفته لاپلاس

ایکس(j) - تصویر یک سیگنال پیوسته ایکس(تی) به گفته فوریه

ک - پیوند دادن رایانه (یا پیوند اتصال)

دبلیو(پ) - PF یک پیوند (یا اتصال پیوندها)

دبلیو(j) - AFC یک پیوند (یا اتصال پیوندها)

آ() - پاسخ فرکانسی یک پیوند (یا اتصال پیوندها)

() - پاسخ فاز یک پیوند (یا اتصال پیوندها)

F( آر) – PF یک سیستم کنترل بسته

ساعت(تی) - تابع انتقال (ویژگی) یک پیوند یا سیستم کنترل

w(تی) - عملکرد ضربه ای (وزن) (ویژگی) یک پیوند یا سیستم کنترل

معرفی

تئوری کنترل خودکار (TAC)- یک رشته علمی که موضوع مطالعه آن فرآیندهای اطلاعاتی است که در سیستم های کنترل اشیاء فنی و فناوری رخ می دهد. TAU الگوهای کلی عملکرد سیستم‌های خودکار با ماهیت‌های فیزیکی مختلف را شناسایی می‌کند و بر اساس این الگوها، اصولی را برای ساخت سیستم‌های کنترل با کیفیت بالا توسعه می‌دهد.

هنگام مطالعه فرآیندهای کنترل در TAU، آنها از ویژگی های فیزیکی و طراحی سیستم ها انتزاع می گیرند و در عوض سیستم های واقعیمدل های ریاضی کافی آنها را در نظر بگیرید. هرچه مدل ریاضی دقیق تر (کامل تر) با فرآیندهای فیزیکی رخ داده در سیستم واقعی مطابقت داشته باشد، سیستم کنترل طراحی شده کامل تر خواهد بود.

روش های اصلی تحقیق در TAU مدل سازی ریاضی، تئوری معادلات دیفرانسیل معمولی، حساب عملیاتی و تحلیل هارمونیک است. بیایید به طور خلاصه به هر یک از آنها نگاه کنیم.

روش مدلسازی ریاضی، که طیف گسترده ای از روش ها و تکنیک ها را برای توصیف و نمایش اشیاء و پدیده های فیزیکی ترکیب می کند، می تواند به صورت مشروط و شماتیک با استفاده از متداول ترین تکنیک - نمایش گرافیکی یک شی ساده که دارای یک سیگنال ورودی است، نمایش داده شود. ایکس(تی) و یک سیگنال خروجی y(تی، به شکل یک مستطیل (شکل B. 1، آ). سمبل آدرون یک مستطیل به معنای یک عملگر ریاضی (تابع، انتگرال و غیره) است که سیگنال های ورودی و خروجی را که در طول زمان تغییر می کنند، به هم متصل می کند.

برنج. در 1. نمایش شماتیک روش های ریاضی مورد استفاده در TAU

نظریه معادلات دیفرانسیل معمولیبا تمرکز بر جنبه های فیزیکی و کاربردهای راه حل های به دست آمده، به عنوان مبنای روش شناختی اصلی TAU عمل می کند و معادلات دیفرانسیل معمولی خود کلی ترین و کامل ترین شکل توصیف ریاضی عناصر و سیستم های کنترل هستند. معادلات دیفرانسیل متغیرهای ورودی و خروجی متغیر با زمان و مشتقات آنها را به هم مرتبط می کند. در ساده ترین حالت، معادله دیفرانسیل شکل دارد

دو(تی)/dt=f[ایکس(تی),y(تی)]. (در 1)

روش حساب عملیاتیکه بر اساس تبدیل لاپلاس است

(در 2)

به شما امکان می دهد معادلات دیفرانسیل را جبری کنید - به معادلات به اصطلاح عملگر که تصاویر را متصل می کنند بروید ایکس(پ) و Y(پ) سیگنال های ورودی و خروجی از طریق تابع انتقال دبلیو(پ) (شکل B. 1، ب)

دبلیو(پ)=Y(پ)/ایکس(پ). (در 3)

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

(در 4)

با استفاده از تبدیل فوریه (B. 4)، تصاویر پیدا می شوند ایکس(j) و Y(j) سیگنال های ورودی و خروجی ایکس(تی) و y(تی) که طیف فرکانس این سیگنال ها را مشخص می کند. تصاویر فوریه سیگنال ها به هم وصل شده اند (شکل B. 1، V) تابع انتقال فرکانس

دبلیو(j) =Y(j)/X(j). (ساعت 5)

هر چهار روش که به طور خلاصه در بالا ارائه شده اند، دستگاه ریاضی TAU را تشکیل می دهند. بر اساس آن، مجموعه ای از روش های TAU "خود" توسعه یافته است که در این دوره ارائه شده است.

TAU همراه با تئوری ساخت و بهره برداری از عناصر سیستم کنترل (حسگرها، تنظیم کننده ها، محرک ها) شاخه وسیع تری از علم - اتوماسیون را تشکیل می دهد. اتوماسیون نیز به نوبه خود یکی از شاخه های سایبرنتیک فنی است. سایبرنتیک فنی سیستم های کنترل خودکار پیچیده را برای فرآیندهای تکنولوژیکی (APCS) و شرکت ها (APCS) که با استفاده از رایانه های کنترلی (CCM) ساخته شده اند، مطالعه می کند.

سایبرنتیک فنی، همراه با سایبرنتیک بیولوژیکی و اجتماعی-اقتصادی، بخشی جدایی ناپذیر از سایبرنتیک است که بنیانگذار آن، ریاضیدان آمریکایی N. Wiener، در سال 1948 آن را به عنوان علم کنترل و ارتباطات در تعریف کرد. سیستم های فنیو موجودات زنده

اولین تنظیم کننده های صنعتی در دوره 1765-1804 ظاهر شدند. (I. Polzunov, J. Watt, J. Jacquard).

اولین مطالعات نظری تنظیم کننده ها در دوره 1868-1893 ظاهر شد. (J. Maxwell, I. Vyshnegradsky, A. Stodola). دانشمند و مهندس روسی I. A. Vyshnegradsky تعدادی از تحقیق علمی، که در آن موتور بخار و تنظیم کننده آن ابتدا با روش های ریاضی به عنوان یک سیستم دینامیکی واحد مورد تجزیه و تحلیل قرار گرفت. آثار A. A. Andronov، V. S. Kulebakin، I. N. Voznesensky، B. V. Bulgakov، A. A. Feldbaum، B. N. Petrov، N. N. Krasovsky نقش زیادی در شکل گیری مدرسه TAU روسیه ایفا کردند.

توسعه نظریه کنترل مدرن از نظریه کنترل موسوم به "کلاسیک"، بر اساس چهار روش اصلی تحقیق TAU ذکر شده در بالا، و شکل گیری جدیدترین روش های آن به صورت شماتیک در شکل 1 نشان داده شده است. در 2.

برنج. در 2. توسعه محتوا و روش شناسی تئوری مدیریت

در حال حاضر، TAU، همراه با جدیدترین بخش هاتئوری مدیریت عمومی (تحقیق در عملیات، مهندسی سیستم ها، نظریه بازی ها، تئوری صف) نقشی حیاتی در بهبود و خودکارسازی مدیریت فرآیندهای تکنولوژیکی و تولید ایفا می کند.

متغیرهای شرطی

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

پشتیبانی از متغیرهای شرطی توابع زیر:

· منتظر یک متغیر شرطی (انتظار) ( pthread_cond_wait());

· رفع انسداد یک جریان (سیگنال) ( pthread_cond_signal())

· رفع انسداد جریان های متعدد (پخش) ( pthread_cond_broadcast()),

در اینجا مثالی از استفاده معمولی از یک متغیر شرطی آورده شده است:

pthread_mutex_lock (&m) ;-…

در حالی که (!شرط خودسرانه) (

pthread_cond_wait(&cv, &m);

pthread_mutex_unlock (&m) ;

در این مثال، mutex قبل از بررسی شرط به دست می آید. به این ترتیب، شرط مورد آزمایش فقط برای رشته فعلی اعمال می شود. خدا حافظ این شرایطدرست است، این بخش از کد در فراخوانی انتظار بلوک می‌شود تا زمانی که رشته‌ای دیگر یک یا چند رشته را بر روی متغیر شرط انجام دهد.

حلقه whileدر مثال بالا به دو دلیل لازم است. اولاً، استانداردهای posix عدم وجود بیدارسازی کاذب را تضمین نمی کنند (به عنوان مثال، در سیستم های چند پردازنده). دوم، اگر موضوع دیگری شرایطی را تغییر دهد، باید دوباره بررسی شود تا اطمینان حاصل شود که تغییر با معیارهای پذیرفته شده مطابقت دارد. هنگامی که یک رشته منتظر مسدود می شود، mutex مرتبط با متغیر شرط به صورت اتمی توسط تابع آزاد می شود. pthread_cond_wait()به طوری که یک رشته دیگر بتواند وارد بخش مهمی از کد برنامه شود.

رشته ای که یک رشته را از حالت انسداد خارج می کند، رشته با اولویت بالاتر را که در صف متغیر شرط قرار می گیرد، رفع انسداد می کند. عملیات باز کردن انسداد چند رشته، همه رشته‌هایی که در صف متغیر شرط قرار می‌گیرند را از حالت انسداد خارج می‌کند. mutex مرتبط با متغیر شرط به صورت اتمی توسط نخی که دارای بالاترین اولویت است آزاد می‌شود. پس از پردازش بخش بحرانی کد، این موضوع باید mutex را آزاد کند.

نوع دیگری از عملیات انتظار متغیر مشروط ( pthread__cond_timedwair()) به شما این امکان را می دهد که یک بازه زمانی تعیین کنید. در پایان این دوره می توان تاپیک انتظار را رفع انسداد کرد.

موانع

مانع یک مکانیسم همگام سازی است که به شما امکان می دهد کار چندین رشته در حال تعامل را به گونه ای هماهنگ کنید که هر یک از آنها در نقطه داده شدهقبل از ادامه کار، منتظر رشته های باقی مانده است.

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

#عبارتند از

pthread_barrier_init (pthread_barrier_t *barrier، const pthread_barrierattr_t *attr، تعداد int بدون علامت);

این کد یک مانع در آدرس داده شده ایجاد می کند (اشاره گر به مانع در آرگومان مانع است) و با ویژگی های تعیین شده توسط آرگومان attr. آرگومان count تعداد رشته هایی را که باید () pthread_barrier_wait را فراخوانی کنند، مشخص می کند.

پس از ایجاد مانع، هر رشته تابع ()pthread_barrier_wait را فراخوانی می‌کند و به این ترتیب سیگنال تکمیل این عمل را نشان می‌دهد:

#عبارتند از

int pthread_barrier_wait(pthread_barrier_t "barrier);

وقتی یک رشته یک تابع را فراخوانی می کند pthread_barrier_wait()،تا زمانی که تعداد رشته های مشخص شده توسط تابع مسدود شود pthread_barrier_init()، تابع را فراخوانی نخواهد کرد pthread_jbarrier_wait()و بر این اساس مسدود نخواهد شد. پس از اینکه تعداد مشخصی از رشته ها تابع را فراخوانی کردند pthread_barrier_wait()، همه آنها آنلاک هستند همزمان.

#عبارتند از

#عبارتند از

#عبارتند از

#عبارتند از

pthread_barrier_t barrier; // شی همگام سازی از نوع "مانع".

main() // نادیده گرفتن آرگومان ها

time_t now;// یک مانع با مقدار شمارنده 3 ایجاد کنید

pthread_barrier_init(&barrier, NULL, 3); // شروع دو موضوع - threadl و thread2

pthread_create (NOLL، NOLL، threadl، NULL); // رشته های threadl و thread2 در حال اجرا هستند

pthread_create (NDLL, NDLL, thread2, NDLL);// منتظر تکمیل

printf("main() در انتظارمانع در %s، ctime (&اکنون));

pthread_barrier_wait (&barrier)؛ // پس از این نقطه، هر سه رشته خاتمه می‌یابند

printf ("موانع در mainO انجام شده در %s"، ctime (&now));

threadl (باطل *استفاده نشده)

ساعت هم اکنون)؛ // انجام محاسبات

printf ("threadl با %s شروع می شود"، ctime (&now))؛ // مکث

pthread_barrier_wait (&barrier) ;// پس از این نقطه، هر سه رشته خاتمه می یابند

printf ("barrier in threadl() در %s انجام شد، ctime (&now)) ;

thread2 (باطل *نیست__استفاده شده)

ساعت هم اکنون)؛ // انجام محاسبات

printf ("thread2 که از %s شروع می شود"، ctime (&now))؛ // مکث

pthread_barrier_wait (&barrier) ;

// بعد از این نقطه هر سه رشته تکمیل می شود

printf ("barrier in thread2() در %s انجام شد، ctime (&now));

در مثال از فهرست، رشته اصلی یک مانع ایجاد می‌کند، پس از آن شروع به شمارش تعداد رشته‌های مسدود شده روی مانع برای همگام‌سازی می‌کند. که در در این موردتعداد thread های همگام شده روی 3 تنظیم می شود: thread main()، thread thread1() و thread thread2().

موضوعات thread1() و thread2() راه اندازی می شوند. برای وضوح، یک مکث در جریان برای شبیه سازی فرآیند محاسبات تنظیم شده است. برای انجام همگام‌سازی، نخ اصلی روی یک مانع مسدود می‌شود و منتظر باز شدن قفل می‌شود، که پس از عدم اتصال دو رشته دیگر به آن در آن مانع، رخ می‌دهد.



در انتظار مسدود شدن

قفل های خواب مانند متغیرهای شرطی، با چند استثنا، کار می کنند. همانطور که متغیرهای شرطی منتظر قفل هستند ( pthread_sleepon_lock()) می تواند برای مسدود کردن یک رشته تا زمانی که یک شرط درست شود (مشابه تغییر مقدار یک مکان حافظه) استفاده شود. اما بر خلاف متغیرهای شرط (که باید برای هر شرایطی که آزمایش می‌شود وجود داشته باشد)، قفل‌های انتظار برای یک متغیر شرط mm.tex و پویا، بدون توجه به تعداد شرایط مورد آزمایش اعمال می‌شوند. حداکثر تعداد متغیرهای شرطی در نهایت وجود دارد حداکثر تعدادتاپیک های مسدود شده

بهترین مقالات در این زمینه