Lecture 6: Processes 3, Threads

【十万字拆解】从零开始实现GPT-2(完整版) 本文是一篇 14 万字、从零硬核实现 GPT 的保姆级指南。内容全面覆盖四个阶段:①从最基础的 Bigram 语言模型切入,跑通数据处理与训练闭环;②仿照 Transformer 架构,深度研究 Multi-Head Attention、残差网络、LayerNorm 及 Dropout 的底层数学与代码实现;③从零构建BPE 分词器,对齐 GPT-2 规范;④从头搭建 GPT-1/2 工业级预训练流程,包含混合精度、梯度累积等十余项硬件级工程调优,并在 AutoDL 算力平台上从0开始训练!适合所有层次! 阅读详情

回顾:

  1. 调度器类型:抢占式/非抢占式,长期/中期/短期)
  2. 性能评价标准
  3. 调度算法:FCFS, SJF,轮询,优先队列

本章小结:

  • 线程与进程
  • 不同的线程实现
  • POSIX线程(PThreads)

线程

从操作系统的角度看线程

一个进程由两个基本单元组成:
1. 资源:将所有相关资源分组在一起

  • 包含进程映像(程序、数据、堆、栈)的逻辑地址空间。
  • 文件,I/O设备,I/O通道,…

2. 执行轨迹,即一个被执行的实体

一个进程可以在多个执行轨迹之间共享其资源,即在同一资源环境中运行的多个线程

单线程进程(左),多线程进程(右)

每个线程都有自己的执行上下文(例如程序计数器,堆栈,寄存器)

所有线程都可以访问进程的共享资源

  • 例如文件,一个线程打开一个文件,同一进程的所有线程都可以访问该文件
  • 全局变量,内存等(⇒同步!)

与进程类似,线程具有:

  • 状态和转换(新建、运行、阻塞、就绪、终止)(new, running, blocked, ready, terminated)
  • 线程控制块(TCB)
左边是共享资源,右边是私有资源

线程产生更少的创建/终止/切换开销(地址空间对于同一进程的线程保持相同)
一些cpu对多线程有直接的硬件支持:通常,每个内核最多可以提供8个硬件线程

线程间通信比进程间通信更容易/更快(线程默认共享内存)
地址空间中不需要保护边界(线程是合作的,属于同一个用户,并且有一个共同的目标)
必须仔细考虑同步!

为什么要使用线程

多个相关的活动应用于相同的资源,这些资源应该是可访问/共享的
进程通常包含多个阻塞任务

  • I/O操作(线程阻塞,中断标志完成)
  • 内存访问:页面错误导致阻塞

这些活动应并行/同时进行
应用实例:web服务器、制作程序、电子表格、文字处理器、处理大数据量

线程的操作系统实现

用户线程 User threads:多对一

线程管理(创建、销毁、调度、线程控制块操作)通过用户库在用户空间中完成
进程在内核不知情的情况下维护运行时系统管理的线程表

  • 类似于过程表
  • 用于线程切换
  • 跟踪线程相关信息

优点:

  • 线程位于用户空间(即,不需要模式切换)
  • 对线程调度程序的完全控制
  • 操作系统无关(线程可以在不支持它们的操作系统上运行)

缺点:

  • 阻塞系统调用会挂起整个进程(用户线程被映射到单个进程,由内核管理)
  • 没有真正的并行性(进程在单个CPU上调度)
  • 时钟中断是不存在的(即用户线程是非抢占的)
  • 页面错误导致进程阻塞 
User threads

内核线程 Kernel Threads:一对一

内核管理线程,用户应用程序通过API和系统调用访问线程设施

  • 线程表在内核中,包含线程控制块(进程控制块的子集)
  • 如果一个线程阻塞,内核将从相同或不同的进程中选择线程

优点:

  • 真正的并行是可以实现的
  • 不需要运行期系统

频繁的模式切换会导致性能下降
Windows和Linux应用这种方法

Kernel threads

混合实现 Hybrid Implementations:多对多

用户线程被复用到内核线程上
内核看到并调度内核线程(数量有限)
用户应用程序看到用户线程并创建/调度这些线程(数量不受限制)

Kernel threads
性能对比: 用户线程vs内核线程vs进程

