LINUX.ORG.RU

Пара тупых вопросов о системном программировании

 , , , ,


0

3

В раннем детстве, лет так 20 назад, я при помощи старого папиного ноута с Вин95 и QBasic пытался писать свои первые хэлловорлды. Там использовался брутально-прямолинейный способ сделать паузу в исполняемом потоке:

FOR I = 1 TO 100000
NEXT

Потом, когда я стал постарше, мне объяснили, что это напрасный перевод процессорного времени.

Теперь стало интересно, как дело обстоит в современных ОС. Если я напишу цикл, сидящий в отдельном треде, вроде

for (;;) {
    if (some_condition) {
        break;
    } else {
        continue;
    }
{

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

★★★★★
Ответ на: комментарий от seiken

Элементарно, Ватсон. Читаю из камеры фреймы и обрабатываю один за другим. Чтение - строго последовательно и блокируется, обработка - какой угодно параллелизм, хоть синхронный, хоть асинхронный.

И где тут слип?

Pavval ★★★★★
()
Ответ на: комментарий от seiken

Он в драйвере, а не в твоем приложении. И это не слип, а ожидание события прихода данных.

Pavval ★★★★★
()
Ответ на: комментарий от fsb4000

Совет дебильный. Есть стандарт, всё есть в stl.

Ответ дебильный. В стандарте этого нет. STL это вообще шаблонная библиотека коллекций. Qt это C++.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

Ты из сообщения топикстартера прочитал первые 140 букв? Ему надо запустить несколько приложений одновременно и обрабатывать их вывод.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

почитай правильный совет в этой теме и потом поищи есть ли это в stl или нужно тащить Qt?

Пара тупых вопросов о системном программировании (комментарий)

Qt настолько же С++ насколько и Nim, например. Там тоже в конце собирается С++ компилятором(или С, но С++ тоже поддерживается). Qt вводит новые ключевые слова в язык. Всё, после этого это не С++. Без прогона Qt утилитами, которые сгенерируют дополнительные исходники, не собрать Qt приложение обычным с++ компилятором.. В отличие от gtk, wxwidgets и прочих библиотек С++.

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Если ты не видишь разницы между кодом на Nim и кодом, использующим Qt, то я не знаю, что тебе ещё можно объяснить. По-моему отличие очевидно. Ты можешь писать, используя Qt, на C++ без препроцессора, повторяя его работу, смысла в этом нет, но при желании ты это можешь делать. И этот код не будет ничем принципиально отличаться.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Ему надо запустить несколько приложений одновременно и обрабатывать их вывод.

Я это привёл в качестве примера больше. Для Раст, например, есть построчный итератор для выхлопа порождённого процесса, он делает именно то, что нужно в данном конкретном случае. Мне больше интересен общий подход - в Glib/Qt есть удобные высокоуровневые обёртки вокруг всего этого, но не тащить же тяжеленный фреймворк ради одних сигналов/слотов/коллбэков.

meliafaro ★★★★★
() автор топика
Ответ на: комментарий от meliafaro

Системному программированию — системные вызовы. Хочешь портабельный селект, бери его в рантайме любимого высокоуровневое языка.

t184256 ★★★★★
()
Ответ на: комментарий от Legioner

Если ты не видишь разницы между кодом на Nim и кодом, использующим Qt, то я не знаю, что тебе ещё можно объяснить

У меня критерий очень простой.

Если программу можно собрать используя только компилятор С++:

g++ file1.cpp file2.cpp file3.cpp -lname1 -lname2

то это С++. Если нельзя, то не С++.

Программа с использованием Qt этому критерию не удовлетворяет. Всё просто. Другие могут думать как им угодно.

Ты можешь писать, используя Qt, на C++ без препроцессора, повторяя его работу

То можешь писать на Nim на С++ без препроцессора, повторяя его работу.

fsb4000 ★★★★★
()

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

anonymous
()
Ответ на: комментарий от anonymous

Читал, что его втыкают в реализацию полноценных мутексов, в ограниченном количестве, но хз где конкретно, и правда ли

В оффтопике в critical section.

anonymous
()
11 июня 2021 г.

пустых циклов не бывает — сама проверка условия это уже какое-то действие. По данной причине будет неплохо так кушать CPU ресурсы.

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

Зная частоту и требуемое количество тактов процессора можно расчитать сколько будет кушать ресурсов CPU.
При этом так же можно расчитать длительность sleep для определенной нагрузки для процессора. Например если частота процессора 1гГц (1000.000.000 Гц), то sleep в 1000 наносекунд будет занимать 0.1% времени CPU если я не заблудился во множителях сейчас)))

safocl ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.