一,兴趣的由来
由于看了《向往的生活》里面薇娅自带推流工具做直播。
1.我就搜索了下推流
2.然后搜索到了ffmpeg流媒体开发
3.然后看了一个流媒体开发入门
3.1 描述简单的RTMP推流
3.2 音视频基础知识
3.3 流媒体服务器和客户端协议包括rtmp(客户端)hhtp-flv(PC-vwe)hls(手机)。
3.4 SRS开源流媒体服务器的框架
3.5 里面介绍了直播播的实时性B帧P帧相关。
3.6 然后又讲了协程开源的链接数量百万级客户端,只要内存够大。
我首先比较感兴趣的就是协程,因为我做socket服务器和客户端连接数量很少。但是从来没有想过这样的百万级连接应该如何设计。所以我就好奇。
二,协程的理解
网上可以搜索到很多协程机制的资料及协程和线程对比。
看完后,我很容易理解,因为很多知识点相同的,属于经验迁移型的学习,我之前实现过RTOS的task创建及调度。可以参考我的学习笔记大总结:各类RTOS学习总结--Apple的学习笔记
协程(Coroutine)在执行过程中可中断去执行其他任务,执行完毕后再回来继续原先的操作。可以理解为两个或多个程序协同工作。
其实它是一个线程中按顺序执行。并不是多线程按时间片切换的同步运行,所以不需要加锁。效率高。
另外在同一个线程中,用户态轻量及的函数切换(任务栈切换),需要切换的内容就是任务栈,所以占用内存少,操作速度快。
常利用多进程(利用多核)+协程来获取更高的性能。
三,我的思考总结
对于我已经有如下知识点
1.OS基础
2.linux用户态内核态基础
3.io事件驱动基础(io检测+io处理完成2个流程)
4.同步/异步和阻塞/非阻塞基础+4种基础的socket模型
5.线程/进程基础
然后我深度思考了协程的好处
我觉得应用场景应该是io密集型需要用到协程设计。
答:原因是比如用户态调用send后,用协程切出,当io数据处理ready后,通过协程调度器来决定resume到哪个协程继续运行。
说白了,就是节约io等待的时间,因为就算非阻塞io,仅在检测到io为异步,当处理读写数据还是有阻塞的。
另外,协程占用内存小,若用多线程怕内存不够。
那么改成epoll回调+线程池异步的设计模型和协程区别大吗?我2个都没有用过,只是今天刚了解,所以暂时无法知道对比效果。之后还是会进入主题ffmpeg流媒体开发。将来会用到协程,了解协程只是一个准备工作。
网友评论