Null fork:创建、调度、运行和终止空进程/线程的开销
信号等待:同步线程的开销

比较,单位为µs
线程的实现对比

线程管理:库(Libraries)

线程库提供了一个API/接口来管理线程。(例如,创建、运行、销毁、同步等)
线程库可以实现:

  • 完全在用户空间中(即用户线程)
  • 基于系统调用,即依赖内核进行线程实现

线程API的例子包括POSIX的PThreads, Windows Threads和Java Threads

  • PThread规范可以作为用户线程或内核线程实现

POSIX Threads

也被称为Pthreads,是POSIX标准的一部分,定义了一套用于创建和操纵线程的API。 它为操作系统级线程提供了统一的接口,使得在多种UNIX-like系统上编写可移植的多线程程序成为可能。 Pthreads提供了一套丰富的API,包括创建线程、销毁线程、线程同步和线程通信等操作。 这些API在C语言中定义,因此对于使用C语言进行多线程编程的 开发者 来说非常方便。

POSIX 线程 (Pthread)

深入理解 POSIX 线程 (pthread):从基础到高级应用-优快云博客https://blog.youkuaiyun.com/yangyangyiyang_/article/details/146888003

POSIX 线程是一种任何人都可以实现的规范,即它定义了一组 API(函数调用,超过 60 个)及其功能作用。
PThreads 的核心功能包括:

PThread的例子

欲获取更详细的描述,请在命令行中使用“man function_name”命令。

这段C程序演示了如何使用POSIX线程(pthread)创建多个线程,每个线程打印自己的ID:

  1. 主线程创建10个子线程,每个线程接收自己的ID作为参数

  2. 每个子线程执行hello函数,打印自己的ID

  3. 主线程等待所有子线程结束

  4. 程序退出

#include语句:

  • pthread.h:提供多线程相关函数

  • stdio.h:标准输入输出

hello线程函数:

void* hello(void* arg) {
    printf("Hello from thread %d\n", *((int*)arg));
    return 0;
}
  • 线程的入口函数,参数和返回值都是void*

  • 将参数转换为int*后解引用获取线程ID

  • 打印线程ID后返回0

创建线程的循环:

for(int i = 0; i < THREADS; i++) {
    args[i] = i;  // 设置线程参数
    if(pthread_create(threads + i, NULL, hello, args + i)) {
        printf("Creating thread %d failed\n", i); 
        return -1;
    }
}
  • pthread_create参数:

    • 线程标识符的地址

    • 线程属性(这里为NULL表示默认)

    • 线程函数

    • 传递给线程函数的参数

  • 如果创建失败返回非零值,程序退出

等待线程结束的循环:

for(int i = 0; i < THREADS; i++)
    pthread_join(threads[i], NULL);
  • pthread_join等待指定线程结束

  • 第二个参数可以接收线程返回值(这里不需要设为NULL)

阿里开源最强数字人工具 EchoMimicV2,本地部署(一) EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。 阅读详情

相关推荐

Diffusion:如何从噪声中生成清晰图像

扩散模型是当前AI图像生成领域的核心基础,如Stable Diffusion、DALL·E等热门模型均采用该技术。其原理分为训练和推理两个阶段:训练时通过逐步加噪图片,让AI学习如何去除噪声;推理时则从随机噪声出发,结合文本提示逐步去噪生成清晰图像。模型架构通常包含文本编码器、生成模型(如U-Net)和解码器三部分,通过多轮迭代将低维潜在空间表示转化为最终图像。这种技术模拟了艺术家从混沌中雕琢作品的过程,实现了从随机噪声到目标图像的智能生成。

laumy的学习笔记 1275

鸿蒙操作系统实现应用接续跨设备流转实战

应用接续的落地成本很低:一个配置、一个onContinue回调、一处 launchReason 判断,合计不足百行代码,就能让任务在手机、平板、鸿蒙电脑之间无缝续接。随着互助通信共享等组网能力在更多机型下放,这条能力的实用价值会持续放大,建议交互密集型应用尽早接入。

NJPJI_Yang的博客 357

ESP-Mesh-Lite vs ESP-Mesh:如何选择适合你的物联网组网方案?

