操作系统思考 第二章 进程

第二章 进程

作者:Allen B. Downey

原文:Chapter 2 Processes

译者:飞龙

协议:CC BY-NC-SA 4.0

2.1 抽象和虚拟化

在我们谈论进程之前,我打算先定义几个东西:

  • 抽象(Abstraction):抽象是复杂事物的简单表示。例如,如果你开车的话,应该知道车轮向左转的时候车也会向左行驶,反之亦然。当然,方向盘由一系列机械和传动系统所连接,用于使轮子转向,并且轮子和路面的相互作用方式也很复杂。但是作为一个司机,你通常不需要考虑这些细节。你可以仅仅建立方向盘的心智模型,这种心智模型就是一个抽象。

    软件工程的很大一部分就是设计类似这样的抽象,允许用户和其它程序员使用强大而复杂的系统,而不必知道其实现的细节。
    
  • 虚拟化(Virtualization):一类非常重要的抽象就是虚拟化,它是创建可取的幻像的过程。例如,许多公共图书馆都参与了馆际合作,允许它们互相借阅图书。当我需要一本书时,有时它在我的本地图书馆的架子上,但更多情况下它会被运到其它的馆藏中。无论是哪一种,我都会收到它可借阅的提醒。我并不需要知道它来自哪里,我也不需要知道我的图书馆拥有哪一本书。一般来说,这个系统创建了一个幻象,好像我的图书馆拥有全世界的每一本书。

    在物理上,我的图书馆的馆藏可能很小,但是虚拟上我能获得的馆藏包含了馆际合作的每一本书。另外一个例子,大多数电脑都只连接到一个网络中,而这个网络又链接到其它网络,等等。我们所谈论的“互联网”,是一系列网络和协议的合集,它将数据包从一个网络传送到另一个网络。从用户和程序员的角度来看,整个系统的行为就像是互联网的每台计算机都互相连接。物理连接的数量十分少,但是虚拟连接的数量十分庞大。
    

“虚拟”这个词通常用于虚拟机的语境中,它是一种软件,可以创建运行特定系统的专用计算机的幻象。实际上,虚拟机可能和其它虚拟机一起运行在不同的操作系统上。

在虚拟化的语境中,我们通常把真实发生的事情叫做“物理的”,而把虚拟上发生的事情叫做“逻辑的”或者“抽象的”。

2.2 隔离

工程最重要的原则之一就是隔离(Isolation):当你设计一个带有多个组件的系统时,将它彼此隔离是个很好的方法,这样某个组件中的改变就不会对其它组件造成不良影响。

操作系统最重要的目标之一,就是将每个进程和其它进程隔离,使程序员不必考虑每个可能的交互情况。提供这种隔离的软件对象叫做进程(Process)。

进程是表示运行中程序的软件对象。我按照面向对象编程把它称之为“软件对象”。工程一个对象包含数据,并且提供用于操作数据的方法。进程正是包含以下数据的对象:

  • 程序文本,通常是机器语言的指令序列。

  • 程序相关的数据,包括静态数据(编译时分配)和动态数据,后者包括运行时的栈和堆。

  • 任何等待中的IO状态。例如,如果进程正在等待从磁盘中读取的数据,或者从网络到达的数据包,这些操作的状态也是进程的一部分。

  • 程序的硬件状态,这包括储存在寄存器中的数据,状态信息,以及程序计数器,它表示当前执行了哪个指令。

通常一个进程运行一个程序,但是对于进程来说,加载并运行新的程序也是可能的。

也可以在多于一个进程中运行相同的程序,这非常常见。这种情况下,各个进程共享程序文本,但是拥有不同的数据和硬件状态。

大多数操作系统提供了隔离进程的基本功能:

  • 多任务:大多数操作系统有能力在几乎任何时候中断一个进程,保存它的硬件状态,并且在以后恢复它。通常,程序员不需要考虑这些中断。程序的行为就像在一个专用的处理器上持续运行,除了两条指令之间的时间是不可预测的。

  • 虚拟内存:大多数操作系统会创建幻象,每个进程看似拥有独立内存片并且孤立于其他进程。同样,程序员通常也不需要考虑虚拟内存如何工作,他们可以当做每个程序都拥有专用的内存片来处理。

  • 设备抽象:运行于同一台计算机的进程共享磁盘、网络接口、显卡和其它硬件。如果进程直接和这些硬件交互而不加协调,就一定会产生混乱。例如,一个进程预期的网络数据可能会被另一个进程读取。或者多个进程可能尝试在磁盘的相同位置储存数据。操作系统负责通过提供合适的抽象来维持秩序。

作为程序员,你不需要知道太多关于这些功能如何实现的事情。但是如果你很好奇,你可以在这个屏蔽层的后面发现一大堆有趣的事情。而且,如果你知道其中所发生的事情,你会成为更好的程序员。

