为什么在中断过程中不能进行睡眠

为什么在中断上下文中不能休眠 为什么在中断上下文中不能休眠 我的理解: 1.执行在中断上下文的代码: a)中断的 top half (interrupt handler)和 b)bottom half(softirq,tasklet等) 2.中断服务程序需要满足的特性: 需要记住 interrupt handler 在执行时是中断了其他的进程或者其他的interrupt handler的。对于inter 阅读详情

        运行在中断中的代码不能进行睡眠,或者阻塞!因为代码是运行在中断上下文中,并非进程上下文中,如果将中断进行睡眠的话,调度器无从得知下一个应该调度的进程,系统无法继续进行!

        关于调度器在中断过程中无法调度其他进程的问题,是由于系统设计的原因!当然你也可以将你的系统设计成在中断过程中,可以进行睡眠或阻塞!但这样会增加你系统设计的复杂程度!因为在设计过程中,你需要考虑好多,复杂的情况!所以,如果你将系统设计成可在中断中睡眠的话,除了给你的设计增加难度外,应该没有其他任何的帮助!所以说从系统设计的角度来讲,声明在中断中无法进行睡眠是有必要的!

       如果你在中断中睡眠的话,你将不得不考虑到许多复杂的情况,以下场景是你经常会遇到的!

       死锁问题:

                         1) 进程1进入kernel code

                         2) 进程1获得Lock A

                         3) 中断发生

                         4)  ISR 执行,但ISR借用进程1的stack

                         5)  ISR 试图获得Lock A

                         6)  ISR 由于无法获得 Lock A, 而进入睡眠!

       此时,就会造成系统死锁,而导致进程1 和ISR无法运行!因为进程1 在等待ISR释放stack而阻塞,而ISR在等待进程1释放Lock A而阻塞,但进程1由于被阻塞,所以无法释放Lock A而导致两者死锁! 

[笨叔点滴12]面试必考:如果在中断处理函数里发生了缺页中断会怎样?为什么? “小明同学去BAT公司面试。 面试官:叫神马名字 小明:小明 面试官:啥是时钟中断? 小明:就是手表坏了,不跑了 面试官: ???这也行 面试官接着问:如果时钟中断处理程序发生了缺页中断,怎么办? 小明嘟囔:咋手表坏了还会缺液,这啥手表。。。液压手表?要加几号油... 面试官:小明同学,滚。。。 ” 上面是一个段子,但是这是一个面试必考题目,考察大家对中断和异常处理的理解,如果你对中断和异常理解不透彻,很难胜任Linux相关的研发工作的。如果能把这个问题的来龙去脉想出来,去面试BA. 阅读详情

相关推荐

深入解析MC9S12XE MSCAN模块:协议保护、时钟配置与低功耗实战

CAN总线作为汽车电子和工业控制领域广泛应用的现场总线技术,其核心在于控制器的高可靠性与实时性。控制器通过硬件协议引擎和精密的时钟系统,确保多节点间数据同步与可靠传输。在嵌入式系统中,深入理解CAN控制器的底层机制,对于设计稳定、低功耗的网络节点具有重要工程价值。以恩智浦MC9S12XE系列内置的MSCAN模块为例,其硬件协议保护机制能有效防止软件错误引发总线故障,而灵活的时钟配置与位定时参数则直接决定了通信的稳定性与波特率精度。结合低功耗模式管理,开发者可以在满足汽车级电磁兼容要求的同时,实现系统能耗的优

weixin_34194829的博客 289

为什么中断里不能 sleep

为什么在 Linux 的 ISR 里,不能 call scheduler?

lyndon 1637

【SeedLab】Packet Sniffing and Spoofing Lab

本节实验要求:借助Scapy库,实现网络流量的捕获与伪造。

cold_windx的博客 4515

中断不能睡眠的原因

转载地址原文地址 这个说起来有点多,一一来看: 1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求. 2,根据硬件请求响应处理逻辑的实时紧要与否,将整个中断处理过程分为上半部和下半部. 3,上半部也就是所谓的硬中断处理逻辑,其要求cpu在收到硬件请求后必须马上处理的事情,比如网卡收到数据包了,把数据包从网卡缓存拷贝到主存(可以由DMA完成,但寄存器的修改以及资源设定还是要由cpu去做)的逻辑就需要cpu立即去做,不做的话,网络新来的数据包

afootball的博客 1312

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2846

