程序员都熟悉但不一定说得清的操作系统基本概念

这篇具有很好参考价值的文章主要介绍了程序员都熟悉但不一定说得清的操作系统基本概念。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

程序员都熟悉但不一定说得清的操作系统基本概念

任何计算机系统都包含一个名为操作系统的基本程序集合。在这个集合里,最重要的程序称为内核(kernel)。当操作系统启动时,内核被装入到RAM中,内核中包含了系统运行所必不可少的很多核心过程(procedure)。其他程序是一些不太重要的使用程序,尽管这些程序为用户提供了与计算机进行广泛交流的经验(以及用户买计算机要做的所有工作),但系统根本的样子和能力还是由内核决定。内核也为系统中所有事情提供了主要功能,并决定高层软件的很多特性。因此,我们将经常使用术语“操作系统”作为“内核”的同义词。

RAM(Random Access Memory)是一种计算机内存,它允许数据被随机地读取和写入。与只读存储器(ROM)不同,RAM只能临时存储数据,当电源关闭时,存储在RAM中的数据会丢失。

RAM通常由多个存储单元组成,每个单元可以存储一个二进制数字(0或1)。这些存储单元被组织成一个矩阵,方便数据的随机访问。现代计算机通常包含几个GB的RAM,以便快速处理大量数据。

根据工作原理,RAM可以分为两类:静态RAM(SRAM)和动态RAM(DRAM)。SRAM的每个存储单元都需要六个晶体管,因此它的集成度较低,功耗也较高。相比之下,DRAM的每个存储单元只需要一个晶体管和一个小电容,因此它的集成度更高,功耗更低。

除了SRAM和DRAM,还有一种基于Flash技术的非易失性RAM(NVRAM),它可以在断电后保持数据。NVRAM通常用于存储固件、启动加载器等重要数据。

总之,RAM是计算机中非常重要的组成部分,它提供了快速的数据存储和访问能力,使得计算机能够高效地处理各种任务。

操作系统必须完成两个主要目标:

  • 与硬件部分交互,为包含在硬件平台上的所有低层可编程部件提供服务。

  • 为运行在计算机系统上的应用程序(即所谓用户程序)提供执行环境。

一些操作系统允许所有的用户程序都与硬件部分进行交互(典型的例子是MS-DOS)。与此相反,类Unix操作系统把与计算机物理组织相关的所有低层细节都对用户运行的程序隐藏起来。当程序想使用硬件资源时,必须向操作系统发出一个请求。内核对这个请求进行评估,如果允许使用这个资源,那么,内核代表应用程序与相关的硬件部分进行交互。

为了实施这种机制,现代操作系统依靠特殊的硬件特性来禁止用户程序直接与低层硬件部分进行交互,或者禁止直接访问任意的物理地址。特别是,硬件为CPU引入了至少有两种不同的执行模式:用户程序的非特权模式和内核的特权模式。Unix把它们分别称为用户态(User Mode)和内核态(Kernel Mode)。

下面这些基本概念,推动了Unix、Linux和其他操作系统的设计。你也许熟悉这些概念,但为了说明这些概念对Linux内核的必要性,下面试图对其做更深一步的介绍。

多用户系统

多用户系统(multiuser system)就是一台能并发和独立地执行分别属于两个或多个用户的若干应用程序的计算机。“并发”(concurrently)意味着几个应用程序能同时处于活动状态并竞争各种资源,如CPU、内存、硬盘等等。“独立”(independently)意味着每个应用程序能执行自己的任务,而无需考虑其他用户的应用程序在干些什么。当然,从一个应用程序切换到另一个会使每个应用程序的速度有所减慢,从而影响用户看到的响应时间。现代操作系统内核提供的许多复杂特性减少了强加在每个程序上的延迟时间,给用户提供了尽可能快的响应时间。

多用户操作系统必须包含以下几个特点:

  • 核实用户身份的认证机制。

  • 防止有错误的用户程序妨碍其他应用程序在系统中运行的保护机制。

  • 防止有恶意的用户程序干涉或窥视其他用户的活动的保护机制。

  • 限制分配给每个用户的资源数的记账机制。

为了确保能实现这些安全保护机制,操作系统必须利用与CPU特权模式相关的硬件保护机制,否则,用户程序将能直接访问系统电路并克服强加于它的这些限制。Unix是实施系统资源硬件保护的多用户系统。

用户和组

在多用户系统中,每个用户在机器上都有私有空间,典型地,他拥有一定数量的磁盘空间来存储文件、接收私人邮件信息等等。操作系统必须保证用户空间的私有部分仅仅对其拥有者是可见的。特别是必须能保证,没有用户能够开发一个用于侵犯其他用户私有空间的系统应用程序。

所有的用户由一个唯一的数字来标识,这个数字叫用户标识符(User ID, UID)。通常一个计算机系统只能由有限的人使用。当其中的某个用户开始一个工作会话时,操作系统要求输入一个登录名和口令,如果用户输入的信息无效,则系统拒绝访问。因为口令是不公开的,所以用户的保密性得到了保证。