2.3 Unix 进程

当我写这本书的时候,我最关注的进程就是我的文本编辑器,Emacs。偶尔我也会切换到终端窗口,它是一个运行Unix shell并提供命令行接口的窗口。

当我移动鼠标时,窗口的管理器会被唤醒,看到鼠标在终端窗口上方,并且唤醒终端。终端又唤醒shell。如果我在shell中键入make,它就会创建一个新的进程来运行Make。Make会创建另一个进程来运行LaTeX,之后另一个进程会显示结果。

如果我需要查询一些东西,我会切换到另一个桌面,这会再次唤醒窗口管理器。如果我点击Web浏览器的图标,窗口管理器会创建进行来运行Web浏览器。许多浏览器,类似Chrome,会为每个窗口和每个选项卡创建新的进程。

并且这些只是我所了解的进程,同时还有许多其它进程“在后台”运行。它们中许多都在执行操作系统相关的工作。

Unix命令ps能打印出运行中进程的信息。如果你在终端里运行它,可能会看到这些:

  PID TTY          TIME CMD2687 pts/1    00:00:00 bash2801 pts/1    00:01:24 emacs
24762 pts/1    00:00:00 ps

第一列是唯一的进程ID。第二列是创建进程的终端,“TTY”代表“电传打字机”(Teletypewriter),它是原始的机械终端。

第三行是用于该进程的处理器时间总计,依次为时、分、秒。最后一行是所运行进程的名称。这个例子中,bash是shell的名称,用于解释我键入到终端中的命令。Emacs是我的文本编辑器,而ps是生成这份输出的程序。

通常,ps只会列出有关当前终端的进程。如果你使用-e选项,你会得到所有进程(也包括属于其他用户的进程,我认为这是个安全缺陷)。

在我的系统上有233个进程,下面是它们的一部分:

  PID TTY          TIME CMD1 ?        00:00:17 init2 ?        00:00:00 kthreadd3 ?        00:00:02 ksoftirqd/04 ?        00:00:00 kworker/0:08 ?        00:00:00 migration/09 ?        00:00:00 rcu_bh10 ?        00:00:16 rcu_sched47 ?        00:00:00 cpuset48 ?        00:00:00 khelper49 ?        00:00:00 kdevtmpfs50 ?        00:00:00 netns51 ?        00:00:00 bdi-default52 ?        00:00:00 kintegrityd53 ?        00:00:00 kblockd54 ?        00:00:00 ata_sff55 ?        00:00:00 khubd56 ?        00:00:00 md57 ?        00:00:00 devfreq_wq

init是操作系统启动时首先创建的进程。它又会创建许多其它进程,之后会闲置,直到它创建的进程运行完毕。

kthreadd是操作系统用于创建新的“线程”的进程。之后我们将会谈论更多关于线程的东西,但是你暂时你可以认为线程是一种进程。

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

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

相关文章

1 句代码,搞定 ASP.NET Core 绑定多个源到同一个类

问题有群友希望将路由中的信息绑定到一个Dto对象中:public class DDDDDto {[FromRoute(Name "collectionId")]public Guid collectionId { get; set; }[BindProperty(Name "relativeUrl")]public string relativeUrl { get; set; } }这样就不用…

设置git自动补全功能(windows版本)

目录 下载 Git 的源代码 在目录中 git/contrib/completion/ 中找到 git-completion.bash 文件 将 git-completion.bash 文件改名为 .git-completion.bash 找到本机git安装目录 将.git-completion.bash文件复制到git安装目录下的etc文件夹 打开同目录下的 bash.bashrc 文件&…

[转]Java 18 还未用上,Java 19 最新两大特性曝光

铁打的 Java,流水的版本。 不久前,Java 18 才正式发布,遵循 Oracle 六个月发一版本的频率,Java 19 将在今年 9 月出炉。这不,还没等众多开发者用上 Java 18,关于 Java 19 最新的两个目标功能就被披露了出…

C# 值类型和引用类型讲解

要了解值类型和引用类型,我们首先要知道堆和栈的区别:① 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存…

【ArcGIS微课1000例】0048:制图表达(3)---水立方效果实现

本文讲解ArcGIS中水立方效果的实现过程(制图表达案例)。 文章目录 一、效果展示二、制作步骤1. 创建数据库及要素数据集2. 创建范围3. 创建随机点4. 创建泰森多边形5. 创建制图表达一、效果展示 基于制图表达的思想,可以容易实现多种形式的水立方效果,例如: 怎么实现的呢…

Java中this与super的区别

2019独角兽企业重金招聘Python工程师标准>>> this与super关键字在java中构造函数中的应用: ** super()函数 ** super()函数在子类构造函数中调用父类的构造函数时使用,而且必须要在构造函数的第一行,例如: class Ani…

