Skip to content

tfelwood/philo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Описание проекта Philosophers

Проект реализует знаменитую задачу о философах, используя posix threads для имитации жизнедеятельности каждого философа и механизм мьютексов для взаимодействия между ними. В папке philo_bonus представлена реализация той же задачи с использованием процессов, для взаимодействия между которыми используются семафоры.

Суть задачи

Один или несколько философов сидят за круглым столом. В центре стола стоит большая миска со спагетти. На столе по левую и правую руку от каждого философа лежат вилки. Вилок столько же, сколько философов.
Поскольку есть спагетти только одной вилкой очень неудобно, каждый философ берёт для еды правую и левую вилки, по одной в каждой руке. Поэтому все философы не могут есть одновременно. Когда философ заканчивает есть, он кладет вилки обратно на стол и ложится спать. Проснувшись, он начинает думать. Затем, получив вилки, необходимые для еды, он снова начинает есть.
Симуляция прекращается, когда какой-нибудь философ умирает от голода, не получив вилку до истечения времени time_to_die. Философы не разговаривают друг с другом. Философы не знают о состоянии друг друга.

В консоль выводится журнал, который информирует, когда философ предпринял одно из следующих действий:

  1. взял вилку;
  2. начал есть;
  3. начал думать;
  4. начал спать;
  5. умер.

Каждое действие имеет временную метку в миллисекундах.

Основной целью этой программы было оптимизировать ее таким образом, чтобы накапливалось как можно меньше задержек, так что даже для большого количества потоков / процессов, если параметры гарантируют, что симуляция выполняется бесконечно (например, time_to_eat + time_to_sleep меньше, чем time_to_die), программа выполняется как можно дольше и время её выполнения зависит только от производительности компьютера. Также ключевым моментом является управление ресурсами разделяемой памяти и предотвращение гонки между потоками.

Инструкция для запуска:

Программе при запуске необходимо предоставить следующие параметры:
number_of_philosophers - количество философов
time_to_die - время, которое философ может прожить от одного приёма пищи до другого
time_to_eat - время, которое философ тратит на еду
time_to_sleep - время, которое философ тратит на сон
number_of_times_each_philosopher_must_eat - количество приёмов пищи каждого философа, которое необходимо для успешного завершения программы
Последний параметр опционален, если его не предоставит пользователь, симуляция будет длиться до смерти одного из философов.

Запуск многопоточной версии:

$ cd philo 
$ make  
$ ./philo number_of_philosophers time_to_die time_to_eat time_to_sleep [number_of_times_each_philosopher_must_eat]

Запуск многопроцессной версии:

$ cd philo_bonus 
$ make  
$ ./philo_bonus number_of_philosophers time_to_die time_to_eat time_to_sleep [number_of_times_each_philosopher_must_eat]

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published