进程上下文VS中断上下文

本文主要集中介绍 进程、线程、软硬中断、以及进程上下文、中断上下文等信息

1:Tasklet机制:

1.1定义 :

Tasklet 是 Linux中断处理机制中的 软中断延迟机制,在Linux中存在着硬中断和软中断之别

1.2工作 :

在Linux 接收到 硬件中断 之后,通过tasklet函数来设定软中断被执行的优先程度从而导致 软中断处理函数被优先执行的差异性 

1.3软中断 :

软中断的一种典型应用就是所谓的 “下半部”,它的名字来源于 将 硬件中断处理分离成 “上半部” “下半部” 两个阶段的机制,上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作,而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机。软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的(硬中断是由硬件产生的)。

1.4硬中断与软中断的结合:

与系统相连的外设状态发生变化的时候,外设会发出一个 硬件中断 给系统,硬件中断处理比较简单的,耗时较短的工作(顶半部),而将处理时间比较长的的工作,放在中断之后来完成,也就是软中断来完成(底半部),当顶半部收到外设中断的时,简单的读取中断状态,并且在清除中断标志后进行 “登记中断”(传给底半部),将底半部的处理流程程序挂接到该设备的底半部执行队列中去。由内核内部的进程完成处理,如此配合,使得系统能都非常块的相应外设中断。

2 :进程 VS 线程

在这里感谢知乎大牛 zhonyong 关于 线程/进程 的讲解!!

概括: 进程和线程都是一个时间段的描述,是CPU工作时间段的描述 
详解: CPU+RAM+各种资源(显卡 光驱 键盘 。。)组成了我们的电脑,但是电脑的运行,实际是 
CPU和相关寄存器以及RAM之间的事情。

2.1

      电脑运行,CPU运行速度过快,寄存器仅仅能够跟得上,而RAM等外设根本跟不上CPU的速度,那现在
      当有多个任务需要执行的时候该怎么办?轮流着来,或者谁优先级高谁来?不管是什么策略,对于CPU
      看来就是轮流着来。

2.2

      执行一段代码,实现一个功能过程介绍 : 任务A得到CPU的时候,相关的资源必须已经到位了,比如显卡 GPS之类的必须已经就位了,然后CPU开始执行,这里除了CPU以外所有的资源就构成了这个程序(任务)的执行环境,也就是我们定义的 程序上下文,当这个程序执行完了,或者分配给他的CPU 执行时间用完了,那他就要被切换出去,等待下一次CPU的临幸,在被切换出去的最后一步工作及时保存程序上下文,因为这个是下次它被CPU临幸的运行环境,必须保存。

2.3

      把上面所讲的串联在一起就是: 先加载A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的上下文,然后开始执行B,保存B的上下文。。。。。。。

2.4

      以上就是线程和进程的背景,进程和线程只不过是对应的CPU时间段的描述,
      进程就是包换上下文切换的程序执行时间总和 : CPU加载上下文 + CPU执行 + CPU保存上下文

2.5:线程的说明 :

      在进程的时间中,每次都要有 上下文的调入,保存,调出,如果我们把进程比喻为一个运行在电脑上面的软件,那么这个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A(任务A)实际分成了 a,b,c等多个小块组合,深入一点情况可能就是这样: 程序A得到CPU CPU加载上下文,开始执行程序A 的a小段,然后执行b小段,再执行c小段,最后保存程序A的上下文。也就是说,这里a,b,c的执行是共享了A的上下文(环境)CPU在执行的时候没有进行上下文的切。这里的a,b,c就是线程,也就是说线程共享了进程的上下文环境,是更小的CPU时间段

2.6总结:

所以 进程和线程都是一个时间段的描述,是CPU的工作时间的描述,只不过时间段的大小不同,进程大于线程 
上下文是程序运行的环境 :寄存器 RAM 外设资源。。。

3 :Linux内核中 进程进程上下文,中断上下文,用户上下文,原子上下文 的理解

0 :

内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而用户态应用程序运行在用户空间,他们代表不同的级别,对系统资源有着不同的访问权限,内核模块运行在最高级别(内核态),这个级别下的所用操作都受系统信任,而应用程序运行在比较低级别的(用户态)。内核态和用户态都有自己的内存映射,即自己的地址空间。
        处理器总是处于以下状态中的一种:
        内核态:运行于进程上下文,内核态代表进程运行于内核空间
        内核态:运行于中断上下文,内核态代表硬件运行于内核空间
        用户态:运行于用户空间

1 :

