我觉得LZ是在研究硬件上对于中断和任务调度的某些feature。或者在尝试自己写一个小内核。值得鼓励!鼓掌! 楼上讲的很有道理。不过,对于任务调度的时机,可能根据不同的操作系统内核设计理念就有不同的调度策略。在某些实时操作系统的早期版本里,因为内核完成的任务不同,可能只有少数几个任务在跑实时性要求非常高的活儿,对于调度的实时性要求很高,有可能会采用在中断处理中做任务切换。 当然,包括调度策略在内的很多操作系统理念,也有可能随硬件性能的大大提高而改变,而且也有可能受到了Linux和Windows的影响有所改变。比如很多实时操作系统早期根本就不对内存做页处理的,现在也都做了相应的支持。
[quote=引用 3 楼 Heaven_Redsky 的回复:] 我大概明白你的意思了。但是我觉得你对这件事的理解是不是有了偏差? 我说说我的理解哈。首先运行的是任务A,这时候,来了个中断,可能是引起任务调度的时钟中断哈。中断处理程序会怎么做呢? 1. 把A的上下文入栈,注意,这时候的栈是A的空间。 2. 进入内核栈里,把中断8259 reenable。并且在内核里选择下一个需要运行的任务B。 3. 离开内核栈,找到并把B的栈选择进来,并把任务B的上下文恢复。 4. 运行中断返回指令iretd 结束中断服务程序。 这时候,请注意,上下文完全是任务B的上下文了,而A的上下文在刚刚进入中断服务程序的时候就已经被保存并被切换走了。 不知道有没有回答你的问题?
我大概明白你的意思了。但是我觉得你对这件事的理解是不是有了偏差? 我说说我的理解哈。首先运行的是任务A,这时候,来了个中断,可能是引起任务调度的时钟中断哈。中断处理程序会怎么做呢? 1. 把A的上下文入栈,注意,这时候的栈是A的空间。 2. 进入内核栈里,把中断8259 reenable。并且在内核里选择下一个需要运行的任务B。 3. 离开内核栈,找到并把B的栈选择进来,并把任务B的上下文恢复。 4. 运行中断返回指令iretd 结束中断服务程序。 这时候,请注意,上下文完全是任务B的上下文了,而A的上下文在刚刚进入中断服务程序的时候就已经被保存并被切换走了。 不知道有没有回答你的问题?
怎么看起来 所谓B任务像是中断服务程序?
4,437
社区成员
17,460
社区内容
加载中
试试用AI创作助手写篇文章吧