写点什么

三种流行操作系统的内核比较

  • 2009-08-21
  • 本文字数:2626 字

    阅读完需:约 9 分钟

本文的灵感来自于 Max Bruning 对 Solaris、BSD 和 Linux 的看法。准 Unix 系统之间优缺点的比较已经是老生常谈了。不过,本文探讨了三种最新发布的操作系统 ——OpenSolaris、Windows Vista 和 Linux kernel 2.6 的内核子系统。之所以选择它们是因为它们在商业环境和开发社区中使用最广泛、最受欢迎。

评价一种操作系统存在很多标准,但是毫无疑问,操作系统在计算机科学领域的角色始终不变。我们可以从以下三个目标来分析:

  • 效率:支持系统资源(特别是硬件)以有效的方式运转。
  • 演变:唯一不变的事物就是变化本身。操作系统应该恰当地构建以支持在不影响原先系统服务的情况下开发和引入新的系统函数。
  • 用户友好性:每天我们都需要面对操作系统。用户友好的界面是必须的,否则不论上面两个目标做的如何出色你都会被抛弃。

显然,操作系统需要各种功能,如进程 / 线程管理(以特定的调度机制分配和调用线程)、内存管理和文件管理。我们依次比较这些子系统。(用户友好性不在本文讨论之列,我们将关注于内核。)Linux 和 OpenSolaris 之间有些概念类似,但 Windows Vista 则差别很大。

进程和线程管理

OpenSolaris

OpenSolaris 实现了多层次的线程支持,以便灵活地利用处理器资源。下面四种概念来自于 OpenSolaris。

  • 进程:这是正常的 UNIX 进程,包括用户地址空间、栈和进程控制块。
  • 用户级线程:通过进程地址空间的线程库实现,这些线程对操作系统是透明的。用户级线程(ULT)是进程内部用户创建的执行单元。
  • 轻量级进程:轻量级进程(LWP)可以被看做是用户级线程和内核线程的一种映射。每一个轻量级进程支持用户级线程,并映射到一个内核线程上。轻量级线程由内核独立调度,能够在多处理器中并发执行。
  • 内核线程:这些线程是基本的实体,可以在系统处理器上调度和分发运行。

如图 0 所示,ps -Lec 命令显示了系统进程和线程。

图 0 Solaris 10 update 6 输出

图 1 显示了四种实体的关系

图 1 Opensolaris 线程模型 1

OpenSolaris 三种层次的线程结构(ULT、LWP、内核线程)有利于操作系统管理线程,并为应用程序提供了清晰的接口。

用户线程接口是一个标准线程库。ULT 映射到 LWP 上,LWP 由操作系统管理,定义了执行的状态。LWP 被绑定到内核线程上,在执行状态中一一对应。因此,并发和执行在内核线程层面上管理。

此外,应用程序可以通过应用程序接口(API,由系统调用构成)访问硬件。API 支持用户调用内核服务执行特权任务,例如读写文件、对设备发出控制指令、创建新进程或线程、为进程分配内存,等等。

线程模型的变化造成了进程数据结构的修改。OpenSolaris 保留了基本的结构,去掉了进程状态块,取而代之的是包含每一个 LWP 的数据块结构。

LWP 数据结构包含以下元素:

  • LWP 标识符
  • LWP 的优先级和支持它的内核线程
  • 信号掩码,告知内核能够接受哪些信号
  • 用户级寄存器的保存值(LWP 不处于运行状态时)
  • 针对 LWP 的内核栈,包括每一层调用的系统调用参数、结果和错误代码
  • 资源使用和配置数据
  • 对应内核线程的指针
  • 对应进程结构的指针

图 2 Solaris 进程结构和传统 Unix 进程结构的区别

Windows Vista

Vista 进程的设计目标是支持若干操作系统环境。相应的,由 Windows 内核提供的原生进程结构和服务相对简单和通用,支持各个操作系统子系统实现特定的进程结构和功能。以下是 Windows 进程的重要特征:

  • Windows 进程以对象的形式实现。
  • 一个可执行的进程包含一个或多个线程。
  • 进程和线程对象都具有内建的同步机制。

图 3 2 展示了一个进程如何与它控制或者使用的资源关联。每一个进程被赋予一个安全访问令牌,称为进程的主令牌。

图 3 Windows 进程和它的线程

当用户首次登陆时,Vista 创建一个访问令牌,包含用户的安全 ID。该用户创建或者运行的每一个进程都有该访问令牌的拷贝。Windows 使用该令牌验证用户访问安全对象或者在系统和安全对象上执行受限函数的合法性。该访问令牌控制着进程能否改变自己的属性。在本例中,进程没有指向访问令牌的句柄。如果进程尝试打开这样一个句柄,安全系统将决定这是否合法和进程是否可以改变自己的属性。

同时,与进程关联的还有一系列定义虚拟地址空间的数据块。进程不能直接修改这些结构,只能依赖于虚拟内存管理器,它提供了进程的内存分配服务。

最后,进程包含了一个对象表格,记录了进程所知的其他对象的句柄。每一个对象包含的每一个线程都有一个句柄。

此外,进程可以访问一个文件对象和定义共享内存的节对象。

Windows 面向对象的结构有利于通用进程函数的发展。Windows Vista 利用两种进程相关的对象:进程和线程。在 OpenSolaris 中,进程是对应用户任务或者应用的实体,拥有内存、文件等资源。线程是工作任务的一个可分发单元,可中断,因此处理器能够切换到另一线程。

