Linux之进程与线程

进程与线程

概念:

进程:进程是处于执行期的程序,通常还包含其他资源,如:打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,数据段等。它是资源分配的基本单位。

 

线程:线程是进程中的活动对象,每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。它是调度的基本单位,在Linux中线程也是一个轻量级的进程。

参考理解:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

区别:

  1. 资源分配:进程是资源分配的基本单位,线程是调度的基本单位。
  2. 进程与进程之间是独立的,一个进程异常终止不会影响其他进程;线程之间大部分资源是共享的,一个线程异常终止会影响其他线程并使其终止。
  3. 线程的上下文切换比进程上下文切换快
  4. 线程占用资源比进程小
  5. 线程大部分资源共享,但是也有自己的私有数据,如栈空间,错误码,上下文,线程ID等。
  6. 进程与进程之间是独立的,在并发过程中,用同步互斥少,相对安全,代码编写容易;线程之间大部分资源共享,所有需要加上同步互斥锁。
  7. 线程创建出来的线程是平等的,进程创建出来的进程就是该进程的子进程。

联系:

  1. 线程是活动在进程内部,一个进程可以有一个或多个线程。
  2. 一个线程结束,进程不一定会退出,而一个进程退出,线程也会退出。
  3. 进程中的资源给多个线程共享,包括虚拟内存和全局变量等。
  4. 当进程只有一个线程时,可以认为进程就是线程。

进程描述符:

一个进程中有三大块:进程控制块(PCB)、数据段、代码段。

当一个程序被加载到内存之后,内核会为他分配一个PCB,这里PCB就是task_struct结构,称之为“进程描述符”。

task_struct主要信息:

  1. 标识符:用来描述本进程的唯一标识符,区别其他进程。
  2. 状态:用来表示当前进程的状态,退出码,退出信号。
  3. 优先级:相对于其他进程之间的优先级。
  4. 程序计数器:用于记录程序的下一条指令的地址。
  5. 内存指针:其中有代码和数据相关的指针,还有共享内存块指针。
  6. 上下文:进程执行时寄存器中的数据。
  7. I/O状态:包括显示I/O请求,分配I/O设备和被进程使用的文件列表。
  8. 记账信息:其中包含各种时间。
  9. 其他

 

进程五种运行状态:

运行状态(TASK_RUNNING):是指正在使用CPU或者正在等待CPU的进程,就是常用top命令看到的,处于R状态(Runing或Runable)的进程。

可中断状态(TASK_INTERRUPTIBLE):进程正处于可中断等待状态(被阻塞),系统不会调度该进程进行执行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程收到一个信号,都可以唤醒进程转换到运行状态。

不可中断状态(TASK_UNINTERRUPTIBLE):除了就算是接收到信号也不会被唤醒或准备投入运行外,这个状态与可打断状态相同。这个状态通常在进程必须在等待时不受干扰或事件很快就会发生时出现。就是常用top命令看到,处于D状态(Disk Sleep)的进程,不可中断状态实际上是系统对进程和硬件设备的一种保护机制,比如说当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断所打断的。

暂停状态(TASK_STOPPED):进程停止执行;进程没有投入运行也不能投入运行。通常这种状态发生在接收SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号的时候。

僵死状态(TASK_ZOMBIE):当进程已停止运行,但其父进程还没有询问其状态时,则称该进程处于僵死状态。

Linux之进程与线程

进程上下文:

Linux按照特权等级,把进程的运行空间分为内核空间和用户空间,对应下图中,CPU特权等级的Ring0和Ring3.

Linux之进程与线程

内核空间(Ring0)具有最高特权,可以直接访问所有资源;

用户空间(Ring3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源。

那么,进程既可以在用户空间运行,又可以在内核空间运行。

进程在用户空间运行时,称为进程的用户态。

当进程陷入内核空间的生活,称为进程的内核态。

当用户态的进程执行了一个系统调用或触发了某个异常,它就会陷入内核空间,此时,就是处于进程上下文中。