EF选择Mysql数据源

EF添加ADO.NET实体模型处直接选择Mysql数据源 最近想到EF是连接多数据库的orm框架,于是就想测试下。查了一堆网上资料后,测试连接mysql成功。步骤如下: 1、在你项目Model层中nuget安装MySql.Data.Entity 如果没安装这个provider 就进行下面的…

JIRA简介及基本概念

目录 第一章 JIRA简介 1.1 什么是JIRA 1.2 JIRA的主要功能 1.3 JIRA的主要特点 1.3.1 JIRA的优点 1.3.2 JIRA的缺点 1.4 相关版本 第二章 JIRA的基本概念 2.1 JIRA 中涉及的角色 2.1.1 管理人员 2.1.2 项目管理者 2.1.3 开发人员 2.1.4 测试人员 2.2 问题 2.2.1…

CodeChef Chef and Churu [分块]

题意: 单点修改$a$ 询问$a$的区间和$f$的区间和 原来普通计算机是这道题改编的吧... 对$f$分块,预处理$c[i][j]$为块i中$a_j$出现几次,$O(NH(N))$,只要每个块差分加上然后扫一遍就行了不用树状数组之类的 修改,整块直接…

SkiaSharp 之 WPF 自绘 拖曳小球(案例版)

感谢各位大佬和粉丝的厚爱和关心( 催更),我会再接再厉的,其实这也是督促自己的一种方式,非常感谢。刚写了一篇万字长文,自己也休养生息(低调发育)了一段时间,接下来来几个小案例。拖曳小球WPF的拖曳效果,基…

ABP学习资源整理

不同的编程语言都有构建Web Application的框架,比如C#中的ASP.NET Core和ABP,Java中的Spring Boot和Spring Cloud,Python中的Django和Flask,Node.js中的Express和Koa2,Go中的Beego和Gin等。今天要介绍的主角是ABP框架&…

【ArcGIS微课1000例】0049:制图表达(4)---自由式制图表达

文章目录 一、转换为自由表达并编辑二、将效果转换为几何当编辑地图时,可能会遇到一个独特的或显著的特征,需要专门的符号的情况,可以使用覆盖的制图表达来实现,但是往往不够。可能需要简单地绘制一个图形以达到要求的外观,这时可以尝试使用自由式制图表达。 自由式制图表…

基于FPGA的异步FIFO设计

今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域。由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出)。这里的读写指针是异步的&#xff0…

EJB

Enterprise JavaBean,企业级javabean,是J2EE的一部分,定义了一个用于 开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 是Java的核心代码,分别是会话Bean(Session Bean),实体Be…

WinForm(一):开始一个WinForm程序

WinForm程序只能运行在Windows上,即使是基于.NET5,6,7也一样。因为WinForm的UI层对接的底层API是基于Windows的。用VisualStudio创建一个WinForm应用很简单,建议使用非.NET Framework版,因为.NET Framework微软渐渐不支…

【ArcGIS微课1000例】0050:Geodatabase属性域操作全解

文章目录 1. 属性域的创建2. 属性域的查看3. 属性域的删除与修改4. 属性域的关联地理数据库按照面向对象的模型存储地理信息,也可以将其非空间信息保存在表中。对于要素和表可以设置一些规则进行限制,对属性的约束称为属性域。 属性域是描述字段合法值的规则,是一种增强数据…

『JavaScript』核心

为什么80%的码农都做不了架构师?>>> 弱类型语言 JavaScript是一种弱类型的语言。变量可以根据所赋的值改变类型。原始类型之间也可以进行类型转换。其弱类型的物质为其带来了极大的灵活性。 注意:原始类型使用值传递,复合类型使用…

优酷VIP会员周卡只需7.5元,看《沉香如屑》用优酷视频

由杨紫、成毅主演的《沉香如屑》已上线7天。站内热度值已经破万,也拿下了4次日冠的好成绩。追优酷视频最新热剧不能没有优酷VIP会员啊,优酷的会员,价格算是最便宜的了,下面是幻海优品优酷VIP会员特价充值的价格。优酷VIP会员特价充…

Solr6.1.0Windows安装步骤

一、 环境 solr 6.1.0 下载地址 http://archive.apache.org/dist/lucene/solr/6.1.0/ jdk 1.8 tomcat8 二、 安装solr到tomcat 1.解压solr,把 solr-6.1.0\solr-6.1.0\server 下的solr-webapp 文件夹拷贝到tomcat 的webapps下,重命名为solr;…

[转]Autofac 框架初识与应用

一、前言 这上一篇中,主要讲述了什么是IoC容器,以及了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置IoC容器,以及它的实例注册方式和相应的生命…