https://blog.csdn.net/weixin_45154837/article/details/100690909
关于多进程的文章
https://blog.csdn.net/weixin_45154837/article/details/100138135
关于多线程的文章
进程与线程的关系,什么场景下该用哪一个?各自的优点与缺点?
进程与线程的关系
每个进程中都至少有一个线程
区别
1,进程是资源分配的最小单位,线程是cpu调度的最小单位
2,属于同一进程的线程,堆是共享的,栈是私有的
3,属于同一进程的所有线程都拥有相同的地址空间
多进程的优点
1,编写相对容易,一般不考虑资源同步和锁的问题
2,容错性强,哪怕一个进程崩了也不影响其他的进程
3,隔离性强,错误与数据隔离,在多进程架构的程序一定程度上能自我恢复,如nginx的master管理进程在监测到worker进程挂掉后会重新拉起新的worker进程
多线程的优点
1,创建数据快,方便高效的数据共享
2,较轻的上下文切换开销,不用切换地址空间,不用切换寄存器,不用刷新TLB
(引用解释:每创建一个线程时都会为这线程创建一个数据结构来保存这个线程的信息,我们称这个数据结构为线程上下文,每个线程的上下文中有一部分数据是用来保存当前所有寄存器的副本。每当操作系统暂停一个线程时,就会将CPU中的所有寄存器的当前内容都保存到线程上下文数据结构中。而操作系统要让另外一个线程执行时则将要执行的线程的上下文中保存的所有寄存器的内容再写回到CPU中,并将要运行的线程中上次保存暂停的指令也赋值给CPU
的指令寄存器,并让新线程再次执行。可以看出操作系统正是通过这种机制保证了即使是多线程运行时也不会导致寄存器的内容发生错乱的问题。因为每当线程切换时操作系统都帮它们将数据处理好了。)
(引用解释:tlb是一种缓存,缓存的内容是虚拟地址和物理页面的对应关系,每当一个新进程投入运行的时候,tlb就要被刷新,否则就会出现混乱)
多进程的应用场景
1,nginx主流的工作模式是多进程模式(也支持多线程模型)
几乎所有的web server服务器服务都有多进程的,至少有一个守护进程配合一个worker进程,例如apached,httpd等等以d结尾的进程包括init.d本身就是0级总进程,所有你认知的进程都是它的子进程;
2,chrome浏览器也是多进程方式。 (原因:①可能存在一些网页不符合编程规范,容易崩溃,采用多进程一个网页崩溃不会影响其他网页;而采用多线程会。②网页之间互相隔离,保证安全,不必担心某个网页中的恶意代码会取得存放在其他网页中的敏感信息。)
3,redis也可以归类到“多进程单线程”模型(平时工作是单个进程,涉及到耗时操作如持久化或aof重写时会用到多个进程)
多线程应用场景
1,线程间有数据共享,并且数据是需要修改的(不同任务间需要大量共享数据或频繁通信时)。
2,提供非均质的服务(有优先级任务处理)事件响应有优先级。
3,单任务并行计算,在非CPU Bound的场景下提高响应速度,降低时延。
4,与人有IO交互的应用,良好的用户体验(键盘鼠标的输入,立刻响应)
案例:
需要频繁创建销毁时优先使用线程,进程的频繁创建与销毁开销过大


560

被折叠的 条评论
为什么被折叠?



