何为进程?
进程是资源分配的基本单位。
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。
进程是拥有一个执行流,或多个执行流的线程组。
进程是一个能独立运行的基本单位,同时也是系统分配资源基本单位。(独立性)
进程是动态执行的程序。(动态性)
任何进程都可以同其他进程一起并发执行。(并发性)
进程间的相互制约,进程具有执行的间断性,进程按照各自独立不可预知的速度向前推进。(异步性)
何为线程?
线程是独立调度的基本单位。
一个进程中可以有一个或多个线程,它们共享进程资源。
Linux下线程用进程PCB模拟描述,也叫轻量级进程。
线程是进程内部的一个执行流,也就是线程在进程的地址空间内运行。
线程是CPU调度的基本单位(CPU调度是按照PCB进行调度的)(程序执行的最小单位)
创建或销毁一个线程相较创建或销毁一个进程成本要低(创建进程要创建PCB、虚拟地址空间、创建页表、维护映射、把硬盘的代码数据加载到内存、文件描述符等等,而创建线程只需要一个PCB指向进程的虚拟地址空间即可,同样销毁一个线程只需要销毁PCB即可)
线程间的切换相比于进程间的切换容易的多(进程间的切换:PCB切换,页表切换等等,线程切换:PCB切换,页表不切换)
QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。
共同点
功能上都是用于实现多任务并发程序设计的技术手段,线程的状态包括就绪、执行与阻塞,与进程类似。
从系统实现的角度看,进程实体和线程实体在Linux内核中都是有task_struct实现的,两者的创建最终都是调用系统函数clone()。
进程和线程的区别
1 目的
进程是资源分配的基本单位,线程是系统调度的基本单位,进程维护资源,线程是真正的执行体。
2 定义
进程是一个用户程序在同一数据集合上的一次执行过程,而在不同数据集合上或者同一数据集合的不同运行都是不同的进程。
线程是进程上的一个实体,是系统调度的基本单位。
3 所属关系
线程只能属于一个进程,而进程可以创建多个线程,且最少创建一个主线程。
4 拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
5 调度情况
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
6 系统开销
线程开销小于进程开销,切换效率高于进程。
由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置。而线程切换时只需保存和设置少量寄存器内容,开销很小。
进程需要独立的数据段,代码段、扩展段等系统资源,创建时需要复制(写时复制)父进程的所有资源。而线程与其它线程共享进程的系统资源,每个线程只需要拥有自己的栈段和寄存器,用于存储局部变量和临时变量。但进程因为有独立的数据段、堆栈段,所以更加稳定、安全。
7 通信机制
线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。(Inter-Process Communication)
进程间相互独立,互不打扰。因此通信方式较为复杂,包括Pipe(管道),Signal(信号),Semaphore(信号量),Message(消息队列),SharedMemory(共享内存), Socket(套接字),文件。(PIC包括Semaphore,Message, SharedMemory)
而线程之间由于共享进程数据段,所以通过全局变量来实现通信,当然访问时需要加锁。
8 控制权
线程可以销毁,挂起、恢复其它线程,也可以通过销毁主线程来销毁进程,而进程没有权利控制其父(子)进程的状态。子线程终止不会引起其它线程或者进程的终止,但进程(主线程)的终止能够引起所有子线程的终止,同时任何一个子线程执行exit()会引起进程中的全部线程同时灭亡。
9 linux系统内核实现
无论进程创建使用的fork()函数,还是线程创建使用的pthread_create()函数最终都是调用系统函数clone(),只是通过传入不同的flag来设置是否共享父进程的资源。
进程和程序的区别?
程序是指令的有序集合,而进程是动态执行的程序(把程序加载到内存中,用PCB描述,被调度,被执行,有生命周期)--程序静态的,进程动态的
程序可以作为一种软件资料长期保存,而进程是有生命周期的。--程序可以一直被保存,无生命周期,进程是有生命周期的
优点
线程
线程共享进程的地址空间,因此线程间通信比较容易(但是不安全要注意维护),而进程间通信就相比较困难了,因为两个进程看到同一块资源不容易 ------------节约资源,成本低,调度切换快
创建销毁成本低
线程间切换容易
等待慢速I/O的同时,可以干其他事情
进程
更强的容错性,安全,一个进程挂了,不影响其他.
多进程比多线程编写,调试容易。
线程应用场景
等待慢速I/O时,交给一个线程等待,接着做其他事情
通信,比较容易(注意加锁)
进程的应用场景
需要安全稳定时用进程,需要速度时用进程,既要速度又要安全。
有的书上说,能用多进程解决的尽量不要用多线程
参考文献
[1] 进程和线程的区别,以及应用场景
[2] 进程和线程的区别与联系
[3] CS-Notes: 进程与线程