历史

1991年,还在俄罗斯圣彼得堡学院念书的LinusTorvalds在自己的Intel386计算机上开发了属于他自己的第一个程序,并借助Internet发布了他开发的源代码,将其命名为Linux,进而创建了Linux操作,并在同年公开了Linux的代码,因而开启了一个伟大的时代。在以后的将近30年的时间里,越来越多的工程师投入到Linux,帮助不断建立Linux的功能。现今的Linux系统构架凭着优秀的分层和模块化的设计,融合了大量的设备和不同的化学构架。

写这篇文章,也是对Linux系统的一个特别简单的介绍,主要讲解Linux的进程调度、内存管理、设备驱动、文件系统、网络模块。

虚拟ip配置_linux配置ip地址_linux系统配置虚拟ip

Linux内核构架图

上图就是Linux内核的构架图,从硬件层--->操作系统内核--->应用层,这套系统构架的设计应用于各种软硬件结合的系统上,例如物联网系统,单片机系统、机器人等领域。

进程调度

进程在Linux系统中称为process或task。操作系统中进程的数据结构包含好多元素,例如:地址空间、进程优先级、进程状态、信号量、占用的文件等,常常用数组链接。

CPU在每位系统滴答(Tick)中断形成的时侯检测就绪队列旁边的进程(遍历数组中的进程结构体),如有符合调度算法的新进程须要切换,保存当前运行的进程的信息(包括栈、地址等)后挂起当前进程,之后运行新的进程,这就是进程调度。

CPU调度的基本根据是进程的优先级。调度的终极目标是让高优先级的进程能及时得到CPU的资源,低优先级的任务也能公正的分配到CPU资源。不过由于保存当前进程的信息所以进程的切换本身是有成本的,调度算法同样须要考虑效率。

在初期Linux内核中,就是采用协程算法来实现的,内核在就绪的进程队列中选择高优先级的进程执行,每次运行相等时间,该算法简单直观,但依然会造成一些低优先级的进程长时间不能执行。为了提升调度的公正性,在后来Linux内核(2.6)中硬盘安装linux,引入了CFS调度器算法。

CFS引入虚拟运行时间的概念,虚拟运行时间用task_struct->se.vruntime表示,通过它来记录和测度进程应当获得的CPU运行时间。在理想的调度情况下,任何时侯所有的进程都应当有相同的task_struct->se.vruntime值。由于每位进程都是并发执行,没有进程会超过理想状态下应当占有的CPU时间。CFS选择须要运行的进程的逻辑基于task_struct->se.vruntime值,它总是选择task_struct->se.vruntime值最小的进程来运行(为了公正)。

CFS使用基于时间排序的黑红树来为将来进程的执行时间线。所有的进程按task_struct->se.vruntime关键字排序。CFS从树中选择最右边的任务执行。随着系统运行,执行过的进程会被放在树的一侧,逐渐让每位任务都有机会成为最右边的进程,因而让每位进程都能获取CPU资源。

总的来说,CFS算法首先选一个进程,当进程切换时,该进程使用的CPU时间会加到该进程task_struct->se.vruntime里,当task_struct->se.vruntime的值渐渐减小到别的进程弄成了黑红树最右边的进程时,最左侧的进程被选中执行,当前的进程被占据。

显存管理

显存,一种硬件设备,操作系统对其轮询,找到对应的显存单元,之后对其操作。CPU的字节宽度决定了最大的可轮询空间,32位机器最大轮询空间是4GBytes,64位机器最大轮询空间是2^64Bytes。

最大轮询空间和化学显存大小无关,称之为虚拟地址空间。Linux内核把虚拟地址空间分为内核空间和用户空间。每位用户进程的虚拟地址空间范围是0~TASK_SIZE。从TASK_SIZE~2^32或2^64的区域保留给内核,不能被用户进程访问。

虚拟地址空间与数学显存的映射

绝大多数情况下,虚拟地址空间比实际化学显存大,操作系统须要考虑怎样将实际可用的化学显存映射到虚拟地址空间。

Linux内核采用页表(pagetable)将虚拟地址映射到化学地址。虚拟地址和进程使用的用户&内核地址有关,化学地址拿来轮询实际使用的显存。

linux配置ip地址_linux系统配置虚拟ip_虚拟ip配置

示例图

上图所示,A和B进程的虚拟地址空间被分为大小相等的等份,称为页(page)。化学显存同样被分割为大小相等的页(pageframe)。

进程A第1个显存页映射到化学显存(RAM)的第4页;进程B第1个显存页映射到化学显存第5页。进程A第5个显存页和进程B第1个显存页都映射到化学显存的第5页(内核可决定什么显存空间被不同进程共享)。页表将虚拟地址空间映射到化学地址空间。

文件系统

Linux的核心理念:everythingisfile。Linux系统存在好多文件系统,例如EXT2,EXT3,EXT4,rootfs,proc等等,每一种文件系统都是独立的,有自己的组织形式、操作方式。

为了支持不同的文件系统,内核在用户态和文件系统之间包含了一层虚拟文件系统(VirtualFileSystem)。大多数内核提供的函数都能通过VFS定义的插口来访问。诸如内核的子系统:字符设备、块设备,管线,socket等。另外,用于操作字符和块设备的文件是在/dev目录下真实文件,当读写操作执行的时侯,其会被对应的驱动程序创建。