为了和其他用户有选择地共享资料,每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识。每个文件也恰好与一个组相对应。例如,可以设置这样的访问权限,拥有文件的用户具有对文件的读写权限,同组用户仅有只读权限,而系统中的其他用户没有对文件的任何访问权限。

任何类Unix操作系统都有一个特殊的用户,叫做root,即超级用户(superuser)。系统管理员必须以root的身份登录,以便处理用户账号,完成诸如系统备份、程序升级等维护任务。root用户几乎无所不能,因为操作系统对他不使用通常的保护机制。尤其是,root用户能访问系统中的每一个文件,能干涉每一个正在执行的用户程序的活动。

进程

所有的操作系统都使用一种基本的抽象:进程(Process)。一个进程可以定义为:“程序执行时的一个实例”,或者一个运行程序的“执行上下文”。在传统的操作系统中,一个进程的地址空间(address space)中执行一个单独的指令序列。地址空间是允许进程引用的内存地址集合。现代操作系统允许具有多个执行流的进程,也就是说,在相同的地址空间可执行多个指令序列。

多用户系统必须实施一种执行环境,在这种环境里,几个进程能并发活动,并能竞争系统资源(主要是CPU)。允许进程并发活动的系统称为多道程序系统(multiprogramming)或多处理系统(multiprocessing)。区分程序和进程是非常重要的:几个进程能并发地执行同一个程序,而同一个进程能顺序地执行几个程序。

在单处理器系统上,只有一个进程能占用CPU,因此,在某一时刻只能有一个执行流。一般来说,CPU的个数总是有限的,因而只有少数几个进程能同时执行。操作系统中叫做调度程序(scheduler)的部分决定哪个进程能执行。一些操作系统只运行有非抢占式(nonpreemptable)进程,这就意味着,只有当进程资源放弃CPU时,调度程序才被调用。但是,多用户系统中的进程必须是抢占式的(preemptable),操作系统记录下每个进程占有的CPU时间,并周期性地激活调度程序。

Unix是具有抢占式进程的多处理操作系统。即使没有用户登录,没有程序运行,也还是有几个系统进程在监视外围设备。尤其是,有几个进程在监听系统终端等待用户登录。当用户输入一个登录名,监听进程就运行一个程序来验证用户的口令。如果用户身份得到证实,那么监听进程就创建另一个进程来执行shell,此时在shell下可以输入命令。当一个图形化界面被激活时,有一个进程就运行窗口管理器,界面上的每个窗口通常都由一个单独的进程来执行。如果用户创建了一个图形化shell,那么一个进程运行图形化窗口,而第二个进程运行用户可以输入命令的shell,对每一个用户命令,shell进程都创建执行响应程序的另一个进程。

类Unix操作系统采用进程/内核模式。每个进程都自以为它是系统中唯一的进程,可以独占操作系统所提供的服务。只是进程发出系统调用,硬件就会把特权模式由用户态变成内核态,然后进程以非常有限的目的开始一个内核过程的执行。这样,操作系统在进程的执行上下文中起作用,以满足进程的请求。一旦这个请求完全得到满足,内核过程将迫使硬件返回到用户态,然后进程从系统调用的下一条指令继续执行。

内核体系结构

如前所述,大部分Unix内核是单块结构:每一个内核层都被继承到整个内核程序中,并代表当前进程在内核态下运行。相反,微内核(microkernel)操作系统只需要内核有一个很小的函数集,通常包括几个同步原语、一个简单的调度程序和进程间通信机制。运行在微内核之上的几个系统进程实现从前操作系统级实现的功能,如内存分配程序、设备驱动程序、系统调用处理程序等等。

尽管关于操作系统的学术研究都是面向微内核的,但这样的操作系统一般比单块内核的效率低,因为操作系统不同层次之间显式的消息传递要花费一定的代价。不过,微内核操作系统比单块内核有一定的理论优势。微内核操作系统迫使系统程序员采用模块化的方法,因为任何操作系统层都是一个相对独立的程序,这种程序必须通过定义明确而清晰的软件接口与其他层交互。此外,已有的微内核操作系统可以很容易地移植到其他的体系结构上,因为所有与硬件相关的部分都被封装进微内核代码中。最后,微内核操作系统比单块内核更加充分地利用了RAM,因为暂且不需要执行的系统进程可以被调出或撤销。

为了达到微内核理论上的很多优点而又不影响性能,Linux内核提供了模块(module)。模块是一个目标文件,其代码可以在运行时链接到内核或从内核解除链接。这种目标代码通常由一组函数组成,用来实现文件系统、驱动程序或其他内核上层功能。与微内核操作系统的外层不同,模块不是作为一个特殊的进程执行的。相反,与任何其他静态链接的内核函数一样,它代表当前进程在内核态下执行。

