Программалау» Тақырыбы: «Тамақтанып жатқан философтар туралы есеп»



жүктеу 114,12 Kb.
Дата22.11.2022
өлшемі114,12 Kb.
#40265
түріПрограмма
7лаба.пайтон (1)


Коммерциялық емес акционерлік қоғамы
Ғұмарбек Дәукеев атындағы

«АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІ»


Институт Теплоэнергетика және басқару жүйелері


Кафедра Автоматтандыру және басқару
7 зертханалық жұмыс бойынша
ЕСЕП
Пән: «Жүйелік программалық жабдықтау және программалау»
Тақырыбы: «Тамақтанып жатқан философтар туралы есеп»
Мамандық: Автоматтандыру және басқару
Нұсқа: №6
Орындаған:Мансур Гульназ
Тобы: АИСУк 20-8
Қабылдаған: оқытушы Абдильдаева А.

Алматы 2022


Тапсырма шарты: Бес философ дөңгелек үстелдің жанында отырады. Олар өмірлерін тамақтану мен ойлауды кезектесіп өткізеді. Үстелдің ортасында үлкен спагетти тағамы орналасқан. Спагетти ұзақ және шатастырылған, порцияны жеу үшін философ екі шанышқыны қолдануы керек. Өкінішке орай, философтарға тек бес шанышқы берілді. Философтардың әр жұпының арасында бір шанышқы бар, олар әрқайсысы оның жанында орналасқан шанышқыларды ғана қолданады деп келісті (сол және оң). Философтардың әрекетін модельдейтін бағдарлама жазыңыз. Бағдарлама бәрі аш болған кезде сәтсіз жағдайдан аулақ болу керек, бірақ олардың ешқайсысы екі шанышқыны да ала алмайды – мысалы, әрқайсысы бір шанышқыны ұстап, оны бергісі келмеген кезде.
Мәселе мынада, философтардың ешқайсысы аштық сезінбейтін мінез-құлық моделін (параллель алгоритм) жасау керек, яғни тамақтану мен ойлауды үнемі ауыстырып отырады. Тапсырма өзара бұғаттауды болдырмау мәселесін суреттейтін етіп тұжырымдалған (ағылш. deadlock) - прогресті мүмкін емес жүйе күйі.
Мысалы, әр философқа келесі алгоритмді орындауға болады:
− Сол жақтағы шанышқы босатылғанша ойлану
− Шанышқы босатылған кезде-оны алу
− Оң жақтағы шанышқы босатылғанша ойлану
− Шанышқы босатылған кезде-оны алу
− Тамақтану
− Сол жақтағы шанышқыны қою
Оң жақтағы шанышқыны қою
− Басынан бастап алгоритмді қайталау.

Листинг код:
import threading
from time import sleep
import random
forks = 5
philosophers = 5

forks_lock = [threading.Lock() for n in range(forks)]

def philosophers_dinner(right_fork, left_fork, philosopher):
while True:
first_fork = min(right_fork, left_fork)
second_fork = max(right_fork, left_fork)
forks_lock[first_fork].acquire()
forks_lock[second_fork].acquire()
print(f'Философ {philosopher} ест')
sleep(random.randint(1, 5))
forks_lock[second_fork].release()
forks_lock[first_fork].release()

for philosopher in range(philosophers):


right_fork = philosopher
left_fork = (philosopher+1) % philosophers
threading.Thread(target=philosophers_dinner, args=(right_fork, left_fork, philosopher)).start()

1-сурет.Нәтиже
жүктеу 114,12 Kb.

Достарыңызбен бөлісу:




©g.engime.org 2024
әкімшілігінің қараңыз

    Басты бет
рсетілетін қызмет
халықаралық қаржы
Астана халықаралық
қызмет регламенті
бекіту туралы
туралы ережені
орталығы туралы
субсидиялау мемлекеттік
кеңес туралы
ніндегі кеңес
орталығын басқару
қаржы орталығын
қаржы орталығы
құрамын бекіту
неркәсіптік кешен
міндетті құпия
болуына ерікті
тексерілу мемлекеттік
медициналық тексерілу
құпия медициналық
ерікті анонимді
Бастауыш тәлім
қатысуға жолдамалар
қызметшілері арасындағы
академиялық демалыс
алушыларға академиялық
білім алушыларға
ұйымдарында білім
туралы хабарландыру
конкурс туралы
мемлекеттік қызметшілері
мемлекеттік әкімшілік
органдардың мемлекеттік
мемлекеттік органдардың
барлық мемлекеттік
арналған барлық
орналасуға арналған
лауазымына орналасуға
әкімшілік лауазымына
инфекцияның болуына
жәрдемдесудің белсенді
шараларына қатысуға
саласындағы дайындаушы
ленген қосылған
шегінде бюджетке
салығы шегінде
есептелген қосылған
ұйымдарға есептелген
дайындаушы ұйымдарға
кешен саласындағы
сомасын субсидиялау