您的当前位置:首页>全部文章>文章详情

【PHP】进程、线程、协程的关系

CrazyPanda发表于:2025-03-21 09:35:06浏览:48次TAG: #php

一、进程、线程和协程
(一)进程和线程的基本概念
一个程序至少一个进程,一个进程至少一个线程。

进程: 是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态的概念,竞争计算机系统资源的基本单位;
线程: 是进程的一个执行单元,是进程内的调度实体,比进程更小的独立运行的基本单位,线程也被称为轻量级进程。

假设你在电脑上运行一个音乐播放器软件,比如常见的音乐播放器。

这个音乐播放器是一个进程,它拥有自己的内存空间和资源。你可以在操作系统中看到这个音乐播放器的进程。这个进程负责整个音乐播放过程的管理和控制,比如用户界面的显示、接收用户输入、加载音乐文件等。
在这个进程中,可能会有多个线程来处理不同的任务。比如:UI 线程:负责显示用户界面,接收用户的操作,如播放、暂停、调节音量等。音频解码线程:负责解码音频数据,将音频数据转换成数字信号以便输出到音频设备。播放控制线程:负责控制音乐的播放进度,包括开始播放、暂停、停止等操作。后台任务线程:可能会有一些后台任务,比如加载音乐文件、更新播放列表等,这些任务可能会在后台线程中执行,以免阻塞 UI 线程。
通过多线程的方式,音乐播放器可以实现同时进行多个任务。

(二)线程的意义
每个进程都有自己的地址空间,即进程空间。在网络环境下,一个服务器通常需要接收不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通,因此操作系统中线程概念被引进。
线程的执行过程是线性的,尽管中间会产生中断或者暂停,但是进程所拥有的资源只为该线状执行过程服务,一旦发生线程切换,这些资源需要被保护起来。
进程分为单线程进程和多线程进程,单线程进程宏观来看也是线性执行过程,微观上只有单一的执行过程。多线性进程宏观上是线性的,微观上多个执行操作。

(三)进程和线程的对比

相同点: 线程和进程两者均可并发执行。

 

区别 线程 进程
本质区别 线程是处理器任务调度和执行的基本单位 进程是操作系统资源分配的基本单位
地址空间 同一进程中的线程共享本进程的地址空间 进程之间是独立的地址空间
资源拥有 同一进程内的线程共享进程的资源如内存、I/O、CPU等,一个线程崩溃可能导致整个进程都死掉 进程之间的资源是独立的,一个进程崩溃后,在保护模式下不会对其他进程产生影响
执行过程 每个独立的线程都有一个程序运行的入口、顺序执行序列和程序出口,但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。(线程是基于进程的)  
其他 线程是处理器调度的基本单元 进程不是处理器调度的基本单元

进程和线程的优缺点:

线程执行开销小,但是不利于资源的管理和保护;
进程执行开销大,但是能够很好的进行资源管理和保护,多进程比多线程健壮。
何时使用多进程,何时使用多线程:

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。(CPU密集型任务)
要求效率高,切换频繁时,资源的保护管理要求不是很高时,使用多线程。(I/O密集型任务)
(四)协程
协程: 是一种轻量级的线程,因此又称微线程。它不是由操作系统内核调度,而是由程序员自己控制调度的执行流程。

(协程是用户视角的一种抽象,操作系统并没有协程的概念。协程运行在线程之上,协程的主要思想是在用户态实现调度算法,用少量线程完成大量任务的调度。)

协程的特点:

协程类似于子程序,但执行过程中,协程内部可中断,然后转而执行其他的协程,在适当的时候再返回来接着执行,从而实现一种灵活的并发编程方式。协程之间的切换不需要涉及任何系统调用或任何阻塞调用。
协程中不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
协程运行在线程之上,更加轻量级,协程并没有增加线程总数,只是在线程的基础之上通过分时复用的方式运行多个协程,大大提高工程效率。