本文深入对比了乐鑫ESP-Mesh-Lite与ESP-Mesh两种物联网组网方案的核心差异。重点解析了ESP-Mesh-Lite分布式协议栈架构的优势,即每个节点拥有独立IP,可直接访问外部网络,极大简化了应用层开发。文章从网络架构、性能、开发体验及适用场景等多维度进行分析,为开发者根据项目需求(如分布式数据采集、智能家居或集中控制网络)选择最合适的方案提供了清晰的决策框架。

pluto的博客 816

【Linux】APT 本地 deb 安装与 `-f` 参数总结笔记

apt install ./xx.deb 可自动解析并安装依赖,无需 -f;-f 仅用于修复已损坏的依赖状态,非首次安装时必需。apt install -f 可单独运行,修复 broken dependencies。两者职责不同:前者是安装与依赖解决,后者是故障修复。完全离线时需提前准备依赖包或本地源。

hknaruto的专栏 211

泰山派RK3576开发板部署Qwen3-VL-4B多模态模型实战指南:从模型转换到板端推理全流程

本文提供了在泰山派RK3576开发板上部署阿里Qwen3-VL-4B多模态模型的完整实战指南。详细介绍了从环境准备、模型转换(包括视觉模型转换为.rknn格式和语言模型转换为.rkllm格式)、交叉编译到板端推理的全流程,重点讲解了如何利用RK3576的NPU进行硬件加速,实现高效的边缘AI应用。

weixin_30356433的博客 257

Intel Mobileye EyeQ Ultra:RISC-V架构的L4自动驾驶芯片解析

RISC-V作为开源指令集架构,凭借其模块化设计和可定制特性,正在重塑高性能计算领域。其精简指令集带来的确定性执行时序,特别适合自动驾驶等实时性要求严苛的场景。在异构计算架构中,RISC-V与专用加速器(如NPU、GPU)的协同设计,能显著提升能效比和算力密度。Mobileye EyeQ Ultra采用12核RISC-V集群,结合176TOPS AI加速器和5nm工艺,实现了L4级自动驾驶所需的实时感知与决策能力。这种架构为车载计算平台提供了可扩展的解决方案,同时降低了系统复杂度和BOM成本。

weixin_33245447的博客 426

【Linux网络】TCP 服务器并发处理多客户端:从 fork 分发到双重 fork 彻底消灭僵尸进程

拆解 TCP 服务器并发演进链:fork 分发连接、SIGCHLD 循环回收僵尸、双重 fork 交孙进程给 init 收养,并给出模型选型与线上排错对照。

2301_78967866的博客 421

微信聊天记录数据库解密实战:从WCDB到sqlcipher4的关键步骤解析

本文详细解析了微信桌面版聊天记录数据库的解密实战过程。通过逆向分析,定位了微信从WCDB框架到sqlcipher4加密的关键步骤,并成功提取了数据库密钥。文章重点介绍了如何通过动态调试、字符串定位等方法,追踪并验证sqlcipher4的加密密钥,最终实现对加密数据库文件的解密操作,为安全研究和数据恢复提供了技术参考。

weixin_29322553的博客 1071

Linux rm 误删文件恢复实操教程

Linux使用rm删除文件时,并不会直接抹除磁盘上的数据,只是移除文件索引,让系统不再识别这块空间。只要没有写入新数据,原有扇区内容就会保留。新文件写入才有可能覆盖这些区域,一旦覆盖就很难找回。恢复的本质就是扫描磁盘,找到这些还存在、但索引丢失的数据条目,再把它们导出保存到其他分区。越早停止写入,恢复成功的概率越高。

海天数据恢复-winhex数据恢复教程 228

帆软报表JS导出避坑指南:如何正确处理sessionid和参数传递

本文深入探讨了帆软报表中通过JavaScript实现一键导出的关键技术,重点解析了如何正确获取并传递sessionid以确保会话不丢失,以及如何构造包含必要参数的导出URL。文章详细对比了预览后导出与直接URL导出两种方式的差异,并提供了从参数拼接、前端触发下载到高级场景(如SPA集成)的完整避坑指南,帮助开发者构建稳定可靠的自定义导出功能。

weixin_42522857的博客 162

多台树莓派(主机)通信

