导航:首页 > 编程系统 > linux38软中断

linux38软中断

发布时间:2023-09-06 07:15:53

linux中软中断(softirq)为什么不能嵌套

硬中断能嵌套来........................嗯..........这个说法自很奇怪................
根据我的理解是硬中断能被硬中断抢断.................不知道你所谓的嵌套何指.
软中断都在下半部处理.处理时间即长.涉及资源又多.在这里需要同步的地方非常多.难度也比较高..........软中断如果没记错的话.是不能被同种类型抢断.可以被非同类型抢断.因为同类型多涉及相同资源.如果被同类抢断的话.上一个占有的资源未释放.这一个又一直得不到资源.就会一直被阻塞.造成系统进退不得.所以才禁止同类抢断.
不过在不同下半部解决方案设计中.限制也不一样.具体可以自行了解.

不知道你说的可以嵌套指的是什么东西..................

㈡ Linux中断 异常 系统调用 中断上半部 中断下半部 这些有什么区别和联系

中断分软中断跟硬中断,硬中断是由硬件从外部触发,软中断由软件触发,就像linux系统调用int 80一样。至于中断的上下部其实就是因为中断的处理时间跟它的优先级不一定成正比,所以一般先处理中断最重要的部分(上半部),待到不怎么忙的时候,再来处理比较悠闲的部分(下半部)。就像输入的时候,拿到键盘输入的是什么才是最重要的(上半部),显示字符才是次要的(下半部)。

㈢ LINUX软中断通信

我验证下阿...一不小心就fork多了..
刚开始我把kill的参数弄反了,信号和pid位置弄错了,调了半个小时,很郁闷..

你只是忽略了一点...,我也给忽略了。。。后来才想起来

你按下ctrl+C的时候,另外两个fork出来的进程,他们也会接到SIGINT。。。就退出了。。所以你要先在子进程里面忽略这个SIGINT信号,用signal(SIGINT,SIG_IGN)就OK了....
程序如下...

有解释,你可以自己看看...

#include"stdio.h"
#include"unistd.h"
#include"signal.h"
#include"sys/types.h"
#include"stdlib.h"

int k=0;
pid_t child1=0,child2=0;

void func_main(int sig);
void func_child1(int sig);
void func_child2(int sig);

int main()
{
while((child1=fork())==-1);
if(child1==0)
{
printf("child1 OK\n");
signal(SIGINT,SIG_IGN);
signal(SIGUSR1,func_child1);
sleep(60);
}

else if(child1 >0)
{
while((child2=fork())==-1);
if(child2==0)
{
printf("child 2 OK\n");
signal(SIGINT,SIG_IGN);//你按下ctrl+C,子进程也会接受到ctrl的信号...所以,子进程忽略
//所提子进程要忽略掉这个SIGINT信号
signal(SIGUSR2,func_child2);
sleep(60); //这里为了验证,如果进程没退出,40妙之后自动会退出的
//不然就得手动在终端里面kill掉这个进程了...
//有时候成了僵尸进程需要kill -9 才能杀死
}

else if(child2 >0)
{
signal(SIGINT,func_main);
printf("children forked OK...\n");
wait(0);

printf("child return...\n");

sleep(100);
return 0;
}
}

}

void func_main(int sig)
{
k++;
printf("to send signal\n");
//printf("child1=%d,child2=%d\n",child1,child2);
//if(k==1)
kill(child1,SIGUSR1);
//if(k==2) 加上这句,再按一次ctrl C,子进程2才会退出
就是你想要的效果了
kill(child2,SIGUSR2);
signal(SIGINT,SIG_DFL); //这里恢复ctrl+C的效果
//子进程退出之后,我们再按一次ctrl+C,当前的父进程就会像平常一样,退出。

}

void func_child1(int sig)
{
printf("child1 is killed by parent!\n");
exit(0);
}

void func_child2(int sig)
{
printf("child2 is killed by parent!\n");
exit(0);
}

㈣ linux 什么时候用软中断

在中断处理程序不是很紧急的时候适合使用软中断,tasklist workqueue threadirq等,分为前半部后半部,前半部紧急响应中断操作,后半部在处理器空闲是再处理

㈤ linux中断的下半部机制有哪些

