Кіріспе

Бірнеше есептеулердің үсті-үстіне келіп, бірдей уақыт аралығында орындалуы

Бір мезгілде есептеу – бұл бірнеше есептеулердің тізбектеп емес, үсті-үстіне келіп, бірдей уақыт аралығында орындалуын қамтамасыз ететін есептеу түрі. Яғни, бірі аяқталған соң ғана келесісі бастала салмайды. Бұл – бағдарлама, компьютер немесе желі сияқты жүйенің қасиеті, онда әр процеске жеке орындау нүктесі немесе "бақылау тізбегі" берілген. Бір мезгілде жұмыс істейтін жүйеде есептеу басқа есептеулердің аяқталуын күтпей, өздігінен алға жылжуы мүмкін. Бір мезгілде есептеу – модульдік бағдарламалаудың бір түрі. Оның парадигмасында жалпы есептеу бірнешеге бөлінеді, олар бір мезгілде орындалуы мүмкін. Бір мезгілделік есептеу саласындағы алғашқы зерттеушілердің қатарында Эдсгер Дайкстра, Пер Бринч Хансен және К. А. Р. Хоар бар.

Кіріспе

Бір мезгілде есептеу тұжырымы жиі қатарлы есептеудің байланысты, бірақ ерекше тұжырымымен шатастырылады, дегенмен екеуін де «бір уақытта орындалатын бірнеше процесс» деп сипаттауға болады. Параллель есептеуде орындалу бір физикалық сәтте жүзеге асырылады: мысалы, көппроцессорлық машинаның жеке процессорларында есептеулерді жылдамдату мақсатымен. Параллель есептеу (бір ядролы) бір процессорда мүмкін емес, себебі кез келген сәтте (бір сағат циклында) бір ғана есептеу болуы мүмкін. Керісінше, бір мезгілде есептеу процестердің өмір сүру кезеңдерінің үсті-үстіне келуінен тұрады, бірақ орындалу бір сәтте болуы міндетті емес. Мұндағы мақсат – сыртқы әлемде бір мезгілде болатын процестерді модельдеу, мысалы, серверге бір уақытта бірнеше клиент кіруі. Бірнеше бір мезгілде, өзара байланысатын бөліктерден құралған бағдарламалық жүйелерді құру, бөліктердің қатар орындалу мүмкіндігіне қарамастан, күрделілікті шешу үшін пайдалы болуы мүмкін. Мысалы, бір мезгілдегі процестерді бір ядрода орындау қадамдарын уақыт бөлісу арқылы өзара алмастыру арқылы жүзеге асыруға болады: бір уақытта бір ғана процесс жұмыс істейді, егер ол уақыт тілімінде аяқталмаса, тоқтатылады, басқа процесс басталады немесе қайта жалғастырылады, содан кейін бастапқы процесс қайта іске қосылады. Осылайша, бірнеше процесс бір сәтте орындалудың ортасында болады, бірақ сол сәтте тек бір процесс орындалады. Бір мезгілдегі есептеулер қатар орындалуы мүмкін, мысалы, әрбір процесті жеке процессорға немесе процессорлық ядроға беру арқылы немесе есептеуді желіде тарату арқылы. Бір мезгілде жұмыс істейтін жүйедегі тапсырмалардың орындалу уақытының нақты уақыты кестеге байланысты, ал тапсырмаларды әрқашан бір мезгілде орындау қажеттілігі жоқ. Мысалы, екі тапсырма берілген жағдайда, T1 және T2:

T1 T2 алдында орындалып, аяқталуы мүмкін немесе керісінше (тізбекті және ретті)
T1 және T2 кезекпен орындалуы мүмкін (тізбекті және бір мезгілде)
T1 және T2 бір уақытта, уақыттың бір мезгілінде орындалуы мүмкін (параллель және бір мезгілде)

«Тізбектік» сөзі «бір мезгілде» және «параллель» екеуінің де антонимдері ретінде қолданылады; олар нақтырақ ажыратылған кезде, бір мезгілде/тізбекті және параллель/тізбекті қарсы жұптар ретінде қолданылады. Тапсырмалардың бірінен соң бірі орындалатын (параллельдік жоқ), араласпайтын (тізбекті, бір мезгілде емес: алдыңғы тапсырма аяқталғанға дейін ешқандай тапсырма басталмайды) кесте тізбекті кесте деп аталады. Тізбекті түрде жоспарлана алатын тапсырмалар жиынтығы тізбектеледі, бұл бір мезгілдестікті басқаруды жеңілдетеді.