在做无人机实验时,有个任务需要 两台无人机 或 无人机与小车 进行通信。 由于我们飞机上用了树莓派,相当于一台电脑,索性选用Socket网络编程。 条件:树莓派、局域网(手机热点或路由器)。需要通信的两台树莓派接入同一个局域网。 如若现场没有网络,可将树莓派配置为无线路由器,发射wifi。网上很多教程,注意一点是树莓派需要先用网线接入路由器再配置。 发送数据: # -*- coding...

LNL_LNL的博客 7687

Linux sudo

如果输出 → 无 sudo 权限 如果输出 → 拥有全部 sudo 权限 辅助验证命令 ⚠️ 注意:在 wheel 组 ≠ 一定能 sudo,必须 开启 Ubuntu/Debian: ✅ 重要:修改组之后,用户要重新登录才生效! 或者执行 临时生效 看到这行(没有 #注释)才生效: 方式 2:visudo 直接单独给用户授权(精细化权限) 找到 ,下面添加一行: 自带语法校验,写错会告警,不要直接 vim 改 ,写错直接 sudo 炸掉! 想免密 su

fengliyang_的博客 178

手把手教你获取全国街道级GeoJSON数据:前端地图开发必备技巧

本文详细介绍了获取全国街道级GeoJSON数据的多种方法,从前端地图开发的实际需求出发,涵盖了免费获取省市县级数据的工具如阿里云DataV.GeoAtlas和HashTang,以及进阶的街道级数据获取方案,包括使用Bigemap GIS Office和专业数据采购。文章还提供了数据处理与优化技巧,帮助开发者高效使用GeoJSON数据进行地图可视化。

weixin_29053383的博客 289

【HarmonyOS 7 语音 AI 开放能力深度实战】 05 文本转语音实战,文字播报与合成状态控制

会议笔记已经整理成文字,用户离开屏幕以后,可能仍然希望听一遍已经确认的事项。应用可以提供一个播报按钮,把当前内容交给语音合成服务。但是,按钮点击成功与整段内容播放结束之间,还隔着引擎初始化、音色选择、合成和音频输出。页面如果在第一个完成回调出现时就恢复空闲,用户可能再次启动播报,让新的内容与尚未结束的声音互相影响。文本转语音服务负责把文字转换为声音,应用仍然需要选择音色、提交请求并管理页面状态。对于直接播报,合成引擎可以负责播放,页面不必另建播放器;但页面仍需要根据播放事件判断什么时候可以开始下一次操作。

Code Metaverse 182

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ARM64-GNU汇编器

o伪指令分配大小例子伪指令分配大小例子.byte1 字节.byte 0x412 字节.word / .long 4 字节8 字节.ascii字符串(不加 \0)字符串(自动加 \0).byte:把 8位数当成数据插入汇编代码中。.hword和 .short:把16 位数当成数据插入汇编代码中。.long和 .int:这两个伪指令的作用相同,都把 32位数当成数据插入汇编代码中。.word:把 32位数当成数据插入汇编代码中。

weixin_43903002的博客 191

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

第一章 Shell 概述

本文介绍了Shell编程的基础知识,包括Shell的起源与发展、常见Shell类型及查看方式,阐述了Shell作为命令解释器连接用户与操作系统内核的作用。强调其作为解释型脚本语言的优势,适用于系统管理自动化任务。内容涵盖Shell脚本基本结构、注释规范、编写风格、执行方法及常用命令(如echo、printf、history、管道等),并讲解了命令执行顺序、退出状态码等核心概念,为初学者提供系统学习路径。

sbjdhjd的博客 276

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux基本使用和程序部署

Linux是一个操作系统,和Windows是并列的关系。

LYYstudying的博客 84

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268

鸿蒙沉浸光感开发适配

设备材质档位:EXQUISITE(精致,全光效,高性能设备)、GENTLE(均衡,默认)、SMOOTH(轻量,仅基础效果,低算力设备)、ADAPTIVE(自适应,系统自动识别算力选档,业务首选);用户系统设置三档(强/均衡默认/弱):本质是对透明度、反色率、折射强度的精细调控。用户的三档偏好由系统底层自动映射到渲染参数,应用只需一次定义材质,界面就会随用户设置平滑过渡,完全不需要针对三档分别写适配。

qq_63223749的博客 411

Windows 10/11 彻底禁用更新防止反弹完全指南:设置、服务、任务计划与批处理实战

Windows 10已于2025年10月14日终止支持,本文以22H2版本为例,系统性介绍通过设置、组策略、注册表、服务禁用及任务计划管理等多层手段彻底关闭自动更新。操作需管理员权限,可有效避免强制重启、节省资源并阻止Win11推送,但需手动处理安全补丁。文末提供完整批处理脚本与调试检查方法,实现一键禁用与验证。

seahahacsdn的博客 231

Linux篇(五)

本文系统梳理了Linux常用终端快捷键、软件包管理(yum/apt)、服务管理(systemctl)、软链接(ln)、时间与IP配置、域名解析、固定IP设置及网络命令(ping/wget/curl),涵盖日常运维核心操作,助力高效管理Linux环境。

wykyzdq的博客 188

Linux网络编程:TCP多线程远程命令执行与线程池改造

前面已经实现了 TCP Echo Server,并且通过多进程和多线程解决了多个客户端连接的问题。不过目前服务器的业务还是比较简单,客户端发送什么,服务器就返回什么。这次在原来的多线程服务器上继续做一些改动,实现一个简单的远程命令执行功能。这次主要学习了两个内容。第一个是多线程远程命令执行。通过 Command 类封装命令的接收、检查、执行和结果返回,并使用 set 对允许执行的命令进行限制。第二个是线程池版本的 TCP Echo Server。通过和std::bind。

2501_93388101的博客 360

Linux的渲染与显示系统链路

Linux渲染与显示链路核心为DRM/KMS + EGL直连模式,绕过传统X11/Wayland中间层,实现低延迟、高效率的直接帧提交。相比X11的粗粒度权限控制与Wayland的合成开销,该方案链路短、资源消耗低,但仅支持单进程独占显示,缺乏窗口管理与系统级兜底。EGL作为跨平台桥梁,连接OpenGL ES与原生显示系统,通过Display、Surface、Context三要素构建渲染环境。内核层DRM管理GPU资源,KMS配置显示模式,用户态GDM负责登录会话,共同构成从硬件到应用的完整图形栈。

微小的鱼的博客 369

windows服务主进程已停止工作怎么解决?我把服务控制器的报错码和启动链路拆开跑了一遍

windows服务主进程已停止工作怎么解决,先把 SCM 的报错码读明白:服务起不来,先抓报错码再动手——1060名字错、1058被禁用、1056已运行、1053超时、1067起来又死、1069账户、1075依赖、25路径权限。读配置用sc qc、看状态用sc query、列服务用,这三件套能定位大部分启动失败。把服务放到云上,阿里云 ECS、腾讯云 CVM、华为云 ECS 都给你一台能用sc管理的机器,排障逻辑不变。我在这台 Windows 10 上把106010581056和sc qc。

2601_97101189的博客 265

CentOS 下大容量 U 盘挂载

在 CentOS 下操作大容量 U 盘(exFAT)需先确认设备识别(lsusb -t、lsblk),安装 exfat-utils 和 fuse-exfat 支持 exFAT 文件系统。挂载时使用 mount -t exfat -o flush /dev/sdb2 /mnt/usb,避免用 FAT32 格式化大容量盘(耗时极长)。数据迁移推荐 rsync -avh --progress 保持进度与完整性,移动操作慎用 mv 跨盘。最后务必执行 sync 后 umount,确保数据安全。

351

QT 版翻译者资料库

- 本项目是用 Qt6(C++/Widgets)重写的【翻译者资料库】,功能对齐原 VB6 版本,涵盖资料管家、词库句库整理、文本处理、对照制作、备份恢复及旧版 Access 数据自动迁移等模块。存储由 Access 改为 SQLite,界面采用原生配色,支持多库分类管理、增删改查、导入导出与全屏阅读,并已在 Qt 6.7.2 环境编译验证通过,15 项核心逻辑测试全部通过。

howard2005的专栏 334
上一篇: Lecture 5: Processes 2, Scheduling
下一篇: Lecture 7: Processes 4, Further Scheduling
Dead_Simba
博客等级 码龄2年 172粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值