第三篇
本文摘自鸟哥的私房菜:http://cn.linux.vbird.org/linux_basic/0105computers.php#program(当年看的时候浮光掠影,现在回头发现,经典就是经典)

关于shell的一些相关基础知识了解,了解shell跟内核的关系

软件程序运作

鸟哥在上课时常常会开玩笑的问:『我们知道没有插电的计算机是一堆废铁,那么插了电的计算机是什么?』
答案是:『一堆会电人的废铁』!这是因为没有软件的运作,计算机的功能就无从发挥之故。
就好像没有了灵魂的躯体也不过就是行尸走肉,重点在于软件/灵魂罗!所以底下咱们就得要了解一下『软件』是什么。

一般来说,目前的计算机系统将软件分为两大类,一个是系统软件,一个是应用程序。
但鸟哥认为我们还是得要了解一下什么是程序, 尤其是机器程序,了解了之后再来探讨一下为什么现今的计算机系统需要『操作系统』这玩意儿呢!

机器程序与编译程序

我们前面谈到计算机只认识0与1而已,而且计算机最重要的运算与逻辑判断是在CPU内部, 而CPU其实是具有微指令集的。
因此,我们需要CPU帮忙工作时,就得要参考微指令集的内容, 然后撰写让CPU读的懂得指令码给CPU执行,这样就能够让CPU运作了。

不过这样的流程有几个很麻烦的地方,包括:

需要了解机器语言:机器只认识0与1,因此你必须要学习直接写给机器看的语言!这个地方相当的难呢!

需要了解所有硬件的相关功能函数:因为你的程序必须要写给机器看,当然你就得要参考机器本身的功能,然后针对该功能去撰写程序码。
例如,你要让DVD影片能够放映,那就得要参考DVD光驱的硬件信息才行。
万一你的系统有比较冷门的硬件,光是参考技术手册可能会昏倒~

程序不具有可携性:每个CPU都有独特的微指令集,同样的,每个硬件都有其功能函数。
因此,你为A计算机写的程序,理论上是没有办法在B计算机上面运作的!
而且程序码的修改非常困难!因为是机器码,并不是人类看的懂得程序语言啊!

程序具有专一性:因为这样的程序必须要针对硬件功能函数来撰写,
如果已经开发了一支浏览器程序,想要再开发档案管理程序时,还是得从头再参考硬件的功能函数来继续撰写,每天都在和『硬件』挑战!

那怎么解决啊?为了解决这个问题,计算机科学家设计出一种让人类看的懂得程序语言,
然后创造一种『编译器』来将这些人类能够写的程序语言转译成为机器能看懂得机器码,
如此一来我们修改与撰写程序就变的容易多了!
目前常见的编译器有C, C++, Java, Fortran等等。机器语言与高阶程序语言的差别如下所示:

从上面的图示我们可以看到高阶程序语言的程序码是很容易察看的!
鸟哥已经将程序码(英文)写成中文说~ 这样比较好理解啦!所以这样已经将程序的修改问题处理完毕了。
问题是,在这样的环境底下我们还是得要考量整体的硬件系统来设计程序喔!

举例来说,当你需要将运作的数据写入内存中,你就得要自行分配一个内存区块出来让自己的数据能够填上去,
所以你还得要了解到内存的位址是如何定位的,啊!眼泪还是不知不觉的流了下来... 怎么写程序这么麻烦啊!

为了要克服硬件方面老是需要重复撰写控制码的问题,所以就有操作系统(Operating System, OS)的出现了!
什么是操作系统呢?底下就来谈一谈先!

操作系统

如同前面提到的,在早期想要让计算机执行程序就得要参考一堆硬件功能函数,并且学习机器语言才能够撰写程序。
同时每次写程序时都必须要重新改写,因为硬件与软件功能不见得都一致之故。
那如果我能够将所有的硬件都驱动, 并且提供一个发展软件的参考介面来给工程师开发软件的话,那发展软件不就变的非常的简单了?
那就是操作系统啦!

1、操作系统核心(Kernel)

操作系统(Operating System, OS)其实也是一组程序,这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。
我们刚刚谈到计算机没有软件只是一堆废铁,
那么操作系统的功能就是让CPU可以开始判断逻辑与运算数值、让主内存可以开始载入/读出数据与程序码、让硬盘可以开始被存取、让网络卡可以开始传输数据、让所有周边可以开始运转等等。
总之,硬件的所有动作都必须要透过这个操作系统来达成就是了。

上述的功能就是操作系统的核心(Kernel)了!
你的计算机能不能做到某些事情,都与核心有关!
只有核心有提供的功能,你的计算机系统才能帮你完成!
举例来说,你的核心并不支持TCP/IP的网络协定, 那么无论你购买了什么样的网卡,这个核心都无法提供网络能力的!

