https://blog.csdn.net/kuangsonghan/article/details/80674777
https://www.cnblogs.com/zhuzhu2016/p/5804875.html
https://www.cnblogs.com/zhehan54/p/6130030.html
实现并发的方式有多种:比如多进程、多线程、IO多路复用。
1 多进程
进程是资源(CPU、内存等)分配
的基本单位,就是一个个pid,它是程序执行时的一个实例
。程序运行时系统就会创建一个进程
,并为它分配资源,然后把该进程放入进程就绪队列
,进程调度器
选中它的时候就会为它分配CPU时间
,程序开始真正运行。
Linux系统函数fork()
可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来
,然后创建子进程让其去处理
,这样就能做到并发处理
。
2 多线程
线程是任务调度和执行
的最小单位,它是进程的一个执行流
,是CPU调度和分派
的基本单位,一个进程可以由很多个线程组成,线程间共享
进程的所有资源,每个线程有自己的堆栈和局部变量
。线程由CPU独立调度执行
,在多CPU环境下就允许多个线程同时
运行。同样多线程也可以实现并发操作
,每个请求分配一个线程来处理。
2.1 为什么会有线程?
每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接收大量不确定数量用户的并发请求
,为每一个请求都创建一个进程显然行不通(系统开销大
响应用户请求效率低
),因此操作系统中线程概念被引进。
线程的执行过程是线性的
,尽管中间会发生中断或者暂停,但是进程所拥有的资源只为该线状执行过程服务,一旦发生线程切换,这些资源需要被保护起来。
进程分为单线程进程
和多线程进程
,单线程进程只包含一个线程。多线程进程包含1个以上的线程。
线程的改变只代表CPU的执行过程的改变
,而没有发生进程所拥有的资源的变化。
3 优缺点
- 线程执行
开销小
,但是不利于资源的管理和保护
。线程适合在多CPU系统上运行
。 - 进程执行
开销大
,但是能够很好的进行资源管理和保护
。进程可以跨机器前移
。
4 何时使用多进程,何时使用多线程?
- 对资源的管理和保护要求高,不限制开销和效率时,
使用多进程
。 - 要求效率高,频繁切换时,资源的保护管理要求不是很高时,
使用多线程
。
5 二者区别
根本区别
:进程是资源分配
的最小单位,线程是CPU调度和分派
的最小单位。包含关系
:线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。地址空间
:同一进程的线程共享本进程的地址空间
,而进程之间则是独立的地址空间
。内存分配方面
:系统在运行的时候会为每个进程分配不同的内存空间
;而对线程而言,除了CPU外,系统不会为线程分配内存
(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
。在开销方面
:每个进程都有独立的代码和数据空间
(程序上下文),程序之间的切换会有较大的开销
;线程可以看做轻量级的进程,同一类线程共享代码和数据空间
,每个线程都有自己独立的运行栈和程序计数器
(PC),线程之间切换的开销小
。线程之间的通信更方便
,同一进程下的线程共享全局变量、静态变量
等数据,而进程之间的通信需要以通信的方式
(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。所处环境
:在操作系统
中能同时运行多个进程(程序
);而在同一个进程(程序)
中有多个线程同时执行(通过CPU调度
,在每个时间片
中只有一个线程执行)健壮性方面
:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。执行过程
:每个独立的进程程有一个程序运行的入口
,可以独立运行
。但是线程不能独立执行
,必须依存在应用程序中
,由应用程序提供多个线程执行控制。并发
:两者均可并发执行。