linux配置ip地址_linux系统配置虚拟ip_虚拟ip配置

VFS结布光

Linux的虚拟文件系统四大对象:

1.superblock(超级块)

2.inode(节点)

3.dentry(目录)

4.block(具体的数据块)

superblock

代表一个具体的早已安装的文件系统linux系统配置虚拟ip,包含文件系统的类型、大小、状态等等。

inode

代表一个具体的文件,在Linux文件管理中,一个文件不仅自身的数据外,还有一个附属信息,即文件的元数据(metadata)RED HAT LINUX 9.0,这个元数据用于记录文件的许多信息例如文件大小、创建人、创建时间等,这个元数据就包含在inode中。

inode是文件从具象--->具体的关键。inode储存了一些表针,这种表针指向储存设备的一些数据块,文件的内容就储存在这种数据块中。Linux想打开一个文件时,只须要找到文件对应的inode,之后顺着表针,将所有的数据块攒上去,就可以在显存中组成一个文件的数据了。

linux系统配置虚拟ip_虚拟ip配置_linux配置ip地址

inode结构

inode并不是组织文件的惟一方法,最简单的组织文件的形式,是把文件依次次序的装入储存设备,但若果有删掉操作的话,删掉导致的空余空间参杂在正常文件之间,很难借助和管理;复杂方法可以拿来数组来做,每位数据块有个表针,指向属于同一文件的下一个数据块,这样的用处是可以利用零散的空余空间,益处是对文件的操作必须根据线性形式进行,假如随机读取就必需要遍历数组,直至目标位置。因为这一遍历不是在显存进行,所以速率很慢。

inode既可以充分借助空间,在显存抢占空间不与储存设备相关,解决了里面的问题。但inode也有自己的问题。每位inode还能储存的数据块表针总量是固定的。假如一个文件须要的数据块超过这一总量,inode须要额外的空间来储存多下来的表针。

dentry

代表一个目录项,是路径的一部份,例如一个路径/home/jackycao/hello.txt,这么目录项就有home、jackycao、hello.txt。

block

代表具体的数据,一个文件由分散的多个block组成,组织的形式由inode来指向。

设备驱动

与外设的交互,说白了就是输入(input)、操作(operate)、输出(ouput)的操作。

内核须要完成三件事情:

1.针对不同的设备类型实现不同的方式来轮询硬件。

2.必须为用户空间提供操作不同硬件设备的方式,且须要一个统一的机制来确保尽量有限的编程工作。

linux系统配置虚拟ip_虚拟ip配置_linux配置ip地址

3.让用户空间晓得在内核中有什么设备。

linux配置ip地址_linux系统配置虚拟ip_虚拟ip配置

设备通讯图

内核访问外设主要有两种形式:I/O端口和I/O显存映射。具体不展开介绍了。

内核动态接收外设发来的恳求(数据)主要通过两种方法:寻址和中断。

寻址:周期性的访问查询设备是否有数据,假如有,便获取数据。这些技巧比较浪费CPU资源。

中断:核心思想是外设有恳求时主动通知CPU,中断的优先级最高,会中断CPU的当前进程运行,每位CPU都提供了中断线,每位中断由惟一的中断号辨识,内核为每位应用的中断提供一个中断处理方式。当有数据已打算好可以给内核或则间接被一个应用程序使用的时侯,外设出发一个中断。使用中断确保系统只有在外设须要处理器介入的时侯就会通知CPU,增强了效率。

PS:块和磁道的概念:块是一个指定大小的字节序列,用于保存在内核和设备间传输的数据,块的大小可以被设置,默认是4096bytes,磁道是储存设备操作的最小单元,默认是512Bytes,块是一段连续的磁道。

网路

Linux的网路子系统的模型基于ISO的OSI模型,Linux内核中会简化相应层级。右图为Linux使用的TCP/IP参考模型。

网路模型

Host-to-Host层:相当于OSI模型的数学层和数据链路层,负责将数据从一个计算机传输到另一个计算机。在Linux内核的角度来看,这一层是通过网卡的设备驱动程序实现的。

Internet层:相当于OSI模型的网路层,负责让网路中的计算机可以交换数据(这种计算机并不一定是直连的)。该层同时负责传输的包分成指定的大小,由于包在传输路径上每位计算机支持的最大网路包的大小不一样,在传输时数据被分割成不同的包,在接收端再组合。该层为网路中的计算机分配惟一的网路地址。

Transport层:相当于OSI模型的传输层linux系统配置虚拟ip,负责让两个联接的计算机上运行的应用程序之间的数据传输。例如,两台计算机上的顾客端和服务端程序,通过端标语来辨识通讯的应用程序。

App层:相当于OSI模型的会话层、表示层、应用层,网路中不同计算机的两个应用程序构建联接后,这一层负责实际内容的传输。

Linux内核子系统的实现通过C代码实现,每位层只能和它上下层通讯。

linux系统配置虚拟ip_linux配置ip地址_虚拟ip配置

Linux网路分层图

参考资料

《Linux内核设计与实现》

《Linux内核完全分析》

《Linux设备驱动程序》

订阅我的陌陌公众号“杨建荣的学习笔记”,第一时间免费收到文章更新。别忘了加星标,以免错过新推送提示。

近日热文

你可能也会对以下话题感兴趣。点击链接就可以查看。

本文原创地址://q13zd.cn/lnhjgtstnhdj.html编辑:刘遄,审核员:暂无