Re: практикум по Linux Kernel
Добавлено: 16 мар 2015, 19:34
3. Используя очередь отложенных действий (struct workqueue_struct, struct work_struct).Olej писал(а): Задача: Вам предстоит выполнить некоторые ординарные действия в ядре, но параллельно, средствами потоков ядра. Создайте, как минимум, 4 разных способа формирования выполнения своих действий в отдельном потоке.
Вам в учебнике написали, что очередь отложенных действий - это из области обработки прерываний IRQ?
Ничего подобного... Её область применения куда шире: запланировать на отложенное время выполнение любых действий в отдельном потоке.
Код: Выделить всё
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/delay.h>
#define LOG(...) printk( KERN_INFO "! "__VA_ARGS__ )
static void wq_function( struct work_struct *work ) { // рабочая функция
LOG( "%d: start time %lX\n", current->pid, jiffies );
msleep( 1000 ); // пауза 1с.
LOG( "%d: finish time %lX\n", current->pid, jiffies );
return;
}
int test_thread( void ) {
int ret;
struct work_struct work;
unsigned long j = jiffies;
struct workqueue_struct *wq = create_workqueue( "queue" );
if( !wq ) return -EBADRQC;
INIT_WORK( &work, wq_function );
ret = queue_work( wq, &work );
flush_workqueue( wq );
destroy_workqueue( wq );
j = jiffies - j;
LOG( "%d: evaluation time was %ld millisec.\n", current->pid, 1000 * j / HZ );
if( !ret ) return -EPERM;
return -1;
}
module_init( test_thread );
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Oleg Tsiliuric <olej@front.ru>" );
Код: Выделить всё
[olej@fedora smp]$ time sudo insmod thr3.ko
Error: could not insert module thr3.ko: Operation not permitted
real 0m1.112s
user 0m0.035s
sys 0m0.057s
[olej@fedora smp]$ dmesg | tail -n3
[ 737.579134] ! 1807: start time 6AD4B
[ 738.580144] ! 1807: finish time 6B134
[ 738.580409] ! 2521: evaluation time was 1004 millisec.