进程&线程
Linux进程和线程
一个大型的应用系统,往往需要众多进程协作.进程是操作系统理论的核心与基础,许多概念都和进程相关.比较清楚地掌握进程相关的概念,对于深入学习Linux来说,尤为重要.
进程的标准定义是:可并发执行的程序在一个数据集合上的运行过程.换句话说,在自身的虚拟地址空间运行的一个单独的程序称做一个进程.在Linux系统中,当一个程序开始执行后,在开始执行到执行完毕退出的这段时间里,它在内存中的部份就被称做一个进程.进程与程序之间有区别的:程序只是一些预先设定好的代码和数据,进程是一个随时都可能发生变化的,动态的,使用系统运行资源的程序在内存的拷贝.程序静态的存在于外存,进程动态的存在于内存.一个程序可以启动多个进程.和进程联系在一起的不仅有进程的指令和数据,而且还有当前的指令指针,所有的CPU寄存器以及用来保存临时数据的堆栈等,所有这些都随着程序指令的执行动态的发生变化.
Linux系统包括三种不同类型的进程,每种类型的进程都有自己的特点和属性.
交互进程:由shell启动的进程.交互进程既可以在前台运行,也可以在后台运行.
批处理进程:这种进程和终端没有关系,是一个进程序列.
监控进程(也称守护进程)inux系统启动时启动的进程,并在后台运行;进程名后加字母d.
关于线程
和进程概念紧密相关的概念是线程.线程可以看成进程中指令的不同执行路线.例如,常见的字处理程序中,主线程处理用户输入,而其他并行运行线程在必要时可在后台保存用户的文档.与进程相关的基本要素有代码,数据,堆栈,文件I/O和虚拟内存信息等等,因此,系统对进程的处理需要花费更多的开支,尤其在进行进程调度时.利用线程则可通过共享这些基本要素而减轻系统开支,因此,线程也被称做”轻量级进程”.许多流行的多任务操作系统均支持线程.
线程有”用户线程”和”内核线程”之分.所谓用户线程是指不需要内核支持而在用户程序中实现的线程.这种线程甚至在像DOS这样的操作系统中也可以实现,但线程的调度需要用户程序完成,类似于Windows 3.X的协作式多任务.另外一种则需要内核的参与,由内核完成线程的调度.这两种模型各有其优缺点:用户线程不需要额外的内核开支,但是当一个线程因I/O而处于等待状态时,整个进程会被调度程序切换为等待状态,其他进程得不到运行的机会;而内核线程则没有这个限制,但却占用了更多的系统开支.
Linux支持内核空间的多线程.Linux的内核多线程和其***作系统的内核实现不同.大多数操作系统单独定义线程,从而增加了内核和调度程序的复杂性;而Linux则将线程定义为”执行上下文”,实际只是进程的另外一个执行上下文而已.这样,Linux内核只需区分进程,只需要一个进程/线程数组,而调度程序仍然是进程的调度程序.Linux的克隆(clone)系统调用可用来建立新的线程.
会话和进程组
在Linux系统中,父进程创建子进程,子进程可以再创建新进程,形成一定的层次,称为”进程组”.一个或多个进程可以合起来构成一个进程组(process group),一个或多个进程组可以合起了构成一个会话(session).这样,就有了对进程进行批量操作的能力,例如通过向某个进程组发送信号以实现向该组中的每个进程发送信号.
Linux内核通过维护会话和进程组而管理多用户进程.每个进程是一个进程组的成员,而每个进程组又是某个会话的成员.一般而言,当用户在某个终端上登录时,一个新的会话就开始了.进程组由组中的领头进程标识,领头进程的标识符就是进程组的标识符.类似地,每个会话又对应一个领头进程.
同一个会话中的进程通过该会话的领头进程和一个终端相连,该终端作为这个会话的控制终端.一个会话只能有一个控制终端,而一个控制终端只能控制一个会话.用户通过控制终端,可以向控制终端所控制的会话中的进程发送键盘信号.
同一个会话中只能有一个前台进程组.属于前台进程组的进程可以从控制终端获得输入,而其他进程均是后台进程,可能分属于不同的后台进程组.
搜索更多相关主题的帖子:
线程 amp 进程