Basler相机和pylon viewer 的使用

文章目录1 线路连接2 安装和使用pylon 1 线路连接 电源线接到电源插座,网线接到电脑(电脑没有网口的话,可用转换器转到type-c接口)。 2 安装和使用pylon 参考 Basler pylon安装及对网口相机基本设置 相机和电脑以太网IP设置参考:balser相机IP设置 关于相机参数和pylon viewer的详细设置,可以参考pylon Viewer安装路径下的文档(Documentation) ...

Deephome的博客 1万+

中断中不能睡眠的原因

这个说起来有点多,一一来看: 1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求. 2,根据硬件请求响应处理逻辑的实时紧要与否,将整个中断处理过程分为上半部和下半部. 3,上半部也就是所谓的硬中断处理逻辑,其要求cpu在收到硬件请求后必须马上处理的事情,比如网卡收到数据包了,把数据包从网卡缓存拷贝到主存(可以由DMA完成,

one shot,one kill. 4123

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 266

Linux 0.11中进程睡眠和唤醒机制思考

当进程尝试访问一个边界数据时,有可能由于资源已经被占用而进入睡眠状态。当资源被释放后,就需要把睡眠的进程唤醒。

水土精灵的专栏 1200

实用工具系列 - Xshell安装下载与使用

一、介绍 二、下载 三、安装 四、使用

Passerby_Wang的博客 1万+

DSP复习笔记(5)——外部接口模块XINTF

【注意】 1. 芯片型号:TMS320F28335 2. 适用于NJUSTEO李彧晟老师课程 3. 参考资料:《TMS320F28335 DSP原理、开发及应用》 4. 对应PPT第二章 5. 本章内容较多而且较为重要,请结合PPT一起复习

BerenCamlost的博客 1万+

关于中断上下文不能阻塞的一个猜想

今天突然想到,为什么中断上下文不能阻塞呢一个进程在运行过程中,遭到中断打断,这时候用户空间保存其被打断时候的状态,然后处理器模式切换,切换到中断模式这个进程不是阻塞,而是被中断!而在中断上下文中,如果出现了阻塞,那么调度器不知道去调度谁,因为调度不能发生在中断上下文中而且中断上下文和进程上下文没有任何关系

我的专栏 944

利用Gretna软件计算脑网络的全局属性和局部属性指标

使用Gretna,你可以计算脑网络的全局属性指标(如网络特征、小世界性和模块度),以及局部属性指标(如节点度和聚类系数)。通过Gretna,你可以计算脑网络的稀疏度,并进一步探索网络的特征和特性。Gretna是一款基于MATLAB平台的脑网络分析工具,它提供了丰富的函数和工具箱,用于计算和分析脑网络的结构和功能。在脑网络中,较高的稀疏度可能意味着神经系统的高效性和信息处理能力,因为较少的连接可以降低信息传递的成本。连接矩阵是一个N*N的矩阵,其中N表示节点的数量,矩阵的每个元素表示节点之间的连接强度。

code_program481的博客 1808

线程interrupt方法_带示例的Java线程类void interrupt()方法

线程interrupt方法 线程类void interrupt() (Thread Class void interrupt()) This method is available in package java.lang.Thread.interrupt(). 软件包java.lang.Thread.interrupt()中提供了此方法。 This method is used to inter...

cumubi7552的博客 453

立项书8分钟定生死?手把手教你用ChatGPT辅助打造高水平申报书,让评审专家一看就想打高分!

宏大叙事、空话堆砌只会让评审绕晕,不如聚焦一个具体问题,拿出清晰的研究路径、扎实的设计方案,把“我想做什么、为什么做、打算怎么做”讲明白。对评审来说,关键不在你读了多少,而在你能否看清领域的共识、争议和空白,GPT的作用就在于帮你理清研究脉络,发现问题结构,聚焦那些还没被充分讨论的变量或方法,去提升综述的深度。之前要用到ProcessOn、Draw.io等工具画流程图,现在有了ai虽然方便了,但也需要多次调教,如果嫌麻烦,七哥给大家准备了课题申报常用的流程图,技术路线图,方便大家直接拿来编辑填空使用。

智能AI让学术科研更容易 289

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

多线程调用与中断过程研究

一直以来,对多线程的理解都仅限书本知识,没有仔细研究过,这次做了个实验,对多线程有了一定的了解。下面是实验代码与结果。 public class MyRunTest implements Runnable { private int ticket=5;//类的成员变量放在栈里面,因为只new了一个对象,所以三个线程共同操作这个变量。 @Override public void

我喂自己袋盐 1129

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

xv6操作系统源码阅读之锁

在操作系统中,多个线程之间的竞争,多个CPU之间的竞争,多个中断过程之间的竞争都需要同步技术来保证程序操作数据的正确性。 自旋锁 xv6有两种锁,一种是spin-lock,另一种是sleep-lock,首先先看spin-lock。 // Mutual exclusion lock. struct spinlock { uint locked; // Is the lock held? // For debugging: char *name; // Name of l

weixin_38616705的博客 578

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

设计滚动字演示线程状态及改变方法

本例演示线程对象的生命周期从创建到终止的过程,使用new、start()、sleep()、interrupt()等方法改变线程的状态。 本例综合运用内部类、图形化用户界面、线程等多方面技术实现设计。 [code="java"] package com.jbx.thread; import java.awt.FlowLayout; import java.awt.GridLayo...

天生我材必有用 342

STM32D单片机退出睡眠模式在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能区别引发的中断过程步骤整理

这两个使能的区别?前者是中断线EXTI_Init(),后者是NVIC_Init(),两者通道中断通道号联系起来,例如中断线11配置中断引脚源GPIO_EXTILineConfig()寄存器是AFIO->EXTICR;EXTI_Line11属于EXTI15_10_IRQn外部中断通道号 ...

二进制模----细微行动改变影响世界 405

C# 线程手册 第一章 线程定义 中断和局部线程存储

中断和局部线程存储是如何工作的? 当一个线程用完了分配给它的时间片以后,它不会停止而是再次排队等待。每个处理器在同一时间只能处理一个线程,所以当前线程不得不离开(被从处理器中移出)。然而,在线程跳出执行之前,它得将离开前的状态信息保存下来以便于再次执行。如果你的记性不错,这个功能就称作线程本地存储(TLS).一个线程的本地线程存储包含寄存器,堆栈指针,调度信息,内存中的地址空间以及其他正在使用的...

weixin_33845477的博客 124

ESP8266 - Arduino 知识整理

ESP8266-Arduino开发知识梳理 ESP8266 Arduino 核心开发文档 太极创客 ESP8266开发资料 Random Nerd Tutorials 本文仅从以上网站整理、翻译自己需要使用的内容。 下表显示了丝印标签和GPIO编号之间的对应关系、最适合使用的引脚,以及需要谨慎使用的引脚。用“√ ”标出的引脚可以使用。“※”可以使用,但是需要注意:它们在启动时有意料之外的行为。“×”的引脚不建议用作输入或输出。 丝印标签 GPIO 输入 输出 Notes D0 GPI

李shine的博客 1万+

线程的阻塞

       所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。就绪并代表是在运行啊,所谓的就绪,就是可运行也可不运行,只要调度器分配时间片给线程,线程就可以运行,因为我们都知道,调度器是如何分配线程,是不确定的。为什么任务会进入阻塞的状态,一般有以下几个原因:    ...

weixin_34221112的博客 363

java线程第五课:线程中断

线程的中断   在很多时候,我们需要在一个线程中调控另一个线程,这时我们就要用到线程的中断。用最简单的话也许可以说它就相当于播放机中的暂停一样,当第一次按下暂停时,播放器停止播放,再一次按下暂停时,继续从刚才暂停的地方开始重新播放。而在Java中,这个暂停按钮就是Interrupt()方法。在第一次调用interrupt()方法时,线程中断;当再一次调用interrupt()方法时,线...

王强的专栏 395

2021-07-17嵌入式笔试

嵌入式启动方式: 1、有片内ROM启动 2、片外flash启动(又分为并口/SPI等不同的接口形式) 3、片外EEPROM启动甚至是RAM启动 如AT91RM9200就有片内ROM启动和片外并口flash启动 TI F2812就有并口flash启动和IIC EEPROM启动 TI C6416只有RAM启动,需要主控CPU将程序下载到RAM中,再触发复位 TI C6488启动方式更是多达五六种 每种都有不同的适用场合 可见多么强大 PPC440启动方式更是多达8种 通常都是通过硬件管脚控制的 可以设置跳线选择

kangxiansen的博客 346
上一篇: Linux 内核机制--阻塞与非阻塞机制及Poll/Select分析
下一篇: grep 搜索目录中的文件
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值