Подтвердить что ты не робот

Неужели бесконечный цикл While использует ресурсы процессора?

Из того, что я понимаю, вы пишете ваш Linux Daemon, который слушает запрос в бесконечном цикле.
Что-то вроде..

int main() {
    while(1) {
        //do something...
    }
}

ref: http://www.thegeekstuff.com/2012/02/c-daemon-process/

Я читал, что спящая программа заставляет ее перейти в режим ожидания, чтобы она не ест ресурсы.

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

int main() {
    while(1) {
        if (request) {
            //do something...
        }
        sleep(1)
    }
}

2.Если я должен был снять сон, значит ли это, что потребление ЦП повысится на 100%?

3. Можно ли запускать бесконечный цикл без использования ресурсов? Скажите, если он ничего не делает, кроме как просто петли. Или просто спать (1).

Бесконечные циклы и ресурсы ЦП являются для меня загадкой.

4b9b3361

Ответ 1

Можно ли запустить бесконечный цикл без использования ресурсов? Скажите, если он ничего не делает, кроме как просто петли. Или просто спать (1).

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

Ответ 2

Вызовы poll и select (упомянутые Базиле Старинкевичем в комментарии) или семафор (упомянутый Альсом в ответе) - это правильные способы ожидания запросов в зависимости от обстоятельств. В операционных системах без poll или select должно быть что-то подобное.

Ни один из sleep, YieldProcessor и sched_yield не являются правильными способами для этого, по следующим причинам.

YieldProcessor и sched_yield просто переместите процесс в конец очереди выполнения, но оставьте его выполнимым. Эффект заключается в том, что они позволяют выполнять другие процессы с одинаковым или более высоким приоритетом, но когда эти процессы выполняются (или их нет), процесс, который называется YieldProcessor или sched_yield, продолжает работать. Это вызывает две проблемы. Один из них заключается в том, что процессы с более низким приоритетом по-прежнему не будут выполняться. Другим является то, что это приводит к тому, что процессор всегда работает, используя энергию. Мы бы предпочли операционную систему распознавать, когда процесс не должен работать, и перевести процессор в состояние с низким энергопотреблением.

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

Вызовы poll и select предназначены именно для этой ситуации. Они сообщают операционной системе, что этот процесс хочет обслуживать запрос, поступающий на один из его каналов ввода-вывода, но в противном случае не имеет работы. Это позволяет операционной системе пометить процесс как не выполняемый и поставить процессор в состояние малой мощности, если оно подходит.

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

Критика, что poll, select или семафор вызывает вызов режима ядра, не имеет значения, поскольку другие методы также вызывают вызовы режима ядра. Процесс не может спать сам по себе; он должен вызвать операционную систему, чтобы запросить ее. Аналогично, YieldProcessor и sched_yield делают запросы к операционной системе.

Ответ 3

Короткий ответ - да - удаление сна дает 100% CPU, но ответ зависит от некоторых дополнительных деталей. Он потребляет весь процессор, который он может получить, если...

  • Тело цикла тривиально и оптимизировано.
  • Цикл содержит операцию блокировки (например, операцию с файлом или сетью). Предоставляемая вами ссылка предлагает избежать этого, но часто рекомендуется блокировать до тех пор, пока что-то не произойдет.

РЕДАКТИРОВАТЬ:. Для вашего сценария я поддерживаю предложение, сделанное @Als.

EDIT 2: Я ожидаю, что этот ответ получит -1, потому что я утверждаю, что блокирующие операции могут быть хорошей идеей. [Если вы -1, вы должны оставить мотивацию в комментарии, чтобы все мы могли чему-то научиться.]

Современное популярное мышление заключается в том, что неблокирующий (основанный на событиях) IO хорош, а блокировка - плохо. Это представление упрощено, поскольку предполагает, что все программное обеспечение, выполняющее IO, может повысить пропускную способность, используя неблокирующие операции.

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

Напротив, неблокирующий IO может нести большие фиксированные накладные расходы, чем простой блокирующий IO. Если процесс не может предоставить дополнительный IO, который может чередоваться, то ничего не получается, заплатив за неблокирующую настройку. (На практике наибольшая стоимость неотъемлемого неблокирующего IO - это просто добавленная сложность кода. Кроме того, эта тема в значительной степени является мысленным упражнением.)

При блокировке IO мы полагаемся на операционную систему, чтобы запланировать те процессы, которые могут добиться прогресса. Это то, что предназначена для ОС.

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