Linux课程总结
Linux精简系统概念模型:

Linux向应用程序提供系统调用接口,应用程序通过调用系统调用来请求Linux的服务。如上图所示,Linux提供的服务主要分为三个部分,分别是进程管理,文件系统,内存管理。本文主要讨论进程管理模块。
进程是程序的一次运行活动,系统中的应用程序必须形成一个进程才能得以执行。Linux中使用数据结构进程描述符task_struct来描述一个进程,task_struct中包含了很多的信息,包括进程打开的文件,和进程相关的设备,进程的堆栈,进程的状态等信息。
首先进程必须被创建才能得以执行,调用fork系统调用用来创建一个新进程,内存中形成了一个新的进程描述符,进程描述符中保存了进程的相关信息,在进程的运行过程中起着至关重要的作用,此时新进程的状态是就绪态,等待CPU的调度。
进程主要有三种状态,分别为就绪态,运行态,阻塞态,状态转换如下图所示:

进程调度就是要在这几种不同的状态中相互切换,让不同的进程得以被CPU执行。
Linux通过schedule函数实现进程调度,schedule函数把进程的就绪队列中通过进程调度算法选出来的进程切换到CPU上执行。
在进程调度的时机进行进程的调度,进程调度的时机包含以下两种:1.中断处理过程中,在适当的时机检测need_resched标志,决定是否调用schedule函数切换进程;2.内核线程主动调用schedule函数;
Linux把系统的进程主要分为两种,一种是实时进程,一种是普通进程,两种进程由于特性的不同,需要不同的调度算法进行调度。实时进程由于其实时性,使用的是先来先服务调度算法和时间片轮转调度算法,而普通进程使用的是完全公平调度算法,同时普通进程的优先级是低于实时进程的优先级,只有在就绪队列中没有实时进程,普通进程才能得以被调度。
进程切换主要包括从一个进程的地址空间切换到另一个进程的地址空间,以及从一个进程的内核堆栈切换到另一个进程的内核堆栈,还有进程的CPU上下文的切换。
一个程序从执行到结束大致需要经历以下几个过程:编译,汇编,链接,创建,调度,运行,结束。编译,汇编,链接等步骤由于语言特性的不同,运行效率各有不同。同样的程序用C和Java写出来的执行效率是不一样的。java是跨平台的,效率比一般的高级语言低,C语言几乎直接转换为机器语言,效率是比所有的高级语言都高。由于Linux把进程分为普通进程和实时进程,同时实时进程的优先级比普通进程要高,优先被调度,因此实时进程的执行效率要高于普通进程。进程调度在程序的执行的过程中会发生很多次,而进程调度非常消耗CPU资源,不利于程序的执行。因此最好是能够减少进程调度的次数,比如应用程序的需要阻塞的次数较少,不需要频繁的进行进程的切换,提高程序的运行效率。

浙公网安备 33010602011771号