Unix 发展史概览

这里是一个简明清晰的 Unix 发展史概览,涵盖从起源到现代的重要节点和演变过程。


Unix 发展史概览

1. Unix 起源(1969年)

  • 贝尔实验室:Ken Thompson 和 Dennis Ritchie 开发出 Unix 操作系统。
  • 最初设计目标:简洁、可移植、多任务。
  • 用汇编语言开发,后期移植为 C 语言,极大推动了跨平台发展。

2. 早期版本(1970年代)

  • Unix Version 1 - 6(1971-1975)

    • 基础系统设计与完善。
    • Version 6 (V6) 是首个广泛传播的版本,成为众多高校教学和研究基础。
  • Unix Version 7(1979)

    • 被称为第一个“现代Unix”,功能更完备。
    • 引入 Bourne Shell、多种系统调用等。

3. Unix 分支与商业化(1980年代)

  • BSD Unix(伯克利软件发行版)

    • 加入网络协议栈(TCP/IP)、虚拟内存支持。
    • BSD 4.2 和 4.3 成为高性能的学术与商业系统基础。
  • AT&T System V

    • 商业版本 Unix,广泛推广。
    • 引入 System V Interface Definition(SVID),统一标准。
  • Unix Wars

    • BSD 和 System V 争夺市场主导权,导致标准割裂。

4. 标准化与统一(1990年代)

  • POSIX 标准

    • 统一操作系统接口,促使各种 Unix 系统兼容。
  • Unix 品牌管理

    • IEEE 和 The Open Group 推出 “The Single UNIX Specification”。
  • Linux 崛起(1991起)

    • Linus Torvalds 开发的免费 Unix-like 内核,快速普及。

5. 现代 Unix 与 Unix-like 系统(2000年代至今)

  • 商业 Unix 系统

    • 如 IBM AIX、HP-UX、Solaris 等继续发展。
  • 开源 Unix-like 系统

    • BSD 系列(FreeBSD、OpenBSD、NetBSD)广泛应用。
    • Linux 作为主流服务器和嵌入式平台。

小结时间线

1969   Unix诞生(贝尔实验室)
1970s  Unix早期版本(V1-V7)
1980s  BSD Unix & System V 发展与分裂
1990s  POSIX标准化,Linux兴起
2000s  现代Unix与开源Unix-like系统共存

在 UNIX V6 中(特别是 PDP-11 架构下),只有进程(process)概念没有线程(thread) 的支持。我们来详细对比一下:


🧠 1. UNIX V6 的执行单元是「进程」

✅ 每个进程有:

  • 独立的 地址空间(虽然没有 MMU,但通过 relocation/base 寄存器实现简单隔离)
  • 独立的 堆栈、代码段、数据段
  • 独立的 打开的文件描述符列表
  • 独立的 用户态 / 内核态栈
  • PCB(进程控制块):proc 结构体

📌 换句话说:一个进程就是一个完整的程序的运行实例


❌ 2. UNIX V6 没有线程

🚫 不存在:

  • 多个线程共享同一地址空间
  • 用户态或内核态的线程库
  • 没有 pthread、也没有类似 clone() 的系统调用

在 UNIX V6 中,线程等同于进程的最小执行单元还未诞生


📚 补充:现代对比

特性UNIX V6现代 Linux / Windows
线程支持❌ 无✅ 有 pthread / clone / TCB
地址空间隔离✅ 基于 relocation✅ 基于 MMU
并发机制✅ 多进程 + fork()✅ 多进程 + 多线程
同步原语❌ 无✅ Mutex、Sem、Cond 等

✳️ 总结一句话:

UNIX V6 的“并发”全靠 fork() 创建多个独立进程完成,没有线程这个概念。
UNIX 在早期(包括 UNIX V6/V7)没有线程的概念,所有的并发都是通过 fork() 创建进程来实现的,每个进程有独立的地址空间,没有共享内存,也没有线程同步原语。