Windows Vista 支持进程之间的并发,因为不同进程里的线程可以并发执行。而且,同一进程里的多线程可以被并发的分配给各个处理器执行。多线程进程无需使用多进程即可实现并发。同一进程内的线程可以通过它们的通用地址空间交换信息和访问进程的共享资源。不同进程内的线程可以通过两个进程搭建好的共享内存交换信息。

面向对象的多线程进程可以有效的实现服务器应用。例如,一个服务器进程可以伺候多个客户端请求。

Linux Kernel 2.6

在 Linux 中,进程或者说任务由 task_struct 数据结构表示。 task_struct 包含了一系列信息:

  1. Linux 的进程不像 Vista 和 Opensolaris,它们是容器和可调度的实体,进程可以分享地址空间和系统资源,使进程像线程那样有效使用。
  2. 同样不像 Vista 和 Opensolaris 的还有,大多数服务都是在内核中实现的,除了很多网络功能。因此 Linux 内核比之前的两种系统更大。

Linux 并不区分线程和进程,使用了类似 OpenSolaris 的轻量级进程的机制,用户级线程被映射到内核级进程上。单个用户级进程里的多个用户级线程被映射到共享组 ID 的内核进程上。这确保了这些进程可以共享资源,如文件、内存,避免了同一组内部进程之间调度切换时的环境切换。

结论

Solaris 和 Windows 都已经存在了几十年,Linux 却很年轻,还有很长的路要走。很明显,三种操作系统实现了流行的操作系统理论。对我们来说最大的障碍是访问内存实现和调试。由于知识的局限,我没有办法调试或者跟踪 Windows Vista 的线程和进程,不过 OpenSolaris 提供了足够的工具来查看内核线程。

在下一篇中,我们将探讨内存管理和文件系统。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2009-08-21 00:1315056
用户头像

发布了 501 篇内容, 共 259.4 次阅读, 收获喜欢 61 次。

关注

评论

发布
暂无评论
发现更多内容

【Kubernetes】k8s的安全管理详细说明【role赋权和clusterrole赋权详细配置说明

爱好编程进阶

Java 程序员 后端开发

2022-05微软漏洞通告

火绒安全

微软 终端安全 安全漏洞

疫情期间,IT运维人员远程办公软件有哪些?

行云管家

远程办公 IT运维 服务器运维 居家办公 运维软件

戴尔赋能科创小企业,共塑科创大时代

科创人

云计算平台与传统平台的区别是什么?怎么理解?

行云管家

云计算 云服务 IDC

全渠道CRM系统解决方案

低代码小观

低代码 CRM 客户关系管理 CRM系统 客户关系管理系统

架构训练 模块五

小马

「架构实战营」

Redis(十二)

爱好编程进阶

Java 程序员 后端开发

京东面试题:ElasticSearch深度分页解决方案

爱好编程进阶

Java 程序员 后端开发

直播可以使用 https 了,快来试试吧

CRMEB

突破疫情限制,WorkPlus助力企业打开远程高效办公新模式

BeeWorks

密钥管理系统-为你的天翼云资产上把“锁

天翼云开发者社区

数据 数据安全 密码管理

2022 开源之夏 | Curve 邀你与中国存储软件共成长,赢万元奖金

网易数帆

分布式 云原生 存储 Ceph curve

RPC架构设计方法论(完结)

爱好编程进阶

程序员 后端开发

一道有意思的“初始化”面试题

爱好编程进阶

Java 程序员 后端开发

多家波卡生态项目招聘开发者,高薪职位等你来 Pick!

One Block Community

区块链 招聘 波卡生态

龙蜥开源内核追踪利器 Surftrace:协议包解析效率提升 10 倍! | 龙蜥技术

OpenAnolis小助手

Linux 网络协议 系统运维 龙蜥社区 Surftrace

前车之鉴:聊聊钉钉 Flutter 落地桌面端踩过的“坑” | Dutter

阿里巴巴终端技术

flutter 钉钉 移动端 跨端框架 桌面端

《深入理解Java虚拟机》读后笔记-运行时数据区域

爱好编程进阶

Java 程序员 后端开发

初识DevOps

天翼云开发者社区

DevOps 运维 前端开发

Spring Cloud构建微服务架构(一)服务注册与发现

爱好编程进阶

Java 程序员 后端开发

Chrome Devtools调试小技巧

百度Geek说

后端

实战攻略:企业如何一步步建立自己的数字孪生

BeeWorks

案例成果展 | 一朵“航空云”为国航APP核心业务保驾护航

York

云原生 敏捷实践 应用现代化

Spring Cloud 学习系列:(八

爱好编程进阶

程序员 后端开发

不要临时抱佛脚!跳槽面试涨薪全靠它 ,BATJ面试重点

爱好编程进阶

Java 程序员 后端开发

Authing 宣布推出云原生「多租户」身份解决方案

Authing

身份云 数字化转型 SaaS 多租户

最佳实践 | 用腾讯云AI文字识别从0到1实现通信行程卡识别

牵着蜗牛去散步

腾讯 文字识别 技术实践 腾讯云AI 疫情防控

【国产】分布式批量作业调度平台TASKCTL产品验证的几种方式

敏捷调度TASKCTL

程序员 DevOps 分布式 ETL任务 自动化运维

Spark离线开发框架设计与实现

百度Geek说

后端

技术干货| MongoDB时间序列集合

MongoDB中文社区

mongodb

三种流行操作系统的内核比较_Linux_Dingze Zhu_InfoQ精选文章