背景
最近新来的同事在做一些并发编程, 我们交流了一下并发编程的发展。
并行与并发
先说了一下并行与并发, 并行是将任务分成两个部分,互不影响的执行, 并发是将任务分成两个部分,但是可能会产生交叉执行。
- 并行
- 并发
由上面知道, 并行与并发最终目的最终效果都是将结果计算出来, 只是计算的方式不一样。并发操作和串行操作的不同是,防止一个任务由于长时间的因为资源等原因发生阻塞影响整个大任务的执行。
并发方案
多进程
为了区分线程和进程的关系,我们先来了解一下他们的定义。
- 进程是操作系统直接管理的程序运行的基本调度单元。
多线程
- 线程是减少系统调度资源的并行方案
可以看出, 一个进程可以包含多个线程,用多线程取代多进程的方式,可以减少因为多进程进程头的资源和减少系统调度开销的系统资源。
非阻塞多路复用IO
然后就是非阻塞多路复用IO, 在我们的并发编程的时候,主要是解决在文件读取网络等待占用大部分时间, 但是这部分时间我们可以通过非阻塞的方式进行读取,来解决,没必要就拿着程序调度来说事情。
多路复用IO也有多种思路来实现, 下面来讲讲多路复用IO的一些方法。
- select 方法: 用数组来记录文件读写的fd, 每次事件都遍历所有的fd
- poll 方法: 用链表来存储文件读写的fd, 每次事件都遍历所有的fd
- epoll 方法: 用链表来存储文件读写的fd, 将事件存储成单独的链表,每次事件都遍历事件链表
线程池
虽然多路复用是一个非常好的概念,但是所有任务其实就只是一个逻辑在处理,而现在一般都是多核CPU,怎么能够将所有CPU都跑起来呢, 于是有了线程池的概念。
大致实现是,将事件保存到一个事件表里面, 将线程放在一个线程表里面, 有事件了,我就找一个空余的线程去处理, 是不是很优秀的想法。
其他
并行还不够? 确实,现在都是很多服务器在一起, 我们应该怎么去权衡这些服务器的运行呢, 你是不是有答案了, 如有有时间,我们下次再做分析。
结束语
这是一次交流的记录, 也许很多不够严谨, 欢迎大家讨论和指正。