【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

2024-06-24 14:12

本文主要是介绍【Linux进阶】UNIX体系结构分解——操作系统,内核,shell,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.什么是操作系统?

从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。
我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。 

从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等。

2.UNIX体系结构

下图显示了UNIX系统的体系结构

  1. 内核的接口被称为系统调用(system call,图1-1中的阴影部分)。
  2. 公用函数库构建在系统调用接口之上,应用程序既可使用公用函数库,也可使用系统调用。
  3. shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口。

例如,Linux是GNU操作系统使用的内核。一些人将这种操作系统称为GNU/Linux操作系但是,更常见的是简单地称其为Linux。虽然这种表达方法在严格意义上讲并不正确,但鉴“操作系统”这个词的双重含义,这种叫法还是可以理解的(这样的叫法更简洁)。

系统调用我们之前讲过,这个公用函数库我们也讲过,那么我们只需要来了解一下内核和shell

3. 什么是内核(Kernel)

内核是操作系统的核心内核是操作系统执行的第一道程序,被率先加载到内存中开始系统行为。内核始终保持在主内存中直到系统被关闭。内核将用户输入的命令转换成计算机硬件能理解的机器语言。

内核是系统应用软件和硬件的桥梁。内核直接与硬件联系,并告之它由应用软件发起的请求。操作系统不能脱离内核工作,内核是系统正常运行最重要的程序。

内核的主要职责是:进程管理、磁盘管理、任务调度、内存管理等,具体如下:

  • 文件管理

为了更有效地搜索和使用文件,内核使用文件系统(file system)来组织文件,并通过文件系统保持对文件数据存储、文件状态、访问设置的监视。

  • 进程管理

在多进程环境下,内核决定哪一道进程被CPU优先运行,以及分配的运行时间片长度是多少,称为进程调度。当进程不再被需要的时候,将被内核自动销毁。

  • 内存管理

内核检测内存空间——生成或销毁内存,以确保应用程序被正确执行。

内核分为单核(Monolithic Kernel)和微核(Microkernel)两种。

  • 对于单核,所有操作系统服务运行在单核的主线程中,单核提供了对系统硬件的广泛访问。
  • 对于微核,其提供的是硬件抽象,意味着操作系统必须在系统调用(system calls)和原语(primitives)的帮助下工作。

3.1.操作系统和内核的区别

4.什么是shell

我们把上面那个图拿下来

shell是操作系统的最外层是一个用户跟操作系统之间交互的命令解释器,也就是运行在终端中的文本互动程序。

Shell相当于是一个翻译,把我们在计算机上的操作或我们的命令,翻译为计算机可识别的二进制命令,传递给内核,以便调用计算机硬件执行相关的操作;同时,计算机执行完命令后,再通过Shell翻译成自然语言,呈现在我们面前。

 shell独立于内核,是链接内核和应用程序的桥梁,通俗来讲shell是内核周围的外壳

UNIX中常见的shell
名称路径FreeBSD 8.0Linux 3.2.0Mac OS X 10.6.8Solaris 10
Bourne shell/bin/shbash的副本
Bourne-again shell/bin/bash可选的
C shell/bin/csh链接至tcsh可选的链接至tcsh
Korn shell/bin/ksh可选的可选的
TENEX Cshell/bin/tcsh可选的

系统从口令文件中相应用户登录项的最后一个字段中了解到应该为该登录用户执行那
个 shell。

4.1.shell的作用

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。

如何理解?为什么不能直接使用kernel?

我们所有的指令,最终都要在OS内部运行,但是直接使用OS难度非常高,我们用户不能直接和操作系统打交道,我们只能通过命令行来进行交互,和OS沟通的之间的桥梁就是命令行解释器 