进程上下文 : 所谓进程上下文,就是在一个进程在执行的时候,CPU的所有寄存器中的数值,进程的状态以及堆栈上的内容; 当内核需要切换到另一个进程的时候,它需要保存当前进程的所有状态,即保存当前进程的上下文。以便再次执行该进程的时候, 能够恢复切换是的状态,继续执行。
一个进程的上下文可以分为三个部分:用户级上下文,寄存器上下文,系统级上下文,
用户级上下文:正文,数据,用户堆栈以及共享存储区
寄存器上下文:通用寄存器,程序寄存器,处理器状态寄存器,栈指针
系统级上下文:进程控制块,内存管理信息,内核栈。。
当发生进程调度的时候,进行进程切换就是上下文切换,操作系统必须对上面全部信息进行切换,新调度的进程才能运行,进程山下文主要是异常处理程序和内核线程,内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做,例如系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态,所以在进程上下文中引用 current 是没有意义的

2 :中断上下文 :

硬件通过触发信号,想CPU发送中断信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理,所以此时的 “中断上下文” 就可以理解为硬件传递过来的参数 和内核需要保护的一些环境,主要是被中断进程的环境。内核进入中断上下文是因为中断信号而导致的中断处理或软中断而中断信号的发生是随机的,中断处理程序以及中断并不能实现预测发生中断时当前运行的是哪一个进程,所以在中断上下文中引用 current 是可以的,但是没有意义。 

3 :进程上下文 与 中断上下文

        内核态可以处于两种上下文 : 进程上下文,中断上下文
        内核会限制 中断上下文,不允许有如下操作:
3.1 :进入睡眠状态或者主动放弃CPU :
            由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时 current 指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒,所以也叫 原子上下文      
            中断上下文执行流程 :1进入中断处理程序-->2保存关键上下文-->3开中断-->4进入中断处理程序的handler-->5关中断-->6中断处理完成-->7开中断

            上半部 硬中断:对应于上面流程的1、2、3步骤,在上半部硬中断中,所有的中断都是被屏蔽的如果在这个时候睡眠了,操作系统不会收到任何中断(包括时钟中断),系统就基本处于谈话状态下半部 软中断:对应上面流程的 4步骤,此时不能睡眠是因为上下文,操作系统是以进程调度为单位,进程的运行在进程的上下文中,进程运行在进程上下文中,以进程描述符作为管理的数据结构,进程可以睡眠的原意是操作系统可以切换不同的进程上下文,进行调度操作,这些操作都是以进程描述符为支持。中断运行在中断上下文,没有所谓的 中断描述符来描述它,它不是操作系统调度的单位,一旦在中断上下文中睡眠,首先是无法切换上下文(因为没有中断描述符,当前上下文状态得不到保存),其次,没有人来唤醒他,因为他不是操作系统的调度单位。最后,中断的发生是非常频繁的,在一个中断睡眠期间,其他中断发生并且睡眠了,很容易造成中断栈溢出呆滞系统崩溃;

             如果上述条件满足了(也就是有中断描述符,并成为调度器的调度单位,栈也不溢出了,理论上是可以做到中断睡眠的),中断是可以睡眠的,但会引起很多问题. 例如,你在时钟中断中睡眠了,那操作系统的时钟就乱了,调度器也失去了依据;例如,你在一个IPI(处理器间中断)中,其它CPU都在死循环等你答复,你确睡眠了,那其它处理器也不工作了; 例如,你在一个DMA中断中睡眠了,上面的进程还在同步的等待I/O的完成,性能就大大降低了……还可以举出很多例子。所以,中断是一种紧急事务,需要操作系统立即处理,不是不能做到睡眠,是它没有理由睡眠。
3.2 :占用互斥体:
在占用互斥锁的时候如果获取不到信号量,代码就会睡眠,产生和上面一样的结果,如果必须使用锁,那就用 spinlock
3.3 : 执行耗时的任务:
中断处理应该尽可能快,因为内核要响应大量的服务和请求,中断上下文占用的CPU时间太长会严重的影响系统功能,在中断处理例程中 执行耗时任务时,应该交由中断处理机制的底半部来处理;
3.4 :访问用户空间虚拟内存:
因为中断上下文是特定进程无关的,它是内核代表硬件运行在内和空间,所以在中断上下文文法访问用户空间的虚拟地址;

4 :原子上下文

内核的一个基本原则是:在中断或者 原子上下文中,内核不能访问 用户空间,而且内核不能睡眠,也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数,一般来说 原子上下文指的是 在中断或者软中断之,以及在自旋锁的时候,原子上下文 有时候可以看成 中断上下文    

猜你喜欢

转载自blog.csdn.net/linuxarmbiggod/article/details/79195138
今日推荐