“LWP(轻量级进程,Light Weight Process)” 是线程发展历史中一个非常关键的概念,尤其在早期 UNIX(如 Solaris)中引入,是连接用户线程与内核线程的中间层。下面我详细解释:


✅ 什么是 LWP(Light Weight Process)?

LWP 是一种内核调度单位,它像一个普通进程一样能被内核调度,但:

  • 它和传统的 UNIX 进程相比更轻量
  • 允许多个用户线程绑定到一个或多个 LWP 上
  • 引入 用户线程(user-level thread)与内核线程(kernel-level thread)之间的分离

🧠 为什么引入 LWP?

早期 UNIX:

  • 每个进程是调度单位
  • 多线程程序会导致所有线程都阻塞(因为调度粒度是整个进程)

引入 LWP 的目的:

  • 实现线程调度 不完全依赖内核
  • 用户空间可以快速切换线程,减少系统调用
  • 实现 M:N 模型(多个用户线程映射到多个内核线程)

🔧 结构示意图

               用户空间+--------------------------------+|  用户线程1   用户线程2   ...   |+--------------------------------+↓         ↓LWP1       LWP2        <- 绑定关系↓         ↓内核线程1   内核线程2      <- LWP由内核调度

📘 Solaris 中的 LWP 模型(经典代表)

