Easyelectronics.ru

Электроника для всех
Текущее время: 15 окт 2019, 06:38

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 65 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Блокировка процессов
СообщениеДобавлено: 30 ноя 2015, 18:41 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
Предложите способ блокировки процессов. Если активирован один процесс, другой должен быть остановлен. Условие - модульность программ. Процесс может быть функцией, КА. Процессы могут быть внутри одной функции.
RTOS не предлагать!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 30 ноя 2015, 19:37 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Так если КА - то кто-то же по ним ходит? Вот пусть тот, кто ходит, и следит за локами (конкретную реализацию не предлагаю, ибо неясна задача).

Более того: по сути, в КА лок - это просто некоторое дополнительное состояние, которое понимает два сигнала: лок занят (вернуться в себя) / лок свободен (взвести лок и перейти к следующему состоянию).

Сложности с локами начинаются только при более-менее честном мультитрединге, а на КА это халява.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 30 ноя 2015, 20:07 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
aamonster писал(а):
...

Приведите пример лока


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 30 ноя 2015, 22:39 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Например, так (каждый поток - КА):

Код:
#define LOCK(mutex) {if(mutex) return; else mutex=TRUE;}
#define UNLOCK(mutex) {mutex=FALSE;}

void dfm1() {
  switch(state1) {
      case S1: LOCK(mutex1);
         ...
         state1=S2;
         break;
      case S5: UNLOCK(mutex1);
         ...
         break;
      ...
      }
   }
}

void dfm2() // аналогично

int main() {
   ...
   while(1) {
      dfm1();
      dfm2();
   }
}


Ну, если подсуетиться - можно объединить два КА в один, тогда лок вообще исчезнет. Но состояний много станет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 30 ноя 2015, 22:48 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2862
Вот немного оффтопа. А почему такое отторжение RTOS, где это все реализовано? Ведь куда удобнее. Запустили таск, заблокировали явно другую задачу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 30 ноя 2015, 23:01 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
А зачем мне RTOS на небольших проектах?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 01 дек 2015, 00:05 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Hold, одна причина уже озвучена.
Вторая - мультитаск (точнее, совместное использование ресурсов несколькими тредами) - это _сложно_ и даже опытные программисты лепят ошибки. Поэтому, если задача позволяет использовать простые средства - это хорошо (у меня вот на Маке такой роскоши нет: в один тред всё не соберёшь. Зато есть другие вкусняшки - Grand Central Dispatch, например). Хотя граница как раз где-то в районе "понадобились примитивы синхронизации" и пролегает...
Третья - когда начинаешь использовать многозадачность, крайне полезно знать, а как все эти примитивы синхронизации работают.

demiurg1978, да, напоминаю на всякий пожарный: лок надо брать на минимально возможное время. А если этим временем окажется один шаг КА - лок вроде как и не нужен: шаг-то никто не прервёт... надеюсь (а если может прервать - задача резко усложняется: прерывание-то не может подождать, пока лок освободят, так что ему данные под локом недоступны)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 01 дек 2015, 00:55 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
aamonster писал(а):
Третья - когда начинаешь использовать многозадачность, крайне полезно знать, а как все эти примитивы синхронизации работают.
изнутри или с т.з. черного ящика?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 01 дек 2015, 02:25 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Что характерно - и то, и другое. Абстракции текут - http://russian.joelonsoftware.com/Artic ... tions.html

Возьмём, к примеру, простейший лок в винде. Упс... А их три вида: mutex, critical section, spinlock.
Делают вроде одно и то же, но применишь один вместо другого - и получишь тормоза и расход проца (подробности расписывать не буду, у Рихтера очень интересно описано).
Ну ладно, фиг с ней, с виндой. Берём freeRTOS. И видим то ли 72, то ли вообще 112 байт памяти на мьютекс. Нефигово, да? Казалось бы, один бит нужен - но нет, всё не так просто.
Я уж не говорю про такие тонкие материи, как fair mutex.

Так вот, опыт работы не только с готовым API сложных систем, но и с простейшими реализациями многозадачности даёт возможность изучить, как оно всё работает - потихоньку, от простого к сложному.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 01 дек 2015, 04:21 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
aamonster, но ведь это все разные примитивы, и в доках всегда описана разница между ними, именно поведенческая. то есть, черный ящик, но с известным поведением и для конкретной платформы. если спинлок циклит проц, так в любой доке это написано. если мьютекс "настоящий", он имеет еще кучу свойств вместе с тем самым битом, это тоже всегда оговаривается. и как-то без разницы, как именно он там внутри реализован (с тем же фриртос, когда-то там семафоры были на очередях, щас хз как, так если хватает памяти, вообще без разницы его реализация, лишь бы поведение было ожидаемое, если же с памятью засада - стоит подумать о смене платформы или обойтись без ос). имхо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 01 дек 2015, 19:22 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Ink, может, пример и не лучший (хотя как объяснить человеку, который в глаза не видел код спинлока, специфику CriticalSection в винде?), но в любом случае - тот, кто сам реализовывал синхронизацию, куда легче поймёт доку.
Но это так, лишь дополнительный бонус: понятно, что инструмент надо выбирать по задаче, и если удобнее более-менее полноценная операционка - то, значит, так тому и быть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 03 дек 2015, 01:21 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2012, 17:24
Сообщения: 525
Как насчет прототредов?
Цитата:
void PT_WAIT_UNTIL(struct pt *pt, condition);
Block and wait until condition is true.

void PT_WAIT_WHILE(struct pt *pt, condition);
Block and wait while condition is true.

