Liunx学习笔记(一)

一、Linux操作系统原理

  • 操作系统(Operating System,OS)是控制其他程序运行、管理系统资源并为用户提供操作界面的系统软件的集合。

  • 操作系统是一个庞大的管理控制程序,大致包括5个方面的管理功能:进程与处理机管理、作业管理、存储管理、设备管理、文件管理。

  • 所有的操作系统都具有并发性、共享性、虚拟性和不确定性四个基本特征。

(一)Linux操作系统

(1)Linux系统的组成

Linux操作系统一般包含4个主要部分:内核、shell、文件系统和应用程序。其中,内核、shell和文件系统构成了基本的操作系统结构,可以使得用户可以运行程序、管理文件并使用系统。

  • Linux内核:心脏,实现操作系统的基本功能。

    在硬件上,控制硬件设备,管理内存,提供硬件接口,处理基本IO。(其实就是CPU的功能)

    在软件上,管理文件系统,为程序分配内存和CPU时间等。

  • Liunx shell:Shell是一种命令解释器,有时间的话可以好好去钻研一下这个东西,Shell是系统的用户界面,提供用户与内核进行交互操作的一种接口,它可以解释由用户输入的命令并且把它送到内核执行

  • Liunx 应用程序:包括文本编辑器、编程语言、X-Window等各种应用程序。

  • Linux 文件系统:文件系统是文件存放在磁盘等存储设备上的组织方法。我很喜欢这个说法。每个目录可以包括多个子目录以及文件,系统以“/”为根目录。系统中所有数据都存储在文件系统上以便用户读取、查询和写入。Linux能支持多种目前流行的文件系统,如ext2、ext3、fat、vfat、ISO9660、nfs等。

(2)常见的Linux操作系统

Red Hat、Ubuntu、SuSE、Red Flag、Turbo Linux、Fedora等。

(3)关于Linux内核的构成

Linux内核由三个主要的子系统组成:进程调度(SCHED)、内存管理(MM)和文件系统(VFS)

  • 进程调度

Linux中的每个进程都分配由一个相对独立的虚拟地址空间。该虚拟空间分为两部分:

用户空间:进程本身的代码和数据。

内核空间:操作系统的代码和数据。  

 Liunx采用有条件的可剥夺的调度方式。

对于普通的进程,当其时间片结束时,调度程序挑选出下一个处于TASK_RUNNING状态的进程作为当前进程。

对于实时进程,若其优先级足够高,则会从当前的运行进程中抢占CPU成为新的当前进程。(在嵌入式中也就是中断的意思,谁优先级高我就先执行谁)

发生强制调度:其实也就是优先级最高的那个头头,如果进程在用户空间中运行,就会直接被剥夺CPU;如果进程在内核空间中运行,即使迫切需要其放弃CPU,也仍要等到从其系统空间返回前才被剥夺CPU。(也就是内核当前的进程要完成自己的任务先才可以交还CPU)

Linux的进程调度:主动调度和被动调度

主动调度随时都可以进行:

 Linux内核通过schedule()启动一次调度,还有一种方式是将进程状态设置为TASK_INTERRUPTIBLE,使得进程暂时放弃运行而进入睡眠状态。

用户状态中的程序可以通过pause()达到相同的目的。

 如果要为这种暂时的睡眠法起加上时间限制:

 内核态中有schedule_timeout()

用户态有nanosleep()用于实现目的。

内核中这种主动放弃是不可见的,它隐藏在每一个可能受阻的系统调用中,例如open()\read()\select()等。

被动调度发生在系统调用返回的前夕,中断异常处理返回前、用户态处理软中断返回前。Linux2.6开始实现了抢占式内核,即处于内核态的进程也可能被调度出去。

在Linux2.6之前,一个进程正在内核态运行,如果发生了另外一个高权值进程就绪,那么内核态就会一直执行当前进程的运行,直到这个进程进行完了,退出内核态才会引发调度程序。

