The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

Краткая справка

Краткая справка

Предыдущая  Содержание  Следующая V*D*V

Эта глава представляет следующие символы.

Сохранение времени

#include <linux/param.h>

HZ

Символ HZ определяет число тактовых тиков, генерируемых за секунду.

 

#include <linux/jiffies.h>

volatile unsigned long jiffies

u64 jiffies_64

Переменная jiffies_64 увеличивается один раз за каждой тактовый тик; таким образом, она увеличивается HZ раз в секунду. Код ядра чаще всего использует jiffies, которая то же самое, что и jiffies_64 на 64-х разрядных платформах и является его младшей половиной на 32-х разрядных платформах.

int time_after(unsigned long a, unsigned long b);

int time_before(unsigned long a, unsigned long b);

int time_after_eq(unsigned long a, unsigned long b);

int time_before_eq(unsigned long a, unsigned long b);

Эти логические выражения сравнивают тики безопасным способом, без проблем в случае переполнения счётчика и без необходимости доступа к jiffies_64.

u64 get_jiffies_64(void);

Получает jiffies_64 без состояния гонок.

 

#include <linux/time.h>

unsigned long timespec_to_jiffies(struct timespec *value);

void jiffies_to_timespec(unsigned long jiffies, struct timespec *value);

unsigned long timeval_to_jiffies(struct timeval *value);

void jiffies_to_timeval(unsigned long jiffies, struct timeval *value);

Преобразует представление времени между тиками и другими представлениями.

 

#include <asm/msr.h>

rdtsc(low32,high32);

rdtscl(low32);

rdtscll(var64);

Макрос для x86 для чтения тактового счетчика. Они читают его как две 32-х разрядные половины, читая только младшую половину или читая всё это в переменную long long.

 

#include <linux/timex.h>

cycles_t get_cycles(void);

Возвращает тактовый счётчик независимым от платформы образом. Если процессор не предлагает функцию тактового счётчика, возвращается 0.

 

#include <linux/time.h>

unsigned long mktime(year, mon, day, h, m, s);

Возвращает количество секунд с начала эпохи, основанной на шести аргументах типа unsigned int.

void do_gettimeofday(struct timeval *tv);

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

struct timespec current_kernel_time(void);

Возвращает текущее время с разрешением в один тик.

Задержки

#include <linux/wait.h>

long wait_event_interruptible_timeout(wait_queue_head_t *q, condition, signed long timeout);

Помещает текущий процесс в сон в очередь ожидания, задавая значение timeout в тиках. Для непрерываемого сна используйте schedule_timeout (смотрите ниже).

 

#include <linux/sched.h>

signed long schedule_timeout(signed long timeout);

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

 

#include <linux/delay.h>

void ndelay(unsigned long nsecs);

void udelay(unsigned long usecs);

void mdelay(unsigned long msecs);

Вводит задержки на целое число наносекунд, микросекунд и миллисекундах. Задержка достигает по крайней мере желаемого значения, но она может быть и больше. Аргумент каждой функции не должна превышать предела, специфичного для каждой платформы (обычно, несколько тысяч).

void msleep(unsigned int millisecs);

unsigned long msleep_interruptible(unsigned int millisecs);

void ssleep(unsigned int seconds);

Помещает процесс в сон на заданное число миллисекунд (или секунд, в случае ssleep).

Таймеры ядра

#include <asm/hardirq.h>

int in_interrupt(void);

int in_atomic(void);

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

 

#include <linux/timer.h>

void init_timer(struct timer_list * timer);

struct timer_list TIMER_INITIALIZER(_function, _expires, _data);

Эта функция и статическая декларация по таймерной структуры являются двумя способами инициализации структуры данных timer_list.

void add_timer(struct timer_list * timer);

Регистрирует таймерную структуру для запуска на текущем процессор.

int mod_timer(struct timer_list *timer, unsigned long expires);

Изменяет время окончания уже запланированной таймерной структуры. Она может также выступать в качестве альтернативы add_timer.

int timer_pending(struct timer_list * timer);

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

void del_timer(struct timer_list * timer);

void del_timer_sync(struct timer_list * timer);

Удаление таймера из списка активных таймеров. Последняя функция гарантирует, что таймер не запущен на другом процессоре.

Микрозадачи

#include <linux/interrupt.h>

DECLARE_TASKLET(name, func, data);

DECLARE_TASKLET_DISABLED(name, func, data);

void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);

Первые два макроса декларируют структуру микрозадачи, а функция tasklet_init инициализирует структуру микрозадачи, которая была получена путём создания во время работы или другими способами. Второй из макросов DECLARE помечает микрозадачу как отключённую.

void tasklet_disable(struct tasklet_struct *t);

void tasklet_disable_nosync(struct tasklet_struct *t);

void tasklet_enable(struct tasklet_struct *t);

Отключает и снова включает микрозадачу. Каждое отключение должно сопровождаться включением (вы можете отключить  микрозадачу даже если она уже отключена). Функция tasklet_disable ожидает завершения микрозадачи, если она работает на другом процессоре. Версия nosync не делает этого дополнительного шага.

void tasklet_schedule(struct tasklet_struct *t);

void tasklet_hi_schedule(struct tasklet_struct *t);

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

void tasklet_kill(struct tasklet_struct *t);

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

Очереди задач

#include <linux/workqueue.h>

struct workqueue_struct;

struct work_struct;

Структуры, являющиеся очередью задач и рабочей записью, соответственно.

struct workqueue_struct *create_workqueue(const char *name);

struct workqueue_struct *create_singlethread_workqueue(const char *name);

void destroy_workqueue(struct workqueue_struct *queue);

Функции для создания и уничтожения очередей задач. Вызов create_workqueue создаёт очередь с рабочим потоком на каждом процессоре в системе; наоборот, create_singlethread_workqueue создаёт очередь задач с одним рабочим процессом.

DECLARE_WORK(name, void (*function)(void *), void *data);

INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);

PREPARE_WORK(struct work_struct *work, void (*function)(void *), void *data);

Макросы, которые объявляют и инициализируют записи очереди задач.

int queue_work(struct workqueue_struct *queue, struct work_struct *work);

int queue_delayed_work(struct workqueue_struct *queue, struct work_struct *work, unsigned long delay);

Функции, которые последовательно работают для запуска из очереди задач.

int cancel_delayed_work(struct work_struct *work);

void flush_workqueue(struct workqueue_struct *queue);

Используйте cancel_delayed_work для удаления записи из очереди задач; flush_workqueue гарантирует, что никакая из записей в очереди задач не работает где-либо в системе.

int schedule_work(struct work_struct *work);

int schedule_delayed_work(struct work_struct *work, unsigned long delay);

void flush_scheduled_work(void);

Функции для работы с общей очередью задач.

 

Предыдущая  Содержание  Следующая