linux 哪个驱动 处理系统中断?
与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq(), request_irq()的原型为: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags, const char * devname, void *dev_id); irq是要申请的硬件中断号; handler是向系统登记的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递; irqflags是中断处理的属性,若设置SA_INTERRUPT,标明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置SA_SHIRQ,则多个设备共享中断,dev_id在中断共享时会用到,一般设置为这个设备的device结构本身或者NULL。
什么叫时间中断?
时钟中断:是指在计算机CMOS中一个芯片晶片中(常被称为实时时钟)由电池供电,用于计时,而另一个芯片则根据实时时钟提供的时间定期向CPU引脚发送中断信号的中断。
时钟中断非常特殊而且在系统作用也非常重大。
1.他用做记时。这点显而易见。
2.现在流行的操作系统linux和windows他们都是多进程并发执行的,为什么多进程可以并发,这是由中断支持的。一个进程执行的脚本是代码,而我们知道我们在写代码过程中不会每隔多少行,或者说多少命令就写一个让出CPU语句将自己停止。既然这样,就是说进程不会自己让出CPU了(让出CPU我想除了中断其他方式用的都是有自己特殊目的的,比如异常,让他来支持多进程并发运行显然不实际,因为他将会执行的异常处理程序,确切说他可能连进程也不会切换),那么就得靠其它中断来阻止他继续运行,让CPU停下来从新调度所有进程,然后给人造成多进程并发运行的假象。
那么只有靠硬件的中断了,(为什么不是软件呢,刚说过了正在执行的进程没有中断自己,其它进程还在内存中,连CPU都没拿到,它如何能向CPU中断引脚发送中断信号)硬件中断都是有自己的特殊用途的,一般他们目的都是想让CPU执行它们的驱动程序给他们提供服务,绝大部分是。明显时钟中断没这个要求,我的中断服务程序里面一个应该涉及到计时,除此之外我不需要CPU给我实时时钟提供什么服务。而且如果你操作系统不需要,甚至连前面的计时都可以不用。现在时钟中断了当前运行的进程,然后它按理应该做的是恢复原来的现场,但如果我不恢复现场呢,做一次进程调度。这样就实现了多进程并发运行。
当然如果你在代码中每隔几行加上一次自己主动让出CPU的语句(不一定是中断),但这么做明显将进程调度的部分任务交给了程序,编写的程序将会很复杂,而且每个语句指定时间长短不一,很难做到时间很短或者很确定时间。
linux如何强制中断?
llinux强制中断的命令有以下两个:
linux停止命令方法一
终止当前正在执行的某个命令最快的方法是按下组合键“Ctrl+C”。这个方法只有在用户能够从某个虚拟控制台上控制这个程序的时候才奏效。
linux停止命令方法二
终止某个出错程序的另外一个办法是kill(杀)掉它的进程。请按照下面的方法进行操作:
1) 输入“ps”命令获取进程的PID,这个命令要求你是运行这个程序的那个人或者是根用户。如果是根用户,请输入“ps -aux”命令查看所有的进程,不管是谁拥有它们的。
2) 在清单中找到这个出错进程。因为程序的名称列在清单的最右边,通常一眼就可以找到它。
3) 请记下ps命令输出清单中进程状态行最左边的ID数字。
4) 输入“kill ID”,终止该进程。
Linux中,shell脚本如何使用信号机制去控制线程的开启关闭?
trap是Linux的内建命令,用于捕捉信号,trap命令可以指定收到某种信号时所执行的命令。trap命令的格式如下:trap command sig1 sig2 ... sigN,当接收到sinN中任意一个信号时,执行command命令,command命令完成后继续接收到信号前的操作,直到脚本结束。 利用trap命令捕捉INT信号(即与Ctrl+c绑定的中断信号)。trap还可以忽略某些信号,将command用空字符串代替即可,如trap "" TERM INT,忽略kill %n和Ctrl+c发送的信号(kill发送的是TERM信号)。Linux更强劲的杀死进程的命令:kill -9 进程号(或kill -9 %n作业号)等价与kill -KILL 进程号。
举个例子
:
最近小A需要生产2015年全年的KPI数据报表,现在小A已经将生产脚本写好了,生产脚本一次只能生产指定一天的KPI数据,假设跑一次生产脚本需要5分钟,那么:
如果是循环顺序执行,那么需要时间:5 * 365 = 1825 分钟,约等于 6 天
如果是一次性放到linux后台并发执行,365个后台任务,系统可承受不住哦!
既然不能一次性把365个任务放到linux后台执行,那么,能不能实现自动地每次将N个任务放到后台并发执行呢?当然是可以的啦。
#! /bin/bash
source /etc/profile;
# -----------------------------
tempfifo=$$.fifo # $$表示当前执行文件的PID
begin_date=$1 # 开始时间
end_date=$2 # 结束时间
if
then
if
then
echo "Error! $begin_date is greater than $end_date"
exit 1;
fi
else
echo "Error! Not enough params."
echo "Sample: sh loop_kpi 2015-12-01 2015-12-07"
exit 2;
fi
# -----------------------------
trap "exec 1000>&-;exec 1000
mkfifo $tempfifo
exec 1000$tempfifo
rm -rf $tempfifo
for ((i=1; i
do
echo >&1000
done
while
do
read -u1000
{
echo $begin_date
hive -f kpi_report.sql --hivevar date=$begin_date
echo >&1000
} &
begin_date=`date -d "+1 day $begin_date" +"%Y-%m-%d"`
done
wait
echo "done!!!!!!!!!!"
第6~22行:比如:sh loop_kpi_report.sh 2015-01-01 2015-12-01:
$1表示脚本入参的第一个参数,等于2015-01-01
$2表示脚本入参的第二个参数,等于2015-12-01
$#表示脚本入参的个数,等于2
第13行用于比较传入的两个日期的大小,>是转义
第26行:表示在脚本运行过程中,如果接收到Ctrl+C中断命令,则关闭文件描述符1000的读写,并正常退出
exec 1000>&-;表示关闭文件描述符1000的写
exec 1000
trap是捕获中断命令
第27~29行:
第27行,创建一个管道文件
第28行,将文件描述符1000与FIFO进行绑定,写的绑定,则标识对文件描述符1000的所有操作等同于对管道文件$tempfifo的操作
第29行,可能会有这样的疑问:为什么不直接使用管道文件呢?事实上这并非多此一举,管道的一个重要特性,就是读写必须同时存在,缺失某一个操作,另一个操作就是滞留,而第28行的绑定文件描述符(读、写绑定)正好解决了这个问题
第31~34行:对文件描述符1000进行写入操作。通过循环写入8个空行,这个8就是我们要定义的后台并发的线程数。为什么是写空行而不是写其它字符?因为管道文件的读取,是以行为单位的
第37~42行:
第37行,read -u1000的作用就是读取管道中的一行,在这里就是读取一个空行;每次读取管道就会减少一个空行
第39~41行,注意到第42行结尾的&吗?它表示进程放到linux后台中执行
第41行,执行完后台任务之后,往文件描述符1000中写入一个空行。这是关键所在了,由于read -u1000每次操作,都会导致管道减少一个空行,当linux后台放入了8个任务之后,由于文件描述符1000没有可读取的空行,将导致read -u1000一直处于等待。