php 轮询-不用看,同步异步、阻塞、非阻塞等面试中用到的基本概念都在这里了

2023-08-29 0 8,282 百度已收录

您还在寻找进程线程、同步与异步阻塞与非阻塞、并发与并行等基本概念吗? 本文全部收集。

1 进程线程

过程:

它是Windows系统中的一个基本概念,包含了运行一个程序所需要的资源。 正在运行的应用程序被视为操作系统中的一个进程,一个进程可以包含一个或多个线程。

线程是操作系统分配处理器时间的基本单位。 在一个进程中,多个线程可以同时执行代码。 进程相对独立,一个进程很难访问另一进程的数据(除非使用分布式估计方法),并且一个进程的故障不会影响其他进程的运行。 Windows系统使用进程将工作定义为多个独立的区域。 进程可以理解为程序的基本边界。 它是应用程序的运行解释器,是应用程序的动态执行过程。

线程(线程):

它是进程中的基本执行单位,也是操作系统分配CPU时间的基本单位。 一个进程可以包含多个线程,进程入口处第一个执行的线程被视为该进程的主线程。 线程主要由CPU寄存器、调用栈和线程本地存储(ThreadLocalStorage,TLS)组成。 CPU寄存器主要记录当前执行线程的状态,调用栈主要用于维护线程调用的显存和数据,TLS主要用于存储线程的状态信息。

进程和线程的区别

进程和线程之间的主要区别在于它们是操作系统资源管理的不同方法。 进程有独立的地址空间。 一个进程崩溃后,不会影响其他处于保护模式的进程,线程只是进程中的一条不同的执行路径。

线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。 如果一个线程挂了,就意味着整个进程跑掉了,所以多进程程序比多线程程序强,但是在进程之间切换时,耗费的资源更大,效率更低。 但对于一些需要同时执行并共享各个变量的并发操作,只能使用线程,而不能使用进程。

2 同步(Sync)和异步(Async)

同步:

所谓同步是指当发出函数调用时,在获得结果之前调用不会返回或继续执行后续操作。

简单来说,同步就是一件事情必须一件一件地做完,上一件事情做完之后才能做下一件事情。

例如:B/S模式下的表单提交,具体流程为:客户端提交请求->等待服务器处理->处理后返回,在此过程中客户端(浏览器)不能做其他事情。

异步:

异步与同步相反。 当发出异步过程调用时,调用者可以在获得结果之前继续执行后续操作。 当此呼叫完成时,通常会通过状态、通知和退回邮件通知呼叫者。 对于异步调用,调用的返回不受调用者控制。

对于呼叫者的三种通知形式,详细信息如下:

例如:B/S模式下的ajax请求,具体流程为:客户端发送ajax请求->服务器处理->处理完后执行客户端反弹,客户端(浏览器)发送请求后,可以还是做其他事情吧。

同步和异步的区别:

总结一下,同步和异步的区别:请求发送后,是否需要等待结果,是否可以继续执行其他操作。

3 阻塞和非阻塞

阻塞和非阻塞两个概念与程序(线程)等待消息通知的状态有关(无论同步还是异步)。 也就是说,阻塞和非阻塞主要是从程序(线程)等待消息通知的状态来看的。

阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态。

阻塞调用意味着在返回调用结果之前当前线程将被挂起。 调用线程在获得结果之前无法返回。

非阻塞调用是指调用不会阻塞当前线程,直到无法立即获得结果为止。

4并发并行

并发:在操作系统中,是指在启动、运行和运行结束之间的一段时间内有多个程序,并且这些程序都运行在同一个处理器上,但在任何时间点上都只有一个程序运行处理器。

当有多个线程在运行时,如果系统只有一个CPU,则不可能同时运行多个线程。 它只能将CPU运行时间定义为若干个时间段,然后将时间段分配给每个线程。 执行时,当线程代码运行一段时间后,其他线程被挂起。 。 这些方法我们称之为并发(Concurrent)。

php 轮询-不用看,同步异步、阻塞、非阻塞等面试中用到的基本概念都在这里了

并行性:当系统有多个CPU时,线程的操作可能不是并发的。 当一个CPU执行一个线程时,另一个CPU可以执行另一个线程。 两个线程不占用CPU资源,可以同时执行。 我们称这些方法为并行(Parallel)

并发和并行的区别:

并发的关键是您有能力处理多个任务,但不一定要同时处理。 并行性的关键是同时处理多个任务的能力。

所以我认为其中最关键的一点是它们是否“同时”。

异步和多线程的两个区别? (原理) 1 异步和多线程有什么区别?

