这里将以对话的形式进行:
A:
普通的线程是可以被其他线程中断掉的,而基于select、epoll的事件处理函数实际上是不可以被其他事件(线程)中断的。
我这个理解对吗?
B:
图片里的应该是对是否可以并行,多路复用的说法,
传统的io操作,可以在主进程里串行等待执行完再处理下面的逻辑,但逻辑上没有强相关的情况,可以并行去执行各种io(用户态),而主进程或其他子线程可以继续做其他事
传统的io线程,主进程中是可以中断的,知道线程id,去中断就可以
而select, epoll 主要是为了实现多路复用吧,配有监听进程的,不会被其他线程中断的
A:
哦哦 那如果在bind cpu1的进程使用了epoll 并开启了监听 注册好了事件处理函数 那么触发多个事件的时候也只能顺序地在本cpu上挨个处理 不能扩散到其他cpu上 对吧?
看代码好像是这样。那这样的话 如果把一台机器上所有的核都用上 实际上就和多线程一样了。
B:
是的
A:
但是又有个问题 如果所有进程都在运行事件处理函数 那我此时再开启一个另外服务的进程不就是没用了吗 因为每个核都不可中断。这样只能等到某个核的事件处理函数搞好了才能让出cpu。
那么如果一个8核的cpu 8个核都被业务进程bind 然后事件处理函数中又有读取本机数据库的操作 但是数据库进程又不能占到cpu 这样不就系统不就死锁了吗。
感觉这样就很不合理。
B:
如果一个核上有进程在跑,那肯定是要等处理完,新的服务进程才能使用
8核的这种情况,如果一直没占用着,那肯定是需要扩容的,或者调成业务的逻辑。另外数据库的连接是在线程里处理的吧
A:
哦哦
或者把数据库放到云上 以网络请求的方式获取
这样一来我大概懂了
B:
嗯,数据库和业务服务是分开部署的
A:
这几天在看操作系统导论的 看到基于线程的服务器与基于事件的服务器的区别感觉不是很理解。
我之前学网络编程以及看公司里面的框架是基于事件的,就没见到过基于线程的。
基于线程的服务器里感觉应该用协程更好理解 显式yield而不是让操作系统进行切换。
B:
嗯,工业里肯定是基于事件的,各层之间是分开部署的,不会都揉在一起
A:
主要是我之前以为事件处理的时候是可以被其他进程中断的这样就不能理解为何阻塞了
B:
嗯,c++里的协程是一种方案,java里其实没协程,但可自己去实现
A:
嗯 协程我也没用过
23标准才比较全 20的协程还需要自己再封装
参考
https://zhuanlan.zhihu.com/p/32961438
http://t.zoukankan.com/feng9exe-p-10485519.html
https://blog.csdn.net/Chen4852010/article/details/123163903
http://www.imxmx.com/Item/1/117655.html