协程适用于有大量I/O操作业务的场景,可以到达很好的效果,一是降低了系统内存,二是减少了系统切换开销,因此系统的性能也会提升。在协程中尽量不要调用阻塞I/O的方法,比如打印,读取文件等,除非改为异步调用的方式,并且协程只有在I/O密集型的任务中才会发挥作用。

假设存在一个任务是在电脑上同时下载多个文件,并在下载完成后将它们合并成一个文件。我们可以用进程、线程和协程来实现这个任务。

使用多个进程来同时下载多个文件,每个进程都有自己的内存空间和资源。 比方说创建一个进程来下载第一个文件,另一个进程来下载第二个文件,以此类推。下载完成后,每个进程将下载的文件传递给主进程,主进程负责将它们合并成一个文件。
使用多个线程在同一个进程中并发下载多个文件。 线程共享同一个进程的资源。比如在一个程序中创建多个线程来同时下载多个文件,每个线程负责下载一个文件。线程之间可以共享内存,因此可以在下载完成后直接合并文件,不需要传递数据给主线程。
使用协程来异步下载多个文件。 在 Python 中,可以使用 asyncio 来创建协程。先定义一个异步函数来下载文件,然后在一个事件循环中同时运行多个异步函数。在下载完成后,利用异步的方式将文件合并成一个文件,不需要阻塞其他协程的执行。

 

二、并行和并发
并行和并发是计算机科学中常用的两个概念,它们描述了程序执行的不同方式。

(一)并行(Parallelism)
并行指的是在同一时刻执行多个任务或指令,通常是在多个处理单元(如多个 CPU 核心或多个 GPU 核心)上同时执行。
每个任务都是独立执行的,彼此之间不会受到影响,且执行顺序不受限制。
并行的目标是通过同时处理多个任务来提高整体的计算速度。
(二)并发(Concurrency)
并发指的是在相同时间段内执行多个任务,这些任务可能会交替执行,但并不一定是同时执行的。
多个任务之间可能会共享资源,因此需要考虑资源竞争和同步问题。
并发的目标是更高效地利用计算机资源,提高系统的吞吐量和响应性。

(三)单个cpu一次只能运行一个进程吗

单个 CPU 一次只能执行一个进程的指令,但是通过操作系统的进程调度机制,可以实现多个进程在 CPU 上轮流执行,使得它们在表面上看起来是同时运行的。操作系统会根据一定的调度算法,将 CPU 的时间分配给不同的进程,从而实现多任务处理。

简而言之,并行是指同时执行多个任务,而并发是指在同一时间段内处理多个任务。并行通常需要硬件支持(如多核处理器),而并发则可以在单核处理器上通过多线程或时间片轮转等技术实现。

 

猜你喜欢

