并行、并发、同步、异步、阻塞、非阻塞

本文详细介绍了并行和并发的概念,指出并行是在多核CPU上同时执行多个任务,而并发则是在单核CPU上交替执行任务。并讨论了多核CPU中并发和并行的共存,以及三种常见的并发处理方法:基于进程、IO多路复用和基于线程。此外,还探讨了线程同步、异步IO以及阻塞与非阻塞的区别。最后,提到了线程池和预线程化的策略,并指出线程池数量通常设置为CPU核数的2倍。
摘要由CSDN通过智能技术生成

并行

是指两个或者多个事件在同一时刻发生。并行是在不同实体上的多个事件。

并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力

单核 CPU 无法并行,并行只可能发生在多核 CPU 中。

并发

是指两个或多个事件在同一时间间隔发生。并发是在同一实体上的多个事件。

并发针对单核 CPU 而言,它指的是 CPU 交替执行不同任务的能力。

单核 CPU 只能并发,无法并行;换句话说,并行只可能发生在多核 CPU 中。

在多核 CPU 中,并发和并行一般都会同时存在,它们都是提高 CPU 处理任务能力的重要手段。

常见的3种并发办法:

1.基于进程的并发

2.IO多路复用

如select函数,结合FD_ZERO、 FD_CLR、 FD_SET、 FD_ISSET函数。

优点:是在单一进程实现的,每个逻辑流都可以访问该进程的全部地址空间。

缺点:1.编码复杂。2.不能充分利用多核处理器。

3.基于线程的并发

特点是:

1.在同一进程的所有线程共享该进程的整个虚拟地址空间。=> 延伸到用全局变量或静态变量实现共享  => 延伸到需要同步(可用互斥锁、事件量、条件变量、信号量)=>

同步导致的问题:

a.导致同步开销巨大(处理办法:缩小同步的范围,更多使用局部变量

b.线程不安全函数    有下面4种情况

第1.不保护共享变量的函数    

   处理办法:使用互斥量或者信号量是互斥

第2.保持跨越多个调用的状态的函数     

      处理办法重写,依靠重写函数的参数传递状态信息。(该参数如果按值传递并且引用的数据都是局部变量,那就是线程安全。或者参数按指针传递,并且指针指向的是非共享数据的指针也是线程安全的)

第3.返回指向静态变量的指针的函数

     处理办法:就是加锁-复制技术。=>导致开销大,降低程序的速度

第4.调用线程不安全函数的函数

     处理办法:重写或互斥锁
c.竞争

改造: 

 

d.死锁

一个线程被阻塞,等待一个永远也不会为真的条件。如信号量的P和V操作顺序不当。

2.线程的上下文要比进程的上下文小地多,线程的上下文切换要比进程的上下文切换快得多。

=> 每个客户端创建一个新线程,代价还是很大的。=> 线程池(或说预线程化)

所以: 预线程(线程池)的数量不是越多越好,一般是cpu核的数量的2倍。

同步(Synchronization)

同步与异步关注的是消息通信机制,所谓同步,就是由“调用者”主动等待这个“调用”的结果。

阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。
 

和异步(Asynchronous)

异步则相反:“调用”在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立即得到结果。而是在“发出后”,“被调用者“通过状态,来通知调用者,或通过回调函数处理这个调用。   比如io完成端口,只有io完成端口才是真正的异步操作。

异步必定是非阻塞的。
 

阻塞

当数据没有准备的时候阻塞,往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否則一直等待在那里。阻塞函数会挂起线程,释放cpu.

非阻塞

当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。

延伸:

就有3种思路:
1.多线程(同步阻塞);
2.IO多路复用(select,poll,epoll)(同步非阻塞,严格地来讲,是把阻塞点改变了位置);
3.直接暴露出异步的IO接口,如Linux kernel-aio(io_uring)和windows IOCP(异步非阻塞)。

其中:

select()函数主要解决的是accept()函数阻塞问题,而没有解决recv()和send()函数阻塞问题。

select不足的地方:
1 每次select都要把全部IO句柄复制到内核
2 内核每次都要遍历全部IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能下降明显

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值