Я хотел бы поделиться своим практическим опытом в области мультипрограммирования здесь.
Вчера я написал мультипрограмму. Модификации разделяемых ресурсов были помещены в критические секции, защищенные P (mutex) и V (mutex), и эти критические секции кода были помещены в общую библиотеку. Библиотека будет использоваться параллельными приложениями (моими).
У меня было три приложения, которые будут использовать общий код из библиотеки и делать свое дело независимо.
my library
---------
work_on_shared_resource
{
P(mutex)
get_shared_resource
work_with_it
V(mutex)
}
---------
my application
-----------
application1
{
*[
work_on_shared_resource
do_something_else_non_ctitical
]
}
application2
{
*[
work_on_shared_resource
do_something_else_non_ctitical
]
}
application3
{
*[
work_on_shared_resource
]
}
*[...] denote a loop.
------------
Мне пришлось запускать приложения на ОС Linux. У меня в голове нависла мысль о том, что ОС будет со всей честностью планировать все процессы, выполняемые под ним. Другими словами, он одинаково хорошо подарит всем процессам и их использование ресурсов.
Когда были запущены первые два приложения, они прекрасно работали без тупиковой ситуации. Но когда запускалось третье приложение, всегда третье получало ресурсы, но, поскольку оно ничего не делает в своей некритической области, оно чаще получает общий ресурс, когда другие задачи делают что-то еще. Таким образом, два других приложения были найдены почти полностью остановленными. Когда третье приложение было принудительно завершено, предыдущие два приложения возобновили свою работу, как и раньше.
Я думаю, это случай голодания, первые два приложения должны были голодать.
Теперь, как мы можем обеспечить справедливость?
Теперь я начал верить, что планировщик ОС невиновен и слеп. Это зависит от того, кто выиграл гонку; он получил самый большой кусок процессора и ресурсов.
Должны ли мы обеспечить честность пользователей ресурсов в коде критического раздела в библиотеке?
Или мы оставим это на усмотрение заявителей, чтобы обеспечить справедливость, будучи либеральным, а не жадным?
Насколько мне известно, добавление кода для обеспечения справедливости в общей библиотеке должно быть непосильной задачей. С другой стороны, вера в заявления также никогда не гарантирует 100% справедливости. Приложение, которое выполняет очень мало задач после работы с общими ресурсами, должно выиграть гонку, в то время как приложение, которое выполняет тяжелую обработку после своей работы с общими ресурсами, всегда будет голодать.
Какая лучшая практика в этом случае? Где мы обеспечиваем справедливость и как?
С уважением,
Сринивас Наяк