Linux 64。 英特尔酷睿2双核处理器。
Linux内核"通信"用cpu? 我阅读了调度程序的源代码,但无法理解它们之间的如何以及内核如何告诉cpu需要处理的内容。
我知道有运行队列,但有没有什么能让内核通过总线中断cpu?
它稍微扩展了我的初步问题:我们怎样才能告诉cpu 哪里任务队列?
因为cpu必须轮询某些内容,我想我们会在某些时候告诉它。错过了内核代码中的那一点。
答案 0 :(得分:2)
我会尝试写一个简单的解释,告诉我有什么不清楚。
CPU只做一件事:执行指令。它将从预定义的地址开始,然后执行。这就是全部。有时你可以有一个中断,这会暂时使CPU跳转到另一条指令。
内核是一个程序(=一系列指令),可以很容易地执行其他程序。内核将完成他的业务以设置它所需的内容。这通常包括构建要运行的进程列表。 "过程"的定义完全取决于内核,因为如你所知,CPU只做一件事。
现在,当内核运行(由CPU执行)时,它可能决定需要执行一个进程。为此,内核将简单地跳转到流程程序。它是如何完成的并不重要,但在大多数操作系统中,内核会将周期性中断(CPU将周期性地跳转)映射到一个函数,该函数决定执行哪个进程并跳转到它。这不是必需的,但它很方便,因为程序会被强行“打断”#34;定期,以便其他人也可以被执行。
总之,CPU并不知道"任何东西。内核运行,并将跳转到其他进程代码以使其运行。只有内核"才知道"。答案 1 :(得分:1)
Linux内核是一个程序。它没有"谈话"这样的CPU; CPU有一个特殊的寄存器program counter(PC),它指向CPU正在处理的内核的当前执行。
内核本身包含许多服务。其中一个管理任务队列。任务队列中的每个条目都包含有关任务的信息。其中一个信息是运行任务的CPU核心。当内核决定服务应该做一些工作时,它会调用它的功能。这些函数由CPU解释的instructions组成。它们中的大多数都会改变CPU的状态(如推进PC,更改寄存器值,设置标志,启用/禁用CPU核心......)。
这意味着CPU不会轮询任何内容。根据调度程序,使用不同的策略来处理任务队列。最简单的一个是基于定时器的:内核安装一个定时器中断(即它在某处写入中断处理程序的地址加上它配置定时器以每隔几毫秒产生一次中断)。
然后,处理程序查看任务队列并根据其策略决定要执行的操作。