16.1.2 Linux 的多用户多任务环境

在 Linux 下面执行一个指令时,系统会将相关的权限、属性、程序码与数据等均载入内存, 并给予这个单元一个程序识别码 (PID),最终该指令可以进行的任务则与这个 PID 的权限有关。根据这个说明,我们就可以简单的了解,为什么 Linux 这么多用户,但是却每个人都可以拥有自己的环境了吧。

多人环境:

什么是“多用户多任务”?在Linux系统上具有多种不同的账号,每种帐号都有都有其特殊的权限,只有一个人具有至高无上的权力,那就是 root (系统管理员)。除了 root 之外,其他人都必须要受一些限制的。

多任务行为:

目前的 CPU 速度可高达几个 GHz。 这代表 CPU 每秒钟可以运行 109 这么多次指令。我们的 Linux 可以让 CPU 在各个工作间进行切换, 也就是说,其实每个工作都仅占去 CPU 的几个指令次数,所以 CPU 每秒就能够在各个程序之间进行切换。

CPU 切换程序的工作,与这些工作进入到 CPU 运行的调度 (CPU 调度,非 crontab 调度)会影响到系统的整体性能! 目前 Linux 使用的多任务切换行为是非常棒的一个机制,几乎可以将 PC 的性能整个压榨出来。

多重登陆环境的七个基本终端窗口:

在 Linux 当中,默认提供了六个文字界面登陆窗口,以及一个图形界面,你可以使用 [Alt]+[F1].....[F7] 来切换不同的终端机界面,而且每个终端机界面的登陆者还可以不同人。Linux 默认会启动六个终端机登陆环境的程序,所以我们就会有六个终端机接口。

16.2 工作管理

这个工作管理 (job control) 是用在 bash 环境下的,也就是说:“当我们登陆系统取得 bashshell 之后,在单一终端机接口下同时进行多个工作的行为管理 ”。

16.2.1 什么是工作管理?

由于假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前景(foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运行。要注意的是,放入背景的工作想要运行时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running) 的,因为没有数据无法运行,而且放入背景的工作是不可以使用 [ctrl]+c 来终止的。

总之,要进行 bash 的 job control 必须要注意到的限制是:

这些工作所触发的程序必须来自于你 shell 的子程序(只管理自己的 bash);

前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);

背景:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 调用该工作;

背景中“执行”的程序不能等待 terminal/shell 的输入(input)

16.2.2 job control的管理

如前所述,bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够将别人的 bash 下面的 job 给他拿过来执行。此外,又分前景与背景,然后在背景里面的工作状态又可以分为“暂停 (stop)”与“运行中 (running)”。实际进行 job 控制的指令有下面这些:

直接将指令丢到背景中“执行”的 &

如果想要同时进行多个工作, 那么可以将某些工作直接丢到背景环境当中,让我们可以继续操作前景的工作。如何将工作丢到背景中?最简单的方法就是利用“ & ”。举个简单的例子,我们要将 /etc/ 整个备份成为 /tmp/etc.tar.gz 且不想要等待,那么可以这样做:

在输入一个指令后,在该指令的最后面加上一个“ & ”代表将该指令丢到背景中, 此时 bash 会给予这个指令一个“工作号码(job number)”,就是那个 [1]。至于后面那个 14432 则是该指令所触发的“ PID ”。而且,有趣的是,我们可以继续操作 bash。如果你输入几个指令后,突然出现这个数据:

就代表 [1] 这个工作已经完成 (Done) ,该工作的指令则是接在后面那一串命令行。 另外,这个 & 代表:“将工作丢到背景中去执行”。 注意到那个“执行”的字眼!此外,这样的情况最大的好处是: 不怕被 [ctrl]+c 中断。此外,将工作丢到背景当中要特别注意数据的流向。包括上面的讯息就有出现错误讯息,导致我的前景被影响。 虽然只要按下 [enter] 就会出现提示字符。但如果我将刚刚那个指令改成:

在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面的, 所以,我们会无法看到提示字符,当然也就无法完好的掌握前景工作。同时由于是背景工作的 tar , 此时你怎么按下 [ctrl]+c 也无法停止。所以,最佳的状况就是利用数据流重导向, 将输出数据传送至某个文件中。举例来说,我可以这样做:

这样,输出的信息都给他传送到 /tmp/log.txt 当中,当然就不会影响到我们前景的作业了。

工作号码 (job number) 只与你这个 bash 环境有关,但是他既然是个指令触发的,所以当然一定是一个程序, 因此你会观察到有 job number 也搭配一个 PID。

将“目前”的工作丢到背景中“暂停”:[ctrl]-z

想个情况:如果我正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,此时是否要结束 vim 呢?不需要,只要暂时将 vim 给他丢到背景当中等待即可。 例如以下的案例:

