Коммерциялық емес акционерлік қоғамы
Ғұмарбек Дәукеев атындағы
«АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІ»
Институт Теплоэнергетика және басқару жүйелері
Кафедра Автоматтандыру және басқару
№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-сурет.Нәтиже
Достарыңызбен бөлісу: |