多线程编程

2018-10-09 10:15:00
CJL
原创
3732

一、概念

进程(process):每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)

线程(thread):同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)

协程(Coroutine):协程又称为微线程,协程的完成主要靠yeild关键字,协程执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行,注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。


二、来源

进程和线程概念来源于操作系统OS层面。多进程是为了解决高效利用CPU时间的问题,由于CPU处理速度非常快,经常会出现IO等待等,在等待的时候其他进程就可以进入CPU执行队列,形成并发执行的“假象”,当然现在的多核处理器可以实现真正的并行。每个进程对应一个操作系统层面的PID。但是进程切换的时候载入内存等消耗的系统资源较多,为了解决这个问题引入了线程概念,线程都属于进程,线程共享一些系统资源是轻量级的进程,可以很小的代价进行线程切换。线程是操作系统层面进行任务调度的最小单位。

由于在线程调度上是操作系统上完成的,有些情况下我们需要自己进行线程的调度,改变优先级等。所以一些语言在编译器层面实现了协程,协程是一个更小的执行单位,有更高的自由度。


三、作用

常见的有多进程、多线程、协程编程。我们可以根据各自的优缺点进行选择。主要考虑的有:通信、切换、效率等方面。可以提高程序处理速度,提高计算资源利用率。在IO等待时间较长,CPU切换频繁等场景上应用较多。

一般需要频繁创建销毁的使用线程,频繁进行CPU切换的使用协程,子功能交互较少需要利用多核优势的使用多进程。

日常使用最多的还是多线程编程,现在为了提高性能swoole\go等也使用了协程实现。


四、常见问题

线程安全:线程安全主要解决的问题是共享变量的操作,包含原子性、可见性、顺序性。解决线程安全的方式包含锁和同步。锁的实现基于底层硬件基础CPU提供的原子操作、关中断、锁内存总线的机制。

分布式锁:基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Zookeeper实现分布式锁

通信:通知机制(wait/notify)、管道(PipeInputStream/PipeOutputStream)、共享变量(volatile/synchronized)

中断:interrupt,协作方式,程序可以对中断信号不做响应。

阻塞:sleep、wait、锁、IO(网络、磁盘、内存等)

事件驱动:select/epoll

线程池:


五、常见场景

多线程 : 常见的浏览器、Web服务(现在写的web是中间件帮你完成了线程的控制),web处理请求,各种专用服务器(如游戏服务器)需要频繁创建销毁的优先用线程需要进行大量计算的优先使用线程(CPU频繁切换)

多进程:使用场所:目标子动能交互少,如果资源和性能许可,可以设计由多个子应用程序来组合完成目的

协程:swoole、go、


从应用程序上考虑:如果程序属于CPU计算密集型建议使用多进程,如科学计算、机器学习;如果是IO密集型建议使用多进程,如爬虫、web Server。

在处理异步业务的时候我们经常使用多线程编程。


六、php样例

http://www.netkiller.cn/journal/thread.php.html

信号量与共享内存 shm_get_var sem_acquire

使用shmop 、sem模块

消息队列:msg_send msg_recive


七、java样例

https://www.cnblogs.com/BigJunOba/p/8980007.html


八、常见软件中的应用

nginx 使用事件驱动的思想通过类似协程的方式减少进程数,提高处理性能。

apache 使用多进程的方式处理请求,复用进程。

fpm 使用多进程和进程池的方式提高处理性能。


九、扩展

学习多线程编程的时候很多概念是和分布式应用相通的,在分布式应用中关键问题也是资源竞争(锁)、协作(阻塞、事件)、一致性、原子性等问题,我们通过一系列分布式组件来解决这些问题,比如分布式内存数据库、分布式锁、分布式消息队列。以前用于解决问题的思想也对应产生了不同的解决方案,比如微服务的rpc通信、actor模型等。

zokeeper提供了强一致性的分布式数据存储服务,可以实现分布式锁、分布式消息队列、选举等。

linux 提供了高性能IPC线程间消息队列通信实现,ipcs。


发表评论
评论通过审核后显示。
流量统计