[资料分享] 奔跑吧Linux内核+进程调度原语和创建终止

meiyao   2024-4-1 20:14 楼主

进程调度是操作系统中的一项核心功能,负责在单核或多核处理器系统中,根据一定的策略选择进程以执行。在单核系统中,由于同一时刻只能有一个进程使用处理器,因此进程调度变得尤为重要。当一个进程因等待I/O操作、资源分配或其他原因而处于阻塞状态时,调度器会选择另一个就绪的进程来执行,从而提高处理器的利用率。

Linux系统作为一个通用操作系统,需要处理多种类型的进程,每种进程都有其特定的行为特征。交互式进程注重用户体验,要求系统响应时间短,例如文本编辑器、浏览器等。批处理进程则注重吞吐量,可以长时间运行并占用大量系统资源,如编译任务、数据库查询等。实时进程对时间要求非常严格,必须在规定的时间内完成,如音视频处理、工业控制等。

从处理器的角度看,进程可以分为CPU消耗型和I/O消耗型。CPU消耗型进程需要长时间占用处理器进行计算,如科学计算、图像渲染等。I/O消耗型进程则大部分时间用于等待I/O操作完成,如网络请求、文件读写等。调度器需要根据系统负载和进程类型,合理地分配处理器资源,以平衡系统吞吐率和响应性。

Linux内核的调度器采用了多种策略和技术来优化系统性能。例如,它会根据进程的优先级、I/O行为、运行时间等因素来选择合适的进程执行。此外,调度器还会利用处理器缓存、任务队列等机制来减少上下文切换的开销,提高系统的整体性能。

 

image.png

 

在POSIX标准中,进程创建和终止的操作系统层面的原语确实扮演着至关重要的角色。这些原语为操作系统提供了控制和管理进程生命周期的基础机制。

进程创建方面,fork()函数是一个核心原语,它用于创建一个与当前进程几乎完全相同的子进程。这个子进程会获得父进程的一份副本,包括父进程的代码、数据、堆、栈等内容。然而,需要注意的是,这些内容是写时复制的,也就是说,在子进程没有修改这些内容之前,它们实际上是指向父进程相同内容的指针。这样做的好处是可以提高创建进程的效率,因为不需要立即复制所有的内容。

execve()函数族则是用于在已经存在的进程中执行新的程序。当调用execve()时,当前进程的映像会被新的程序替换,然后新的程序开始执行。这样,虽然进程ID没有改变,但进程的内容已经完全不同了。

进程终止方面,wait()、waitpid()等函数用于父进程等待子进程的结束。这是非常重要的,因为当一个进程结束时,它的资源需要被操作系统回收。如果父进程不等待子进程结束,那么子进程就会变成一个僵尸进程,占用系统资源但不执行任何操作。另外,kill()函数可以用于向进程发送信号,以此来实现进程的强制终止。而exit()函数族则提供了进程正常结束的机制,它会返回一个状态码,供其他进程或操作系统了解进程的结束状态。

Linux操作系统为了提高效率,对POSIX标准的fork()原语进行了扩展,引入了vfork()和clone()两个原语。vfork()与fork()类似,但它创建子进程后并不复制父进程的地址空间,而是直接共享。这可以进一步提高效率,但也有一些限制和注意事项。clone()则提供了更细粒度的控制,可以创建具有不同属性或能力的子进程。

GCC是Linux下常用的编译器,它将源代码编译成ELF(可执行与可链接格式)文件。当我们在Shell中运行一个ELF文件时,Shell会创建一个新的进程来执行这个程序。这个过程涉及到fork()创建子进程和execve()执行新程序两个步骤。

在Linux内核中,这些进程创建和终止的原语都是通过系统调用来实现的,如sys_fork()、sys_exec()等。这些系统调用为内核提供了与用户空间程序交互的接口,使得用户空间的程序可以请求操作系统创建新进程、执行新程序或终止进程等操作。

image.png  

总结:

进程调度和进程创建与终止是操作系统中至关重要的功能,它们共同确保了系统能够高效地管理进程的生命周期和处理器资源。

进程调度是操作系统内核的核心功能之一,它负责在单核或多核处理器系统中根据一定的策略选择进程以执行。在单核系统中,由于同一时刻只能有一个进程使用处理器,进程调度变得尤为重要。调度器通过选择就绪的进程来执行,从而提高了处理器的利用率。Linux系统作为通用操作系统,需要处理多种类型的进程,包括交互式进程、批处理进程和实时进程等,每种进程都有其特定的行为特征。调度器需要根据系统负载和进程类型,合理地分配处理器资源,以平衡系统吞吐率和响应性。

进程创建和终止则是操作系统控制和管理进程生命周期的基础机制。在POSIX标准中,fork()函数用于创建子进程,execve()函数族用于在已存在的进程中执行新的程序。进程终止方面,wait()、waitpid()等函数用于父进程等待子进程的结束,以确保资源的正确回收。此外,kill()函数和exit()函数族分别提供了强制终止进程和正常结束进程的机制。Linux操作系统为了提高效率,对fork()原语进行了扩展,引入了vfork()和clone()等更高效的原语。

 

 

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复