使用模块的主要优点包括:

  • 模块化方法
    因为任何模块都可以在运行时被链接或解除链接,因此,系统程序员必须提出良定义的软件接口以访问由模块处理的数据结构。这使得开发新模块变得容易。

  • 平台无关性
    即使模块依赖于某些特殊的硬件特点,但它不依赖于某个固定的硬件平台。例如,符合SCSI标准的磁盘驱动程序模块,在IBM兼容PC与HP的Alpha机上都能很好地工作。

  • 节省内存使用
    当需要模块功能时,把它链接到正在运行的内核中,否则,将该模块解除链接。这种机制对于小型嵌入式系统是非常有用的。

  • 无性能损失
    模块的目标代码一旦被链接到内核,其作用与静态链接的内核的目标代码完全等价。因此,当模块的函数被调用时,无需显式地进行消息传递。

参考文档:
[1] 《深入理解Linux内核第三版》


📢欢迎 点赞👍 收藏⭐ 评论📝 关注 如有错误敬请指正!

☟ 学Python,点击下方名片关注我。☟文章来源地址https://www.toymoban.com/news/detail-784545.html

到了这里,关于程序员都熟悉但不一定说得清的操作系统基本概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 程序员想兼职赚钱?这几个渠道你一定要知道?

    某一天当一个程序员,一拍脑门想要兼职,赚点小钱,于是他打开了知乎,打开了百度搜索兼职。结果弹出了一大部分有兼职要视频剪辑的,写文稿的等等等等。逛了一圈,发现根本没有自己合适的兼职。 我想说: 喂!喂!喂! 你不是程序员吗?我们程序员当然要用自己的

    2024年02月14日
    浏览(50)
  • 【闪击Linux系列P9】程序员一定要了解的计算机管理理念——描述与组织

    ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,从操作系统层面向大家介绍进程: 主要内容含: 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【Linux】Linux环境搭建

    2024年02月12日
    浏览(41)
  • 猫头虎分享:AI时代SaaS项目程序员一定要懂的技术名词详解(下)

    博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接 : 🔗 精选专栏 : 《面试题大全》 — 面试准备的宝典! 《IDEA开发秘籍》 — 提升你的IDEA技能! 《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师! 《100天精通Golang(基础入门篇)》 — 踏入

    2024年02月21日
    浏览(59)
  • 高薪程序员&面试题精讲系列133之微服务里的网关有哪些实现方案?你熟悉Gateway网关吗?

    微服务里的网关有哪些实现方案? Gateway网关是怎么实现的? 你用过Gateway网关吗? Gateway里有哪些路由规则? 在上一篇文章中, 壹哥 给大家梳理了微服务里的远程调用、熔断等相关的面试题。今天这篇文章, 壹哥 会重点给大家梳理微服务中网关相关的面试题。网关是微服

    2023年04月09日
    浏览(31)
  • 程序员简历程序员简历.pdf

    你们在制作简历时,是不是基本只关注两件事: 简历模板,还有基本信息的填写 。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“ 看起来最好看的模板 ”,填写基本信息,却没有深入思考如何使简历更具吸引力。这其实是一个普遍现象: 许多求职

    2024年04月14日
    浏览(49)
  • AI程序员对程序员的影响

    最近,全球首位AI程序员Devin的出现引发了广泛关注,也引发了人们对人工智能在编程领域的潜力和影响的讨论。尽管AI技术在编程领域得到广泛应用,但人们仍然在探讨它是否能完全取代人类程序员。本文将探讨AI程序员的优势、局限性以及对程序员职业的影响,并展望未来

    2024年03月23日
    浏览(59)
  • 普通程序员和厉害程序员的差距!

    大家好,我是 程序员陶朱公 。 今天跟大家聊一下关于代码重构的话题。 话说,很多程序员对自己写的代码平时很随心所欲(各种魔法变量,一个方法几十上百行代码,还有各种让人崩溃的变量或方法命名)。 当有一天让他维护他人的代码,他就会抓狂,很容易激发他体内重构

    2024年03月23日
    浏览(64)
  • 大批程序员失业,大龄程序员出路在哪里?

    在程序员这个群体中,时常有人陷入技术迷信和思维僵化的困境,但实际上,当前市场对于技术的需求是非常广泛的。因此,我提出了一些建议,希望能够帮助程序员跳出技术框架,更好地利用技能创造实际价值。以下是一些建议供参考: 开发小而实用的工具类软件: 以“

    2024年01月22日
    浏览(56)
  • 低代码——面向程序员,帮助程序员敏捷开发

    低代码是一套可视化开发工具,它帮开发者把前后端基础功能写扎实,开发者只需要 通过填表配置或拖拽生成前端组件 的方式,即可完成后台管理系统的快速搭建。由于低代码仍需要 写少量 JS 代码 ,所以低代码开发平台主要面向程序员,帮助程序员敏捷开发。 本文使用

    2024年02月01日
    浏览(51)
  • 专科程序员与本科程序员之间有什么区别?

    专科程序员和本科程序员之间最主要的区别在于他们的学历水平以及所接受的教育和培训的深度和广度不同。 本科程序员通常拥有更为全面的计算机技术理论知识,同时也接受了更加系统和广泛的相关课程和实践,比如算法、计算机网络、操作系统、软件工程等等。他们研究

    2024年02月06日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包