精华内容
下载资源
问答
  • 中断是当进程或事件需要立即引起注意时由硬件或软件发出的信号。它向处理器发出高优先级进程警报, 要求中断当前工作进程。在I/O设备中, 总线控制线之一专用于此目的, 称为总线控制线。中断服务程序(ISR). 当设备...

    中断是当进程或事件需要立即引起注意时由硬件或软件发出的信号。它向处理器发出高优先级进程警报, 要求中断当前工作进程。在I/O设备中, 总线控制线之一专用于此目的, 称为总线控制线。中断服务程序(ISR).

    当设备在进程i引发中断时, 处理器首先完成指令i的执行。然后, 它向程序计数器(PC)加载ISR的第一条指令的地址。在向程序计数器加载地址之前, 被中断指令的地址将被移至临时位置。因此, 在处理了中断之后, 处理器可以继续处理i + 1。

    在处理器处理中断时, 它必须通知设备其请求已被识别, 以便停止发送中断请求信号。此外, 保存寄存器以便将来可以恢复被中断的过程, 从而增加了接收中断到开始执行ISR之间的延迟。这称为中断延迟。

     

    硬件中断:

    在硬件中断中, 所有设备都连接到中断请求线。一条请求线用于所有n个设备。要请求中断, 设备会关闭其关联的开关。当设备请求中断时, INTR的值是来自各个设备的请求的逻辑或。

    处理IRQ涉及的事件顺序:

    1. 设备发出IRQ。
    2. 处理器中断当前正在执行的程序。
    3. 通知设备其请求已被识别, 并且设备停用请求信号。
    4. 所请求的动作已执行。
    5. 启用中断, 并恢复被中断的程序。

     

    处理多个设备:

    当多个设备发出中断请求信号时, 则需要其他信息来确定首先考虑哪个设备。以下方法用于决定选择哪个设备:轮询, 向量中断和中断嵌套。这些解释如下。

     

    轮询:

    在轮询中, 遇到IRQ位置1的第一个设备是首先要服务的设备。调用适当的ISR来提供相同的服务。这很容易实现, 但是通过查询所有设备的IRQ位会浪费很多时间。

     

    向量中断:

    在向量中断中, 请求中断的设备通过在总线上向处理器发送特殊代码来直接标识自己。这使处理器能够识别产生中断的设备。特殊代码可以是ISR的起始地址, 也可以是ISR在内存中的位置, 称为中断向量。

     

    中断嵌套:

    在这种方法中, I/O设备按优先级结构进行组织。因此, 识别出来自较高优先级设备的中断请求, 而不是来自较低优先级设备的请求。为了实现这一点, 每个进程/设备(甚至是处理器)。处理器仅接受优先级高于其的设备/进程的中断。

    处理器优先级编码在PS(进程状态寄存器)的几位中。可以通过写入PS的程序指令对其进行更改。仅在执行OS例程时, 处理器才处于监督模式。在执行应用程序之前, 它将切换到用户模式。

    更多操作系统相关内容请参考:lsbin - IT开发技术https://www.lsbin.com/

    查看以下操作系统相关的内容:

    展开全文
  • 进程发出一个系统调用的请求时,由应用态切换到内核态。这样的内核控制路径被成为进程内核路径,也叫进程上下文。当CPU执行一个与中断有关的内核控制路径的时候,被成为中断上下文。中断的上半部和下半部都属于ISR...
  • 一种方式是使用轮训(polling)的方式,这种方式周期性地查看所有硬件设备的状态并做相应处理,这会造成很多不必要的系统开销。Linux内核使用中断的方式来管理硬件设备,中断本质上是一种电信号,设备通过和中断控制...

    中断

    为了对计算机的硬件(键盘,硬盘,鼠标,网卡等)进行管理,内核需要和这些硬件通信。一种方式是使用轮询(polling)的方式,这种方式周期性地查看所有硬件设备的状态并做相应处理,这会造成很多不必要的系统开销。Linux内核使用中断的方式来管理硬件设备,中断本质上是一种电信号,设备通过和中断控制器引脚相连的总线发出电信号来发出中断。中断控制器是一种控制芯片,多个设备的中断请求线同时连接到中断控制器上,如果多个设备同时发出中断信号,中断控制器根据优先级选择其中一个发送给处理器处理器,处理器收到中断请求后,就中断当前正在执行的任务,进行中断处理。内核通过中断号(中断号是系统为每个中断请求线interrupt request line分配的编号)来区分不同的设备产生的中断,从而执行对应的中断处理程序。

    人们经常把中断和异常(Exception)放在一起讨论,前者是异步中断,后者是同步中断。同步是指在一个处理器指令执行完毕后产生的(是由处理器产生的),异步指的是在任何时候都有可能发生,和处理器是否完成当前指令无关,当然处理器会将正在执行的指令执行完毕才会去检查是否有中断请求。异常又可以分为处理器检测到的异常(Processor-detected exception)和可编程的异常(programmmed exception),前者又分为fault, trap, abort三种,后者是为了进入内核态(软中断/系统调用)。缺页异常和除以0都属于fault。异常的具体分类在网上看到了很多,各有各的说法,看得我大脑都混乱了,这里的分类参考的是哥伦比亚大学的一份上课PPT的分类法。

    中断处理程序

    当接收到一个中断时,内核会执行中断处理程序(interrupt handler),每个可以产生中断的设备都有一个对应的中断处理程序。中断处理程序是设备驱动的一部分,中断处理程序的函数声明必须遵照规定的格式,中断处理程序本质上是一个函数,和内核其他函数的区别在于中断处理程序是由内核响应中断时调用的,它运行在一个被称为中断上下文的特殊上下文中。中断上下文中不能被阻塞,所以有时候也会被称为原子上下文。

    中断处理程序必须快速地完成执行,这样才能快速地对中断做出响应的同时确保被中断抢占的代码可以尽快地恢复执行。但是中断处理程序往往有大量工作要做,比如网卡的中断处理程序就需要将网络中的数据包从硬件上复制到内存中,处理数据包,最后将数据包交给合适的协议栈或者应用程序。

    上半部和下半部

    中断程序有两个目标:快速完成执行和处理大量工作。很显然,这两个目标是冲突的。为了能够同时达到这两个目标,对中断的响应被分成了两部分:上半部和下半部。上半部是中断处理程序,上半部在接受到中断请求后立刻执行,但是只处理对时延敏感的任务,如对中断进行应答(通过给中断线置低电平告诉设备处理器已经收到中断了)或者复位硬件。对时延不敏感的任务都被放在了下半部,延后执行(下一篇博文将会介绍下半部)。

    还是以网卡为例,网卡收到数据包,发出中断请求,告诉内核收到了数据包。因为网卡上接受数据包的缓冲区大小固定,并且比系统内存小得多,为了避免网卡缓冲区溢出丢包,内核需要快速的完成以下工作:通知网卡中断已经响应(通常是给网卡的寄存器复位)并将数据包拷贝到系统内存,到此中断处理程序(上半部)完成,然后将处理器的使用权交还给内核其他部分(调度程序这个时候就要负责选择下一个执行的进程了,详见Linux内核学习笔记(六)进程调度

    中断处理程序的注册、注销和实现

    注册

    每个设备都有一个对应的设备驱动,如果该设备使用中断(大部分都会使用),那么设备驱动必须要注册一个中断处理程序。注册中断处理程序的函数是 request_irq(),声明在<linux/interrupt.h>中,声明如下:

    /* request_irq: allocate a given interrupt line */
    int request_irq(unsigned int irq, irq_handler_t handler,
                    unsigned long flags, const char *name, void *dev)

    参数irq是对应的终端号。系统时钟和键盘这样的传统PC设备的中断号通常是固定的,对于大部分设备,这个值是动态确定的(通过探测或者编程方式)。
    参数handler是一个函数指针,指向要注册的中断处理程序。

    参数flags是作为bitmask使用,规定了中断和中断处理程序的一些属性,比较重要的有:

    • IRQF_DISABLED 内核在执行该中断处理程序时会禁止所有中断。如果没有这个,内核只会禁止当前的中断处理程序的中断请求线,其他中断请求线仍然可以发出中断,这意味着当前中断处理程序可能会被其他优先级更高的中断请求线的处理程序抢占,这就也叫做中断嵌套。
    • IRQF_SAMPLE_RANDOM 该设备产生的中断会为内核熵池(entropy pool)作出贡献,内核熵池负责从各种随机事件(比如中断)中衍生出真正的随机数。
    • IRQF_SHARED 这个标志表示该中断线可以被多个中断处理程序共享(即多个设备共用同一个中断线,个人感觉一个设备注册多个共享中断线的中断处理程序也是有可能的,但是估计不会有人这样做)

    参数name用于传入设备的名字。

    参数dev用于区分共享同一个中断线的多个中断处理程序(注销共享中断线的其中一个中断处理程序时要用到)以及给中断处理程序传递有价值的数据(实践中通常会传递设备驱动用来表示设备的device结构)。

    如果irq对应的中断线当前处于禁用状态(说明没有中断处理程序注册在该中断线上),request_irq()还会激活该中断线。因为request_irq()可能阻塞,所以不能在中断上下文(interrupt context,稍后会详细介绍)中调用。并且无论IRQF_DISABLED是否被设置,内核都会禁用当前中断处理程序的中断线,所以共享同一个中断线的中断处理程序不会发生嵌套或者重入(后面有详细讨论)。

    注销

    当卸载一个设备的时候,需要注销该设备的中断处理程序。注销函数是

    void free_irq(unsigned int irq, void *dev)

    如果中断号irq对应的中断线不是共享的,free_irq()会将irq的中断处理程序移除,并禁用irq对应的中断线。如果中断号irq是共享的,free_irq()会将dev对应的中断处理程序移除,如果移除的中断处理程序是irq的最后一个中断处理程序,那么free_irq()会同时禁用irq对应的中断线。因为free_irq()可能被阻塞,所以同样不能在中断上下文中调用。

    实现

    中断处理程序的声明规范如下:

    static irqreturn_t intr_handler(int irq, void *dev)

    irq是该中断处理程序要处理的中断请求线的中断号。dev和传递给request_irq()的dev是一样的,用于区分共享中断线的中断处理程序。dev可以指向中断处理程序使用的数据结构,通常驱动中用于表示设备的device结构,这样既能保证唯一性,也可以给中断处理程序提供有价值的数据。中断处理程序的返回值irqreturen_t实质上就是int,但是只有两种返回值:IRQ_NONE和IRQ_HANDLED。中断处理程序被调用时如果发现不是自己的设备发出的中断,就会返回IRQ_NONE。如果判断是自己的设备发出的中断时,就会在处理后返回IRQ_HANDLED。

    中断处理程序的工作内容完全取决于设备和产生中断的原因,但是一个最基本的任务是告诉设备中断已经被响应(中断应答)。复杂的设备通常需要发送、接受数据以及执行额外的工作。驱动程序的编写者需要决定哪些任务必须放在上半部,哪些任务可以放在下半部,能放在下半部的任务要尽可能地放在下半部。

    中断上下文

    当执行一个中断处理程序时,内核处于中断上下文(interrupt context)中。与中断上下文相对的是进程上下文,进程上下文是内核所处的工作模式(注意只有在内核态才可能处于进程上下文),在进程上下文中,内核代表进程执行——比如执行系统调用和运行内核线程,此时可以通过current宏访问当前进程。在进程上下文中可以睡眠。(我个人的理解是中断处理不是一个进程,也没有关联的进程,只有关联的中断。而系统调用或者内核线程执行时有关联的进程,所以是在进程上下文中。此外《Linux Kernel Development 3rd》的作者Robert Love在Quora上亲自回答了进程上下文的问题,说得很详细,可以点击去看一下。)

    中断上下文不和一个进程关联(虽然current宏指向被中断的进程),因为没有一个后备的关联进程,因为无法被再次调度,所以中断上下文不能睡眠(我个人对此的理解是因为没有关联的进程,所以没有可用于切换时保存上下文数据的对象。那为什么不让中断处理程序关联一个进程呢,因为这样的话,虽然可以切换出去了,但是在中断处理程序(或者说上半部)中的任务是时延敏感的,必须立刻执行完毕,所以不能切换出去,那么也就没必要关联一个进程了)。所以不能在中断上下文中调用可能睡眠的函数,这限制了中断处理程序的能力(可以做的事情)。

    中断处理程序使用自己的栈——中断栈(interrupt stack)。中断栈每个处理器一个,栈大小为一个页大小(在32bit机器中通常为4KB)。早起内核版本中,中断程序共用被中断的进程的内核栈。

    一个中断处理的详细过程

    中断处理程序的实现是和体系结构、处理器、中断控制器类型、机器本身密切相关的,下图展示了从硬件发出中断到中断处理返回的完整流程图

    中断处理流程图

    硬件设备通过和中断控制器连接的总线发出电信号来向中断控制器发出中断,如果中断请求线是激活的(中断线是可以被屏蔽的),中断控制器将中断发送给处理器,除非处理器禁用中断了(这也同样是可能的,稍后会说),否则,处理器会在执行完当前指令后,禁用处理器中断,然后跳转到预先设置好的内存位置,并执行那里的代码。这个位置是内核设置的处理中断请求的程序的入口点,入口点是中断在内核中旅行的起点。

    入口点会将中断号和被中断进程的寄存器值保存到中断栈中,然后调用do_IRQ(),do_IRQ()从中断栈中提取中断号,然后给该中断线发送一个中断应答信号(其实就是让CPU回送一个低电平的电信号),并禁用该中断线,然后调用handle_IRQ_event()。

    handle_IRQ_event()先检查IRQF_DISABLE是否被设置,如果没有设置,就重新打开处理器中断(处理器收到中断后把处理器中断禁用了),需要注意的是当前的中断线仍然是禁用的。然后handle_IRQ_event()会按序调用注册在该中断线上的所有中断处理程序,每个中断处理程序都要先检查自己的设备是否发出了中断,如果没有立刻返回,返回值为IRQ_NONE,如果有就进行中断处理,最后返回IRQ_HANDLED。通常这种判断是通过查看设备上的状态寄存器来判断的。(补充说明一点:多个设备共享一个中断线时,如果该中断线产生了中断,那么该中断线上可能只有一个设备发出了中断,也有可能有多个设备同时发出了中断(其实就是中断线被置了高电平),所以该中断线上的每个中断处理程序都会被调用一次)

    查看中断系统的状态 /proc/interrupts

    查看/proc/interrupts可以获得当前系统中注册的中断以及他们的统计信息,包括被注册过的中断号、每个CPU收到的该中断号的次数以及该中断号的中断处理程序的名字、设备的名字。

    参考资料

    《Linux Kernel Development 3rd Edition》
    《Understanding The Linux Kernel 3rd Edition》

    展开全文
  • // 向就绪队列添加进程 void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags); // 向就绪队列删除进程 void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);

    1、中断与系统调用的过程

    x86 Linux中断与系统调用过程

    1、程序控制流

    正常程序的控制流只有next(执行下一条指令)和goto(跳转到另一条指令执行)。除了正常控制流之外,还有异常控制流,广义上异常控制流被称为中断。

    狭义的中断是由外设产生的中断,例如按下键盘,此类中断被称为硬中断,这类中断是异步的,CPU执行指令的任何时候都有可能产生中断。另一类中断是由CPU执行中断指令产生的,属于编程中断,例如在x86系统上,执行int指令产生中断,其中int 0x80被用来实现系统调用,此类中断被称为软中断,这类中断是同步的,是执行指令的结果。还有一类中断是指令执行出错产生的,被称为异常,例如除零异常、缺页异常。无论硬中断、软中断还是异常,实现机制上是类似的,都是将CPU中断寄存器置位,以此表明产生了中断。

    CPU在执行完一条指令之后,检测到有中断信号,如果中断没有屏蔽,则根据中断号,跳转到中断描述符表中指明的中断处理程序的位置(Interrupt Descriptor Table,IDT,中断描述符表是内存中的数据结构,起始位置保存在中断描述符表寄存器 IDTR中,x86系统中中断号128对应的中断处理程序是系统调用的入口),权限检查通过后执行完中断处理程序,之后,再跳转到原来程序的断点处,继续执行。

    为了能够回到断点处继续执行,在跳转到中断处理程序之前,需要保存程序断点处的现场信息,也就是各个寄存器的值,包括各个段寄存器,程序计数器,各个数据寄存器,状态寄存器等。其中有硬件自动保存的,也有通过编程由软件保存的。中断处理程序执行完,恢复各个寄存器的原始值,CPU就可以从原来程序的断点处继续执行。

    2、进程上下文

    从硬件的角度来说,CPU无差别的执行程序流程,处理中断,并没有进程的概念。进程是从软件角度抽象出来的,进程在内存中的布局分为代码段、数据段、堆、用户栈和内核栈,不同的代码、数据、堆栈形成了不同的进程。CPU执行程序时,代码段、数据段、堆栈的内存位置存放在相应的寄存器中,改变这些寄存器的值到对应进程的代码段、数据段、堆栈就实现了进程的切换。由于内存中的进程数据不会相互干扰,而CPU的寄存器是所有进程共用的,所以进程切换时,需要保存CPU中各个寄存器的值。当切换当前正在运行的A进程时,将A进程CPU寄存器中的值保存到进程的内核栈上,恢复B进程断点时刻CPU寄存器中的值,B进程则可以从断点处继续执行。进程切换造成进程运行变慢主要原因是数据缓存失效,包括L1、L2、L3缓存以及TLB页目录缓存。线程切换受到影响较小的原因是,线程共享地址空间,不会导致缓存失效。但是频繁的进程切换会导致CPU的大部分时间都耗费在恢复进程上下文的过程中,而实际执行进程代码的时间变少。

    3、中断/系统调用过程

    通常可以将Linux的中断分为异常、硬件中断、系统调用。硬件中断是异步的,也就是外部硬件随时都有可能发出中断,比如按下键盘。处理中断时,CPU会关中断,也就是不允许处理中断时,再响应其他中断,发生中断套嵌。异常和系统调用是同步的,也就是执行某一条指令导致的,比如除零异常、缺页异常;系统调用是通过执行int 0x80指令导致的,对应的中断号为128。处理异常和系统调用不会关中断,也就是CPU在执行异常处理程序或系统调用时,如果产生硬件中断,则会响应中断,执行中断处理程序。

    根据中断时,进程所处的特权级别,可以分为两种情况:

    1、CPU在用户空间执行用户程序时,检测到中断信号进入内核空间执行系统调用/中断处理

    CPU执行用户程序处于用户空间,处于用户态,执行系统调用或处理中断时处于内核空间,处于内核态。在x86系统中,用户态对应特权级ring3,内核态对应特权级ring0。由于从用户空间进入内核空间,发生了特权转换,所以进程调用栈需要从用户栈切换到内核栈,并且需要将用户栈指针ESP和程序计数EIP保存到内核栈,然后跳转到中断处理程序所在的位置。这些操作必须由硬件辅助完成,因为中断是异步产生的,软件无法完成这些操作。试想一下,CPU正常执行指令的时候,完全不知道什么时候会产生中断,也就没有办法通过指令切换调用栈,也没有办法通过指令保存程序计数。

    涉及到硬件辅助,必然和硬件的体系结构相关。事实上,x86在设计上,提供硬件切换进程的方式。每个进程有一个任务状态段TSS(task state segment),这是内存中一个的数据结构,用来保存进程的寄存器上下文,包含通用寄存器的值、IO权限位图信息。
    在这里插入图片描述

    另外还有一个特殊的寄存器TR(Task Register),指向某个进程的TSS。修改TR的值将会触发硬件保存CPU所有寄存器的值到当前进程的TSS中,然后从新进程的TSS中读出所有寄存器值,加载到CPU对应的寄存器中,从而实现进程切换。

    Linux没有采用x86硬件提供的进程切换方式,而是使用软件编程实现进程切换。但是,因为切换内核栈,保存程序计数是无法软件实现的,所以Linux启动的时候,初始化了一个TSS,而后,所有的进程共用一个TSS。

    产生中断时,CPU检测到当前处于用户态ring3,将状态寄存器改为内核态ring0,自动从TSS中取出esp0字段(esp0代表的是特权级为0内核栈指针)赋给ESP,此时ESP指向了内核栈(内核栈位于进程结构体thread_info上方)。然后CPU将用户栈指针(ss、sp)压入内核栈,再依次压栈EFLAGS、CS、EIP、Error Code(异常时错误码)。
    在这里插入图片描述
    硬件压栈的内容和硬件体系结构相关,x86和arm是不同的。硬件压栈以后,CPU跳转到中断描述符表中对应中断号的中断处理程序的入口地址,执行中断处理程序。所有的硬件中断处理程序先压栈中断号,如果是系统调用,则先压栈系统调用号,然后通过执行SAVE_ALL宏定义的汇编代码,压栈用户程序的寄存器值,然后执行具体的系统调用/中断处理。

    /* 此处已进入进程内核栈 */
    ENTRY(system_call)
    	pushl %eax			// save orig_eax,此处为系统调用号
    	SAVE_ALL            // 保存上下文
    	GET_THREAD_INFO(%ebp)
    	// system call tracing in operation
    	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
    	jnz syscall_trace_entry
    	cmpl $(nr_syscalls), %eax  //nr_syscalls表示最大的系统调用号加1。eax存放的是用户传进来的系统调用号。
    	jae syscall_badsys
    	//系统调用号确定有效后
    syscall_call:
    	call *sys_call_table(,%eax,4)  // 在sys_call_table中查找中断服务程序并执行。
    	movl %eax,EAX(%esp)		// 保存返回值
    syscall_exit:
    	cli				/* 
    					make sure we don't miss an interrupt
    					setting need_resched or sigpending
    					between sampling and the iret 
    					*/
    	movl TI_flags(%ebp), %ecx
    	testw $_TIF_ALLWORK_MASK, %cx	// current->work
    	jne syscall_exit_work
    restore_all:
    	RESTORE_ALL     // 回复上下文
    	// perform work that needs to be done immediately before resumption
    

    2、CPU在内核空间执行系统调用,检测到中断信号在内核空间执行中断处理

    在内核空间发生中断,由于特权级别未改变,所以不需要切换调用栈,除此之外,处理中断的过程是一样的。

    4、进程切换

    发生进程切换的原因有两种:一种是进程主动放弃CPU,直接调用schedule()切换到其他进程。
    另一种是进程被抢占。

    1、触发抢占的时机

    每个进程都包含一个TIF_NEED_RESCHED标志,内核根据这个标志判断该进程是否应该被抢占。此标志位于thread_info结构体中的flag上。此外还有preempt_count抢占计数,表示进程是否可以被抢占。

    struct thread_info {
    	/* low level flags */
        unsigned long        flags;
        /* address limit */
        mm_segment_t        addr_limit;
        /* main task structure */
        struct task_struct    *task;
        /* 抢占计数,表示进程处于内核空间时,是否可以抢占,大于0不可以抢占,等于0可以抢占,小于0是bug */
        int            preempt_count;
        int            cpu;        /* cpu */
    };
    

    直接设置TIF_NEED_RESCHED标志的函数是 set_tsk_need_resched();触发抢占的函数是resched_task()。

    周期性的时钟中断

    时钟中断处理函数会调用scheduler_tick(),这是调度器核心层(scheduler core)的函数,它通过调度类(scheduling class)的task_tick方法 检查进程是否需要重调度,如果是,则置位TIF_NEED_RESCHED。

    唤醒进程

    当进程被唤醒的时候,如果优先级高于CPU上的当前进程,就会触发抢占。相应的内核代码中,try_to_wake_up()最终通过check_preempt_curr()检查是否触发抢占。

    创建新进程

    如果新进程的优先级高于CPU上的当前进程,会触发抢占。相应的调度器核心层代码是sched_fork(),它再通过调度类的 task_fork方法触发抢占:

    修改进程nice值

    如果进程修改nice值导致优先级高于CPU上的当前进程,也会触发抢占。内核代码参见 set_user_nice()。

    负载均衡

    在多CPU的系统上,进程调度器尽量使各个CPU之间的负载保持均衡,而负载均衡操作可能会需要触发抢占。

    不同的调度类有不同的负载均衡算法,涉及的核心代码也不一样,比如CFS类在load_balance()中触发抢占

    2、执行抢占的时机

    用户抢占

    从中断返回用户空间

    检查当前进程是否设置了重调度标志TLF_NEDD_RESCHED, 如果该进程被其他进程设置了TIF_NEED_RESCHED标志, 则函数重新执行进行调度

    从系统调用返回用户空间

    检查当前进程是否设置了重调度标志TLF_NEDD_RESCHED, 如果该进程被其他进程设置了TIF_NEED_RESCHED标志, 则函数重新执行进行调度

    内核抢占

    从中断返回内核空间

    当从中断返回内核空间时,内核会检preempt_count和need_resched的值(返回用户空间时只需要检查need_resched,检查是否可以抢占的原因时,内核有可能持有自旋锁,如果被抢占,可能会导致死锁),如查preempt_count为0且need_resched设置,则调用schedule(),完成任务抢占。

    展开全文
  • 这是一个操作系统实验课上的全部内容,这一实验为时钟中断处理程序和键盘中断响应程序.本次实验的内容为操作系统工作期间,利用时钟中断,在屏幕24行79列位置轮流显示’|’、’/’、’-’和’\’,适当控制显示速度...
  • 中断处理进程调度的区别

    千次阅读 2020-12-19 21:36:23
    中断处理进程调度的区别 对于中断处理进程调度的抢占方式(处理机调度),因为二者都有打断的性质,都是抢占了CPU,所以容易混淆。 首先,中断处理是外设打断进程,比如一个进程在使用cpu,它的某条指令到达了...

    中断处理与进程调度的区别

    对于中断处理和进程调度的抢占方式(处理机调度),因为二者都有打断的性质,都是抢占了CPU,所以容易混淆。
    首先,中断处理是外设打断进程,比如一个进程在使用cpu,它的某条指令到达了中断周期,那么,这个进程被中断。(注意:是被外设中断而不是被一个进程打断。就算中断嵌套嵌套的也是其他中断而不是进程。中断服务程序的执行并不视为进程执行)
    进程调度抢占方式则是CPU中一个进程打断另一个执行中的进程。(如处于改进程某条指令的取值、执行或者非中断处理的任何时候)
    所以可以这么认为——中断处理是进程A执行过程中发生的,且一旦发生无法切换为另一个进程B。

    为什么中断处理时无法进行处理机调度(进程切换)?
    因为中断恢复所需要的所有数据都放在被中断进程的内核栈中,如果发生切换就找不到之前的被中断进程了,使得中断无法恢复。
    注:中断处理保存PC(隐指令保存断点)和PSW、通用寄存器内容(保护现场)都是为了恢复被中断进程。进程切换保存PC、PSW是为了下次再轮到被切换进程执行时该从哪开始。从这点看,他们的任务是一致的。(都是保存在被中断\切换进程的PCB中)

    关于进程切换必须用到中断的问题

    进程切换必定使用中断,这似乎与上文所述发生了矛盾,但实际上——上文所有中断说的都是外中断,而不是内中断。
    进程切换不可发生在外中断过程,但必定发生在内中断过程
    因为进程切换必定发生在内核态(管态),而“中断”,严格地说——“内中断”是目态进入管态的必要不充分条件,所以可见进程切换必定借助内中断且必定发生了处理机模式切换。(更确切的说这个内中断是软中断(指令产生的),是自愿的,往往这个软中断就是访管指令)

    展开全文
  • linux进程调度与中断处理: 简单起见,只先看单核cpu的场景。 ①在linux内核中,每一个进程都有对应的进程上下文数据结构,其中存储了本进程相关的属性信息、运行时的状态信息以及对应的u区表、用户栈、内核栈等等...
  • 实验六Linux进程间通信24课时 实验目的 理解进程通信原理掌握进程中信号量共享内存消息队列相关的函数的使用 实验原理 Linux下进程通信相关函数除上次实验所用的几个还有 信号量 信号量又称为信号灯它是用来协调不同...
  • Linux 中断之中断处理浅析

    万次阅读 多人点赞 2019-01-17 14:15:09
    中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断程序。...
  • 操作系统实验模板,实验环境是linux,实验内容是进程间的软中断通信。
  • 疑问: 1.设备,中断线,中断处理程序联系 2.中断上下文与进程上下文 3.中断子系统 总结
  • 进程切换与中断处理

    千次阅读 2015-03-14 10:24:39
    而时钟中断则是操作系统自身发出的,我们只要定义好中断处理程序,并对它进行注册,操作系统便知道一旦接收到了该中断信号时该如何处理。 总的来说,以此来了解操作系统的全部可能有点不够,但是也从一个侧面了解了...
  • 进程中断详细过程

    千次阅读 2020-08-21 15:26:08
    文章目录进程中断详细过程中断中断向量中断向量表中断源中断处理过程 中断 所谓中断就是指CPU在正常执行程序的时候,由于内部/外部事件的出发、或由程序预先设定而引起CPU暂时中止当前正在执行的程序,保存被执行...
  • 如何处理python多进程中断

    千次阅读 2020-03-02 12:28:13
    from multiprocessing import Pool import time, os def excute_case(x): time.sleep(2) for i in range(10): print("iiiiiii = %0d",i) ...pool = Pool(3) #进程池里面放三个,每次只能执行三个进程, pool.m...
  • 缺页中断处理过程.ppt

    2020-12-20 04:41:16
    缺页中断处理过程3.5.3 存储保护与共享 1. 分页式存储中的存储保护与共享 . 在页式环境下,存储保护以页面为单位。在页表的每个表项里设置一个所谓的“保护位”,由该位的不同取值定义对应页是可读、可写或只可读等...
  • 第7章中断处理程序

    千次阅读 2018-09-17 20:40:11
    7.2 中断处理程序 在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。例如,由一个函数专门处理来自系统时钟的中断,而另外一...
  • 中断和中断处理程序

    千次阅读 2015-04-09 21:28:59
    处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一... 硬件设备生成中断的时候并不考虑与处理器的时钟同步——也就是说中断随时可以产生。内核随时可能因为新到来的中断
  • 中断处理程序

    千次阅读 2014-08-20 16:47:17
    1、安装中断处理程序 系统中中断信号线很有限,有时只有15或16根。内核维护了一个类似于I/O端口注册表的中断信号线的注册表。一个模块可以申请一个中断请求IRQ,处理完以后也可以释放掉它。相关函数: 头文件  ...
  • 中断机构和中断处理程序

    千次阅读 2018-12-29 18:06:32
    什么是中断? 中断实际上是对信号做出的一种反应, 即CPU对I/O设备发来的中断信号的一种反应。是由外部设备引起的。俗称外中断。 在此插一嘴什么是陷入?...中断处理程序位于I/O系统的底层,直接与硬件进行交...
  • 中断及中断处理过程

    万次阅读 多人点赞 2019-07-24 22:00:23
    Intel的官方文档里将中断和异常理解为两种中断当前程序执行的不同机制。这是中断和异常的共同点。 不同点在于: 中断(interrupt)是异步的事件,典型的比如由I/O设备触发;异常(exception)是同步的事件,典型的...
  • 在linux中,中断处理程序看起来就是普通的C函数,只不过这些函数必须按照特定的类型声明,以便内核能够以标准的方式传递处理程序的信息,在其他方面,他们与一般的函数看起来别无不同。 那么终端处理程序与其他内核...
  • 中断处理程序及设备驱动程序 中断是指CPU在执行一个程序时,对系统中发生的某个事件做出的一个反应,它在操作系统中有着重要的有着重要的地位,时多道程序得以实现的基础。 引入缓冲区的原因: 外部中断:简称...
  • 进程切换与中断

    千次阅读 2020-03-21 10:15:28
    进程切换指从正在运行的进程中收回处理器,让待...进程切换一定发生在中断/异常/系统调用处理过程中,常见的有以下情况: 1、阻塞式系统调用、虚拟地址异常。 导致被中断进程进入等待态。 2、时间片中断、I/O中断...
  • 用户态和内核态 中断处理机制

    千次阅读 2021-01-15 22:57:54
    按照权限管理的原则,多数应用程序应该运行在最小权限下。因此,很多操作系统,将内存分成了两个区域: 内核空间(Kernal Space),这个空间只有内核程序可以访问; 用户空间(User Space),这部分内存专门给...
  • 嵌入式RTOS---异常和中断处理流程

    千次阅读 2019-11-26 22:50:39
    中断处理分为统一的中断处理和独立的中断处理; 1.1 统一的异常和中断处理 1.1.1 ARM的异常模式 所谓异常,指的是中止了程序正常的执行过程而不得不完成一些特殊的工作(异常工作)。 中断也是一种异常,中断...
  • 目录进程与线程进程线程中断处理过程 进程与线程 进程 概念: 程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位 特征: 动态性 并发性 独立性 制约性 结构: 程序块,数据块,进程控制块(PCB)...
  • 中断处理程序&中断服务例程

    千次阅读 2016-06-03 13:58:23
    中断处理程序(Interrupt Handler)和中断服务例程ISR(Inerrupt Service Routine)是两个不同的概念;一条中断线对应一个中断处理程序,而一个中断处理程序再对应若干个中断服务例程,如下: 所有的中断服务例程...
  • linux内核-中断处理程序

    千次阅读 2014-07-03 11:47:20
    linux内核--中断处理程序 时间2013-09-30 07:31:11 CSDN博客 相似文章 (1) 原文 http://blog.csdn.net/yusiguyuan/article/details/12183641 一个设备的中断处理程序是它设备驱动程序的一部分--设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 221,567
精华内容 88,626
关键字:

中断处理程序是进程吗