当前位置: 首页 > news >正文

徐州提供网站建设要多少钱杭州房产网我爱我家官网

徐州提供网站建设要多少钱,杭州房产网我爱我家官网,最大的网站建设公司,网页模板下载在线1.资源消耗 调度方式:线程由操作系统内核调度(抢占式),协程由程序自己控制调度(协作式)。切换开销:线程切换涉及内核态与用户态的转换,开销大;协程只在用户态切换上下文…

1.资源消耗

  • 调度方式:线程由操作系统内核调度(抢占式),协程由程序自己控制调度(协作式)。
  • 切换开销:线程切换涉及内核态与用户态的转换,开销大;协程只在用户态切换上下文,开销小。
  • 状态保存:线程保存寄存器、栈、指令指针等完整上下文;协程只保存少量栈、程序计数器等上下文。
  • 资源隔离: 各线程有自己的堆栈,数据隔离;同一进程内协程共享内存,需注意同步。

线程创建 & 销毁

  • 创建:需要申请内核资源(线程栈、PCB 等),大约消耗 几 MB 内存

  • 销毁:回收内核资源,代价也不小

  • 上下文切换:涉及用户态/内核态切换,保存寄存器、栈、内存页表,切换一次可能 耗时 1000ns+

协程创建 & 销毁

  • 创建:只需要申请一小段栈空间(一般几 KB),几乎不涉及内核资源

  • 销毁:内存回收代价极小

  • 上下文切换:只保存少量寄存器和栈,切换一次只需 几十纳秒(几乎不感知)。可以理解为用户态的调度器。

2.适用情况

👉 总结一句话

  • 线程是“重装战士”,适合 多核并行 + CPU 密集型任务

  • 协程是“敏捷刺客”,适合 高并发 IO 密集型任务

3.内核态和用户态

🔍 线程为什么开销高

  • 用户态 ↔️ 内核态:涉及 系统调用syscall),需要 切换模式,如 read()write() 都要从用户态陷入内核态。涉及到操作系统调用。

  • 内核栈切换:每个线程都有独立内核栈,切换需要重新加载。

  • 缓存失效:切换线程可能导致 CPU 缓存失效,重建 TLB(地址翻译缓存)也增加延迟。

💥 开销对比

  • 线程切换(内核调度):大约 1000ns+

  • 进程切换(内核调度 + 页表切换):大约 几微秒

  • 协程切换(用户态调度):大约 几十纳秒

4.代码例子

chatgpt给出的切换线程和协程的耗时,在数量都是1w的情况下,切换协程的耗时居然比较高,数量如果达到10w,是线程切换的耗时比较高。

package mainimport ("fmt""runtime""sync""time"
)const (numGoroutines = 100000numThreads    = 100000
)// 模拟一个消耗时间的任务
func doTask(id int, ch chan int, wg *sync.WaitGroup) {defer wg.Done()// 模拟一些计算任务for i := 1; i < 1000; i++ {_ = (i * i) % id}ch <- id
}// 记录线程切换时间
func measureThreadSwitching() {start := time.Now()var wg sync.WaitGroupfor i := 1; i < numThreads; i++ {wg.Add(1)go func(id int) {defer wg.Done()// 模拟一个计算任务_ = id * id}(i)}wg.Wait()elapsed := time.Since(start)fmt.Printf("Thread switching took: %v\n", elapsed)
}// 记录协程切换时间
func measureGoroutineSwitching() {start := time.Now()var wg sync.WaitGroupch := make(chan int, numGoroutines)for i := 1; i < numGoroutines; i++ {wg.Add(1)go doTask(i, ch, &wg)}wg.Wait()elapsed := time.Since(start)fmt.Printf("Goroutine switching took: %v\n", elapsed)
}func main() {// 设置 Go 运行时使用多个 CPU 核心runtime.GOMAXPROCS(runtime.NumCPU())// 测量线程切换的时间fmt.Println("Measuring thread switching...")measureThreadSwitching()// 测量协程切换的时间fmt.Println("Measuring goroutine switching...")measureGoroutineSwitching()
}

http://www.dtcms.com/a/528067.html

相关文章:

  • 鸿蒙NEXT系列之NDK UI监听组件事件
  • 20251025 分治总结
  • CentOS上安装dpkg的方法
  • 【C++ 泛型编程】基于哈希表封装 unordered_set(附完整源码解析)
  • 【Docker】docker部署一个服务
  • 【C++】set map 的使用
  • mormot.net.sock.pas的总体设计分析
  • 上海企业网站制作哪家专业wordpress适合做大型网站吗
  • 建设银行网站怎么看不见余额数字展馆设计
  • 【数组二分查找+数组反转】2022-11-19
  • 【新版发布】标准版PHP v5.6.4正式版,优化部分用户体验
  • Spring Boot3零基础教程,Profile 环境隔离用法,笔记55
  • 【MATLAB例程】二维环境定位,GDOP和CRLB的计算,锚点数=4的情况(附代码下载链接)
  • 英语“近音“易混单词
  • 代码随想录Day62|总结篇
  • 基于VMware和Cent OS的Docker Engine安装与配置
  • 十七、OpenCV中HighGUI模块的介绍和使用
  • 【JVM】详解 编译器原理与优化技术
  • 良好形象的重要性----反思
  • kali抓包流量
  • Python 正则表达式深度解析与实战指南
  • 开源 Linux 服务器与中间件(十二)FRP内网穿透应用
  • 石家庄网站建设王道下拉棒wordpress 类似
  • 基于AT89C52单片机的计算器设计与仿真
  • AI研究-112 DeepSeek-OCR 发展背景 走红原因 新型任务与潜在研究方向 详细分析 附最小运行测试
  • STC32G144K246,高速PWM@240Mhz 运行测试
  • OpenHarmony轻量级内核LiteOS-M技术详解与应用实践
  • hive自定义函数
  • 做新媒体每天必看的网站wordpress exif
  • Elasticsearch从入门到进阶——分布式特性