程序并发概述
并发的概念:
计算机里面的并发是指单个系统同时执行多个独立的任务,而非顺序的一个任务一个任务的执行。
在单处理器的单核CPU里,虽然某一时刻只能有一个任务在执行,但是它可以不断进行任务切换,这个任务执行一会儿,再切换到别的任务执行一会儿,由于切换得很快,所以用户感觉像是多个任务在同时运行。单核实现并发模型如下图,橙色和绿色表示两个任务交替执行,中间灰色部分表示任务切换的开销。
在多核心的处理器上,同一时刻可以有多个任务分别在不同的核上运行,这种同一时刻多个任务同时运行,严格意义上我们叫它并行。如下图表示两个任务在双核处理器上实现并行。
多核上除了并行,并发也是存在的,在每个核上可以有多个任务交替运行,以此实现并发,如下图展示四个任务在两个核上实现并发。
实现并发的方法:
多进程方式实现并发。
多线程方式实现并发。
进程与线程的区别:
区别1:从概念上进行理解,进程是指一个程序的执行过程,线程是一个程序中一段代码的执行过程。线程是依附于进程存在的,在一个进程中,至少有一个主线程,当然还可以有更多的线程,而一个线程只可能唯一属于某个进程。
区别2:多进程和多线程都可以实现并发,在上下文切换时进程开销大,线程开销小。
区别3:进程的资源是独立的,进程之间互相不影响,但是同一个进程内的多个线程共享进程的资源,共享的资源每个线程都可以访问,访问的话要保证任意时刻任何线程访问到的资源都是一致的,所以进程不共享资源虽然进程间通信困难,但是资源独立不用关心一致性问题(使用共享内存实现进程通信时要关心),线程共享进程的资源,通信简单,但是要注意一致性问题。
区别4:进程中一个线程崩溃了,整个进程就崩溃了,但是多进程时一个进程崩溃了,不影响其他进程。
所以如果需要频繁的创建和销毁时推荐使用线程,因为创建和销毁一个进程的代价的高昂的。需要频繁切换任务时,也推荐使用多线程,上下文切换速度快,开销小。如果希望更高的安全性时,推荐使用多进程。
为什么要用并发:
1:性能:因为合理的安排并发,能提高程序性能(并不是一定提高哦,一定是要合理实现并发才能提高性能)
2:关注点分离:将一个大的任务分离成小的颗粒,比如一个服务器进程,可以让一个任务负责处理用户的连接请求,一个任务负责处理用户数据的收发和逻辑处理。
什么时候不使用并发:
大多数情况下,并发的代码往往更难理解,维护成本更高,当使用并发的收益不比维护的成本高时,没必要使用并发增加软件的复杂度。