概念描述
用户线程程序员使用的线程接口(如 thr_create
LWP用户线程与内核之间的桥梁,由内核调度
内核线程OS 级别线程,是 CPU 的实际执行单位
M:N 模型多个用户线程通过多个 LWP 共享少量内核线程

🧵 与 POSIX 线程的关系

  • POSIX pthreads 抽象的是用户线程接口
  • 在 Solaris 中,pthreads 是基于 LWP 实现的
  • 在 Linux 中,pthreads 实际上就是 每个线程 = 一个 LWP = 一个内核线程,是 1:1 模型

🔍 LWP 的优劣

优点缺点
用户线程调度效率高实现复杂(需要管理映射关系)
可以复用 LWP,节省系统资源用户线程阻塞时,LWP 也会被阻塞
更灵活:适合 IO 密集 + CPU 密集很难在 Linux 等平台通用实现

🧠 总结一句话:

LWP 是一种由内核调度的轻量进程,用于支持用户线程的执行,是早期 M:N 多线程模型的关键组成。

现代主流系统(如 Linux、macOS)已经普遍采用 1:1 模型(每个线程一个内核线程),放弃了复杂的 M:N 和 LWP,但它在线程设计历史上具有里程碑意义。


是的,RT-Thread Smart 中的 LWP(Light Weight Process) 与 Solaris、早期 UNIX 系统中的 LWP 含义有相似之处,但也有一些区别,下面我来详细说明:


✅ RT-Thread Smart 中的 LWP 是什么?

RT-Thread Smart 是 RT-Thread 的类 Unix 扩展(用户空间 + 内核空间),LWP 是 Smart 中的用户态进程模型实现的核心结构,代表一个用户空间进程

在 RT-Thread Smart 中,LWP(轻量级进程):

  • 是一种用户态进程,具有独立的地址空间
  • 拥有独立的虚拟内存、文件描述符表、信号处理等
  • 内核调度的是线程(rt_thread),线程属于某个 LWP
  • 一个 LWP 可以有多个线程(共享用户空间)

🧠 和传统 UNIX 的 LWP 比较

特性Solaris / UNIX LWPRT-Thread Smart LWP
所属系统UNIX(如 Solaris)RT-Thread Smart
实质用户线程的桥梁 / 调度单位用户空间进程
是否被内核调度是(间接调度)不是(线程调度)
是否有独立地址空间否(多个线程共享)是(每个 LWP 是独立地址空间)
线程关系多个线程通过 LWP 映射到内核线程多个线程属于同一个 LWP,共享资源
内核视角LWP 是调度单位LWP 是运行环境(调度单位是 rt_thread

➤ 可以简单类比为:

  • UNIX LWP ≈ 内核调度用的线程容器
  • RT-Thread LWP ≈ 独立的用户进程(带地址空间)

📦 RT-Thread Smart 中的进程-线程模型

结构大致如下:

         内核空间
+----------------------------+
|        RT-Thread           |
|  +---------------------+  |
|  |  rt_thread(线程)  | <----- 调度单位
|  +---------------------+  |
|  |       LWP(进程)   | <----- 用户进程环境
|  +---------------------+  |
+----------------------------+用户空间(每个进程)
+----------------------------+
|  main() 用户代码           |
|  libc, heap, stack, ...    |
+----------------------------+

✳️ 为什么叫 LWP?

这个命名是借鉴 UNIX 世界的“轻量级进程”的概念,强调:

  • 它不是传统大内核进程(如 Linux task_struct 那种)
  • 它比传统进程更“轻”,适用于嵌入式环境
  • 支持独立地址空间、用户态运行,是 Smart 支持应用层的核心机制

✅ 总结

RT-Thread Smart 的 LWP 是“用户态进程”的抽象,与传统 UNIX 的 LWP 都强调轻量、可调度、可扩展,但意义略有差异。

方面RT-Thread Smart 中的 LWP
本质用户进程(独立地址空间)
是否支持线程是,多个线程属于一个 LWP
是否被调度否,调度的是线程
内存隔离支持 MMU 的隔离(Smart 模式)

在具有多线程与多进程支持的操作系统(如 Linux、RT-Thread Smart 等)中,调度属于不同进程的线程调度同一进程内的线程,在实现层面有一些关键区别,主要体现在以下几个方面:


✅ 1. 地址空间切换(上下文)

✅ 不同进程的线程切换

  • 需要切换地址空间(切换页表或 MMU 上下文);
  • 内核必须刷新 MMU 页表基地址,切换到另一个进程的内存视图;
  • 代价更高,因为涉及 TLB flush、cache coherence 等;
  • 所有进程私有的数据(堆、栈、代码段)都会发生变化。

👉 举个例子:

进程 A 的线程 T1 → 切换 → 进程 B 的线程 T2

系统必须切换页表,所有内存访问都按 B 的上下文来解释。


✅ 同一进程的线程切换

  • 无需切换地址空间,因为线程共享进程的地址空间;
  • 只需要切换线程的 CPU 上下文(寄存器、堆栈等);
  • 开销较小,调度速度快;
  • 常见于用户态多线程库、POSIX 线程(pthread)等。

👉 举个例子:

进程 A 的线程 T1 → 切换 → 进程 A 的线程 T2

页表不动,仅换栈、寄存器等上下文。


✅ 2. 资源管理与权限

不同进程的线程:

  • 拥有独立的资源和权限
  • 文件描述符、信号处理器、环境变量等互不干扰;
  • 更适合服务隔离、安全场景。

同一进程的线程:

  • 共享几乎所有资源:堆、静态区、文件句柄、socket 等;
  • 适合高效协作、低开销计算,但不利于隔离。

✅ 3. 调度粒度与策略

调度项目同进程线程切换跨进程线程切换
时间片轮转通常一样通常一样
优先级调度适用适用
地址空间切换否(保留)是(重载)
系统负担较低(仅 CPU 上下文)较高(CPU + MMU 上下文)

✅ 4. 在 RT-Thread Smart 中的例子

RT-Thread Smart 的 LWP + thread 模型支持这两类调度:

示例结构:

进程 A(LWP 1)├── 线程 T1└── 线程 T2进程 B(LWP 2)└── 线程 T3
  • T1 ↔ T2 切换:共享地址空间,仅切换 rt_thread
  • T2 ↔ T3 切换:需要执行地址空间切换(虚拟内存重新映射)

✅ 总结表格

比较项同进程线程切换跨进程线程切换
是否切换地址空间
切换开销低(快)高(慢)
资源共享程度高(几乎完全共享)低(完全隔离)
安全性
典型用途多线程并发多任务/服务隔离

好问题!关于“进程和线程的关系”以及“多进程多线程的调度”,我来详细解释一下:


1. 一个进程是一个内核线程吗?

  • 传统意义上:不完全是。

  • 进程(Process) 是资源分配的单位,拥有独立地址空间、打开的文件等。

  • 线程(Thread) 是 CPU 调度的基本单位,负责执行代码。


在不同操作系统模型中的关系:

模型类型说明
1:1 模型(如 Linux)每个线程是一个内核线程,进程是线程集合。
进程本身不调度,调度的是线程。
M:N 模型(如 Solaris 旧版、RT-Thread Smart)用户线程与内核线程映射不是一一对应。进程里可有多个用户线程,通过多个内核线程调度。
单线程进程模型(如早期 UNIX)一个进程对应一个执行单元(线程),即进程就是内核线程。

2. 多个进程多个线程如何调度?

在现代系统(1:1 模型,如 Linux):

  • 内核维护所有线程的 PCB(Linux 中是 task_struct,每个线程一个);

  • 调度器按时间片、优先级等策略从所有线程里选择一个运行;

  • 线程调度时,如果跨进程(切换地址空间),内核完成页表切换;

  • 同进程线程调度时,内核切换 CPU 上下文,无需切换地址空间。


举个例子:

假设有两个进程:

  • 进程A 有线程A1、A2
  • 进程B 有线程B1、B2、B3

内核调度器会在这 5 个线程中轮换执行,比如:

A1 → A2 → B1 → B2 → B3 → A1 → ...

切换不同进程线程时切换地址空间,同进程线程切换时地址空间不变。


3. 调度器怎么实现?

  • 维护就绪队列:里面存放所有可运行的线程;

  • 上下文切换:保存当前线程状态,恢复下一个线程状态;

  • 切换页表(跨进程)或保持不变(同进程);

  • 抢占机制:支持抢占式多任务,定时器中断触发调度。


4. 在 RT-Thread Smart 中

  • 进程被称为 LWP(轻量级进程);

  • 内核调度单位是线程(rt_thread);

  • 每个线程属于某个 LWP(进程);

  • 调度器从所有线程中选一个运行;

  • 切换不同 LWP 线程时,完成地址空间切换。


总结:

概念说明
进程资源容器,拥有独立地址空间
线程CPU 调度单位,执行代码的“实体”
一个进程=一个内核线程?早期 UNIX 是,现代系统否。
多进程多线程调度统一调度所有线程,切换时根据是否跨进程切换地址空间。

下面是一个用 Mermaid 画的关于 多进程多线程调度 的简化流程图示例,重点表现线程调度时是否需要切换地址空间:

flowchart TDStart[调度器触发]SelectThread[选择下一个线程执行]SameProcess{是否与当前线程同一进程?}SwitchContext[切换线程上下文]SwitchAddressSpace[切换地址空间(页表切换)]RunThread[线程运行]TimerInterrupt[定时器中断]Start --> SelectThreadSelectThread --> SameProcessSameProcess -- 是 --> SwitchContextSameProcess -- 否 --> SwitchAddressSpaceSwitchAddressSpace --> SwitchContextSwitchContext --> RunThreadRunThread --> TimerInterruptTimerInterrupt --> Start

说明:

  • 调度器周期性触发(通常由定时器中断触发)。

  • 选择下一个要执行的线程。

  • 判断是否是同一进程线程:

    • 是:只切换线程上下文(寄存器、栈指针等)。
    • 否:需要先切换地址空间(更新 MMU 页表),再切换上下文。
  • 切换完成后,线程开始运行。

  • 运行过程中,定时器中断再次触发调度。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于coze studio开源框架二次定制开发教程

目录 一、 项目介绍 1.1 什么是Coze Studio 1.2 功能清单 1.3对比商业版本 二、 功能定开说明 2.1 技术栈简介 2.2 项目架构

RHCE认证题解

考前说明请勿更改 IP 地址。DNS 解析完整主机名&#xff0c;同时也解析短名称。• 所有系统的 root 密码都是 redhat• Ansible 控制节点上已创建用户账户 devops。可以使用 ssh 访问• 所需的所有镜像保存在镜像仓库 utility.lab.example.compodman 可使用下述账号登录使用 用…

调用com对象的坑

1、谏言 最近我在弄64位调用32位dll的问题&#xff0c;在几种IPC之间&#xff0c;最后考虑了调用COM 毕竟我们只在windows平台 2、第一坑–修改编译后都需要重新注册&#xff0c;注册表 一直以为只需要编译就好了&#xff0c;结果调用没反应、报错什么的&#xff0c;需要先撤销…

【Python】PyQt 实现 TreeWidget 多级联动选择逻辑,打造素材搜索自定义树形控件!

在开发自己的写作素材管理工具时,我遇到了一个非常典型但又略显棘手的 UI 问题: 💡 如何实现一个“可自由勾选分类标签”的树形结构界面,支持父子节点自动联动勾选,提升用户体验? 虽然 PyQt 的 QTreeWidget 是构建多层分类结构的好帮手,但默认却不具备父子节点的自动级…

27-数据仓库与Apache Hive-2

1.数仓开发语言概述 理论上来说&#xff0c;任何一款编程语言只要具备读写数据、处理数据的能力&#xff0c;都可以用于数仓的开发。比如大家耳熟能详的C、java、Python等&#xff1b; 关键在于编程语言是否易学、好用、功能是否强大。遗憾的是上面所列出的C、Python等编程语言…

软件测试——接口自动化

测试中的自动化分为两类&#xff1a; 1.ui自动化&#xff08;web、移动端&#xff09;2.接口自动化 前面的博客中&#xff0c;我们已经讲解了web端的ui自动化&#xff0c;感兴趣的同学可以去看看&#xff1a;软件测试——自动化测试常见函数_自动化测试代码编写-CSDN博客 今…

Flask一个用户同时只能在一处登录实现

场景&#xff1a;web页面如果多人用同一账号同时登录操作&#xff0c;可能会导致数据等的混乱甚至出现故障。并且可能损害开发者的利益。为此&#xff0c;本篇文章就讲下如何实现同一账户同时仅能一个地方登录操作。 思路&#xff1a;1. 用户登陆时生成token&#xff08;uuid.u…

联发科芯片组曝高危漏洞:越界写入缺陷危及智能手机与物联网设备安全

漏洞概况全球领先的芯片组制造商联发科&#xff08;MediaTek&#xff09;近日发布最新产品安全公告&#xff0c;披露了影响其智能手机、物联网设备及其他嵌入式系统芯片的多项安全漏洞。高危漏洞分析CVE-2025-20696 作为公告披露的首个且最严重的漏洞&#xff0c;该高危缺陷源于…

Android与Flutter混合开发:页面跳转与通信完整指南

Android与Flutter混合开发&#xff1a;页面跳转与通信完整指南 一、Android跳转Flutter页面的实现方式 1. 基础跳转方法 &#xff08;1&#xff09;使用全新引擎跳转&#xff08;每次新建&#xff09; startActivity(FlutterActivity.withNewEngine().initialRoute("/home…

Web存储技术详解:sessionStorage、localStorage与Cookie

一、核心特性对比特性CookielocalStoragesessionStorage存储大小4KB左右5-10MB5-10MB生命周期可设置过期时间永久存储&#xff08;除非手动清除&#xff09;会话期间有效&#xff08;标签页关闭即清除&#xff09;作用域同源的所有窗口同源的所有窗口仅当前标签页自动发送每次H…

3. 为什么 0.1 + 0.2 != 0.3

总结 底层是二进制实现概述 在 JavaScript 中&#xff0c;0.1 0.2 的结果并不是精确的 0.3&#xff0c;而是 0.30000000000000004。这个现象并不是 JavaScript 的“bug”&#xff0c;而是由于浮点数在计算机底层的二进制表示方式导致的精度丢失问题。一、计算机如何表示小数&a…

股票数据接口哪家好?专业评测各主流接口的优势与不足

Python股票接口实现查询账户&#xff0c;提交订单&#xff0c;自动交易&#xff08;1&#xff09; Python股票程序交易接口查账&#xff0c;提交订单&#xff0c;自动交易&#xff08;2&#xff09; 股票量化&#xff0c;Python炒股&#xff0c;CSDN交流社区 >>> 股票…

如何用分布式架构视角理解宇宙稳定性?从精细调参到微服务的类比思考

在调试一段多线程分布式代码时&#xff0c;我忽然意识到一个不合理的事实&#xff1a;为什么现实世界这么稳定&#xff1f;为什么没有“宇宙蓝屏”或“感知崩溃”&#xff1f;为什么每天醒来&#xff0c;我们还能看到同样的物理规律、感知同一个自我&#xff1f;站在程序员的角…

游戏画面总是卡顿怎么办 告别延迟畅玩游戏

玩游戏最让人头疼的问题之一就是画面卡顿&#xff0c;影响操作流畅度与游戏体验。卡顿可能由硬件性能、系统设置、网络延迟等多种因素导致。本文将从不同角度出发&#xff0c;为你提供五个有效解决方法&#xff0c;帮助你快速提升游戏流畅度。 一、降低游戏画质设置 高画质虽然…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-邮箱重置密码

在现代Web应用中&#xff0c;密码重置功能是用户账户安全体系中不可或缺的一部分。本文将详细介绍如何使用Vue.js前端框架和SpringBoot后端框架实现一个基于邮箱验证的密码重置功能。功能概述本密码重置功能包含以下核心流程&#xff1a;用户输入注册邮箱系统发送验证码到该邮箱…

华为云云产品的发展趋势:技术创新驱动数字化未来

近年来&#xff0c;随着5G、人工智能&#xff08;AI&#xff09;、大数据、物联网&#xff08;IoT&#xff09;和边缘计算等新兴技术的快速发展&#xff0c;全球云计算产业正迎来新一轮变革。作为中国领先的云服务提供商&#xff0c;华为云依托华为集团在ICT&#xff08;信息与…

防御保护07-08

CIDR 可变长子网掩码 VLSM 无类域间路由NET 用少量的私有地址替换大量的共有地址私网地址不能再互联网上去使用、去分配。这里的互联网指的是公网。服务器映射--用来使外部用户能访问私网服务器。静态映射--公网地址和私网地址进行一对一的映射。地址池--中存在多个公网IP地址时…

PDF转图片工具技术文档(命令行版本)

PDF转图片工具技术文档&#xff08;命令行版本&#xff09; 1. 功能概述 本工具是一个基于PyMuPDF库的PDF转图片命令行工具&#xff0c;能够&#xff1a; 通过命令行参数接收PDF文件路径将PDF的每一页转换为PNG格式的图片自动创建输出目录&#xff08;./static&#xff09;保存…

k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC

为响应政策&#xff0c;最近在捣鼓国产化云原生平台的搭建。在搭建过程中遇到了问题记录下来&#xff0c;以备后续查找。 我选用了中国电子云的云平台来搭建K8S集群&#xff0c;选用的技术栈是华为开源的openeulerk8sisulad框架&#xff0c;参考官网文档资料&#xff1a;iSula…

chatgpt plus简单得,不需要求人,不需要野卡,不需要合租,不需要昂贵的价格

ChatGPT Plus&#xff1a;开启智能对话的新纪元 引言&#xff1a;AI助手的时代已经到来 在当今信息爆炸的时代&#xff0c;人工智能助手已经成为我们工作、学习和生活中不可或缺的伙伴。作为AI领域的佼佼者&#xff0c;ChatGPT自问世以来就以其强大的语言理解和生成能力赢得了…