虽然,异步是目的,多线程是实现的方式。 异步是指A发起一个操作(一般是耗时的操作,如果不是耗时的操作,则无需异步),可以继续匆忙处理自己的事务,而不需要等待耗时操作返回。

2 多线程和异步操作的优缺点

多线程和异步操作都可以达到防止调用线程阻塞的目的,从而提高软件的响应能力。 甚至有时候我们觉得多线程和异步操作是等价的概念。 另外,多线程和异步操作之间仍然存在一些差异。 而这种差异就导致了使用多线程和异步操作的时机上的差异。

3 异步操作的本质

所有的程序最终都会由计算机硬件来执行,所以为了更好地理解异步操作的本质,我们需要了解它的硬件基础。 熟悉笔记本硬件的同事一定对DMA这个词不陌生。 硬盘和光驱的技术尺寸都有明确的DMA模式指标,虽然网卡、声卡、显卡也有DMA功能。

DMA的意思是直接显存访问,也就是说具有DMA功能的硬件在与显存交换数据时不消耗CPU资源。 只要CPU在发起数据传输时发出指令,硬件就开始自行与显存交换数据。 传输完成后,硬件会触发中断,通知操作完成。 这种不消耗CPU时间的I/O操作是异步操作的硬件基础。 所以虽然在像DOS这样的单进程(但无线程概念)系统中,也可以发起异步DMA操作。

4 线程的本质

线程不是计算机硬件的功能,而是操作系统提供的逻辑功能。 线程本质上是进程中并发运行的一段代码,因此线程需要操作系统投入CPU资源来运行和调度。

5 异步操作的异同

由于异步操作不需要额外的线程负担,并且以反弹的形式进行处理,因此在设计良好的情况下,处理函数不需要使用共享变量(虽然不能完全使用,但至少共享数量可以减少变量),减少死锁的可能性。 事实上,异步操作并不完美。 编译异步操作的复杂度比较高,程序主要以反弹的形式进行处理,与普通人的思维方式有些不同,但无法调试。

php 轮询-不用看,同步异步、阻塞、非阻塞等面试中用到的基本概念都在这里了

6 多线程的异同

多线程的优点是显而易见的。 线程中的处理程序仍然是顺序执行的,符合普通人的思维习惯,因此编程简单。 而多线程的缺点也同样显着,线程的使用(滥用)会给系统带来额外的上下文切换负担。 但线程之间共享变量可能会导致死锁。

异步和多线程,从辩证关系来看php 轮询,异步和多线程并不是一个平等的关系,异步是目的,多线程只是我们实现异步的一种手段。 什么是异步:异步是指向被调用方发送调用请求,调用方不等待其结果的返回。 要实现异步,可以使用多线程技术或者交给另一个进程来处理。拓展:多线程基础系统知识列表

异步、多线程和并行三者的区别? (故事)

对于非专业人士,我们用非专业的语言来解释一下。 这个比喻不太恰当,但大致意思是,

先听我讲个故事:

那是10年前的事了,12306之前,你只能在高铁站买票。 既然大家都要回去过年,那就不想等了。 高铁站只有一个,窗户也只有这么多。 很头疼。 更难受的是那种在窗口排队的人都是各种挑剔,不要贵的,不要早的,不站票……各种墨迹都带着售票员们,旁边的人越来越着急,义愤填膺,骂爸爸、骂泥巴。

现在假设整个城市只有一列火车和一名售票员。 在咨询售票员后,每位乘客需要思考1分钟才能决定购买哪趟车次。

1.异步:买票的人咨询后,要思考一分钟,立即站到一边,但不需要再次排队。 弄清楚后,他可以立即去找售票员补票。 正当那人站在门口思考的时候,旁边的人赶紧起身继续购买。 这时,队列移动得很快,没有阻塞,售票员最大限度地提高了效率。

2、多线程:在高铁站打开n个窗口(但仍然只有一个人卖票),外面同时有n个队列。 售票员回答完咨询员的问题后,立即起身到下一个窗口,然后继续轮流到下一个窗口……窗口的人已经做出了决定,售票员立即走到了下一个窗口。买给他。 此时的乘客都比较单纯,但如果那种队伍中有人想了半天,闹了事,旁边的人就惨了。

3、并行:复制n个火车站,同时售票,大大提高买票能力。 也可以去人少的高铁站,这样就可以付车费了。

可见,当只有一个火车站、只有一名售票员时,一个接一个地出售,会造成资源浪费、效率低下、队伍被卡住、难以前进。 1和2的优化方法解决了团队不动、售票率低的问题。 不过是降低火车站、降低车窗、降低售票员的好办法。拓展:多线程基础系统知识清单

推理:

1、异步和多线程其实效率差不多,而且没有像3这样打开的窗口很多。同时,当很多人花5分钟而不是1分钟去担心时,多线程的效率是其实比异步的要高一些,因为售票员还是经常会遇到3个队伍同时卡在那里,郁闷死了,卖不出去票。

2.这两个概念也有点不适合比较,因为它们不是一个概念。 多线程的目的是实现异步,多线程应该是实现异步的手段。 异步应该与同步进行比较。

php 轮询-不用看,同步异步、阻塞、非阻塞等面试中用到的基本概念都在这里了

3、多线程比较简单,但是需要加窗口降低成本,导体也累。 这个和apache下的php、node类似。 js下的javascript的关系,一个是多线程、阻塞,一个是单线程、异步、非阻塞。 php方案更符合常规思维,但是比较耗费内存,node.js Node.js 是非阻塞的,完成同样的任务需要更少的资源,但编程比较耗费人力。

4.并行,类似于使用多核cpu的每个核心同时进行估算。 并发可以分为伪并发和真并发。 后者是指单核处理器的并发,而前者是指多核处理器的并发。

5、最终的办法就是并行计算,在每个cpu下进行异步计算,这样你的每个核心都能充分利用。 只是编程要求太高,如果不是密集估算,比如小规模的有限元估算(多用并发),或者服务器同时处理几千个访问(异步或多线程居多)用过),还是老老实实的用传统的方法吧,虽然常规程序的估计量对于现在的硬件来说问题不大。拓展:多线程基础系统知识清单

四种阻塞非阻塞和同步异步的区别? (故事)

了解同步阻塞、同步非阻塞、异步阻塞、异步阻塞、异步非阻塞

同步/异步侧重于消息通知的机制,而阻塞/非阻塞侧重于程序(线程)等待消息通知的状态。

以小明下载文件为例,从这两个关注点再次解释一下这两套概念,希望能够更好地促进大家的理解。

同步阻塞:小明依然盯着下载进度条,到了100%就完成了。

同步非阻塞:小明提交下载任务后,就去做其他事情。 他时不时的看一眼进度条,看到100%的时候就完成了。

异步阻塞:小明换了一个有下载完成通知功能的软件,下载完成就会有“叮”的一声。 但小明还在等待“叮”的一声(看起来很傻,不是吗)。

异步非阻塞:一直都是那种会发出“叮”的下载软件。 小明提交下载任务后,就去做其他事情了。 当他看到“叮”的一声,就知道已经完成了。

也就是说,同步/异步是“下载完成消息”通知的形式(机制),而阻塞/非阻塞是等待“下载完成消息”通知过程中的状态(可以做其他任务吗) ,在不同的场景下,同步/异步和阻塞/非阻塞四种组合都适用。

因此,综上所述php 轮询,同步和异步只是如何通知关注的消息的机制,而阻塞和非阻塞则关注的是等待消息通知时的状态。 也就是说,在同步情况下,消息处理程序等待消息被触发,而在异步情况下,触发机制通知消息处理程序,所以在异步机制中,消息处理程序和触发器之间的关系机制 之间需要一个连接桥梁:

在小明的例子中,桥接是软件的“叮”声。

同步/异步和阻塞/非阻塞1同步阻塞模式

效率最低,

就拿里面的例子来说,就是你专心等待下载完成,其他什么都不做。

实际程序中:是没有给fd设置O_NONBLOCK标志的读/写操作;

2 异步阻塞模式

异步操作可以被阻塞,但不是在处理消息时阻塞,而是在等待消息通知时阻塞。

例如,在select函数中,如果最后传入的超时参数为NULL,那么如果没有触发相关事件,程序仍然会阻塞在select调用处。

3 同步非阻塞模式

实际上效率很低,

想象一下,您需要在做其他事情的同时查找下载是否完成。 如果把做其他事情和观察下载完成的位置看成是程序的两个操作,那么这个程序需要处于这两种不同的行为。 可以想象,在它们之间来回切换效率很低。

很多人都会写阻塞读/写操作,别忘了可以给fd设置O_NONBLOCK标志,这样就可以让同步操作成为非阻塞的。

4种异步非阻塞方法

更高的效率,

由于等待下载完成是你的工作(服务员),通知你是笔记本的工作(消息触发机制),所以程序不会在两个不同的操作之间来回切换。

到目前为止,我们已经讨论了进程线程、同步和异步、阻塞和非阻塞以及并发并行性。 如果有什么不好的地方,还请大家指出。 同时感谢网上大鳄的文章帮助我理解了这个概念。

参考链接:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php 轮询-不用看,同步异步、阻塞、非阻塞等面试中用到的基本概念都在这里了 https://www.wkzy.net/game/173929.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务