前言
为提高系统稳定性和可调试性以及提高系统的整体处理性能,现调研了dpdk的多进程模型,现将调研的内容通过书面的形式进行总结,以便更好的支撑在实际开发过程中的选型。
多进程和多线程的区别
-
创建方式
- 创建进程= fork ——> do_fork(不使用共享属性)
- 创建线程= pthread_create——>__clone ——> do_fork(共享地址空间(代码区、数据区)、页表、文件描述符、信号)
- Linux下不管是多线程编程还是多进程编程,最终都是用do_fork实现的多进程编程,只是进程创建时的参数不同,从而导致有不同的共享环境
-
调度和切换
- 核内的线程本质就是进程,其调度过程跟进程一样
- 不论是进程切换还是线程切换,都需要替换运行环境(内核堆栈,运行时寄存器等),对于内存的切换,内核部分内存是一样的,用户空间部分:如果是进程,需要替换页目录基址寄存器,如果是线程,不需要替换
- 多线程共享地址空间,从一个线程切换到同一个进程上另一个线程运行,页表,数据区等很多都已经在内存甚至缓存里,而从一个进程切换到另一个进程,可能由于刚切换进来的进程的页面被虚拟内存管理模块替换出去导致的页面替换开销,另外还有缓存tlb失效导致的缓存更新开销,这里性能有所差别
-
地址空间共享相关问题
- 进程地址空间是独立的
- 线程地址空间是共享的
- 进程模型更安全、