在 vim 的一般模式下,按下 [ctrl] 及 z 这两个按键,屏幕上会出现 [1] ,表示这是第一个工作, 而那个 + 代表最近一个被丢进背景的工作,且目前在背景下默认会被取用的那个工作(与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在默认的情况下,使用 [ctrl]-z 丢到背景当中的工作都是“暂停”的状态。

观察目前的背景工作状态: jobs

如果想要知道目前有多少的工作在背景当中,就用 jobs 这个指令。一般来说,直接下达jobs 即可! 不过,如果你还想要知道该 job number 的 PID 号码,可以加上 -l 这个参数。+ 代表默认的取用工作。 所以说:“目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [2] 会被拿到前景当中来处理”。

其实 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了。

将背景工作拿到前景来处理:fg

刚刚提到的都是将工作丢到背景当中去执行的,那么有没有可以将背景工作拿到前景来处理的?就是fg。举例来说,我们想要将上头范例当中的工作拿出来处理时:

经过 fg 指令就能够将背景工作拿到前景来处理。不过比较有趣的是最后一个显示的结果,我们会发现 + 出现在第一个工作后! 怎么会这样啊?这是因为你刚刚利用 fg %1 将第一号工作捉到前景后又放回背景,此时最后一个被放入背景的将变成 vi 那个指令动作, 所以当然[1] 后面就会出现 + 了。另外,如果输入“ fg - ” 则代表将 - 号的那个工作号码拿出来,上面就是 [2]- 那个工作号码。

让工作在背景下的状态变成运行中: bg

管理背景当中的工作: kill

我们可以让一个已经在背景当中的工作继续工作,也可以让该工作以 fg 拿到前景来, 那么,如果想要将该工作直接移除呢?或者是将该工作重新启动呢?这个时候就得需要给予该工作一个讯号 (signal),kill这个指令就起作用了。

-9 这个 signal 通常是用在“强制删除一个不正常的工作”时所使用的, -15 则是以正常步骤结束一项工作(15也是默认值),两者之间并不相同。举上面的例子来说,我用 vim 的时候,不是会产生一个 .filename.swp 的文件吗? 那么,当使用 -15 这个 signal时, vim 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个 signal 时,由于该 vim 工作会被强制移除掉,因此, .filename.swp 就会继续存在文件系统当中。

不过,毕竟正常的作法中,你应该先使用 fg 来取回前景控制权,然后再离开 vim 才对。因此,以上面的范例二为例,其实 kill 确实无法使用 -15 正常的结束掉 vim 的动作。通常使用 -9 是因为某些程序你真的不知道怎么通过正常手段去终止他,这才用到 -9 的。

kill搭配 signal 所详列的信息 (用 man 7 signal 去查阅相关数据) 可以让您有效的管理工作与程序 (Process),此外,那个 killall 也是同样的用法。使用kill-l可以得到signal number 与名称的对应。

另外, kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字了。

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

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

相关文章

LeetCode150道面试经典题-- 两数之和(简单)

1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意…

关于Android Studio Http Proxy设置

对敌人最大的蔑视就是沉默。--鹿丸 我们使用Android Studio 开始构建的时候会有卡顿的情况,甚至死机,也就是所谓的【android studio】构建卡住问题,如果依赖库类都是国内的,检查是否开启了代理 这个地方选择下面的自动代理 国内…

【RabbitMQ上手——单实例安装5种简单模式实现通讯过程】

【RabbitMQ入门-单实例安装&5种简单模式实现通讯过程】 一、环境说明二、安装RabbitMQ三、用户权限及Virtual Host设置四、5种简单模式实现通讯过程的实现五、小结 一、环境说明 安装环境:虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本:…

老胡的周刊(第103期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 metersphere[2] MeterSphere[3] 是一站式开源…

Word(1):文章页码设置

1.需求 在文档的封皮页不设置页码,在目录页页码设置为罗马数字,在正文使用阿拉伯数字。 2.解决方法 step1: 在封皮页的最后,点击”插入“-分隔符-分节符(下一页) step2:在目录页的最后&…

Codeforces Round 892 (Div. 2)

A.最大值只能由自己除&#xff0c;所以无解的情况只能是全部相同&#xff0c;否则直接最大值放c即可 #include<bits/stdc.h> using namespace std; const int N 2e510,mod998244353; #define int long long typedef long long LL; typedef pair<int, int> PII;in…

C# 一种求平方根的方法 立方根也可以 极大 极小都可以

不知道研究这些干啥&#xff0c;纯纯的浪费时间。。。 public static double TQSquare(double number){Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX1 0, diff 9999999999, diffTemporary 0;for (int i 0; i < 654321; i){if (random1…

YAMLException: java.nio.charset.MalformedInputException: Input length = 1

springboot项目启动的时候提示这个错误&#xff1a;YAMLException: java.nio.charset.MalformedInputException: Input length 1 根据异常信息提示&#xff0c;是YAML文件有问题。 原因是yml配置文件的编码有问题。 需要修改项目的编码格式&#xff0c;一般统一为UTF-8。 或…

大数据Flink(六十二):批处理的入门案例

文章目录 批处理的入门案例 一、示例 二、​​​​​​​开发步骤

差分升级在物联网水表上的实现与应用(学习)

摘要 当越来越多的物联网水表加入抄表系统后&#xff0c;实现了水表数据的信息化&#xff0c;并且当水表终端需要技术更新时&#xff0c;通过网络方式来升级产品可以高效修复设备面临的问题&#xff0c;减少用户损失&#xff0c;降低维护成本&#xff0c;但同时也对有限的网络…

【MySQL】并发执行事务可能存在的问题, 事务的四种隔离级别

文章目录 前言一、并发执行事务可能存在的问题1, 脏读问题2, 不可重复读3, 幻读 二、MySQL 的四种隔离级别1, READ UNCOMMITTED 读未提交2, READ COMMITTED 读已提交3, REPEATABLE READ 可重复读 (MySQL 的默认事务隔离级别)4, SERIALIZABLE 串行化 总结 前言 各位读者好, 我是…

Prometheus技术文档-基本使用-配置文件全解!!!!!

简介&#xff1a; Prometheus是一个开源的系统监控和告警系统&#xff0c;由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种时间序列数据&#xff0c;比如系统性能、网络延迟、应用程序错误等。Prometheus通过采集监控数据并存储在时间序列数据库中&#xff0c;…