一、进程与线程
进程是应用程序的基本执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成,进程在运行时创建的资源随着进程的终止而死亡。
线程是一个独立的执行流,是进程内部的一个独立的执行单元,一个或多个线程构成一个进程,一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源,但同时每个线程可以拥有自己的变量。
二、多线程与异步操作
多线程就是指一个进程中同时有多个线程正在执行。相比于多进程,多线程花销小切换快,同时线程间的通信更加方便,因此一般将耗时的操作置于一个新的线程。但是应当注意的是,线程间的共享变量可能会造成死锁。
异步操作的主要目的是让调用方法的主线程不需要同步等待调用函数,从而可以让主线程继续执行它下面的代码。因此异步操作无须额外的线程负担,使用回调的方式进行处理。在设计良好的情况下,处理函数可以不必或者减少使用共享变量,减少了死锁的可能。当需要执行I/O操作时,使用异步操作比使用线程+同步 I/O操作更合适。
异步和多线程并不是一个同等关系,异步是目的,多线程是实现异步的一个手段。实现异步可以采用多线程或交给另外的进程来处理。
三、并发与并行
多线程其实是实现并发(并行)的一种手段。
并发:在一个时间段内执行多个操作。
并行:是指两个或多个独立的操作同时进行。
在单核时代,多个线程是并发的,在一个时间段内轮流执行。CPU核心数和线程数并不是对应的,并不是单核CPU就只能执行一个线程。线程是操作系统模拟出来的概念,通过系统的调度算法实现“并行”运行,让这个线程跑一会,再让那个线程跑一会。
而在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,可以并行8个线程。
四、并发编程的方法
1.多进程并发
多进程并发是指将一个应用程序划分为多个独立的进程(每个进程只有一个线程),这些独立的进程间可以互相通信,共同完成任务。由于操作系统对进程提供了大量的保护机制,以避免一个进程修改了另一个进程的数据,使用多进程比多线程更容易写出安全的代码。但这也造就了多进程并发的两个缺点:
a.进程间的通信,无论是使用信号、套接字,还是文件、管道等方式,其使用要么比较复杂,要么速度较慢,或者两者兼而有之。
b.运行多个进程的开销很大,操作系统要分配很多的资源来对这些进程进行管理。
由于多个进程并发完成同一个任务时,不可避免的是:操作同一个数据和进程间的相互通信,上述的两个缺点也就决定了多进程的并发不是一个好的选择。
2.多线程并发
多线程并发是指在同一个进程中执行多个线程。线程是轻量级的进程,每个线程可以独立的运行不同的指令序列,但是线程不独立拥有资源,依赖于创建它的进程而存在。也就是说,同一进程中的多个线程共享相同的地址空间,可以访问进程中的大部分数据,指针和引用可以在线程间进行传递。这样,同一进程内的多个线程能够很方便的进行数据共享以及通信,也就比进程更适用于并发操作。由于缺少操作系统提供的保护机制,在多线程共享数据及通信时,就需要做更多工作以保证对共享数据段的操作是以预想的操作顺序进行的,并且要极力的避免死锁。
五、多线程与高并发
高并发是指系统运行过程中在短时间内遇到大量操作请求的情况,主要发生在web系统集中大量访问或者socket端口集中收到大量请求(如12306抢票,双十一活动等)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅降低用户体验(请求响应时间过长),同时可能导致系统宕机,系统停止工作等。如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等。
而多线程只是在同/异步角度上解决高并发问题的一个方法手段,是在同一时刻利用计算机闲置资源的一种方式。多线程在高并发问题中的作用就是充分利用计算机资源,达到最大的利用率,不浪费资源使其闲置。