如果我是正确的,则通过对内核的系统调用来处理访问设备。
CPU和内存也是设备。
- 当一个进程开始运行时,它是否通过对内核的系统调用来获取CPU和内存?
- 当一个进程与其他进程同时运行时,内核以交错的方式调度它们的运行。当进程将 cpu 和内存交给另一个进程以及重新获得它们时,该进程是否也会调用对内核的系统调用?
- 当一个进程完成运行时,它是否也会通过对内核的系统调用来释放CPU和内存?
答案1
它并没有那么多“获取”CPU,因为它只是在CPU上运行。内核决定进程运行哪个核心、何时运行以及运行多长时间。它调度任务,以便每个进程在 CPU 上获得其时间片:它运行一段时间,然后在时间片到期或发生系统调用后,上下文切换到另一个进程。程序的状态在切换之前存储,并在内核决定它值得另一段时间时恢复,因此它甚至不会注意到时间间隙。调度可能会有所不同 - 它可能有一个固定的计时器(通常是毫秒),或者可能是无滴答的......内核还根据进程的优先级(nice
)来管理调度。该进程可能会被锁定到特定的核心 ( taskset
)。对于多线程程序,线程独立获取它们的切片并且可以并发运行。内核可以完全挂起程序并在稍后恢复它(由 SIGSTOP 和 SIGCONT 触发)。
内存是虚拟化的。您在编程语言中看到的指针不是物理内存块,而是重新映射到物理层的虚拟地址。内核以页面(例如 4kB)为单位提供 RAM,甚至将它们稍微打乱(页面可能会交换到硬盘,并且只有在访问它时才会在 RAM 中恢复)。mmap
是将新页面映射到某个地址的一种方法(其中页面可能引用硬盘驱动器中映射到内存的文件)。但是,当您动态分配内存(malloc
和其他分配器)时,分配器要做什么取决于分配器。它通常调用sbrk
系统调用来为其内存池或mmap
更大的块请求更多空间 - 实现可能有所不同。
因此,总结一下:可以设置进程优先级和 CPU 亲和性,但调度程序负责程序运行的方式和时间,无需以任何方式与内核交互。内存以页面形式提供并通过系统调用请求。一旦分配了内存,您只需通过虚拟地址空间即可访问它,而无需内核的干预。
答案2
中央处理器
进程可以降低其 CPU 优先级(但不能降低它man 2 setpriority
)。此外,它可以让自己休眠一段时间。但它无法决定如何将其节省的CPU时间分配给其他进程。
对于线程的情况,请参阅 psusi 的评论。
记忆
新进程获得初始 RAM 量(不过,我不知道这是内核默认值还是二进制文件头数据中给出的值)。如果需要更多 RAM,则进程会向内核请求更多(请参阅 参考资料man 2 mmap
)。
与 CPU 时间一样,进程无法决定哪个进程释放一些内存后会获得更多内存。
进程退出
如果进程退出(无论是由其自己的决定还是被杀死),内核都会自动释放其资源。进程可以在退出之前释放其“全部”RAM,但没有理由这样做。相反,只是调用_exit
或exit_group
。