shell是用户和Linux(或者更准确的说,是用户和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。

 

 shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。

不论何时你键入一个命令,它都被Linux shell所解释。

一些命令,比如打印当前工作目录命令(pwd),是包含在Linux bash内部的(就象DOS的内部命令)。其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于文件系统中某个目录下的单独的程序。

而对用户来说,你不知道(或者可能不关心)一个命令是建立在shell内部还是一个单独的程序。

        shell 首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序可以是Linux本身的实用程序,比如ls rm,然后shell试着在搜索路径($PATH)里寻找这些应用程序。搜索路径是一个能找到可执行程序的目录列表。如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。而如果命令被成功的找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。

总的来说就是下面这个意思

指令——>命令行解释器——>os  

命令行解释器存在的意义:

  • 进行命令行解释
  • 保护OS,对于用户的非法请求,直接拦截 

4.2.shell的历史

自V7以来,由Steve Bourne 在贝尔实验室开发的Bourne shell得到了广泛应用,几乎每一个
现有的UNIX系统都提供Bourne shell,其控制流结构类似于Algol68。

C shell 是由 Bill Joy 在伯克利开发的,所有 BSD版本都提供这种shell。另外,AT&T的System V/386 R3.2和 System V R4(SVR4)也提供Cshell。C shell 是在第6版shell 而非 Bourme shell 的基础上构造的,其控制流类似于C语言,它支持Bourne shell 没有的一些特色功能,例如作业控制、历史机制以及命令行编辑等。

Korn shell 是Bourne shell的后继者,它首先在SVR4中提供。Korn shell是由贝尔实验室的David Korn开发的,在大多数UNIX系统上运行,但在SVR4之前,通常它需要另行购买,所以没有其他两种shell流行。它与Bourne shell向上兼容,并具有使Cshell广泛得到应用的一些特色功能,包括作业控制以及命令行编辑等。

Bourne-again shell 是GNU shell,所有Linux 系统都提供这种shell。它的设计遵循 POSIX标准,同时也保留了与Bourne shell 的兼容性。它支持C shell 和 Korn shell 两者的特色功能。

TENEX C shell 是C shell的加强版本。它从TENEX操作系统(1972年BBN公司开发)借
鉴了很多特色,例如命令完备。TENEXC shell在Cshell基础上增加了很多特性,常被用来替换Cshell。

POSIX 1003.2标准对shell进行了标准化。这项规范基于Korn shell和Bourne shell的特性。

不同的Linux系统使用不同的默认shell。

  • 一些Linux默认使用Bourmne-again shell。
  • 另外一些使用BSD的对Boumne shell的替代品dash(Debian Almquist shell,最早由Kenneth Almquist开发,并在后来移植入Linux )。
  • FreeBSD的默认用户shell 衍生于 Almquist shell。
  • Mac OSX的默认 shell是Boume-again shell。

Solaries 继承了BSD和System V两者,它提供了上图中所示的所有shell。在因特网上可以找到shell的自由移植版软件。

4.3.什么是shell脚本 

      shell脚本是shell命令组成的文件

换一种说法,shell脚本是利用shell的功能所写的一个程序,这个程序使用纯文本文件将一些shell语法和指令写在里面,让使用者很容易的就能够一个操作执行多个命令。

4.4.bash

最开始在Unix系统中流行的是sh,而bash作为sh的改进版本,提供了更加丰富的功能。

而bash的全名是Bourne Again Shell。

bash(GNU Bourne-Again Shell)是最常用的一种shell,是当前大多数Linux发行版的默认Shell。

Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的扩展。bash 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。bash 也包含了很多 C 和 Korn shell 里的优点。bash 有很灵活和强大的编程接口,同时又有很友好的用户界面。

为什么要用 bash 来代替 sh 呢?

Bourne shell 最大的缺点在于它处理用户的输入方面。在 Bourne shell 里键入命令会很麻烦,尤其当你键入很多相似的命令时。而 bash 准备了几种特性使命令的输入变得更容易。 

这篇关于【Linux进阶】UNIX体系结构分解——操作系统,内核,shell的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090375

相关文章

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命