让代码运行得更快:深入理解进程、线程和协程

让代码运行得更快:深入理解进程、线程和协程

什么是执行体

在深入探讨进程、线程和协程之前,我想先介绍下执行体这个概念。

执行体这个词语是我从七牛云创始人许式伟大佬的专栏中学到的,它代表操作系统中程序执行的载体,涉及到计算资源的分配、访问权限的控制等方面。我们经常提到的进程、线程和协程就是三种不同的执行体。

我们在谈论具体的某种执行体前,首先需要认识到各种执行体出现的根本原因,那就是提高CPU和内存的利用效率。如果我们不定义相应的执行体,CPU和内存就会被浪费掉,这对于计算机的性能是极大的浪费。比如说,我们正在看电影,但是突然想查看一下邮件,如果我们不将电影播放和邮件检查划分为不同的任务,那么我们就需要暂停电影,然后去查看邮件,然而对视频进行解码和从网络拉取邮件是可以并行的操作,这就浪费了CPU的计算能力。因此,合理的划分执行体是提高计算机性能的一个重要手段。

进程

进程是操作系统进行资源分配和调度的基本单位,它是程序运行的载体。

那么,我们为什么需要进程呢?

其实,这主要是为了满足操作系统的多任务需求。我们在使用电脑时,常常需要同时运行多个程序,比如上网、听音乐、写文档等等,这就需要操作系统能够同时处理多个任务,而进程就是实现这个功能的基础。

进程的创建在不同的操作系统中有所不同。在Unix/Linux/Mac中,我们主要使用fork函数来创建进程。而在Windows中,我们使用CreateProcess函数。这两个函数虽然在实现方式上有所不同,但是他们的目的都是创建一个新的进程。

进程有两个重要的特征。

一是内存地址空间隔离,也就是说,每个进程都有自己独立的内存空间,这保证了进程之间不会相互干扰。

二是操作系统内核调度,也就是说,进程的运行是由操作系统内核来调度的,它决定了哪个进程先运行,哪个进程后运行,内核可以在一定程度上保障资源在不同进程之间的合理分配。

线程

线程是比进程更小的执行单位,它是进程内部的独立执行路径。

我们为什么需要线程呢?

这是因为我们在开发一个软件时,常常需要在软件内部进行多任务处理,比如我们在编写一个文档时,可能需要同时进行拼写检查、保存文档等任务,这就需要我们在软件内部创建多个线程来处理这些任务。

线程的特征和进程有些相似,但也有一些不同。

线程同样是由操作系统内核调度的,但是线程之间是共享进程内存地址空间的,这意味着同一个进程内的线程可以访问到相同的数据。

此外,每个线程都有自己的栈,栈的大小在不同的操作系统中有所不同,比如在Linux中,默认线程栈是8M,而在Windows中,默认线程栈是1M。

协程

协程是一种比线程更轻量级的执行单位,它主要用于处理高性能的网络服务需求。

为什么我们需要协程呢?

这是因为在处理高性能网络服务时,我们常常需要使用异步IO,但是异步IO会导致大量的回调逻辑碎片化,这对于我们的编程是非常不利的。因此,我们需要回归到同步IO编程模式,而协程就是实现这个目标的一个重要工具。

协程的特征有三点。

一是它同样共享进程内存地址空间;

二是它由用户程序调度,这意味着我们可以在程序中自由地创建和销毁协程;

三是它无栈或者有较小的栈,这使得我们可以创建大量的协程而不用担心内存消耗。

此外,协程切换的时间成本也比较低。这是因为协程切换是在用户态进行,避免了频繁的内核态和用户态切换,节省了大量的CPU指令。同时,由于协程的上下文结构简单,保存和恢复的开销小,而且由程序自身控制切换时机,可以避免在关键路径上进行切换,这些都大大降低了切换的时间成本。

目前对协程支持的比较好的语言有Go和Erlang,其它语言如C#、Java、Javascript等对协程也有一定的支持。


总结起来,进程、线程和协程都是为了提高CPU和内存的利用率,满足多任务处理的需求,他们在创建方式、特征和应用场景上各有不同,但都是为了让我们的计算机运行得更高效。希望通过这篇文章,大家对计算机的执行体有了更深入的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331985.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

makefile,make,gcc/g++ 编译流程分析

文章目录 makefile,make,gcc/g 编译流程分析 makefile,make,gcc/g 编译流程分析 C实现加减乘除四个运算 // // Created by qiufh on 2024-01-17. //#include "add.h"int add(int a, int b) {return a b; } // // Cre…

C++的命名空间域

一、域作用限定符 :: 即是域作用限定符,它的作用是指明一个标识符(变量、函数或类)来自哪一个作用域范围 二、编译器搜索变量、函数等的原则 1.先搜索局部变量,2.再搜索全局变量,3.最后搜索指定的命名空间域 三、…

python数字图像处理基础(十)——背景建模

目录 背景建模背景消除-帧差法混合高斯模型 背景建模 背景建模是计算机视觉和图像处理中的一项关键技术,用于提取视频中的前景对象。在视频监控、运动检测和行为分析等领域中,背景建模被广泛应用。其基本思想是通过对视频序列中的像素进行建模&#xff…

构建中国人自己的私人GPT—限时免费部署

在现实生活中,很多公司或个人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的本地专属GPT变得非常重要。 先看效果: 解方程,24小…

用友GRP-U8 obr_zdybxd_check.jsp SQL注入漏洞复现

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 obr_zdybxd_check.jsp 接口处存在SQL注入漏洞…

day-13 拿出最少数目的魔法豆

思路 将beans的每个数值当做袋子最后豆子剩余数,选择取豆子最少的一种方案 解题方法 //从小到大,将每个beans[i]作为剩余豆子数 //对于beans[i],i之前的全为零,i之后的全变为beans[i] ansMath.min(ans,sum-(beans.length-i)*bean…

esp32-idf eclipse 定时器的使用demo

esp32定时器的使用demo 1、介绍 ESP32芯片包含两个硬件定时器组。每组有两个通用硬件定时器。它们都是基于16位预分频器和64位自动重载功能的向上向下计数器的64位通用定时器。 2、API接口函数 创建定时器函数: esp_timer_create(); esp_err_t esp_timer_create …

动态pv(nfs方式挂载)

1、定义 发布pvc之后可以生成pv,还可以在共享服务器上直接生成挂载目录 pvc直接绑定和使用pv 2、动态pv依赖两个组件 (1)provisioner卷插件:k8s本身支持的动态pv创建不包括nfs,需要声明和安装一个外部插件provisio…

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"oh…

「优选算法刷题」:盛最多水的容器

一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器…

第29关 阿里云开源的k8s容器秒级事件监控软件-Kube-eventer

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。这节课给大家分析一款K8S上宝藏级秒级事件监控报警的开源软件kube-eventer&#xff0c;它是由阿里云开源的&#xff0c;并且难得的还一直有在更新。 天下武功&#xff0c;唯快不破。对于报警监…

ClickHouse学习笔记(六):ClickHouse物化视图使用

文章目录 1、ClickHouse 物化视图2、物化视图 vs 普通视图3、物化视图的优缺点4、物化视图的用法4.1、基本语法4.2、准备表结构4.3、准备数据4.4、查询结果 1、ClickHouse 物化视图 ClickHouse 的物化视图是一种查询结果的持久化&#xff0c;它的存在是为了带来查询效率的提升…

鸿蒙OS4.0兼容性测试

背景 OpenHarmony兼容性测评主要是验证合作伙伴的设备和业务应用满足OpenHarmony开源兼容性定义的技术要求&#xff0c;确保运行在OpenHarmony上的设备和业务应用能稳定、正常运行&#xff0c;同时使用OpenHarmony的设备和业务应用有一致性的接口和业务体验。 OpenHarmony兼容…

MySQL存储函数和存储过程练习题

一、创建表的要求 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) …

Peter:经济形势不好,一个最大的原因就是诚信道德的缺失 | 程客有话说002

《程客有话说》是我们最新推出的一个访谈栏目&#xff0c;邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事&#xff0c;我们尝试建立一个程序员交流与学习的平台&#xff0c;也欢迎大家推荐朋友或自己来参加我们的节目&#xff0c;一起加油。本期我们邀请的程序…

【前端设计】输入框

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

python数字图像处理基础(六)——模板匹配、直方图

目录 模板匹配概念单对象模板匹配多对象模板匹配 直方图1.查找直方图2.绘制直方图3.掩膜的应用 模板匹配 概念 模板匹配和卷积原理很像&#xff0c;模板在原图像上从原点开始滑动&#xff0c;计算模板与图像被模板覆盖的地方的差别程度&#xff0c;这个差别程度的计算方法在o…

基于WEKWS模型的语音唤醒关键词识别

一、模型描述 1.1 论文解读 本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》&#xff0c;文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络&#xff08;cFSMN&#xff09;用…

中北数据结构2023真题

雪雾: 设计一个算法&#xff0c;将一个节点值为自然数的单列表拆分成两个单列表&#xff0c;原表中值为偶数的节点保留&#xff0c;而值为奇数的节点&#xff0c;按他们在原表的相对次序组成一个新的单列表 #include <stdio.h> #include <stdlib.h>typedef struct…

一文教你V3+TS(保姆级教程)

TS 与 JS 的区别 基础类型 ts 的常用类型 ts 的常用基础类型分为两种&#xff1a; js 已有类型 原始类型&#xff1a;number/string/boolean/null/undefined/symbol 对象类型&#xff1a;object&#xff08;包括&#xff0c;数组、对象、函数等对象&#xff09; 每次编写前…