进程是程序执行时的一个实例。在过去,一个进程在地址空间中执行一个单独的指令序列。现在的Linux允许在相同的地址空间执行多个指令序列。地址空间是指允许进程引用的内存地址集合。
目前的Linux系统是一个多用户系统,在这个执行环境里,若干个进程并发活动,竞相争夺系统资源(CPU,内存等)。允许多个进程并发活动的系统被称为多道程序系统,也叫多处理系统。
很多人分不清进程与程序的区别:几个进程能并发地执行同一程序,而同一个进程能够顺序地执行几个程序。在单CPU的计算机上, 同一时刻只能执行一个指令序列。如果是多个CPU的,那么同一时刻也只能有有限个指令序列在同时被执行。
在Linux内核有一个调度程序,它能够决定哪个进程能够执行。在多用户系统中的进程,如Linux的,它必须是可抢占的。Linux系统会记录下每个进程占用CPU的时间,并周期性地激活调度程序。这样就可以在有限的CPU的资源下,执行更多的进程。
Unix也是一个抢占式的多用户系统,在没有用户登录时,也会有好几个系统进程在执行。主要是用于监视。比如,当有用户输入用户名时,对应的监听进程就会运行一个程序来验证用户的输入。如被证实,就会再创建一个进程来执行shell程序。如果是一个图形界面被激活,那么就一相应的进程来执行窗口管理器,每一个窗口通常都会有一个单独的进程来执行。对于每一个输入的命令,shell进程都会创建相应程序的另一个进程。这就是一个典型的多个进程可以执行同一个程序的例子。
Linux中的进程发出系统调用,硬件就会把特权械从用户态转入内核态,内核开始代替用户进程去与硬件打交道,或完成一些需要在内核中完成的工作,完成后迫使硬件从内核态回到用户态,最后进程从系统调用的下一条指令开始继续执行。在这个进程调用系统调用到返回的过程中,Linux系统会在进程执行的上下文中发挥作用。
Linux是单块结构,就是所谓的大内核,它的每一个内核层都被集成到内核程序中,并代表当前进程在内核态下运行。
微内核与大内核是相对的。微内核只在内核中存在少量的函数集:调度程序、进程间通信机制等很小一部分。诸如内存分配程序、设备驱动程序、系统调用处理程序都是运行在微内核之上的几系统进程。因为不同层次之间的消息传递需要一定的代价,所以微内核一般比大内核的效率要低。
微内核操作系统的每一层都是一个相对独立的程序,这就迫使程序员必须采用模块化的方法。这必要求程序员必须定义好软件的接口与其他层之间的交互。
在微内核的操作系统中,与硬件相关的部分会被写进内核中,因此微内核很容易就可以移植到其他体系结构上。大内核的代码会在开机后常驻内存,而微内核可以把那些暂时不需要执行的系统进程调出内存或撤销。所以微内核比大内核更加充分利用了内存。
Linux系统也吸收了微内核模块化的优点,所以它提供了模块,这是一个目标文件,它的代码可以在运行时链接到内核或从内核上解除链接。这个目标文件通常由一组函数组成,用于实现文件系统、驱动程序或其他的内核功能。