全方位剖析 Linux 操作系统,太全了( 四 )


上面的设备驱动程序中,每个设备类型的内核代码都不同 。字符设备有两种使用方式,有一键式的比如 vi 或者 emacs,需要每一个键盘输入 。其他的比如 shell,是需要输入一行按回车键将字符串发送给程序进行编辑 。
网络软件通常是模块化的,由不同的设备和协议来支持 。大多数 Linux 系统在内核中包含一个完整的硬件路由器的功能,但是这个不能和外部路由器相比,路由器上面是协议栈,包括 TCP/IP 协议,协议栈上面是 socket 接口,socket 负责与外部进行通信,充当了门的作用 。
磁盘驱动上面是 I/O 调度器,它负责排序和分配磁盘读写操作,以尽可能减少磁头的无用移动 。

  • I/O 右边的是内存部件,程序被装载进内存,由 CPU 执行,这里会涉及到虚拟内存的部件,页面的换入和换出是如何进行的,坏页面的替换和经常使用的页面会进行缓存 。
  • 进程模块负责进程的创建和终止、进程的调度、Linux 把进程和线程看作是可运行的实体,并使用统一的调度策略来进行调度 。
在内核最顶层的是系统调用接口,所有的系统调用都是经过这里,系统调用会触发一个 trap,将系统从用户态转换为内核态,然后将控制权移交给上面的内核部件 。
Linux 进程和线程下面我们就深入理解一下 Linux 内核来理解 Linux 的基本概念之进程和线程 。系统调用是操作系统本身的接口,它对于创建进程和线程,内存分配,共享文件和 I/O 来说都很重要 。
我们将从各个版本的共性出发来进行探讨 。
基本概念每个进程都会运行一段独立的程序,并且在初始化的时候拥有一个独立的控制线程 。换句话说,每个进程都会有一个自己的程序计数器,这个程序计数器用来记录下一个需要被执行的指令 。Linux 允许进程在运行时创建额外的线程 。
全方位剖析 Linux 操作系统,太全了

文章插图
 
Linux 是一个多道程序设计系统,因此系统中存在彼此相互独立的进程同时运行 。此外,每个用户都会同时有几个活动的进程 。因为如果是一个大型系统,可能有数百上千的进程在同时运行 。
在某些用户空间中,即使用户退出登录,仍然会有一些后台进程在运行,这些进程被称为 守护进程(daemon) 。
Linux 中有一种特殊的守护进程被称为 计划守护进程(Cron daemon) ,计划守护进程可以每分钟醒来一次检查是否有工作要做,做完会继续回到睡眠状态等待下一次唤醒 。
全方位剖析 Linux 操作系统,太全了

文章插图
 
Cron 是一个守护程序,可以做任何你想做的事情,比如说你可以定期进行系统维护、定期进行系统备份等 。在其他操作系统上也有类似的程序,比如 Mac OS X 上 Cron 守护程序被称为 launchd 的守护进程 。在 Windows 上可以被称为 计划任务(Task Scheduler) 。
在 Linux 系统中,进程通过非常简单的方式来创建,fork 系统调用会创建一个源进程的拷贝(副本) 。调用 fork 函数的进程被称为 父进程(parent process),使用 fork 函数创建出来的进程被称为 子进程(child process) 。父进程和子进程都有自己的内存映像 。如果在子进程创建出来后,父进程修改了一些变量等,那么子进程是看不到这些变化的,也就是 fork 后,父进程和子进程相互独立 。
虽然父进程和子进程保持相互独立,但是它们却能够共享相同的文件,如果在 fork 之前,父进程已经打开了某个文件,那么 fork 后,父进程和子进程仍然共享这个打开的文件 。对共享文件的修改会对父进程和子进程同时可见 。
那么该如何区分父进程和子进程呢?子进程只是父进程的拷贝,所以它们几乎所有的情况都一样,包括内存映像、变量、寄存器等 。区分的关键在于 fork 函数调用后的返回值,如果 fork 后返回一个非零值,这个非零值即是子进程的 进程标识符(Process Identiier, PID),而会给子进程返回一个零值,可以用下面代码来进行表示
pid = fork();// 调用 fork 函数创建进程if(pid < 0){error()// pid < 0,创建失败}else if(pid > 0){parent_handle() // 父进程代码}else {child_handle()// 子进程代码}父进程在 fork 后会得到子进程的 PID,这个 PID 即能代表这个子进程的唯一标识符也就是 PID 。如果子进程想要知道自己的 PID,可以调用 getpid 方法 。当子进程结束运行时,父进程会得到子进程的 PID,因为一个进程会 fork 很多子进程,子进程也会 fork 子进程,所以 PID 是非常重要的 。我们把第一次调用 fork 后的进程称为 原始进程,一个原始进程可以生成一颗继承树


推荐阅读