Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Управление светофором (семафоры, C, unix)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Управление светофором (семафоры, C, unix)
Имя
Сообщение << Старые топики   Новые топики >>
Управление светофором (семафоры, C, unix) - 2009-05-06 15:52:50.190000   
AchtungPartizanen

Сообщений: 38
Оценки: 0
Присоединился: 2007-10-25 20:54:58.030000
Задача следующая: написать систему моделирования управления движением на перекрестке (Т-образный перекресток, соответственно должно быть 3 процесса) Все движения моделируются отдельными процессами. Процесс моделирует подъезжающие к перекрестку автомобили случайным образом, интенсивности различны. В начале светофор переключается с равными интервалами, по мере накопления статистики по интенсивности время переключения светофора следует изменять. Передача информации процессу светофора выполняется через семафор.

Прежде всего непонятно, с какой стороны вообще нужно подойти к этой задаче. Каким образом сделать так, чтобы процесс постоянно генерил подъезжающие машины, отправляя их в путь только при открытом семафоре, и это в одном процессе? Есть мысль организовать связь через сообщения - процесс генерит их постоянно, а вот другой процесс их забирает только при открытом семафоре - но, кажется, это не совсем то (процесс при этом не один). И непонятно, как вообще собирать и подсчитывать статистику: то ли процессы будут писать все в общий файл, а светофор этот файл анализировать и считать число проехавших с каждой стороны машин, то ли опять через сообщения, то ли что.
В общем, прошу совета. Это курсовая, сроки поджимают
Post #: 1
RE: Управление светофором (семафоры, C, unix) - 2009-05-07 08:57:27.473333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Я никогда не ковырялся с semctl, но… Скажем семафоры из PosixThreads имеют счётчик, который можно увеличивать. Один процесс увеличивает, когда прибывает машина, другой уменьшает, когда она проходит через перекрёсток. Я думаю *nix'овые семафоры примерно тоже самое, и использовать их, наверное, предполагается именно так.
Post #: 2
RE: Управление светофором (семафоры, C, unix) - 2009-05-07 12:50:17.640000   
AchtungPartizanen

Сообщений: 38
Оценки: 0
Присоединился: 2007-10-25 20:54:58.030000
quote:

ORIGINAL: rgo

Я никогда не ковырялся с semctl, но… Скажем семафоры из PosixThreads имеют счётчик, который можно увеличивать. Один процесс увеличивает, когда прибывает машина, другой уменьшает, когда она проходит через перекрёсток. Я думаю *nix'овые семафоры примерно тоже самое, и использовать их, наверное, предполагается именно так.

Да нет, тут не то: семафор организовывает сам светофор: какому направлению давать движение, какому нет. Использовать семафор еще и для прохода самих машин - имхо чересчур
Post #: 3
RE: Управление светофором (семафоры, C, unix) - 2009-05-07 16:01:31.590000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: AchtungPartizanen

Каким образом сделать так, чтобы процесс постоянно генерил подъезжающие машины, отправляя их в путь только при открытом семафоре, и это в одном процессе?


ну пусть процесс-светофор будет родителем, создателем семафора и сборщиком статистики, а потомки (fork или exec - неважно, лишь бы связь была) пусть отправляют сообщения о сгенерированном автомобиле в stdout. итого четыре процесса, связанных через FIFO как 3->1, да плюс семафор в ядре

связь можно осуществить и красивей - через именованные каналы, или сокеты и select/poll

quote:

ORIGINAL: AchtungPartizanen

И непонятно, как вообще собирать и подсчитывать статистику


да как угодно, в чём проблема-то?

quote:

ORIGINAL: AchtungPartizanen

Это курсовая, сроки поджимают


а вот это уже твои личные половые трудности. значит раньше думать надо было

quote:

ORIGINAL: rgo

Я думаю *nix'овые семафоры примерно тоже самое, и использовать их, наверное, предполагается именно так.