void PT_WAIT_THREAD(struct pt *pt, thread);
Block and wait until a child protothread completes.

void PT_SPAWN(struct pt *pt, struct pt *child, thread);
Spawn a child protothread and wait until it exits.


Операционкой назвать язык не поворачивается, а инструменты присутствуют


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 03 дек 2015, 02:47 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Штука прикольная, но её использование противоречит важному правилу: пиши код так, будто поддерживать его будет агрессивный психопат, знающий, где ты живёшь :-)

Лучше уж больше бойлерплейт кода, но прозрачнее.

А вообще, конечно, жаль, что C не умеет сам делать из функции с кучкой yield return конечный автомат, как это делают python и C#. Но там язык под это более заточен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 03 дек 2015, 13:59 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
demiurg1978

Предлагаю адаптировать концепцию mutex под конечный автомат.
Идея следующая.

*Оставляем:
Перед выполнением операций, которые требуют защиты от одновременного посягательства двух процессов, процесс-автомат А пытается захватить mutex.

Если mutex уже захвачен другим процессом B, автомат переводит A себя в состояние WAIT. Среди полей mutex-а есть поле в котором создаётся очередь ожидающих процессов.

Когда процесс B, захвативший mutex, восстанавливает его, mutex переводит следующий в очереди процесс, то есть A, в состояние READY.

*Изменяем:
В отличии от процессов-нитей, способных сразу же выгрузить себя при неудачном захвате мьютекса, конечный автомат должен правильным образом завершиться.

Получается что-то такое:
Код:
switch (state)
{
.....
case 2:
.....
mutex.lock();
state = 3;
break;

case 3:
//Защищенная часть кода
......
mutex.unlock();
state = 4;
break;

case 4:
.......
break;
}

Данная реализация хороша тем, что самому mutex по сути не важно, чем является процесс. Поведение зависит от метода, которым mutex захватывается. Соответственно можно ввести вполне себе абстрактный mutex, который работает со всеми типами процессов.
Эту идею я использую в своей UNDER CONSTRUCTED операционной системе, которая умеет работать сразу со всем скарбом.

P.S. У aamonster очень интересная реализация. Думаю, можно объединить наши идеи в одну. Я запомню.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 00:14 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
SGE писал(а):
Отличный подход, я сам аналогично пишу, но только для себя, чтобы потом было проще вспоминать. У меня иногда в модуле комментария больше, чем самого кода.

Есть и другой подход. Писать код так, чтобы комментарии не требовались. Обзывать функции и переменные так, чтобы было понятно, что они делают и для чего нужны. То же касается констант. И не стесняться если требуется длинных имен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 00:55 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
SGE писал(а):
...

Ну я же не писал кодить без комментариев. Каюсь, не люблю писать комменты. Но если важные места, то приходится. А вот на асме моя нелюбовь писать каменты подводила и не раз. Один раз очень крупно. Долго вникал в собственный написанный несколькими месяцами раньше. Перематерился тогда страшно. А что поделать, сам виноват...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 01:05 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Ага, знакомо: смотришь в код и думаешь - какой дебил это написал? А потом понимаешь, какой...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 01:13 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
aamonster писал(а):
Ага, знакомо: смотришь в код и думаешь - какой дебил это написал? А потом понимаешь, какой...

Ггг. Идентично.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 02:32 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Цитата:
Есть и другой подход. Писать код так, чтобы комментарии не требовались. Обзывать функции и переменные так, чтобы было понятно, что они делают и для чего нужны. То же касается констант. И не стесняться если требуется длинных имен.


Вроде бы звучит правильно, но, увы, неверно. Правильным именованием переменных можно только прокомментировать то, как код исполняется, но вовсе не то, что именно, а главное, ради чего он это делает, и почему из всех возможных альтернатив выбрана эта реализация, а не какая-то другая.

А вот комменты, посвященные тому, как код исполняется, это неправильные комменты. Исполнение должно быть понятно из кода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 11:38 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3540
Откуда: Новосибирск
Может он хотел сказать, что каменты не должны быть от КО. Типа зажечь светодиод. Прибавить 2. Равно 0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 11:50 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Главный вид комментов лично для меня - описание входа и выхода функций. По уму, эти комменты надо вообще писать в doxygen-формате.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 15:39 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
aamonster писал(а):
Ага, знакомо: смотришь в код и думаешь - какой дебил это написал? А потом понимаешь, какой...

.... и вспоминаешь: да это же я в молодости! Или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 17:40 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
SGE писал(а):
А "правильные комменты", по вашему, тогда о чем должны быть ? про сиськи и политику ?

он задним числом пост поправил или вы не читаете?
Mirmik писал(а):
Правильным именованием переменных можно только прокомментировать то, как код исполняется, но вовсе не то, что именно, а главное, ради чего он это делает, и почему из всех возможных альтернатив выбрана эта реализация, а не какая-то другая.

имхо, лучше и не скажешь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 04 дек 2015, 23:19 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
SGE писал(а):
Именно подобное, когда то очень давно, и заставило меня приучить себя писать качественные комменты :)

Выложите пример кода с качественными комментами.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка процессов
СообщениеДобавлено: 05 дек 2015, 00:24 
Старожил
Аватара пользователя

Зарегистрирован: 10 май 2014, 01:21
Сообщения: 1056
Откуда: Мы люди простые, живем в лесу, на пенек молимся
Подобный холивар был как-то в сообществе.
Осталось прослушать лекцию о пользе самодокументирующегося стиля кодирования – и аналогия станет полной :)

_________________
PL/1 forever!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 65 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB