Почему нам нужна задача программы подкачки в Linux?

Я написал эту небольшую функцию несколько лет назад:

function sqlvprintf($query, $args)
{
    global $DB_LINK;
    $ctr = 0;
    ensureConnection(); // Connect to database if not connected already.
    $values = array();
    foreach ($args as $value)
    {
        if (is_string($value))
        {
            $value = "'" . mysqli_real_escape_string($DB_LINK, $value) . "'";
        }
        else if (is_null($value))
        {
            $value = 'NULL';
        }
        else if (!is_int($value) && !is_float($value))
        {
            die('Only numeric, string, array and NULL arguments allowed in a query. Argument '.($ctr+1).' is not a basic type, it\'s type is '. gettype($value). '.');
        }
        $values[] = $value;
        $ctr++;
    }
    $query = preg_replace_callback(
        '/{(\\d+)}/', 
        function($match) use ($values)
        {
            if (isset($values[$match[1]]))
            {
                return $values[$match[1]];
            }
            else
            {
                return $match[0];
            }
        },
        $query
    );
    return $query;
}

function runEscapedQuery($preparedQuery /*, ...*/)
{
    $params = array_slice(func_get_args(), 1);
    $results = runQuery(sqlvprintf($preparedQuery, $params)); // Run query and fetch results.   
    return $results;
}

Это позволяет запускать операторы в однострочном C # -ish String.Format, например:

runEscapedQuery("INSERT INTO Whatever (id, foo, bar) VALUES ({0}, {1}, {2})", $numericVar, $stringVar1, $stringVar2);

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

ОБНОВЛЕНИЕ БЕЗОПАСНОСТИ: предыдущая версия str_replace разрешала инъекции, добавляя токены {#} в пользовательские данные. Эта версия preg_replace_callback не вызывает проблем, если замена содержит эти токены.

42
задан Suresh Subedi 18 July 2015 в 01:37
поделиться

3 ответа

Причина является исторической и программируемой. Неактивной задачей является выполнение задачи, если никакая другая задача не выполнима, как Вы сказал это. Это имеет самый низкий приоритет, так вот почему это не работает никакой другой задачи, выполнимо.

причина Programatic: Это упрощает диспетчеризацию процессов много, потому что Вы не должны заботиться об особом случае: "Что происходит, если никакая задача не выполнима?", потому что всегда существует по крайней мере одна выполнимая задача, неактивная задача. Также можно считать сумму процессорного времени используемой на задачу. Без неактивной задачи, какая задача получает процессорное время, считал, никому не нужно?

Историческая причина: Прежде чем у нас были CPU, которые в состоянии к понижению или входят в режимы экономии электроэнергии, оно должно было работать на полной скорости в любое время. Это выполнило ряд инструкций NOP, если никакие задачи не были выполнимы. Сегодня планирование неактивной задачи обычно понижает CPU при помощи инструкций HLT (останов), таким образом, электроэнергия экономится. Таким образом, существует функциональность так или иначе в неактивной задаче в наши дни.

В Windows Вы видите неактивную задачу в списке процессов, это - неактивный процесс.

34
ответ дан bl4ckb0l7 26 November 2019 в 23:52
поделиться

Ядро Linux поддерживает список ожидания процессов, которые "заблокированы" на IO/mutexes и т.д., Если нет никакого выполнимого процесса, неактивный процесс помещается на очередь выполнения, пока это не вытесняется задачей, выходящей из очереди ожидания.

причина это имеет задачу, то, так, чтобы можно было иметь размеры (приблизительно), сколько времени ядро пропадает впустую из-за блоков на IO / блокировки и т.д. Дополнительно, это делает код, что намного легче для ядра, поскольку неактивная задача совпадает с каждой задачей, в которой это нуждается к контекстному переключению вместо "особого случая" неактивная задача, которая могла сделать изменяющееся поведение ядра более трудным.

17
ответ дан Spence 26 November 2019 в 23:52
поделиться

Существует на самом деле одна неактивная задача на CPU, но это не сохранено в основном списке задач, вместо этого это находится в "запросе структуры CPU" runqueue структура как структура task_struct *.

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

10
ответ дан MarkR 26 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: