TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码
搜索到 4 篇与 的结果
2025-08-06

Linux内核进程调度探秘(上):从时间片到完全公平调度

Linux内核进程调度探秘(上):从时间片到完全公平调度
一、调度器的使命:CPU时间分配的艺术家在Linux系统的核心,调度器如同一位看不见的指挥家,决定着每个进程何时能获得CPU资源。早期的Linux 2.4内核采用传统的时间片(Timeslice)轮转算法,每个进程被分配固定的时间片段(通常是100ms),通过时钟中断触发调度。但这种方式存在明显缺陷: 交互式进程响应延迟:文本编辑器等I/O密集型进程常因时间片耗尽被强制切换 静态权重不公:nice值调整的优先级权重线性变化,缺乏动态适应性 调度粒度粗糙:固定时间片无法适应现代多核处理器架构 c // 早期调度器代码片段(Linux 2.4) if (current->policy == SCHED_RR && !--current->time_slice) { current->time_slice = task_timeslice(current); move_last_runqueue(current); }二、CFS的革命:虚拟时间代替物理时间2007年引入的完全公平调度器(Completely Fair Scheduler...
2025年08月06日
36 阅读
0 评论
2025-08-06

Go协程与Pthread/Java线程的本质区别:轻量级并发的革命

Go协程与Pthread/Java线程的本质区别:轻量级并发的革命
一、从操作系统线程到用户态协程的进化当我们在Java中启动一个线程时,背后是操作系统内核通过pthread_create()创建一个内核级线程。这种线程的特点是: - 1:1映射到内核调度实体(KSE) - 典型内存占用8MB(默认栈大小) - 上下文切换需陷入内核(约1-2μs)java // Java线程示例 new Thread(() -> { System.out.println("Running in kernel thread"); }).start();而Go的协程(Goroutine)采用M:N用户态调度模型: go go func() { fmt.Println("Running in goroutine") }() 其核心差异在于: - 初始栈仅2KB(可动态扩容) - 由Go运行时(runtime)管理调度 - 上下文切换在用户态完成(约200ns)二、架构层面的本质差异1. 调度器设计| 维度 | Pthread/Java线程 | Go协程 | |-----...
2025年08月06日
31 阅读
0 评论
2025-08-01

充分利用多核处理器:Go语言的并发模型与性能优化,go语言如何利用多核

充分利用多核处理器:Go语言的并发模型与性能优化,go语言如何利用多核
一、为什么Go适合多核时代?当你的手机都用上8核CPU时,传统编程语言的线程模型已经显得笨重。Go语言2009年诞生时就瞄准了这个痛点——其创始人Rob Pike说过:"我们不是在用多核,而是在浪费多核"。Go通过Goroutine这个轻量级线程(仅2KB初始栈),让开发者能以极低成本启动数百万并发任务。对比Java线程(默认1MB栈)的创建开销,Goroutine就像超市的自助结账通道:- 传统线程:需要专人服务(内核调度)- Goroutine:自助扫码(用户态调度)二、Goroutine调度的魔法:GMP模型Go的调度器核心是GMP三件套:1. Goroutine:携带执行上下文2. Machine:操作系统线程(实际干活的人)3. Processor:逻辑处理器(任务分发员)go // 一个简单的并发示例 func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Printf("worker %d processing job...
2025年08月01日
31 阅读
0 评论
2025-07-26

Go协程与其他线程模型的本质差异:轻量级并发的革命

Go协程与其他线程模型的本质差异:轻量级并发的革命
一、线程模型的演进困境传统操作系统线程(如pthread)本质上属于内核态线程,每个线程的创建、销毁和调度都需要通过内核系统调用完成。这种设计带来两个致命问题: 内存开销大:默认栈空间约2-8MB(Linux环境下),千级线程即可耗尽内存 调度成本高:线程切换涉及用户态/内核态切换(约1-5μs),CPU寄存器全量保存/恢复 go // 传统线程示例(Java) new Thread(() -> { System.out.println("Thread running"); }).start();二、Go协程的降维打击Go语言在2009年推出的Goroutine采用用户态线程设计,关键技术突破包括:1. 两级调度体系 GMP调度模型: G(Goroutine):携带栈信息(初始仅2KB) M(Machine):绑定操作系统线程 P(Processor):逻辑处理器,维护本地运行队列 协作式抢占:通过函数调用边界插入调度点,避免内核态切换 2. 栈空间动态伸缩go func recursiveCall(n int) { if n == 0 { retur...
2025年07月26日
31 阅读
0 评论