一、中断处理为什么要下半部?Linux在中断处理中间中断处理分了上半部和下半部,目的就是提高系统的响应能力和并发能力。通俗一点来讲:当一个中断产生,调用该中断对应的处理程序(上半部)然后告诉系统,对应的后半部可以执行了。然后中断处理程序就返回,下半部会在合适的时机有系统调用。这样一来就大大的减少了中断处理所需要的时间。

二、那些工作应该放在上半部,那些应该放在下半部?
没有严格的规则,只有一些提示:
1、对时间非常敏感,放在上半部。
2、与硬件相关的,放在上半部。
3、不能被其他中断打断的工作,放在上半部。
以上三点之外的,考虑放在下半部。

三、下半部机制在Linux中是怎么实现的?
下半部在Linux中有以下实现机制:
1、BH(在2.5中删除)
2、任务队列(task queue,在2.5删除)
3、软中断(softirq,2.3开始。本文重点)
4、tasklet(2.3开始)
5、工作队列(work queue,2.5开始)

四、软中断是怎么实现的(以下代码出自2.6.32)?
软中断不会抢占另外一个软中断,唯一可以抢占软中断的是中断处理程序。
软中断可以在不同CPU上并发执行(哪怕是同一个软中断)

1、软中断是编译期间静态分配的,定义如下:
struct softirq_action { void (*action)(struct softirq_action *); };

/*
* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
* frequency threaded job scheling. For almost all the purposes
* tasklets are more than enough. F.e. all serial device BHs et
* al. should be converted to tasklets, not to softirqs.
*/
enum {
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS

㈥ Linux网络 - 数据包在内核中接收和发送的过程(转)

本文将介绍在Linux系统中, 数据包是如何一步一步从网卡传到进程手中的 以及 数据包是如何一步一步从应用程序到网卡并最终发送出去的

如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细。

本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个UDP包的接收过程作为示例.

网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自己注册进网络模块,当相应的网卡收到数据包时,网络模块会调用相应的驱动程序处理数据。

下图展示了数据包(packet)如何进入内存,并被内核的网络模块开始处理:

软中断会触发内核网络模块中的软中断处理函数,后续流程如下

由于是UDP包,所以第一步会进入IP层,然后一级一级的函数往下调:

应用层一般有两种方式接收数据,一种是recvfrom函数阻塞在那里等着数据来,这种情况下当socket收到通知后,recvfrom就会被唤醒,然后读取接收队列的数据;另一种是通过epoll或者select监听相应的socket,当收到通知后,再调用recvfrom函数去读取接收队列的数据。两种情况都能正常的接收到相应的数据包。

了解数据包的接收流程有助于帮助我们搞清楚我们可以在哪些地方监控和修改数据包,哪些情况下数据包可能被丢弃,为我们处理网络问题提供了一些参考,同时了解netfilter中相应钩子的位置,对于了解iptables的用法有一定的帮助,同时也会帮助我们后续更好的理解Linux下的网络虚拟设备。

ndo_start_xmit会绑定到具体网卡驱动的相应函数,到这步之后,就归网卡驱动管了,不同的网卡驱动有不同的处理方式,这里不做详细介绍,其大概流程如下:

在网卡驱动发送数据包过程中,会有一些地方需要和netdevice子系统打交道,比如网卡的队列满了,需要告诉上层不要再发了,等队列有空闲的时候,再通知上层接着发数据。

阅读全文

与linux38软中断相关的资料

热点内容
无锡哪里卖编程书 浏览:857
实现打开文件 浏览:572
s7数据开关在哪里 浏览:361
gvim如何调出文件目录 浏览:587
藏建通在什么网站下载 浏览:323
手机qq怎么改群的名字 浏览:574
美术类的论文主要发表在哪个网站 浏览:8
nodejs6await作用域 浏览:386
editplus调试js文件 浏览:827
电脑数据的u是什么意思 浏览:718
电子照片怎么弄成压缩文件 浏览:285
苹果推送电信运营商配置文件 浏览:748
受精24天数据在多少 浏览:502
计算机网络第二章习题 浏览:821
怎么把pdf文件里的字复制到word 浏览:255
健走app哪个轨迹最准 浏览:650
win10手机系统转安卓系统软件 浏览:313
哪个银行app能代缴违停罚款 浏览:555
苹果导出微信文件 浏览:518
win10宽带拨号连接720 浏览:219

友情链接