那么对于Linux2.6之后,如果一个进程正在内核态进行,这个时候出现了一个权值高的进程就绪,那么在处理完中断后就会立即引发调度,切换道高权值进程。

 为了支持内核代码可以抢占,在Linux2.6版内核中通过采用禁止抢占的自旋锁来保护临界区。

  • 内存管理

Linux的内存管理采用分页机制来实现,分页机制是应用程序通过软硬件协作来访问内存的一种方法,其基本原理是将整个线性内存空间划分成若干页面,在80*86体系结构中是以4KB为一页的内存页面。程序申请使用内存时,就以一页为单位进行分配。

  • 文件系统

Linux内核将文件系统划分为两部分:

 一部分实现了对虚拟文件系统的支持。

另一部分用于实现与Minix文件系统相关的操作,这个部分被单独放在了一个名为Minix的文件夹内。

 虚拟文件系统可以分为以下的四个部分:

 第一部分是高速缓冲区的管理程序,该程序主要实现了高速缓冲的功能。

第二部分是文件系统低层程序,主要实现了对i结点的分配与释放,文件路径名与i结点映射,文件系统超级块的处理以及文件系统的选择处理功能。

第三部分是文件数据的访问操作程序,主要实现了对字符设备、管道、块设备、正规文件的数据访问功能。

第四部分是文件系统的上层操作程序,主要实现了文件的打开、关闭、创建等有关文件操作的系统调用。

(4)Linux的基本思想:

  • 一切都是文件。

  • 每个软件都有确定的用途,同时它们都尽可能被编写的更好。

系统中的所有内容都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等。

(二)Linux操作系统的特征

  • 并发

    并发是指多个时间在同一时间段内发生。操作系统是一个并发系统,包括各进程间的并发,系统与应用间的并发。操作系统要完成这些并发过程的管理。并行(parallel)是指在同一时刻发生。在多道程序处理时,宏观上并发,微观上交替执行(在单处理器情况下)。程序的静态实体是可执行文件,而动态实体是进程(或称做任务),并发指的是进程。

  • 共享

    多个进程共享有限的计算机系统资源。操作系统要对系统资源进行合理分配和使用。资源在一个时间段内交替被多个进程使用。资源分配后到释放前,不可以被其他进程所使用。

  • 虚拟

    虚拟是指一个物理实体映射为若干个对应的逻辑实体——分时或分空间。关于虚拟:CPU——每个用户(进程)的“虚处理机”;存储器——每个进程都占有的地址空间(指令+数据+堆栈);显示设备——多窗口或虚拟终端。

  • 异步性

    异步性也称为不确定性,指进程的执行顺序和执行时间的不确定性。也就是说进程的运行速度不可预知:在多个分时系统中,多个进程并发执行,“时走时停”,不可预知每个进程的运行推进快慢。无论进程运行快慢,结果应该相同——通过进程互斥同步手段来保证。难以重现系统在某个时刻的状态(包括重现运行中的错误)。性能保证:实时系统与分时系统相似,但通过资源预留以保证性能。

(三)Linux内核概述

Linux内核是一个庞大而复杂的操作系统的核心,不过尽管庞大,但是却采用子系统分层的形式,很好的进行了组织。想要真正了解Linux内核,必须要阅读完整的Linux内核源代码。

(1)Linux内核的版本

Linux内核分为两种:稳定版开发版

  • 稳定的内核具有工业级强度,可以广泛的在商业开发中应用。稳定版大部分都是对一些bug进行了修正或是在内核中加入一些新的驱动程序。

  • 开发版的内核中许多内容变化的都比较快,由于开发者不断试验新的解决方案,因此内核经常是不稳定的。

Linux版本的命名规则:num1.num2.num3

num1:主版本号

num2:次版本号(数字为偶数,则是稳定版,若为奇数,则为开发版)

num3:修订版本号

(2)Linux操作系统的基本体系结构

 

