linuxat工作队列
Ⅰ linux 工作队列和等待队列的区别
work queue是一种bottom half,中断处理的后半程,强调的是动态的概念,即work是重点,而queue是其次。
wait queue是一种“任务队列”,可以把一些进程放在上面睡眠等待某个事件,强调静态多一些,重点在queue上,即它就是一个queue,这个queue如何调度,什么时候调度并不重要
等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。这里只说,进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者等待时间经过固定的间隔。
等待队列实现了在事件上的条件等待,希望等待特定事件的进程把放进合适的等待队列,并放弃控制权。因此。等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒进程。
等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。
等待队列链表的每个元素代表一个睡眠进程,该进程等待某一事件的发生,描述符地址存放在task字段中。然而,要唤醒等待队列中所有的进程有时并不方便。例如,如果两个或多个进程在等待互斥访问某一个要释放的资源,仅唤醒等待队列中一个才有意义。这个进程占有资源,而其他进程继续睡眠可以用DECLARE_WAIT_QUEUE_HEAD(name)宏定义一个新的等待队列,该宏静态地声明和初始化名为name的等待队列头变量。 init_waitqueue_head()函数用于初始化已动态分配的wait queue head变量等待队列可以通过DECLARE_WAITQUEUE()静态创建,也可以用init_waitqueue_head()动态创建。进程放入等待队列并设置成不可执行状态。
工作队列,workqueue,它允许内核代码来请求在将来某个时间调用一个函数。用来处理不是很紧急事件的回调方式处理方法.工作队列的作用就是把工作推后,交由一个内核线程去执行,更直接的说就是写了一个函数,而现在不想马上执行它,需要在将来某个时刻去执行,那就得用工作队列准没错。
如果需要用一个可以重新调度的实体来执行下半部处理,也应该使用工作队列。是唯一能在进程上下文运行的下半部实现的机制。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,都会非常有用。
Ⅱ linux.at 命令怎么用
一次性定时计划任务的at命令的用法!
1.命令格式:
at[参数][时间]
2.命令功能:
在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程(
ps -ef | grep atd查看, 开启用/etc/init.d/atd start or restart; 开机即启动则需要运行 chkconfig --level 2345 atd on)。
3.命令参数:
-m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q<列队> 使用指定的列队
-f<文件> 从指定文件读入任务而不是从标准输入读入
-t<时间参数> 以时间参数的形式提交要运行的任务 《Linux就该这么学》
使用实例:
实例1:三天后的下午 5 点锺执行 /bin/ls
命令:
at 5pm+3 days
输出:
[root@localhost ~]# at 5pm+3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00
[root@localhost ~]#
说明:
实例2:明天17点钟,输出时间到指定文件内
命令:
at 17:20 tomorrow
输出:
[root@localhost ~]# at 17:20 tomorrow
at> date >/root/2013.log
at> <EOT>
job 8 at 2013-01-06 17:20
Ⅲ linux 设置at调度。要求如下:
1.at调度
]# at 23:59 2020-12-31
at> wall happy new year!
at> <EOF>
2.查看at调度信息
]# atq
3.修改系统日期
]#date -s "2020-12-31 23:58:00"
Ⅳ linux 内核中,工作队列和线程有什么区别
一句话概括:根本就是两个不同的概念,差别很大。
简单的说:
一般来说,线程是windows上的概念,windows区分进程和线程。而在linux上,统一叫进程,进程是完成某项任务所需资源的集合,同时也是linux基本的执行单元。
工作队列是一个等待被执行的任务链表,由专有的线程来调度、执行。很多linux驱动的中断下半部的实现,都是采用工作队列的方式。
作者:陈彬
链接:
来源:知乎
着作权归作者所有,转载请联系作者获得授权。
Ⅳ Linux怎样在某一特定时间执行命令(使用at”
简介
at定时任务,指定一个时间执行一个任务,只能执行一次。需要安装at服务,apt-get install at;
创建at任务
创建at任务方式有两种,从文件输入和从控制台输入。以下分别用两种方式创建1分钟后将当前时间写入 home/result 文件的命令
1、从文件输入
附录
1、at时间定义
at允许使用一套相当复杂的指定时间的方法。
1)能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:04:00
2)能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
3)能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。例如:12pm
4)能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。例如:04:00 2009-03-1
5)能够使用相对计时法。指定格式为:now + count time-units ,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,几天,几小时。例如:now + 5 minutes 04pm + 3 days
6)能够直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
Ⅵ linux中at命令
linux
at
命令详解
使用方式
:
at
-V
[-q
queue]
[-f
file]
[-mldbv]
TIME
说明
:
at
可以让使用者指定在
TIME
这个特定时刻执行某个程序或指令,TIME
的格式是
HH:MM其中的
HH
为小时,MM
为分钟,甚至你也可以指定
am,
pm,
midnight,
noon,
teatime(就是下午
4
点锺)等口语词。
如果想要指定超过一天内的时间,则可以用
MMDDYY
或者
MM/DD/YY
的格式,其中
MM
是分钟,DD
是第几日,YY
是指年份。另外,使用者甚至也可以使用像是
now
+
时间间隔来弹性指定时间,其中的时间间隔可以是
minutes,
hours,
days,
weeks。
另外,使用者也可指定
today
或
tomorrow
来表示今天或明天。当指定了时间并按下
enter
之后,at
会进入交谈模式并要求输入指令或程序,当你输入完后按下
ctrl+D
即可完成所有动作,至于执行的结果将会寄回你的帐号中。
参数
:
-V
:
印出版本编号
-q
:
使用指定的伫列(Queue)来储存,at
的资料是存放在所谓的
queue
中,使用者可以同时使用多个
queue,而
queue
的编号为
a,
b,
c...
z
以及
A,
B,
...
Z
共
52
个
-m
:
即使程序/指令执行完成后没有输出结果,
也要寄封信给使用者
-f
file
:
读入预先写好的命令档。使用者不一定要使用交谈模式来输入,可以先将所有的指定先写入档案后再一次读入
-l
:
列出所有的指定
(使用者也可以直接使用
atq
而不用
at
-l)
-d
:
删除指定
(使用者也可以直接使用
atrm
而不用
at
-d)
-v
:
列出所有已经完成但尚未删除的指定
Ⅶ 求Linux大神,at设置指令执行时间, 要求:通过标准输入:如在2011年4月9日9点向用户邮箱发送以问候信息
Linux用户任务操作系统用户用户同间使用电脑系统任务Linux执行任务同任务没落实执行另项任务
操作系统管理用户任务要求数系统都CPU主存储器系统能二级存储磁盘输入/输设备操作系统管理些资源资源共享用户间造提请求种错觉像独自占据事实操作系统等待执行监视任务队列些任务包括用户工作操作系统任务电邮件打印作业操作系统根据每任务优先级每任务配合适间片每间片约零点几秒虽看起短其实足够计算机完千万指令集每任务都系统运行段间挂机系统转向其任务;段间处理任务直任务完任务队列删除
跑东西Linux系统流程作业称程每用户任务每系统管理守护程序称程 Linux管理使所任务共享系统资源我所关何控制些程让客户服务
程更式定义:独立程序运行自虚拟址空间流程程序区别该程程序虽由程序程序静态指令集合占系统资源操作程随能发变化态使用系统资源运行程序程序启进程
操作程概念同执行进程称作业作业包含或进程尤其使用管道重定向命令
作业控制运行进程行进行控制例用户暂停程稍等片刻继续程 shell启程每进程程所记录用户随所欲挂起进程或重新启该进程作业控制许shell(包括bashtcsh)特点允许用户间进行切换独立业务
例用户编辑文本文件并需要止编辑做其事情利用作业控制用户让编辑器暂挂起并返shell提示符始做其事情做其事情重新启挂起编辑器返刚停用户离编辑器仅仅例作业控制其实际用途
启进程
类型需要运行程序程序名执行程序其实启进程Linux系统每进程都用于系统识别调度进程进程号主要两种式启进程:手启调度启预先设定根据用户要求始自
1手启
直接输入用户命令启进程手启该进程手启该进程始前台台启
前台启手启进程见式般情况用户键入命令ls-升启程前台进程系统已经状态程许些用户能困惑:我启进程实际台运行系统启自启进程悄悄运行些用户快速键入ls-l命令PS-X查看并没看ls程觉奇怪事实结束进程LS太快使用ps看该进程已经执行结束
直接台手工启进程用除非程非耗用户急于结必要假设用户要始期运行程格式化文本文件使整shell格式化程瘫痪状态明智选择台启进程
2调度启
需要些更耗费间资源密集型维护工作该系统适合半夜候用户提前安排指定任务运行间或场合间系统自完所些工作自启程需要启命令
用户命令指定间执行指定命令序列第重要命令命令其说命令至少需要指定命令执行间运行命令允许您指定间指定期间请注意指定间歧视问题 :现用户指定执行间:3:20早晨发命令前晚20:00究竟执行命令期用户仍工作前3: 20则该命令候完退工作状态用户3:20前该命令执行第二清晨命令语:
[-V] [-Q队列] [-f文件名] [-mldbv]间
AT-C工作[工作]
>允许使用非复杂指定间接受hh:mm(:钟)指定间间已第二执行用于午夜(深夜)午(午)更晦涩难懂午茶(午茶间通16:00)指定间用户使用12制面间AM(午)或PM(午)说明午或午指定命令执行指定期格式月份(月)或MM / DD / YY(月//)或DD.MM.YY(月)指定期必须遵循面指定间
述绝计其实使用相计错要执行命令安排指定格式:+计单位现前间间单位单位间钟(钟)数(h)数()周(周)计数间量论几或几等等
序用于直接指定命令完今(今)明(明)面些例说明具体用假设现间
[例]今午5:30指定执行命令 2月24午12:30,2001命令格式:
午5:30
17:30
今17:30
现+ 5
现+ 300钟
17:30 24.2.99
17:30 2/24/99
17:30 2月24
些命令表达更重要意义完全所间完全自由选择根据喜情况般采用绝间24钟避免导致序错误发由于用户自疏忽例面例写:
17:30 2/24/99
清楚其理解
at命令自执行命令标准输入或使用-f选项指定文件读取执行命令使用su命令切换用户shell则前用户认执行用户所错误输发送用户发送电邮件收消息原用户登录shell所者作业文件工作7月31午10许
任何情况超级用户使用命令于其用户否使用取决于两文件:/ etc / at.allow/ etc / at.deny
cron命令<BR /述两命令完某些任务定间内要知道能执行换句说指定运行命令系统完任务指定间切都结束许情况需要重复几命令:家公司自报告员工公司星期第周候需要使用完任务cron命令cron命令应手启cron命令系统启自启进入台(所没必要使用符号(&))用户没权限运行该命令由shell脚本虽超用户手启cron建议由系统自行启shell脚本
cron命令搜索找/ var / spool / cron内目录用户名/ etc / passwd文件名crontab文件文件发现加载内存例用户名狡猾用户所应crontab文件/ var / spool / cron内/狡猾换句说用户名crontab文件存储/ var / spool / cron内目录搜索/ etc / crontab文件写同格式cron命令cron启首先检查用户否设置crontab文件转移休眠状态释放系统资源台进程占用资源非少每钟醒随着间推移看否前需要运行命令执行命令任何输发送电邮件crontab所者或者/ etc / crontab文件MAILTO环境变量指定用户面简单介绍些cron cron命令执行工作原理需要用户干预要求用户顺序执行crontab命令面crontab命令
crontab命令用于安装删除crontab命令或列表形式用驱cron守护进程换句说用户需要执行命令序列crontab文件执行每用户都自crontab文件面看看何创建crontab文件/ VAR / spool / cron内crontab文件能直接创建或crontab文件crontab命令现假设用户名狡猾需要创建自crontab文件首先使用任何文本编辑器创建新文档向其写入需要运行定期要执行命令保存并退假设文件/ tmp / test.cron使用crontab命令文件安装用户crontab文件类型: crontab test.cron
创建crontab文件/ var / spool / cron内目录看看发现狡猾文件文件必需crontab文件
何crontab文件输入要执行命令间文件每行由六域其前五字段指定命令执行间域要执行命令使用每域间空格或制表符隔格式:
钟月月周命令
第二第钟3月第四今前几月周第五第六要执行命令些项目能空必须填补需要指定些些用*代替*通配符代替任何字符所任何间忽略计
程暂停恢复命令允许进程暂停恢复程BG FG
作业控制需要运行待业复苏流产始继续运行键盘按ctrl + Z挂起前前台作业键盘按CTRL + Z暂停前执行命令cat使用jobs命令显示列表操作外壳包括具体工作工作数量工作电流状态执行恢复程两选项:作业挂起fg命令放前台操作bg命令台始挂起灵使用该命令带极便
进程查看器
由于Linux用户系统候要解其用户现做Linux进程系统部署管理些程往往需要管理程:首先我必须知道底程程等程必要查看工作
命令
命令主要用于查看前线用户命令非用用户希望创建即消息其用户使用talk命令必须首先确定用户网做或谈程能立系统管理员希望监视每登录用户刻行使用谁命令谁命令应用程序非简单更准确握用户情况广泛使用
w命令
命令用于显示登录系统用户谁w命令功能更强仅谁登录系统显示些用户工作进展并统计相更详细科增强版本w命令谁命令命令w命令显示项目按顺序:前间系统启现间记录数量用户该系统1秒5秒15秒平均负载每用户数据该项目显示顺序间指:登录帐号终端名称远程主机名登录间空闲间JCPUPCPU前运行进程命令行JCPU所花费间终端(tty)连接所进程候包括台作业包括前运行台作业所占用间PCPU间指由前进程所占用间(即程序)项目
ps命令 BR /> ps命令基本命令非强进程查看器使用命令决定哪些进程运行运行状态程僵尸进程哪些进程占用资源等等总数信息通执行命令
ps命令用监控台进程工作台进程沟通些标准屏幕键盘输入/输设备所需要检测其状态使用ps命令
ps [选项]
面命令选项说明:
>
-E显示所进程
-F格式
h显示标题
- L格式
-W宽输
显示终端进程包括其用户进程
R运行进程
X显示没控制终端进程
O [+ | - ] K1 [+ | - ] K2 [...]]短按键K1 K2快捷键指定级排序顺序进程列表诗同格式指定缺省值些默认顺序由用户指定覆盖面+字符选其向 - 字符反转指定键
用三参数UX
top命令
top命令ps命令相同显示目前流程其条件顶部态程即通用户按键刷新前状态前台执行该命令独占前台直用户终止程序更准确说top命令提供实监控系统处理器状态显示系统CPU敏任务列表该命令按CPU使用内存使用率执行间任务进行排序;许交互式命令或者定制文件命令集特点
进程调度
需要断前台进程通使用至于理由要杀背景按Ctrl + C组合键于台进程恐怕组合键解决必须打kill命令该命令终止台进程程所消耗程许太CPU间许程已经挂总种情况经发
kill命令发送指定信号给进程结束程发送信号指定则默认值TERM信号TERM信号终止所进程永远能捕捉信号谁捕捉信号程能需要使用kill(9)信号信号能捕获
kill命令语简单基本两种式:
杀[-s信号|-P] [-a〕进程ID ...
杀-L [信号]
Ⅷ 如何使用Linux工作队列workqueue
创建一个per-CPU *编译期间静态创建一个per-CPU DEFINE_PER_CPU(type, name) 创建一个名为name,数据类型为type的per-CPU,比如static DEFINE_PER_CPU(struct sk_buff_head, bs_cpu_queues),此时每个CPU都有一个名叫bs_cpu_queues,数据结构为sk_buff_head的变量副本。每个副本都是在自己的CPU上工作。 * 动态创建per-CPU,以下代码是内核create_workqueue实现的片断 struct workqueue_struct *__create_workqueue(const char *name, int singlethread) { int cpu, destroy = 0; struct workqueue_struct *wq; struct task_struct *p; wq = kzalloc(sizeof(*wq), GFP_KERNEL); if (!wq) return NULL; wq->cpu_wq = alloc_percpu(struct cpu_workqueue_struct); if (!wq->cpu_wq) { kfree(wq); return NULL; } …… }创建一个名为name,数据类型为type的per-CPU,比如static DEFINE_PER_CPU(struct sk_buff_head, bs_cpu_queues),此时每个CPU都有一个名叫bs_cpu_queues,数据结构为sk_buff_head的变量副本。每个副本都是在自己的CPU上工作。Linux 2.6内核使用了不少工作队列来处理任务,他在使用上和 tasklet最大的不同是工作队列的函数可以使用休眠,而tasklet的函数是不允许使用休眠的。工作队列的使用又分两种情况,一种是利用系统共享的工作队列来添加自己的工作,这种情况处理函数不能消耗太多时间,这样会影响共享队列中其他任务的处理;另外一种是创建自己的工作队列并添加工作。第二步:创建一个工作结构体变量,并将处理函数和参数的入口地址赋给这个工作结构体变量如果不想要在编译时就用DECLARE_WORK()创建并初始化工作结构体变量,也可以在程序运行时再用INIT_WORK()创建struct work_struct my_work; //创建一个名为my_work的结构体变量,创建后才能使用INIT_WORK()INIT_WORK(&my_work,my_func,&data); //初始化已经创建的my_work,其实就是往这个结构体变量中添加处理函数的入口地址和data的地址,通常在驱动的open函数中完成INIT_WORK(&my_work, my_func, &data); //创建一个工作结构体变量并初始化,和第一种情况的方法一样//作用与schele_work()类似,不同的是将工作添加入p_queue指针指向的工作队列而不是系统共享的工作队列work queue是一种bottom half,中断处理的后半程,强调的是动态的概念,即work是重点,而queue是其次。wait queue是一种“任务队列”,可以把一些进程放在上面睡眠等待某个事件,强调静态多一些,重点在queue上,即它就是一个queue,这个queue如何调度,什么时候调度并不重要等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。这里只说,进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者等待时间经过固定的间隔。等待队列实现了在事件上的条件等待,希望等待特定事件的进程把放进合适的等待队列,并放弃控制权。因此。等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒进程。等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。等待队列链表的每个元素代表一个睡眠进程,该进程等待某一事件的发生,描述符地址存放在task字段中。然而,要唤醒等待队列中所有的进程有时并不方便。例如,如果两个或多个进程在等待互斥访问某一个要释放的资源,仅唤醒等待队列中一个才有意义。这个进程占有资源,而其他进程继续睡眠可以用DECLARE_WAIT_QUEUE_HEAD(name)宏定义一个新的等待队列,该宏静态地声明和初始化名为name的等待队列头变量。 init_waitqueue_head()函数用于初始化已动态分配的wait queue head变量等待队列可以通过DECLARE_WAITQUEUE()静态创建,也可以用init_waitqueue_head()动态创建。进程放入等待队列并设置成不可执行状态。工作队列,workqueue,它允许内核代码来请求在将来某个时间调用一个函数。用来处理不是很紧急事件的回调方式处理方法.工作队列的作用就是把工作推后,交由一个内核线程去执行,更直接的说就是写了一个函数,而现在不想马上执行它,需要在将来某个时刻去执行,那就得用工作队列准没错。如果需要用一个可以重新调度的实体来执行下半部处理,也应该使用工作队列。是唯一能在进程上下文运行的下半部实现的机制。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,都会非常有用。
Ⅸ linux内核工作队列怎么工作的
Linux 2.6内核使用了不少工作队列来处理任务,他在使用上和 tasklet最大的不同是工作队列的函数可以使用休眠,而tasklet的函数是不允许使用休眠的。
工作队列的使用又分两种情况,一种是利用系统共享的工作队列来添加自己的工作,这种情况处理函数不能消耗太多时间,这样会影响共享队列中其他任务的处理;另外一种是创建自己的工作队列并添加工作。
(一)利用系统共享的工作队列添加工作:
第一步:声明或编写一个工作处理函数
void my_func();
第二步:创建一个工作结构体变量,并将处理函数和参数的入口地址赋给这个工作结构体变量
DECLARE_WORK(my_work,my_func,&data); //编译时创建名为my_work的结构体变量并把函数入口地址和参数地址赋给它;
如果不想要在编译时就用DECLARE_WORK()创建并初始化工作结构体变量,也可以在程序运行时再用INIT_WORK()创建
struct work_struct my_work; //创建一个名为my_work的结构体变量,创建后才能使用INIT_WORK()
INIT_WORK(&my_work,my_func,&data); //初始化已经创建的my_work,其实就是往这个结构体变量中添加处理函数的入口地址和data的地址,通常在驱动的open函数中完成
第三步:将工作结构体变量添加入系统的共享工作队列
schele_work(&my_work); //添加入队列的工作完成后会自动从队列中删除
或schele_delayed_work(&my_work,tick); //延时tick个滴答后再提交工作
(二)创建自己的工作队列来添加工作
第一步:声明工作处理函数和一个指向工作队列的指针
void my_func();
struct workqueue_struct *p_queue;
第二步:创建自己的工作队列和工作结构体变量(通常在open函数中完成)
p_queu=create_workqueue("my_queue"); //创建一个名为my_queue的工作队列并把工作队列的入口地址赋给声明的指针
struct work_struct my_work;
INIT_WORK(&my_work, my_func, &data); //创建一个工作结构体变量并初始化,和第一种情况的方法一样
第三步:将工作添加入自己创建的工作队列等待执行
queue_work(p_queue, &my_work);
//作用与schele_work()类似,不同的是将工作添加入p_queue指针指向的工作队列而不是系统共享的工作队列
第四步:删除自己的工作队列
destroy_workqueue(p_queue); //一般是在close函数中删除
Ⅹ linux内核的工作队列任务没处理完又来一个任务怎么办工作对列到底是个什么玩意
来任务就加入到工作队列里了.你说的这个工作队列很模糊.........因为linux里有很多"工作队列"..................叫法虽然相同.但是概念不一样.....