0x302 进程或进程的阻塞和运行
本质:进程的状态信息在进程可运行队列可等待队列中切换
Linux内核将一个线程当做进程进行调度。内核维护了一个可运行的进程队列,所有处于TASK_RUNNING状态中的进程都会被放入可运行队列。这个队列的本质是使用双向链表将task_struct链接起来,排队使用CPU时间片,使用完时间片后重新等待调度。
所谓调度就是从可运行进程列表中获取一个进程,在从CPU列表中获取一个空闲CPU,将进程的上下文加载到CPU的寄存器中,然后CPU执行程序计数器指定的下一个命令/语句。

而阻塞的本质就是将进程的task_struct移出可运行队列,然后将进程的状态置为TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE ,冲洗触发一次CPU调度,让出CPU。
那么线程如何唤醒呢?现成在加入等待队列的同时向内核注册了一个回调函数,告诉内核我在等待Socket上的数据,如果数据到了就唤醒我。这样当网卡接收到数据时,产生了硬件中断,内核处理硬件中断通过调用回调函数唤醒用户线程。唤醒的过程就是将进程的状态置为TASK_RUNNING,然后将task_struct移动到可运行队列中等待调度。
当read函数调用返回后,CPU又从哪内核态切换到用户态,开始执行下一行代码并且能从用户缓冲区中读取到数据了。
是先将数据从内核空间拷贝到用户空间在唤醒用户进程,还是先唤醒用户进程在将数据从内核空间拷贝到用户空间?
通常是先从内核空间拷贝数据到用户空间,然后再唤醒用户进程。这样做的好处是,当用户进程被唤醒时,它可以直接访问所需的数据,而不需要再次等待数据的传输。这样可以提高系统的效率。
为什么可运行队列使用双向链表?
- 高效操作(查询,新增或删除):能够快速的找到下一个要运行的线程。能够允许从任何位置快速插入和删除节点。
- 双向遍历:有些调度方式需要支持从两侧遍历链表。
- 方便快速调整位置:在优先级调度的算法下,使用双向链表可以快速调整进程的位置。
可以同时处理多少个硬件中断?硬件中断处理器是使用的事件编程模型吗?硬件中断处理器是一个操作系统内核级的进程吗?
- 可同时处理的硬件中断数量取决于处理器的设计和中断控制器的能力。
- 硬件中断处理器通常使用事件编程模型。
- 它是操作系统内核的一部分,负责响应和处理硬件设备发出的中断信号。
可同时处理的中断数量
可同时处理的硬件中断数量主要由处理器的中断控制器决定。中断控制器能够将来自不同硬件设备的信号路由到CPU,并根据中断的优先级和状态决定是否立即处理中断。例如,某些中断可能是不可屏蔽的,意味着一旦检测到中断信号,CPU就必须立即响应45。
在多核处理器中,每个核心都可以独立处理中断,从而增加了同时处理中断的能力。此外,通过中断分组的策略,可以将多个中断源映射到少数几个中断线上,进一步优化中断处理能力 7。
硬件中断处理器的工作原理
硬件中断处理器的工作基于中断描述符表(IDT)。IDT中包含了中断向量(Interrupt Vector)和相应中断处理程序的地址。当发生中断时,CPU会使用中断向量在IDT中查找中断处理程序,并跳转执行中断服务例程(ISR)3 4。
中断处理程序和中断服务例程的概念及其关系
中断处理程序
中断处理程序(Interrupt Handler)是指当系统检测到中断信号时,由操作系统内核调用的一组处理程序。这些处理程序负责响应和处理各种中断事件,如外部设备请求、软件异常等。中断处理程序通常包含两个主要部分:上半部和下半部。上半部负责立即执行的关键任务,如对中断进行应答或复位硬件,而下半部则负责较长时期的工作,这部分工作可能在适当的时候被中断执行27。
中断服务例程
中断服务例程(Interrupt Service Routine, ISR)是指当发生中断时,由中断处理程序调用的一系列程序段。这些例程用于处理特定类型的中断,执行中断所对应的详细处理操作。例如,一个中断服务例程可能负责读取输入设备的信息,另一个则负责向输出设备发送数据。中断服务例程的执行必须在尽可能短的时间内完成,以减少对系统正常运行的干扰145。
中断处理程序与中断服务例程的区别与关系
中断处理程序和中断服务例程虽然密切相关,但它们在概念上是有区分的。中断处理程序是对中断信号的整体响应,而中断服务例程则是中断处理程序内部的详细实施部分。一个中断处理程序可以包含多个中断服务例程,它们共同完成对某一中断的全套处理流程。中断处理程序负责中断的登记、响应和解除,而中断服务例程则负责中断事件的具体执行和处理39。