最上层为User Space(用户空间)是用户应用程序执行的地方。用户空间之下是内核空间,Linux内核正是位于这里,中间使用GNU C Library(glibc)供连接内核的系统调用接口,提供了用户空间应用程序和内核之间进行转换的机制(这个功能非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。)

Linux内核可以进一步划分为3层:

  • 第一层:系统调用接口(read/write)

  • 第二层:内核代码,独立于体系结构的内核代码。这些代码是Linux所支持的所有处理器体系结构所通用的。

  • 第三层:依赖于体系结构的代码,这些代码通常称为BSP(Board Support Package)的部分。这些代码用作支持给定体系结构的处理器和特定平台。

Linux内核的主要子系统如图所示:

 

 Linux内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux可以看作是一个整体,因为它会将所有的基本服务都集成到内核中,这与微内核的体系结构不同,后者回提供一些基本的服务。例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。

  • System Call Interface(系统调用接口)

    SCI层提供了某些机制用于执行从用户空间到内核的函数调用。实际上是一个非常有用的函数调用多路复用和多路分解服务。

    在Linux源代码的./linux/kernel中可以找到SCI的实现,并在./linux/arch中找到依赖于体系结构的部分。

  • Process Management(进程管理)

    进程管理的重点是管理进程的执行过程。在内核中,将处理器虚拟化为线程代码、数据、堆栈和CPU寄存器之后,这些进程又被称为线程。Linux实现并没有区分进程和线程这两个概念。内核通过SCI提供了一个应用程序编程接口来创建一个新进程、停止进程并在它们之间进行通信和同步。

    进程管理害包括处理活动进程之间共享CPU的需求。

O(1)调度程序:表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。  

 

O(1)调度程序是在内核中的的一种新型算法,不管有多少个线程在竞争CPU,这种算法都可以在固定时间内进行操作。

  • Memory Management(内存管理)

    Linux包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

    如果是由硬件直接管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是4KB)。不过内存要管理的可不止是4KB的缓冲区。Linux提供了对4KB的缓冲区抽象,例如slab分配器。这种内存管理模式使用4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪一页是没有完全使用的,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。

    为了支持多个用户使用内存,有时候会出现可用内存被消耗光的情况。由于这个愿意,页面可以移出内存并放入磁盘中,这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码,可以在./linux/mm中找到。

  • Virtual File System(虚拟文件系统)

    虚拟文件系统为文件系统在Linux内核中提供了一个通用的接口抽象。它在SCI和内核所支持的文件系统之间提供了一个交换层。文件系统的源代码可以在./linux/fs中找到。

    文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集。这个缓冲区通过将数据保留一段时间,优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定的物理设备的接口。

  • Network Stack(网络堆栈)

    网络堆栈在设计上遵循模拟协议本身的分层体系结构。Internet Protocol(IP)是传输协议(通常称为传输控制协议或TCP)下面的核心网络层协议。TCP上面是socket层,它通过SCI进行调用的。

    socket层是网络子系统的标准API,它为各种网络协议提供了一个用户接口。从原始帧访问到IP协议数据单元(PDU),再到TCP和User Datagram Protocol(UDP),socket层提供了一种标准化的方法来管理连接,并且在各个终点之间移动数据。内核中网络源代码可以在./linux/net中找到。

  • Device Drivers(设备驱动程序)

    Linux源码中提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如Bluetooth、I2C、serial等。设备驱动程序的代码可以在./linux/drivers中找到。

  • 依赖体系结构的代码(Arch)

    尽管Linux很大程序上独立于所运行的体系结构,但是有些内容则必须考虑体系结构才能正常操作并实现更高的效率。./linux/arch子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录,每个子目录都关注内核中的一个特定方向,例如引导、内核、内存管理等。这些依赖体系结构的代码可以在./linux/arch中找到。

其实看到这,我觉得这已经跟我在学的小型嵌入式很像了,只不过就是多了多线程管理的机制还有内存管理,对于使用过嵌入式的人是比较容易上手的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑烯烃快去学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值