большинство *NIX-систем соответствуют стандарту IEEE 1003.1c - даже BSD'шные потомки считаются mostly complient, так что различия между POSIX и UNIX в данном случае можно не делать
Post #: 4
RE: Управление светофором (семафоры, C, unix) - 2009-05-08 10:02:37.773333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Denaturat
quote:

ORIGINAL: rgo
Я думаю *nix'овые семафоры примерно тоже самое, и использовать их, наверное, предполагается именно так.

большинство *NIX-систем соответствуют стандарту IEEE 1003.1c - даже BSD'шные потомки считаются mostly complient, так что различия между POSIX и UNIX в данном случае можно не делать

Не, это понятно. Но семафоры из PosixThreads – это семафоры которые актуальны в адресном пространстве одного процесса. А semctl и пр. – это IPC, взаимодействие между процессами. Они разные по определению. Но раз название одинаково, должно быть что-то общее… ))

quote:

ORIGINAL: AchtungPartizanen
Да нет, тут не то: семафор организовывает сам светофор: какому направлению давать движение, какому нет. Использовать семафор еще и для прохода самих машин - имхо чересчур

А нафига тогда вообще семафоры заводить? Как было сказано: процесс-сфетофор fork'ает три процесса-дороги. Дочерные процессы генерят тачки и отправляют записи о них в stdout. Родительский процесс по таймеру выбирает pipe нужного child'а и читает машины из него. И при чём тут семафоры?
Я думаю, что реально семафор должен хранить количество машин в очереди. А процесс-светофор уменьшать это количество, если им зелёный.
Post #: 5
RE: Управление светофором (семафоры, C, unix) - 2009-05-08 12:23:20.436666   
Jasmin

Сообщений: 2320
Оценки: 0
Присоединился: 2007-05-03 23:08:53.390000
А зачем вообще на C мучаться?? Есть же специальные системы моделирования, GPSS, AnyLogic, Arena… С анимацией и прочим. Сильно надо - стукни в личку, о цене договоримся.
Post #: 6
RE: Управление светофором (семафоры, C, unix) - 2009-05-08 15:02:07.183333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: rgo

семафоры из PosixThreads – это семафоры которые актуальны в адресном пространстве одного процесса


man PTHREAD_PROCESS_SHARED. семафоры из POSIX реализуются как объекты ядра, к адресному пространству одного процесса они никоим образом не привязаны

quote:

ORIGINAL: rgo

А нафига тогда вообще семафоры заводить? Как было сказано: процесс-сфетофор fork'ает три процесса-дороги. Дочерные процессы генерят тачки и отправляют записи о них в stdout. Родительский процесс по таймеру выбирает pipe нужного child'а и читает машины из него. И при чём тут семафоры?


записи отправляются при "зелёном" состоянии семафора для данного процесса. обратная связь процесса-светофора с дочерними процессами - состояние изменяемого им семафора, другой обратной связи нет
Post #: 7
RE: Управление светофором (семафоры, C, unix) - 2009-05-17 12:53:34.276666   
AchtungPartizanen

Сообщений: 38
Оценки: 0
Присоединился: 2007-10-25 20:54:58.030000

quote:

ORIGINAL: Jasmin

А зачем вообще на C мучаться?? Есть же специальные системы моделирования, GPSS, AnyLogic, Arena… С анимацией и прочим. Сильно надо - стукни в личку, о цене договоримся.

Хорошая шутка. Смешная!

Ладно, всем спасибо за помощь, сам уже почти со всем разобрался…
Post #: 8
RE: Управление светофором (семафоры, C, unix) - 2009-05-18 10:16:22.310000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
упс. пропустил развитие темы. Исправляюсь.
quote:

ORBGINAL: Jasmin
А зачем вообще на C мучаться?? Есть же специальные системы моделирования, GPSS, AnyLogic, Arena… С анимацией и прочим. Сильно надо - стукни в личку, о цене договоримся.

Ты что не видишь? Это студент. Он ограничен рамками задания. В задании речь о семафорах unix…

quote:

ORIGINAL: Denaturat
quote:

ORIGINAL: rgo
семафоры из PosixThreads – это семафоры которые актуальны в адресном пространстве одного процесса

man PTHREAD_PROCESS_SHARED. семафоры из POSIX реализуются как объекты ядра, к адресному пространству одного процесса они никоим образом не привязаны

Ты что пытаешся доказать? Что классические семафоры unix и семафоры pthread – это одно и то же? Это не так. Это разные api.
Или просто хочешь указать на то, что семафоры pthread – это ядерные объекты? А это уже зависит от реализации. Глянь, например, на библиотечку pth. Насколько я знаю, стандарт POSIX Thread составлялся таким образом, чтобы ядрёность/юзермодность реализации оставить на усмотрение разработчиков. В тех же манах на pthread регулярно натыкаешься на фразы о том, что наша реализация поддерживает такую фичу, но вообще фича может и не поддерживаться.

quote:

ORIGINAL: AchtungPartizanen
Ладно, всем спасибо за помощь, сам уже почти со всем разобрался…

Это хорошо. Всегда надо разбираться самостоятельно. Можно с помощью общественности, но самостоятельно.
Post #: 9
RE: Управление светофором (семафоры, C, unix) - 2009-05-18 14:26:31.986666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: rgo

quote:

ORIGINAL: Denaturat
quote:

ORIGINAL: rgo
семафоры из PosixThreads – это семафоры которые актуальны в адресном пространстве одного процесса

man PTHREAD_PROCESS_SHARED. семафоры из POSIX реализуются как объекты ядра, к адресному пространству одного процесса они никоим образом не привязаны


Ты что пытаешся доказать? Что классические семафоры unix и семафоры pthread – это одно и то же? Это не так. Это разные api.


с чего ты взял что я это пытаюсь доказать? где я хоть слово сказать про "классические семафоры UNIX" (что бы там ни имелось в виду под этим названием)?

quote:

ORIGINAL: rgo

Или просто хочешь указать на то, что семафоры pthread – это ядерные объекты? А это уже зависит от реализации


я просто хочу сказать, что по стандарту они обязаны быть объектами, разделяемыми между различными процессами. этого стандарт всё же требует - в противном случае реализация должна указывать неполное соответаствие стандарту. реализуешь их иным образом, не объектами ядра - пожалуйста - но PTHREAD_PROCESS_SHARED будь добр поддержать
Post #: 10
RE: Управление светофором (семафоры, C, unix) - 2009-05-20 09:23:05.710000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Denaturat
записи отправляются при "зелёном" состоянии семафора для данного процесса. обратная связь процесса-светофора с дочерними процессами - состояние изменяемого им семафора, другой обратной связи нет

Не знаю как это выглядит с точки зрения препода. Но с точки зрения программиста – это глупость.
Зачем нужна обратная связь? Даже если подумать тупо о моделируемом процессе: какая обратная связь? Как связана интенсивность потока машин подъезжающих к светофору с состоянием этого светофора? Согласно условию задачи состояние светофора как-то зависит от интенсивности. Но обратной зависимости нет.
А если тупо подумать о наипростейшем решении задачи на пайпах, то зачем нужен семафор? Пайп будет буферизировать всё что в него пишется, а процесс-светофора будет забирать из буфера по мере возможности. Проблема может возникнуть, с блокированием процесса-дороги из-за наполнения внутриядерного буфера пайпа, но эти проблемы решаются, и не сильно-то сложно. И семафоры при таком подходе выглядят лишней сущностью.

ps.
Денатурат доказал мне что фраза "семафоры из PosixThreads – это семафоры которые актуальны в адресном пространстве одного процесса" не верна в корне. Да. Это так.
Более того, он вынудил меня отказаться от моей фразы "я изрекаю лишь истину".
Post #: 11
RE: Управление светофором (семафоры, C, unix) - 2009-05-20 15:02:52.206666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
ну, теперь у нас есть два выхода - либо дуэль на мясорубках, либо написать по программе :)
Post #: 12
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Управление светофором (семафоры, C, unix)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.