linux基础篇之操作系统(一)

    首先,我们大家都知道的,计算机本身就是一堆的硬件,而这堆硬件当中,最核心的就是我们的CPU和所谓的存储器设备,那么为了能够实现让计算机获得数据,实现数据的输入,输出等等。它需要输入设备和输出设备两种,但是对于计算机系统来讲,核心只是运算器、控制器,就是我们所说的CPU和我们存储设备。
    在计算机体系内部,一般来讲,我们的输入设备是通过桥接,是通过南桥,进入当前系统的,那彼此之间可能有系统,各种总线,比如说内存到CPU的,那我们可以称为叫内存总线,或者叫系统总线,都可以的。而各种不同的外围设备,无论是键盘,鼠标等等,它每一种不同的接口,可能属于需要实现的物理总线类型也是各不相同的。但无论如何,假如就是一个简单的PC机而言,在某一时刻,只能运行一个程序,但是计算机的计算能力很强,一个程序所需要运行的程序,内容所需要占用的时间,可能会不是特别的长。那因此,我们需要为了能够尽可能的利用计算机的计算能力,于是需要将计算机同时运行多个程序,那因此,每一个程序在运行起来以后,需要一个协调器,对吧?这个协调程序,我们把它称为叫操作系统,operating system。

     事实上,我们这里把它称之为操作系统是不合适的。因为我们所理解中的操作系统可能会包含了很多外围的其他程序,所以,此处我们把它称为叫内核,会更好一点。以后我们把它称作内核了,叫做kernel,就是叫内核,操作系统的核心,内核本身就负责管理硬件资源,并且将硬件资源虚拟成其他样子提供给上层所需要运行的应用程序。
    为什么需要这样去做?我之前不止一次的提到过,某一程序如果直接运行在硬件上,那么这个程序本身就可以控制硬件的各种属性,其他程序要想再运行到硬件的时候,这些程序彼此之间可能会产生干扰,一个恶意的应用程序可能会导致其他程序统统退出,所以我们需要一个统一的资源管理者,而且任何应用程序要想能够使用硬件,必须要通过内核来完成,而内核也不会让程序直接访问硬件。它是将硬件所提供的运行能力,通过系统调用的方式来实现的,这是一个非常重要的东西,我们说叫system call,系统调用。

    我们上回讲到过它是一种非常底层的实现,因此,程序员根据系统调用来编程会非常麻烦,非常繁琐,而且许多程序之间的功能是相同的,举个简单例子。比如说,我们的word需要打印,excel也需要打印,那如果说,我们不把这些功能做成公用的话,事实上,这就意味着,由于系统调用本身非常底层,这也就意味着word需要自己开发一个打印模块,excel同时,他自己也需要一个打印模块,这两种都需要用到打印的功能,那就意味着在我们的计算机上,大量的功能是重复的。这种重复势必会额外占用空间,对吗?所以从资源的组织角度来讲,它也不合理,那因此,我们操作系统除了提供内核之外,通常还需要将自己的内核所提供的一些系统调用输出出来,而这种输出是通过较为高层一点的调用接口来实现的,我们把它称为叫库,对于库本身,它也是一个应用程序,只不过这个应用程序没有程序的执行入口,它是不能自我独立运行的,只能被其他程序调用的时候才能执行。这就是我们把它称之为叫库的原因。而且我们刚才提到过,库存在的执行环境就是被调用,那因此也就意味着,我们的调用可能不仅仅调用系统。内核所提供的功能也可能会调用库所提供的功能,同时,各位要想明白一个问题,如果一个程序员,我们在编程的时候不使用库,直接在内核上进行编程,可不可以?当然可以,只不过这比较麻烦而已,所以我的调用除了系统调用之外,还有库调用,library,简称为lib。

    如果我们调用库的话,库本身对一个操作系统而言,或者对一个内核而言,我们把它称为叫它的应用编程接口,把它称为叫API,叫做application program interface。它也是程序,所以对WINDOWS而言,和对于linux而言,甚至unix而言,每一个不同的系统,它的程序员在开发库的时候所使用的功能,以及它的内部实现细节,可能是各不相同的。那这也就意味着,如果说,某个人利用WINDOWS上的库调用进行编程,那么这个程序拿到linux上未必能运行,因为它们的库不一样,当然库的内部实现细节不一样,但是如果它的调用接口是一样的,这个程序能运行了吗?没有问题,可以运行的,这是我们的库。

    库的上层就是各个应用程序了,这个应用程序很可能直接运行在系统调用上、内核上,也有可能是通过我们库调用来完成,只不过各位应该知道,使用库调用编程起来可能会更简单,但如果使用内核调用,它的执行效率可能会更高,因为至少不会通过库来完成了,而且他所获得的操作权限也可能会更大。因此,一些高级的黑客们,他们可能会直接使用库调用来实现编程,甚至于直接利用硬件特性进行编程的。
    无论有多少个应用程序,这些应用程序在操作系统启动的时候,什么时候叫启动?后面的文章中我会详细的介绍,先不用管它。在操作系统启动起来以后,这个程序未必会运行起来,只不过说,操作系统一启动,这就意味着这些程序已经具备了运行条件,或者说已经有了运行环境。但是它并没有有运行,什么时候运行,通常我们启动一个程序的方式可能有多种,比如说我们让操作系统一启动之后,这个程序就自动能够启动起来。不知道大家有没有留意过WINDOWS,你装完以后,一个干净的系统,然后点一下你的进程管理器,会发现后台运行有很多进程,对不对?这些进程是随系统的启动而启动的。这些进程有些我们把它称为叫服务,为什么称为叫服务呢?因为你的操作系统为了提供一个完整意义上的操作系统,它就必须要运行起来,才能让我们系统能够完整的提供一个基本的功能,那这种进程我们把它称为叫后台服务。而且是随系统自动启动的,当然也有一些是我们按需启动,比如,我们希望编辑一个Word文档的时候,我们才有必要启动word,不然的话,你开机WINDOWS的时候,word就自动启动,是没有任何意义的。

    所以有时候,我们需要手动启动,而这种程序,我们通常把它称为叫交互式程序。为什么是交互式呢?因为它本身就是个编辑器,需要用户不停的去编辑一些内容的,对吗?所以交互式程序需要跟用户进行交互的,而对用户来讲,我们使用计算机无非就是输入设备和输出设备,键盘、鼠标,输出设备是我们的显示器等等,那现在的问题就是,我们键敲一下键盘之后,这个信息一定是要有CPU先接收,我之前提到过,它通过中断先到达CPU,那CPU发现你敲下键盘以后,它怎么知道是哪个程序,是word还是excel呢?甚至是你的PPT呢?他怎么知道的呢?有没有考虑过这个问题?

    当我们敲下键盘之后,这个信息首先是到达CPU的,CPU并不知道敲键盘这个信息意味着什么,比如说,你按下ctrl+c,它是不是复制?还是说,你随意按了一个其他的键呢?为什么肯定就是复制呢?对于某些编辑器来讲,我们必须要把这个键盘的键解析为对应应用程序所能够理解的功能,对不对?但现在问题是,能够跟硬件交互的只有谁啊?内核,是不是,所以CPU在获得这个信息以后,它是首先通知内核来进行处理的,而不是直接说我叫做word,所以这个时候,内核必须要能够在CPU上运行起来,并且接着去处理这么一个信号。

    当然,内核会知道这个程序是由哪个进程发起来的。为什么呢?整个系统资源的监控包括上层所运营的应用程序的监控都是由内核来完成的,对不对?所以内核是会知道到底是有哪些进程处于当前的焦点,负责接收这样一个快捷键或者这样一个键的组合,那因此,由内核再转交给应用程序来完成,所以一个程序的执行过程是这样子的。但是,刚才我们不止一次的提到过,其实,操作系统本身,它也是一个程序,它也需要运行起来,既然需要运行,它可能就需要有指令和数据,而指令和数据是放在什么地方呢?内存当中对吧?比如我们所谓的存储器当中。那就意味着,在我们存储器当中,既有内核,还有其他的应用程序对吗?那如果说,一个恶意的应用程序能够直接访问内核的话,能够直接跟内核进行交互的话,能够直接去修改内核中的某些数据的话,这意味着什么?系统的稳定性将无从得到保证,对吗?那所以我们必须有一种机制,能够将应用程序和内核隔离开来。通常情况下,比如说像英特尔,这一类的平台上,它会提供所谓的保护机制或者叫保护模式。一般我们CPU有四个级别。是同心圆的四个环。最内层我们称为叫零级别或者叫第零环,而零环也称为叫特权级别,只有内核才能运行在特权模式下。而其他应用程序只能运行在最外层级别,中间两层没用。所以任何时候。应用程序是不能访问内存当中处于零级别的内存区域的。

     我们刚才提到过CPU跟内存,它们彼此之间是紧密结合的,所以CPU的零级别,它会映射到内存的某一段,处于保护的空间当中。那这些机制各位应该能够基本了解,我们翻来覆去的提到这些,也就是让各位知道,其实在我们的内存当中,当我们程序运行起来以后,在内存当中,它是分成两段的。事实上是三段。最底层这一段我说过,叫的映射程序,post加电自检以后,BIOS就自动映射到这个内存的开端之处了,所以系统能够运行起来,能够完成上电自检的。而自检完成之后,接下来就要载入我们的操作系统。说白了,其实载入操作系统内核的。那因此,在我们BISO的背后,这一段是运行内核的一段空间,这段空间就叫内核空间,要理解这个概念。kernel space。而后,再往后这段空间是被多个应用程序彼此之间共享的。那因此,这一段可能运行的是程序一,这一段可能运行的是程序二,这一段可能是运行程序三等等,能明白这意思吗?但是,这样有一个问题,这样分是很粗糙的,只是为了让大家去理解问题的,事实上,这样去进行划分,内存是非常容易产生内存碎片的。
     这里我们有提到概念叫碎片的概念。什么是碎片?各位想象一下,如果一个程序刚开始启动的时候,它只需要两兆内存,你给了它两兆。过一会儿,它又需要两兆,因为它运行过程中需要加载一些其他数据,这个怎么办?那就意味着我们在后面是不是还要给他重新申请两兆?而且这些空间已经不连续了,看到了吗?过一会有个程序退出了,然后又有个程序退出了,你看这剩下的两个段是不是就成了碎片了,所以我们内存管理显然不能是这么一种简单的机制。但是各位要明白就可以,事实上,各位应该知道,这就意味着,我们操作系统其实是一个非常复杂的东西。它需要管理的任务、需要完成的功能也是非常复杂的。


 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值