Ортақ ресурстарға қол жеткізуді үйлестіру

Бір мезгілде жұмыс істейтін бағдарламаларды жобалаудағы негізгі мәселе – бір мезгілділік басқару: әртүрлі есептеу орындалулары арасындағы өзара әрекеттесулердің немесе байланыстардың дұрыс ретін қамтамасыз ету және орындалулар арасында ортақ пайдаланылатын ресурстарға қол жеткізуді үйлестіру.

Іске асыру

Бір мезгілде жұмыс істейтін бағдарламаларды іске асыру үшін әр түрлі әдістерді қолдануға болады, мысалы, әрбір есептеу орындалуын операциялық жүйе процесі ретінде немесе есептеу процестерін бір операциялық жүйе процесі ішіндегі жіптер жиынтығы ретінде іске асыру.

Қарым-қатынас және байланыс

Кейбір бір мезгілдегі есептеу жүйелерінде бір мезгілдегі компоненттер арасындағы байланыс бағдарламашыдан жасырылады (мысалы, болашақтарды пайдалану арқылы), ал басқаларында оны ашық түрде басқару қажет. Ашық байланыс екі классқа бөлінеді:

Ортақ жад арқылы байланыс. Бір мезгілдегі компоненттер ортақ жад участаларының мазмұнын өзгерту арқылы байланысады (Java және C# мысалдары). Бұл стильдегі бір мезгілдегі бағдарламалау көбінесе жіптер арасында үйлестіру үшін қандай да бір құлыптау механизмін (мысалы, мутекстер, семафорлар немесе мониторлар) пайдалануды қажет етеді. Мұндай механизмдерді дұрыс іске асырған бағдарлама жіпке қауіпсіз деп есептеледі. Хабар алмасу арқылы байланыс. Бір мезгілдегі компоненттер хабар алмасу арқылы байланысады (MPI, Go, Scala, Erlang және occam мысалдары). Хабар алмасу асинхронды түрде жүзеге асырылуы мүмкін, немесе синхронды "rendezvous" стилін қолдануы мүмкін, онда жіберуші хабар алынғанға дейін күтіп тұрады. Асинхронды хабар алмасу сенімді немесе сенімсіз болуы мүмкін (кейде "жібер және дұға ет" деп аталады). Хабар алмасу арқылы жүзеге асырылатын бір мезгілделік, ортақ жад арқылы жүзеге асырылатын бір мезгілделікке қарағанда түсінуге және талдауға оңайырақ, және көбінесе бағдарламалаудың сенімді түрі болып саналады. Хабар алмасу жүйелерін түсіну және талдау үшін актерлік модель және әр түрлі процесс есептеулері сияқты көптеген математикалық теориялар бар. Хабар алмасу симметриялық көппроцессорлық жүйеде, ортақ жад кэшінің үйлесімділігімен немесе онсыз тиімді жүзеге асырылуы мүмкін. Ортақ жад және хабар алмасу арқылы жүзеге асырылатын бір мезгілделіктің өнімділік сипаттамалары әртүрлі. Әдетте (бірақ әрқашан емес), хабар алмасу жүйесінде процеске арналған жадты пайдалану және тапсырмаларды ауыстыру шығындары төмен, бірақ хабар алмасу шығындары процедураға шақырудан жоғары болады. Мұндай айырмашылықтар көбінесе басқа өнімділік факторларымен жасырылады.

Тарих

Бір мезгілде есептеулер 19-шы және 20-шы ғасырлардың басында теміржолдар мен телеграф саласындағы ертерек жұмыстардың нәтижесінде пайда болды, ал кейбір терминдер, мысалы, семафорлар, осы кезеңге дейін жетеді. Бұл бір теміржол желісінде бірнеше пойызды қалай басқаруға болады (соқтығыстарды болдырмау және тиімділікті арттыру) және белгілі бір сымдар жиынтығы арқылы бірнеше хабарды қалай жіберуге болады (тиімділікті жақсарту), мысалы, уақытты бөліп жіберу мультиплекстеуі (1870-ші жылдар) сияқты мәселелерді шешу үшін туындады. Бір мезгілдегі алгоритмдерді академиялық тұрғыдан зерттеу 1960 жылдары басталды, ал өзара қол жетімділікті (mutual exclusion) анықтап, шешкені үшін бұл саладағы алғашқы мақала деп есептеледі.