Я написал эту небольшую функцию несколько лет назад:
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
не вызывает проблем, если замена содержит эти токены.
Причина является исторической и программируемой. Неактивной задачей является выполнение задачи, если никакая другая задача не выполнима, как Вы сказал это. Это имеет самый низкий приоритет, так вот почему это не работает никакой другой задачи, выполнимо.
причина Programatic: Это упрощает диспетчеризацию процессов много, потому что Вы не должны заботиться об особом случае: "Что происходит, если никакая задача не выполнима?", потому что всегда существует по крайней мере одна выполнимая задача, неактивная задача. Также можно считать сумму процессорного времени используемой на задачу. Без неактивной задачи, какая задача получает процессорное время, считал, никому не нужно?
Историческая причина: Прежде чем у нас были CPU, которые в состоянии к понижению или входят в режимы экономии электроэнергии, оно должно было работать на полной скорости в любое время. Это выполнило ряд инструкций NOP, если никакие задачи не были выполнимы. Сегодня планирование неактивной задачи обычно понижает CPU при помощи инструкций HLT (останов), таким образом, электроэнергия экономится. Таким образом, существует функциональность так или иначе в неактивной задаче в наши дни.
В Windows Вы видите неактивную задачу в списке процессов, это - неактивный процесс.
Ядро Linux поддерживает список ожидания процессов, которые "заблокированы" на IO/mutexes и т.д., Если нет никакого выполнимого процесса, неактивный процесс помещается на очередь выполнения, пока это не вытесняется задачей, выходящей из очереди ожидания.
причина это имеет задачу, то, так, чтобы можно было иметь размеры (приблизительно), сколько времени ядро пропадает впустую из-за блоков на IO / блокировки и т.д. Дополнительно, это делает код, что намного легче для ядра, поскольку неактивная задача совпадает с каждой задачей, в которой это нуждается к контекстному переключению вместо "особого случая" неактивная задача, которая могла сделать изменяющееся поведение ядра более трудным.
Существует на самом деле одна неактивная задача на CPU, но это не сохранено в основном списке задач, вместо этого это находится в "запросе структуры CPU" runqueue структура как структура task_struct *.
Это активируется планировщиком каждый раз, когда нет ничего лучше, чтобы сделать (на том ЦП) и не выполняет некоторый архитектурно-зависимый код для бездействия CPU в состоянии низкой мощности.