只是简单的描述了一下Linux基本概念,通过几个例子来说明Linux基本应用程序,然后以Linux基本内核构造来结尾。那么本篇文章我们就深入理解一下Linux内核来理解Linux的基本概念之进程和线程。系统调用是操作系统本身的接口,它对于创建进程和线程,内存分配,共享文件和I/O来说都很重要。
我们将从各个版本的共性出发来进行探讨。
基本概念Linux一个非常重要的概念就是进程,Linux进程和我们在
写给大忙人看的进程和线程
中探讨的进程模型非常相似。每个进程都会运行一段独立的程序,并且在初始化的时候拥有一个独立的控制线程。换句话说,每个进程都会有一个自己的程序计数器,这个程序计数器用来记录下一个需要被执行的指令。Linux允许进程在运行时创建额外的线程。
Linux是一个多道程序设计系统,因此系统中存在彼此相互独立的进程同时运行。此外,每个用户都会同时有几个活动的进程。因为如果是一个大型系统,可能有数百上千的进程在同时运行。
在某些用户空间中,即使用户退出登录,仍然会有一些后台进程在运行,这些进程被称为守护进程(daemon)。
Linux中有一种特殊的守护进程被称为计划守护进程(Crondaemon),计划守护进程可以每分钟醒来一次检查是否有工作要做,做完会继续回到睡眠状态等待下一次唤醒。
“Cron是一个守护程序,可以做任何你想做的事情,比如说你可以定期进行系统维护、定期进行系统备份等。在其他操作系统上也有类似的程序,比如MacOSX上Cron守护程序被称为launchd的守护进程。在Windows上可以被称为计划任务(TaskScheduler)。
在Linux系统中,进程通过非常简单的方式来创建,fork系统调用会创建一个源进程的拷贝(副本)。调用fork函数的进程被称为父进程(parentprocess),使用fork函数创建出来的进程被称为子进程(childprocess)。父进程和子进程都有自己的内存映像。如果在子进程创建出来后,父进程修改了一些变量等,那么子进程是看不到这些变化的,也就是fork后,父进程和子进程相互独立。
虽然父进程和子进程保持相互独立,但是它们却能够共享相同的文件,如果在fork之前,父进程已经打开了某个文件,那么fork后,父进程和子进程仍然共享这个打开的文件。对共享文件的修改会对父进程和子进程同时可见。
那么该如何区分父进程和子进程呢?子进程只是父进程的拷贝,所以它们几乎所有的情况都一样,包括内存映像、变量、寄存器等。区分的关键在于fork函数调用后的返回值,如果fork后返回一个非零值,这个非零值即是子进程的进程标识符(ProcessIdentiier,PID),而会给子进程返回一个零值,可以用下面代码来进行表示
pid=fork();//调用fork函数创建进程if(pid0){error()//pid0,创建失败}elseif(pid0){parent_handle()//父进程代码}else{child_handle()//子进程代码}
父进程在fork后会得到子进程的PID,这个PID即能代表这个子进程的唯一标识符也就是PID。如果子进程想要知道自己的PID,可以调用getpid方法。当子进程结束运行时,父进程会得到子进程的PID,因为一个进程会fork很多子进程,子进程也会fork子进程,所以PID是非常重要的。我们把第一次调用fork后的进程称为原始进程,一个原始进程可以生成一颗继承树
Linux进程间通信Linux进程间的通信机制通常被称为Internel-Process