进程
处于执行期的程序以及相关资源的总称。
处于执行期的程序但不局限于一段执行的代码,还包含其他资源,例如 打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间, 或多个执行线程,当然还包括存放全局变量的数据段
进程状态
- 运行 TASK_RUNNING
- 可中断 TASK_INTERRUPTIBLE
- 不可中断 TASK_UNINTERRUPTIBLE
- 被其他进程跟踪的进程 __TASK_TRACED
- 停止的进程 __TASK_STOPPED
线程
在进程中活动的对象,每个线程都拥有一个独立的程序计数器、进程栈、和一组进程寄存器。内核调度的对象是线程而不是进程。
Linux系统的线程实现非常特别:对线程和进程不特别区别对于Linux而言线程只不过是一种特殊的进程
每一个线程都拥有唯一隶属自己的task_struct
所以在内核中它看起来就像是一个普通的进程。
多进程。
多进程是在操作系统层面
进行并发的基本模式。同时也是开销最大的模式。
在Linux平台上,很多工具链正是采用这种模式在工作。比如某个Web服务器,它会有专门
的进程负责网络端口的监听和链接管理,还会有专门的进程负责事务和运算。这种方法
的好处
在于简单、进程间互不影响,坏处
在于系统开销大,因为所有的进程都是由内核管理的。
多线程。
多线程在大部分操作系统上都属于系统层面
的并发模式,也是我们使用最多的
最有效的一种模式。目前,我们所见的几乎所有工具链都会使用这种模式。
它比多进程的开销小很多,但是其开销依旧比较大,且在高并发模式下,效率会有影响。
基于回调的非阻塞/异步IO。
这种架构的诞生实际上来源于多线程模式的危机。在很多高并发服务器开发实践中,使用多线程模式会很快耗尽服务器的内存和CPU资源。 而这种模式通过事件驱动的方式使用异步IO,使服务器持续运转,且尽可能地少用线程,降 低开销,它目前在Node.js中得到了很好的实践。但是使用这种模式,编程比多线程要复 杂,因为它把流程做了分割,对于问题本身的反应不够自然。
协程。
协程(Coroutine)本质上是一种用户态线程,不需要操作系统来进行抢占式调度,
且在真正的实现中寄存于线程中
,因此,系统开销极小,可以有效提高线程的任务并发
性,而避免多线程的缺点。使用协程的优点是编程简单,结构清晰;缺点是需要语言的
支持,如果不支持,则需要用户在程序中自行实现调度器。目前,原生支持协程的语言还很少。