【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 rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支