但是单有核心我们使用者也不知道能作啥事的~
因为核心主要在管控硬件与提供相关的能力(例如网络功能),
这些管理的动作是非常的重要的,如果使用者能够直接使用到核心的话,万一使用者不小心将核心程序停止或破坏,将会导致整个系统的崩溃!
因此核心程序所放置到内存当中的区块是受保护的!并且开机后就一直常驻在内存当中。

2、系统呼叫(System Call)

既然我的硬件都是由核心管理,那么如果我想要开发软件的话,自然就得要去参考这个核心的相关功能!
唔!如此一来不是从原本的参考硬件函数变成参考核心功能,还是很麻烦啊!
有没有更简单的方法啊!

为了解决这个问题,操作系统通常会提供一整组的开发介面给工程师来开发软件!
工程师只要遵守该开发介面那就很容易开发软件了!
举例来说,我们学习C程序语言只要参考C程序语言的函式即可,
不需要再去考量其他核心的相关功能,因为核心的系统呼叫介面会主动的将C程序语言的相关语法转成核心可以了解的任务函数,
那核心自然就能够顺利运作该程序了!

如果我们将整个计算机系统的相关软/硬件绘制成图的话,他的关系有点像这样:

计算机系统主要由硬件构成,然后核心程序主要在管理硬件,提供合理的计算机系统资源分配(包括CPU资源、内存使用资源等等),
因此只要硬件不同(如x86架构与RISC架构的CPU),核心就得要进行修改才行。
而由于核心只会进行计算机系统的资源分配,所以在上头还需要有应用程序的提供,使用者才能够操作系统的。

为了保护核心,并且让程序设计师比较容易开发软件,因此操作系统除了核心程序之外,通常还会提供一整组开发介面, 那就是系统呼叫层。
软件开发工程师只要遵循公认的系统呼叫参数来开发软件,该软件就能够在该核心上头运作。
所以你可以发现,软件与核心有比较大的关系,与硬件关系则不大!
硬件也与核心有比较大的关系!
至于与使用者有关的,那就是应用程序啦!

简单的说,上面的图示可以带给我们底下的概念:

操作系统的核心层直接参考硬件规格写成,所以同一个操作系统程序不能够在不一样的硬件架构下运作。
举例来说,个人计算机版的Windows XP不能直接在RISC架构的计算机下运作。
所以您知道为何Windows XP又分为32位及64位的版本了吧?
因为32/64位的CPU指令集不太相同,所以当然要设计不同的操作系统版本了。

操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出装置及档案系统档。
如果没有其他的应用程序辅助,操作系统只能让计算机主机准备妥当(Ready)而已!
并无法运作其他功能。
所以你现在知道为何Windows XP上面要达成网页影像的运作还需要类似PhotoImpact或Photoshop之类的软件安装了吧?

应用程序的开发都是参考操作系统提供的开发介面,所以该应用程序只能在该操作系统上面运作而已,不可以在其他操作系统上面运作的。
现在您知道为何去购买线上游戏的光盘时,光盘上面会明明白白的写着该软件适合用于哪一种操作系统上了吧?
也该知道某些游戏为何不能够在Linux上面安装了吧?

3、核心功能

既然核心主要是在负责整个计算机系统相关的资源分配与管理,那我们知道其实整部计算机系统最重要的就是CPU与主内存, 因此,核心至少也要有这些功能的:

a.系统呼叫介面(System call interface)

刚刚谈过了,这是为了方便程序开发者可以轻易的透过与核心的沟通,将硬件的资源进一步的利用,于是需要有这个简易的介面来方便程序开发者。

b.程序管理(Process control)

总有听过所谓的『多工环境』吧?一部计算机可能同时间有很多的工作跑到CPU等待运算处理,核心这个时候必须要能够控制这些工作,让CPU的资源作有效的分配才行!
另外,良好的CPU排程机制(就是CPU先运作那个工作的排列顺序)将会有效的加快整体系统效能呢!

c.内存管理(Memory management)

控制整个系统的内存管理,这个内存控制是非常重要的,因为系统所有的程序码与数据都必须要先存放在内存当中。
通常核心会提供虚拟内存的功能,当内存不足时可以提供内存置换(swap)的功能哩。

d.档案系统管理(Filesystem management)

档案系统的管理,例如数据的输入输出(I/O)等等的工作啦!
还有不同档案格式的支持啦等等,如果你的核心不认识某个档案系统,那么您将无法使用该档案格式的档案罗!
例如:Windows 98就不认识NTFS档案格式的硬盘;

e.装置的驱动(Device drivers)

就如同上面提到的,硬件的管理是核心的主要工作之一,当然罗,装置的驱动程序就是核心需要做的事情啦!
好在目前都有所谓的『可载入模组』功能,可以将驱动程序编辑成模组,就不需要重新的编译核心啦!