【PHP】SQL查询优化方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表
发表于:2024-07-15 浏览:262 TAG: #mysql
【PHP】interface接口、abstract抽象类、trait转载合并
1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类。 2 .抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。 3 .如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。
发表于:2025-03-21 浏览:51 TAG: #php
【PHP】PHP8.1新特性大讲解之纯交集类型
纯交集类型 (Pure intersection types)您已经了解PHP 8.0 中的联合类型,交集类型也是一个类似的特性。联合类型要求输入是给定类型之一,交集类型要求输入是所有指定类型。当您使用大量接口时,交集类型特别有用:function generateSlug(HasTitle&HasId $post) {     return strtolower($post->getTitle())&
发表于:2024-01-04 浏览:289 TAG:
【PHP】thinkphp利用缓存提高数据库查询性能
ThinkPHP是一款十分受欢迎的PHP框架,它提供了许多便捷的功能和优化的设计,使得开发者可以更高效地进行Web应用程序的开发。其中,利用缓存提高数据库查询性能是一个常见的优化手段。本文将分享一些关于如何在ThinkPHP中利用缓存提高数据库查询性能的经验。一、什么是缓存?缓存是指将经常查询的数据存储在快速访问的存储介质中,以提高数据的访问速度。在Web应用程序中,数据库是最常用的数据存储介质之一。而经常查询数据库会带来一定的性能压力。因此,利用缓存可以避免频繁地查询数据库,从而提高
发表于:2023-12-08 浏览:430 TAG:
【PHP】CI,ThinkPHP,YII,Laravel框架比较
用过其中的yii TP CI框架。大概整理了这些框架的优点和缺点,有些错误的地方还希望大家指正。各个框架各有所长,针对的应用场景不同。一、Ci框架推崇简单就是美这一原则,没有花哨的设计模式,没有华丽的对象结构,一切就是那么简单。优点:框架的入门槛很低,极易学,极易用,框架很小,静态化非常容易配置简单,全部的配置使用php脚本来配置,执行效率高缺点:架构略简单,只能满足小型应用,略微不太能够满足中型应用需要大型项目扩展能力差,有些功能需要自己写扩展数据库类的扩展 ci给用户提供了一个名为call_
发表于:2024-07-14 浏览:316 TAG: #php #框架
【PHP】PHP依赖注入
PHP依赖注入(Dependency Injection,DI)是一种软件设计模式,可以减少代码耦合,使得类鱼类之间的依赖关系更加清晰。以下是一个简单的PHP依赖注入的例子:<?php   interface StorageInterface {     public function store($data); }   class DatabaseStorage im
发表于:2024-06-17 浏览:235 TAG:
【PHP】PHP防止XSS攻击的主流方法
概述跨站点脚本 (XSS) 是一种严重的安全漏洞,允许恶意行为者将恶意脚本引入网站,使毫无戒心的访问者处于危险之中。使用 XSS,攻击者可以在受害者的 Web 浏览器中执行任意代码,可能导致敏感数据被盗、未经授权的访问或网站污损。本文旨在深入探讨 XSS 攻击的主要形式,阐明其根本原因,探索 XSS 利用的潜在后果,并深入了解防止 PHP 中 XSS 攻击的有效措施。介绍当恶意行为者成功将有害脚本插入受信任的网站时,就会发生跨站脚本 (XSS) 攻击。这些受感染的网站在不知不
发表于:2024-07-14 浏览:242 TAG: #php
【PHP】php对象和数组区别是什么
php对象和数组区别是:1、对象是一个复合数据类型,而数组是一个简单的数据类型;2、对象的属性和方法可以通过对象的实例来访问,而数组的元素可以通过索引来访问;3、对象是一个封装了属性和方法的实体,而数组是一个有序的元素集合;4、对象在PHP中是通过引用来传递的,而数组在PHP中是通过值来传递的;5、对象适用于描述具有状态和行为的实体,而数组适用于存储和处理大量的相似数据。本教程操作环境:windows10系统、php8.1.3版本、DELL G3电脑。PHP是一种面向对象的编程语言,它
发表于:2023-12-06 浏览:366 TAG:
【PHP】Composer创建包,设置命名空间
在Composer创建的库中,给文件命名空间应遵循PSR-4自动加载标准。以下是简要步骤和示例:在库的根目录下创建一个名为 src 的目录,用于存放源代码。在 src 目录下创建你的库的 PHP 文件,并在文件顶部声明命名空间。在库的 composer.json 文件中指定自动加载配置。使用Composer的 dump-autoload 命令更新自动加载器。示例:假设你的库名为 example-library,你想要创建一个名为 ExampleClass 的类。步骤 1: 在 src 目录下创建
发表于:2024-08-28 浏览:373 TAG: #php #composer
【PHP】PHP获取毫秒值的五种方式
在PHP中,获取毫秒值可以通过以下几种方法实现: 1. 使用`microtime()`函数:    `microtime()`函数返回当前的Unix时间戳和微秒数。我们可以通过以下代码获取毫秒值:
发表于:2024-11-12 浏览:230 TAG: #php