龙空技术网

骨灰级程序员总结:多进程/多线程

右手诗 700

前言:

而今小伙伴们对“nginx工作进程多线程”大概比较关切,我们都需要剖析一些“nginx工作进程多线程”的相关内容。那么小编同时在网摘上搜集了一些对于“nginx工作进程多线程””的相关资讯,希望看官们能喜欢,你们一起来学习一下吧!

这个图片很形象吧

程序分为两种:单进程/单线程 和 多进程/多线程 两种。

(为了方便,下文以“单”代指 单进程/单线程 ,“多”代指 多进程/多线程 )。

“单”程序不用考虑并发问题(比如浏览器中的javascript),复杂度会比“多”程序低很多。

多进程/多线程 程序在很多时候可以提高程序的效率,尤其是网络时代的到来。“多”程序的开发需要转变以往开发“单”程序时的开发思路和方式,以及对程序运行的理解,多进程对共享资源的使用,并发问题等等,这些给程序的开发维护带来了更大的挑战,对程序员的要求更高。

参考资料

【开源组件】深入浅出Nginx

nginx、swoole高并发原理初探 - 畅想代码 - SegmentFault

1、同步与异步①同步与异步的理解同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。同步当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。异步调用,要想获得结果,一般有两种方式:1、主动轮询异步调用的结果;2、被调用方通过callback来通知调用方调用结果。②:生活实例同步买奶茶:小明点单交钱,然后等着拿奶茶;异步买奶茶:小明点单交钱,店员给小明一个小票,等小明奶茶做好了,再来取。异步买奶茶,小明要想知道奶茶是否做好了,有两种方式:1、小明主动去问店员,一会就去问一下:“奶茶做好了吗?”...直到奶茶做好。2、等奶茶做好了,店员喊一声:“小明,奶茶好了!”,然后小明去取奶茶。**关于2问题:小明得一直都在,虽然他不用一遍遍去问好了没有,但是他得等着店员什么时候来叫他,并且也不能预料到什么时候回来叫他,所以他不得不一直等着不能离开奶茶店,只不过他等着的时候可以干点别的小事而已。**

异步是一种编程模型,MQ是一种异步实现方式。

(补充:队列实际上也是一种异步模型的应用)

你可以走离开店铺,但是你得告诉服务员一个凭证,以便奶茶做好后可以联系到你。

linux - 单线程多路复用和多线程加锁的区别 - SegmentFault

大家做linux C/C++网络编程时,啥时用到多线程或者多进程啊? - SegmentFault

多个进程或者线程无非就是要多占用点CPU的时间片,让程序运行效率更高点。不过进程间通信,线程上下文切换,同步等问题同样会对性能有些影响。服务器程序为了提高CPU的利用率,采用多进程或多线程的模型是比较常见的做法,而客户端程序一般来说的确单进程单线程就可以了。另外 @Hacken 的回答我不赞同,并不是说单进程和单线程的模型就无法同时服务多个客户端了,这里面主要要依赖IO复用技术。反过来讲,同时服务1000个客户端,难道要同时开1000个线程?显然不可能。

生活中常说的,你们两个人的工作要同步啊,什么跟什么事同步进行啊之类的,这个同步的意思指的是,强调某些事物或工作的频率要保持一致。这个同步和编程中的同步不同哦,就像雷锋和雷峰塔的关系。

网络编程 - I/O复用到底是什么意思 - SegmentFault

I/O多路复用和Socket - 全干工程师 - SegmentFault

select、poll、epoll之间的区别总结[整理] - Anker's Blog - 博客园

IO多路复用之epoll总结 - Anker's Blog - 博客园

异步通知,那我要怎么通知你啊? · php笔记 · 看云

定时-时钟-阻塞 · php笔记 · 看云

多进程/多线程 · php笔记 · 看云

javascript - 究竟能不能用死循环?或者其实我们就活在一个死循环的世界中? - SegmentFault

mysql - PHP定时通知、按时发布怎么做? - SegmentFault

工作线程数究竟要设置为多少 | 架构师之路

为什么操作系统的单线程比多线程好的多?-悟空问答

架构师之路,季度精选40篇

进程和线程到底谁才是鸡肋?他们的区别在哪里?神级程序员解惑!

为什么串口比并口快?-OSDIY的回答-悟空问答

电脑cpu的核心与线程是什么意思?-蒙面侍卫的回答-悟空问答

一篇文章看懂Java并发和线程安全

谈到多线程,我们很容易与高性能画上等号,但是并非如此,举个简单的例子,从1加到100,用四个线程计算不一定比一个线程来得快。因为线程的创建和上下文切换,是一笔巨大的开销。

阻塞非阻塞与同步异步有什么区别?-IT老友的回答-悟空问答

你最后一段说错了。阻塞是指,调用方必须等到下游被调用方执行完毕返回结果才能继续执行,在被调用方未执行完毕返回结果前,上游调用方处于阻塞挂起状态。这就是阻塞。非阻塞是下游被调用方的执行不会阻塞上游调用方,等到执行完毕,将结果通知到上游调用方,在此期间,上游调用方不会被阻塞,可以继续做别的事,然后等着通知就可以了。

程序中的代码段、数据段、堆、栈是怎么回事

当你在 Linux 上启动一个进程时会发生什么?

php非阻塞访问url 解析socket阻塞与非阻塞,同步与异步 - 橙虚缘空间 - CSDN博客

电脑CPU有超线程,为什么手机CPU没有超线程设计?-数码侦探的回答-悟空问答

超线程技术是指,对于单一处理器核心来说来说,虽然也可以每秒钟处理成千上万条指令,但是在某一时刻,只能够对一条指令进行处理,也就是单线程。超线程技术能够把一个物理处理器在软件层变成两个逻辑处理器,可以使处理器在某一时刻,同步并行处理更多指令和数据,也就是超出数量(2)的线程数。

同步 & 异步

同步与异步重要的区别是在于是否阻塞,以及调用结果的通知(返回)方式。

为了便于说明,我们假定:

A:调用方

B:被调用方

调用方 & 被调用方 例子:调用方:JS主线程setTimeout()被调用方:匿名函数(被调用方有可能是一个函数,有可能是一个代码结构,闭包,表达式等等)

同步

A阻塞调用B,阻塞调用的意思就是,在B为执行完并返回结果之前,A会一直处于被阻塞挂起的状态,直至B返回结果,A才继续向下执行。

异步

A非阻塞调用B,非阻塞调用的意思就是,A调用B,A不会被阻塞,在B执行完返回结果之前,A可以继续向下执行。这个具体怎么做到的,根据不同语言的特性有不同的实现方法,比如在JS是利用事件循环实现的。

特点分析

同步调用,调用方的继续执行依赖于被调用方的返回结果。(需要调用方立即返回结果)

异步调用,调用方的继续执行不依赖于被调用方的返回结果。(不需要调用方立即返回结果)

同步调用不能使用MQ

异步调用的可以使用MQ

提示:我们平常写的普通代码,就是自上而上的同步代码,同步调用,一条一条的自上而下的按顺序执行。

另外要注意的是,不要受编程语言所限,很多编程语言语法、调用形式不同,但是所做的事基本是相同的,编程语言只是一层外表,不要被这层外表所蒙蔽了,它们最终都会转变为一系列的系统调用,或者是有效的指令集而已。

标签: #nginx工作进程多线程 #nginx超线程 #php 多进程 多线程