4、操作系统与驱动程序

老实说,驱动程序可以说是操作系统里面相当重要的一环了!
不过,硬件可是持续在进步当中的!包括主机板、显示卡、硬盘等等。
那么比较晚推出的较新的硬件,例如显示卡,我们的操作系统当然就不认识罗!
那操作系统该如何驱动这块新的显示卡?
为了克服这个问题,操作系统通常会提供一个开发介面给硬件开发商,
让他们可以根据这个介面设计可以驱动他们硬件的『驱动程序』,
如此一来,只要使用者安装驱动程序后,自然就可以在他们的操作系统上面驱动这块显示卡了。

应用程序

应用程序是参考操作系统提供的开发介面所开发出来软件,这些软件可以让使用者操作,以达到某些计算机的功能利用。
举例来说,办公室软件(Office)主要是用来让使用者办公用的;影像处理软件主要是让使用者用来处理影音数据的; 浏览器软件主要是让使用者用来上网浏览用的等等。

需要注意的是,应用程序是与操作系统有关系的,如同上面的图示当中的说明喔。
因此,如果你想要购买新软件, 请务必参考软件上面的说明,看看该软件是否能够支持你的操作系统啊!
举例来说,如果你想要购买线上游戏光盘, 务必参考一下该光盘是否支持你的操作系统,
例如是否支持Windows XP/Windows Vista/MAC/Linux等等。
不要购买了才发现该软件无法安装在你的操作系统上喔!

我们拿常见的微软公司的产品来说明。
你知道Windows XP, Office 2007之间的关系了吗?

Windows XP是一套操作系统,他必须先安装到个人计算机上面,否则计算机无法开机运作;
Windows 98与Windows XP是两套不同的操作系统,所以能在Win 98上安装的软件不见得可在WinXP上安装;
Windows XP安装好后,就只能拥有很少的功能,并没有办公室软件;
Office 2007是一套应用程序,要安装前必须要了解他能在哪些操作系统上面运作。

shell第三篇的更多相关文章

  1. Shell第三篇:基本语法

    一 什么是shell script 将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了. 再加上些智能(条件/流控)控制,就变成了智能化脚本了. 二 变量 part1 为何 ...

  2. Shell编程进阶篇(完结)

    1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或 ...

  3. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...

  4. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  5. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  6. SaltStack 入门到精通第三篇:Salt-Minion配置文件详解

    SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ  发布日期:2014-06-09 17:52:16   ##### 主要配置设置 ##### 配置 默认值 ...

  7. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  8. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...

  9. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. clear命令新认识

    学习Linux的时候,最先学习的几个命令中有一个就是clear,中文翻译为:清屏. 以前的理解都是按照字面进行解读的,清除屏幕上多余的内容. 但是实际上真的如此么? 原来屏幕是: 运行clear命令: ...

  2. SDWebImage 加载显示 WebP 与性能问题

    SDWebImage 加载显示 WebP 与性能问题 本文包含自定义下载操作 SDWebImageDownloaderOperation 与编码器 SDWebImageCoder.SDWebImage ...

  3. CCNA笔记(1)

    一个最简单的图来了解网络结构 一个路由器经过数据传输,目标pc的网卡网线接受数据,使数据能交换,然后就连上了互联网

  4. go golang 判断base64数据 获取随机字符串 截取字符串

    go golang 判断base64数据 获取随机字符串 截取字符串 先少写点,占个坑,以后接着加. 1,获取指定长度随机字符串 func RandomDigits(length int) strin ...

  5. jQuery判断Dom对象是否存在

    我们时常要检测一个DOM对象是否为空. var $jObject = $('#btn'); alert($jObject ); 我们会发现,$jObject 永远不会为空.为什么呢?$ 方法查找对象, ...

  6. 我们编写 React 组件的最佳实践

    刚接触 React 的时候,在一个又一个的教程上面看到很多种编写组件的方法,尽管那时候 React 框架已经相当成熟,但是并没有一个固定的规则去规范我们去写代码. 在过去的一年里,我们在不断的完善我们 ...

  7. (转)关于docker的15个小tip

    转自:https://www.cnblogs.com/elnino/p/3899136.html 1. 获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubunt ...

  8. 51Nod 1289 大鱼吃小鱼(模拟,经典好题)

    1289 大鱼吃小鱼             题目来源:             Codility                     基准时间限制:1 秒 空间限制:131072 KB 分值: ...

  9. hdu_2604Queuing(快速幂矩阵)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 Queuing Time Limit: 10000/5000 MS (Java/Others)  ...

  10. HDU--1212大数取模

    大数取模问题.题目传送门:HDU1212 #include <iostream> using namespace std; char a[1010]; int main() { int b ...