一、并发与多线程的基本概念
1、并发的概念
两个或者更多的任务(独立的活动)同时发生(进行),一个程序同时执行多个独立的任务。
以往,单核CPU某一个时刻只能执行一个任务,由操作系统调度,每秒钟进行多次所谓的“任务切换”是一种并发的假象,这种切换(上下文切换)有时间开销。
多核CPU能够实现真正的并发执行多个任务(硬件并发)。
使用并发的原因:主要是可以用时处理多件事,提高性能。
2、可执行程序
硬盘上的一个文件,是能够运行的。
3、进程
- 一个可执行文件运行起来,就创建了一个进程。
- 进程就是运行起来的可执行程序。
4、线程
- 每个进程(执行起来的可执行程序),都有一个主线程,这个主线程是唯一的。
- 当你执行可执行程序,产生一个进程后,这个主线程随着进程默默的启动起来。
- 运行程序时,实际上进程的主线程来执行main函数中的代码。
- 主线程与进程唇齿相依,有我必然有你,有你必然有我,没有我必然没有你。
- 线程:用来执行代码的。理解成一条代码的执行通路(道路)。
- 除了主线程之外,可以通过程序创建其他线程,其他线程走的是别的道路。
- 每创建一个线程,就可以在同一个时刻,多干一个不同的事情(多走一条不同的代码执行路径)。
- 线程不是越多越好,每个线程都需要一个独立的堆栈空间,线程之间的切换要保存很多中间状态,切换会消耗本属于程序运行的时间。
线程总结:
1、线程是用来执行代码的;
2、把线程理解成一条代码的执行通路(道路),一个新线程代表一条新的通路。
3、一个进程自动包含一个主线程,主线程随着进程默默的启动,我们可以通过代码创建其他非主线程,但是创建的数量最大不建议超过200-300个,多大合适,需要根据项目不断的优化。
4、因为主线程是自动启动的,所以一个进程中最少也是有一个线程。
5、多线程效率究竟有多高,并不是一个很容易评估和量化的东西。
二、并发的实现方法
1、并发的实现手段:
- 通过多个进程实现并发
- 在单独的进程中,创建多个线程来实现并发
1.1、多进程并发
world启动后就是进程,ie浏览器启动后就是进程。
进程之间的通讯(同一个电脑上:管道,文件,消息队列,共享内存)
不同电脑上(socket通信技术)。
1.2、多线程并发
单个进程中创建了多个线程。
线程:感觉像是轻量级的进程。每个线程都有自己独立的运行路径,但是一个进程中所有线程是共享内存(共享地址空间);
全局变量、指针、引用都可以在线程之间传递,所以多线程的开销远远小于多进程。
共享内存带来新问题:数据一致性问题。(线程A,线程B同时访问一个空间)
总结
和进程比,线程有如下优点:
1、线程启动速度更快,更轻量级
2、系统资源开销更少,执行速度更快,比如共享内存这种通信方式比任何其他的通信方式都快
缺点:
1、使用有一定的难度,要小心处理数据一致性问题