简而言之,进程是正在执行的程序实例。执行程序时,内核会将程序代码载入虚拟内存,为程序变量分配空间,建立内核记账(bookkeeping)数据结构,以记录与进程有关的各种信息(比如,进程id,用户id,组id以及终止状态等)
在内核看来,进程是一个个实体,内核必须在它们之间共享各种计算机资源。对于像内存这样的受限资源来说,内核一开始会为进程分配一定数量的资源,并在进程的生命周期内,统筹该进程和整个系统对资源的需求,对这已分配进行调整。程序终止时,内核会释放所有此类资源,供其他进程重新使用。其他资源(如CPU,网络带宽等)都属于可再生资源,但必须在所有进程间平等共享。
进程的内存布局:逻辑上将一个进程划分为以下几部分 也称为段
文本:程序的指令
数据:程序使用的静态变量
推:程序可从该区域动态分配额外内存
栈:随函数调用,返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间
内存映射:是调用系统函数mmap()的进程,会在其虚拟地址空间中创建一个新的内存映射
线程 :在现代UNIX实现中,每个进程都可执行多个线程。可将线程想象为共享同一虚拟内存及一干其他属性的进程。每个线程都会执行相同的程序代码,共享同一数据区域和栈。可是,每个线程都拥有属于自己的栈,用来装载本地变量和函数调用链接信息。
线程之间可通过共享的全局变量进行通信。借助于线程API所提供的条件变量和互斥机制,进程所属的线程之间得以相互通信并同步行为---尤其是在对共享变量的使用方面。此外利用 IPC 和同步机制,线程间也能彼此通信。
线程的主要优点在于协同线程之间的数据共享(通过全局变量) 更为容易,多线程应用能从多处理器硬件的并行处理中获益匪浅。
会话:指的是一组进程(任务)。会话中的所有进程都具有的会话标识符。会话首进程是指创建会话的进程,其进程ID会成为会话ID。
通常,会话都会与某个控制终端相关。控制终端建立于会话首进程初次打开终端设备之时。对于由交互式shell所创建的会话,这恰恰是用户的登录终端。一个终端至多只能成为一个会话的控制终端。
打开控制终端会致使会话首进程成为终端的控制进程。一旦断开了与终端的连接(比如关闭了终端窗口),控制进程将会收到SIGHUP信号。在任一时点,会话中总有一个前台进程组(前台任务),可以从终端中读取输入,向终端发送输出。如果用户在控制终端中输入了 中断 通常是ctr +c 或挂起 字符通常是ctr +z ,那么终端驱动程序会发送信号以终止或挂起 亦停亦止 前台进程组。一个会话可以拥有任意数量的后台进程组(后台任务),由以 & 字符结尾的行命令来创建。 支持任务控制的shell 提供如下命令:列出所有任务,向任务发送信号,以及在前后台任务之间来回切换。
伪终端 :是一对相互连接的虚拟设备,也称为主从设备。在这对设备之间,设有一条IPC信道,可供数据进行双向传递。从设备所提供的接口,其行为方式与终端相类似,基于这一特点,可以将某个为终端编写的程序与从设备连接起来,然后,再利用连接到主设备的另一程序来驱动这一 面向终端 的程序,这是伪终端的一个关键用途。由 驱动程序 所产生的输出,在经由终端驱动程序的常规输入处理(例如,默认情况下,会把回车符映射为换行符)
后,会作为输入传递给与从设备相连的面向终端的程序。而由面向终端的程序向从设备写入的任何数据又作为 驱动程序 的输入来传递(在执行完所有常规的终端输入处理后)。换句话说 驱动程序 所覆行的功能,在效果上等同于用户通常在传统终端上执行的操作。伪终端广泛应用于各种应用领域,最知名的要数telnet 和ssh之类提供网络登录服务的应用,以及X Window系统所提供的终端窗口实现。