为什么需要多线程
计算机cpu从单核到多核, 需要处理的任务也越来越多,多线程的出现,便是为了更好的利用多核cpu的利用率
- cpu在读取L1,L2,内存,磁盘的数据的时候,速度差距很大,导致cpu空余时间一直在等待状态,性能浪费,在cpu空余的时候,如果去执行其他任务,就会将其性能充分地利用起来
- 线程的创建相对于进程而言开销更小,而且线程间通讯也更加方便,线程与线程之间就如同同一个房间不同的座位一样,而进程之间就如同同一个屋檐下的相对独立的不同房间
附上cpu缓存内存交互时间
多线程是什么
从资料的中linux内核创建进程和线程的过程介绍来看,
创建线程和创建普通的进程类似,只不过需要在调用do_fork的时候需要传递不同的flag来指明需要共享的资源,使用pthread_create方法来进行创建,最终会调用到do_fork方法。
线程可以看做是共享了父进程空间的一系列子进程,与重新fork进程不同,多个线程之间有资源共享,也有自己独占的资源。
多线程有哪些优势,带来什么样的问题
优势:
- 充分利用了CPU的空闲时间,更好地利用系统资源,用尽可能少的时间来对用户的要求做出响应,使得进程整体运行效率得到较大提高
- 多线程之间会有内存的共享,创建线程不会像开辟新的进程一样开销很大,可以说线程是更加轻量化的进程
问题:
- 上下文切换带来的性能损耗,切换上线文因为要记录上次任务的执行状态的,会有一定的性能损耗,在简单的任务下,cpu频繁地切换线程有时候反而会出现多线程执行比串行执行慢的情况,所以在代码中也要注意使用最少线程,避免创建不需要的线程,以减少上下文切换带来的损耗
- 缓存一致性问题,不同的线程除了共享的主存外,都会有自己线程私有的内存空间,将数据从主存加载都私有缓存中处理,就会有线程安全问题出现,这个也是多线程应用中需要主要注意和处理的问题
- 多个线程竞争共享资源,多个线程是共享计算的硬件如磁盘读写,网路带宽等,必然会出现相互竞争资源抢夺的情况