总第77篇

本篇将全面梳理Linux系统的体系结构,相信你阅读完本文定能对Linux系统有一个更深刻地认识和更全面的掌握。

Linux系统一般有四个主要部分:内核、shell、文件系统、应用程序。 前三者一起构成了基本的操作系统结构,它使得用户可以使用这个操作系统并在系统中完成特定的任务。其结构如下图所示。

1.Linux内核

内核是操作系统的核心,提供很多的基本功能,它负责管理系统的进程、内存、设备驱动程序、文件系统和网络系统等,决定着系统的性能和稳定性。Linux内核主要由以下几部分组成:内存管理、进程管理、设备驱动程序、文件系统、网络管理等,其体系结构可表示成如下图所示:

从上图可以看出,用户与内核之间的交互是通过系统调用接口来完成的。

系统调用接口(System Call Interface)这一层提供了 某些机制执行从用户空间到内核空间的函数调用,接口依赖于体系结构。SCI可以看作是一个非常有用的函数调用式的多路复用、多路分解服务,在目录./linux/kernel下可以找到SCI层的具体实现,在目录./linux/arch 下可以找到其依赖的体系结构。

内存管理

对于计算机而言,内存资源总是有限的,为了让有限的物理内存满足应用程序的需求,Linux采用了“虚拟内存”管理方式, 它使得应用程序认为它拥有连续可用的内存(实际上是多个物理内存碎片,甚至部分暂存在外部磁盘上),让大型程序的编写变得更容易,对物理内存的使用也更有效率。Linux将物理内存划分为容易处理的内存页,目前大多数系统的页面都是4kb

Linux包括了管理可用内存的方式以及物理、虚拟映射所使用的硬件机制。当然,内存管理不光是管理4kb缓冲区, 系统提供了对4kb缓冲区的抽象, 它是以4kb为基数,从中分配结构,并跟踪内存页的使用情况,从而达到根据系统的需要动态调整的效果。

为了支持多用户使用内存,有时内存可能被消耗光,系统可以将暂时不用的页面放入磁盘中,这个过程称为交换。内存管理的源代码可以在目录./linux/mm中查看。

进程管理

进程是某特定应用程序的一个运行实体。Linux系统支持多任务,它是通过在“时间片”间隔内轮流执行这些进程来实现的,进程轮流执行的方法称为“进程调度”,完成调度的程序为调度程序。 进程调度就是控制进程对CPU的访问, 每次由调度程序选择“最值得”运行的进程(可运行进程是仅等待CPU资源的进程),这种“最值得”是系统基于优先级的进程调度算法实现的。

通用多任务机制,每个进程可认为只有自己独占计算机,从而简化了程序的编写。每个进程有自己单独的地址空间,并只有自己可以访问,这样可以有效避免进程间的干扰。对于某项任务需要多个进程协作完成的,操作系统提供了进程间通讯机制来辅助完成。Linux系统中常见的进程间通讯机制有:信号、管道、共享内存、信号量、套接字等

内核通过SCI层提供了一个应用程序编程接口来创建一个新进程(fork 、exec或POSIX函数)、停止进程(kill、exit),并在它们之间进行通信和同步(signal或POSIX机制)。

文件系统

Linux系统将独立的文件系统组合成了一个层次化的树形结构, 并由一个单独的实体代表这一文件系统。对于一个外部新的文件系统,Linux系统通过“挂载”的方式将其挂载到某个目录上,从而让不同的文件系统结合成一个整体。

Linux支持多种不同的文件系统,其中Ext2是其原生文件系统外,它也能够支持FATVFATFAT32MINIX等文件系统,从而可以方便地与其它操作系统交换数据。Linux系统之所以能支持不同的文件系统,是因为它将各种文件系统组织成了一个统一的虚拟文件系统(Virtual File System)。

虚拟文件系统为所有设备提供了统一的接口,它在用户和内核所支持的文件系统之间提供了一个交换层,如下图所示:

从上图可以看出,在VFS上面是对文件的openclosereadwrite等通用API的抽象,在VFS下面是文件系统的抽象,定义了上层函数的实现。文件系统的源代码可以在目录./linux/fs中查看。

有了虚拟文件系统,用户和进程不需要知道文件所在的文件系统类型,而只需要像使用Ext2文件系统一样使用即可。

设备驱动程序

设备驱动程序是Linux系统内核的主要部分,它控制着操作系统和硬件设备间的交互。一般,设备驱动程序与设备的控制芯片有关。

网络接口

网络接口提供了各种网络标准的存取和各种网络硬件的支持。Linux的网络实现支持BSD套接字,支持全部的TCP/IP协议。

2. Linux Shell

shell是系统的用户界面,提供了用户与内核进行交互操作的接口,它接收用户输入的命令并将它送到内核去执行。shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其它应用程序具有同样的效果。

目前大部分GNU操作系统上默认的就是bash shell

3. Linux文件系统

文件系统是文件存放在存储设备上的组织方法。Linux系统支持的文件系统非常多,除Ext2Ext3Ext4 之外,还能支持FATNTFSWindows文件系统,较常见的文件系统如下表所示。

文件系统 详细描述
Ext Linux 中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用
Ext2 是 Ext 文件系统的升级版本,Red Hat Linux 7.2 版本以前的系统默认都是 Ext2 文件系统。于 1993 年发布,支持最大 16TB 的分区和最大 2TB 的文件
Ext3 是 Ext2 文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大 16TB 的分区和最大 2TB 的文件
Ext4 是 Ext3 文件系统的升级版。Ext4 在性能、伸缩性和可靠性方面进行了大量改进。Ext4 的变化可以说是翻天覆地的,比如向下兼容 Ext3、最大 1EB 文件系统和 16TB 文件、无限数量子目录、Extents 连续数据块 概念、多块分配、延迟分配、持久预分配、快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等。它是 CentOS 6.3 的默认文件系统
swap swap 是 Linux 中用于交换分区的文件系统(类似于 Windows 中的虚拟内存),当内存不够用时,使用交换分区暂时替代内存。一般大小为内存的 2 倍,但是不要超过 2GB。它是 Linux 的必需分区
NFS NFS 是网络文件系统(Network File System)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源
ISO9660 光盘的标准文件系统。Linux 要想使用光盘,必须支持 iso9660 文件系统
FAT 就是 Windows 下的 fatl6 文件系统,在 Linux 中识别为 fat
VFAT 就是 Windows 下的 fat32 文件系统,在 Linux 中识别为 vfat。支持最大 32GB 的分区和最大 4GB 的文件
NTFS 就是 Windows 下的 NTFS 文件系统,不过 Linux 默认是不能识别 NTFS 文件系统的,如果需要识别,则需要重新编译内核才能支持。它比 fat32 文件系统更加安全,速度更快,支持最大 2TB 的分区和最大 64GB 的文件
UFS Sun 公司的操作系统 Solaris 和 SunOS 所采用的文件系统
proc Linux 中基于内存的虚拟文件系统,用来管理内存存储目录 /proc
sysfs 和 proc —样,也是基于内存的虚拟文件系统,用来管理内存存储目录 /sysfs
tmpfs 也是一种基于内存的虚拟文件系统,不过也可以使用 swap 交换分区

3.1 Linux文件类型

Linux系统主要有以下文件类型:

  • 普通文件:分为纯文本文件和二进制文件,如C语言代码、shell脚本、二进制可执行文件等;
  • 目录文件:目录是存储文件的唯一地方;
  • 链接文件:指向同一个文件或目录的文件;
  • 设备文件:与系统外设相关的,一般在目录/dev下面。设备分为块设备和字符设备;
  • 管道文件:提供进程间通信的一种方式;
  • 套接字文件:与网络通信相关的文件;

可以通过命令ls -lfilestat等命令来查看文件的类型相关信息。

3.2 Linux目录

Linux使用标准的目录结构,在安装时就已经为用户创建了文件系统和完整固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。 在系统中,使用/来表示根目录,用../表示当前目录,用..../表示上一层目录。若一个目录或文件名以.开始,则表示这个目录或文件是一个隐藏目录或文件,如.bashrw,在默认方式查找时,不显示该目录或文件。

Linux系统的通过目录结构如下图所示:

下表列出了这些目录的作用与存储内容。

目录名称 详细描述
/bin bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的程序和指令。
/boot 存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
/dev dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
/etc etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录,更改目录下的文件可能会导致系统不能启动。
/home 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。
/lib lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。
/sys 这是内核的一个很大的变化。该目录下安装了内核中新出现的一个文件系统 sysfs 。
/sbin 只有系统管理员才能使用的程序和指令。
/media linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
/mnt 临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
/run 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
/lost+found 一般情况下为空的,系统非法关机后,这里就存放一些文件。
/tmp 这个目录是用来存放一些临时文件的。
/opt opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
/proc proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/root 该目录为系统管理员,也称作超级权限者的用户主目录。
/sbin s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。
/selinux 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
/srv 该目录存放一些服务启动之后需要提取的数据
/usr usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
/usr/bin 系统普通用户使用的应用程序。
/usr/sbin 超级用户使用的比较高级的管理程序和系统守护程序。
/usr/src 内核源代码默认的放置目录。
/var var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

Linux系统中,有下面几个目录是非常重要的,注意不误删除或随意修改内部文件:

  • /etc:这个是系统配置文件,修改了目录下的某个文件可能导致系统无法启动;
  • /bin,/sbin,/usr/bin,/usr/sbin:这是系统预设执行文件的放置目录, 不要轻易修改;
  • /var:这是非常重要的一个目录,相当于Windows下的Program files文件夹,系统上运行的很多程序的日志文件也存储于此。

3.2 Linux磁盘分区

Linux分区不同于Windows,硬盘和硬盘分区在Linux系统中都表示为设备。硬盘分区一共有三种:主分区、扩展分区和逻辑分区。主分区与扩展分区的数目之和不能大于四个

  • 主分区(Primary Partion):可以马上被使用,但不能再分区;
  • 扩展分区(Extension Partion):必须再进行分区后才能使用;
  • 逻辑分区(Logical Partion):由扩展分区建立起来的分区,逻辑分区没有数量上的限制

扩展分区只不过是逻辑分区的“容器”,实际上只有主分区与逻辑分区进行数据存储。

Linux系统下的硬盘分区标识一般使用/dev/hd[a-z]X(IDE接口的硬盘)或者/dev/sd[a-z]X(SCSI接口的硬盘)格式,其中[a-z]代表硬盘号,X代表硬盘内的分区号。 X的值是1到4时,表示为硬盘的主分区(包含扩展分区),逻辑分区是从5开始的。要注意:即使一块硬盘只有一个主分区,逻辑分区也是从5开始编号的。

总起来说,一个硬盘分区首先要确认在哪个硬盘,然后再确认它在哪个分区。可以使用fdisk -l命令查看硬盘的详细信息。

硬连接与软连接

Linux中连接有硬连接与软连接之分, 软连接又叫符号连接。它们的特点如下:

  • 硬连接:是指通过索引节点进行连接。文件系统中的文件都会给其分配一个编号,这个编号即索引节点,多个索引节点指向同一文件就是硬连接。硬连接的作用在于允许一个文件有多个路径名,从而建立了硬连接,以防止“误删除”。文件真正删除的条件是与之相关的所有硬连接文件均被删除。
  • 软连接:用ln -s命令建立文件的符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名,类似于Windows下的快捷方式。

硬连接与软连接的区别在于:

  • 硬连接原文件与新文件的inode编号一致,而软连接不一样;
  • 对原文件删除,会导致软连接不可用,而硬连接不受影响;
  • 对原文件的修改,软硬连接文件内容都同样的修改,因为指向的是同一个文件内容的。

文件目录管理的相关命令

文件目录管理的相关命令列举如下:

磁盘与文件空间管理:fdiskdfdu

文件目录与管理:cdpwdmkdirrmdirlscprmmv

查看文件内容:cattacmorelessheadtail

文件目录与权限:chmodchownchgrpumask

文件查找:whichwhereislocatefind

4.Linux内核参数优化

内核参数是用户与系统内核之间交互的一个接口,通过这个接口,用户可以在系统运行的同时,动态更新内核配置。这些内核参数是通过Linux proc文件系统实现的,因此,可以通过调整proc文件系统达到优化Linux系统性能的目的。

本文到此结束!下篇继续!

如果对你有帮助,请随手 点赞赞赏!关注本专栏,更多干货与你分享。

=======================================================

欢迎【关注、私信@武三郎。我们一起交流一起进步。

linux查看内存_【001】一文带你全面掌握Linux系统体系结构相关推荐

  1. linux查看内存_盘点腾讯linux C++后台开发面试题

    鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言,之前面试Java的公司侧重还是在数据结构.网络.框架.数据库和分布式.所以O ...

  2. linux查看内存_嵌入式操作系统的内存,你了解多少?

    关注.星标公众号,不错过精彩内容 来源:EDN电子技术设计 linux 内存是后台开发人员,需要深入了解的计算机资源.合理的使用内存,有助于提升机器的性能和稳定性.本文主要介绍 linux 内存组织结 ...

  3. linux检查内存插槽,Linux查看内存大小和插槽

    相信大家更换自己笔记本电脑的内存时一定是得心应手,即便是一名新手也可以很轻松的动手实现,其实服务器的内存更换也很简单,关机->挪盖->按指定顺序插拔.不过这里有一个很重要的共性前提,需要清 ...

  4. linux查看内存cpu占用

    linux查看内存cpu占用 top 命令  按q退出 可以添加额外选项选择按进程或按用户查看 如: top -u gitu PID:进程id PR:进程的优先级别,越小越优先被执行 NInice:值 ...

  5. Linux 查看内存插槽数、最大容量和频率

    我们通过free命令查看机器空闲内存时,会发现free的值很小.这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache 和buffer一些数据,下面是查看内存的命令供大家 ...

  6. Linux查看内存,负载状态

    Linux查看内存,负载状态 查看内存使用情况  www.ahlinux.com cat /proc/meminfo MemTotal:       16332644 kB MemFree:     ...

  7. Linux查看内存信息(型号、大小、速率等)

    安装工具dmidecode 使用 1.查看内存槽及内存条 $ sudo dmidecode -t memory 2.查看内存的插槽数,已经使用多少插槽.每条内存多大 $ sudo dmidecode ...

  8. linux 内存 参数,linux free命令参数及用法详解(linux查看内存命令)

    linux free命令参数及用法详解(linux查看内存命令) 2019年05月31日 | 萬仟网科技 | 我要评论 free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段 ...

  9. redhat linux 查看内存大小,CentOS (RHEL) 系统管理中的查看内存插槽数、最大容量和频率...

    Linux 查看内存的插槽数,已经使用多少插槽.每条内存多大,已使用内存多大 [root@HNTX-XY-PIM-HA5 ~]# dmidecode|grep -P -A5 "Memory\ ...

最新文章

  1. 【神经网络】(19) ConvNeXt 代码复现,网络解析,附Tensorflow完整代码
  2. 免费好用的Diff和Merge工具大总结
  3. [AI开发]基于深度学习的视频多目标跟踪实现
  4. sql左连接排序取第一个_详解kettle工具记录集连接功能及实验测试
  5. 参加第六届ITAT C语言程序设计大赛复赛-----数学溃败
  6. win10下git的配置教程
  7. java重入锁,再探JAVA重入锁
  8. 关于RabbitMQ以及RabbitMQ和Spring的整合
  9. OpenCv之图像形态学(笔记08)
  10. HDU - 4704(费马小定理和快速幂)
  11. win7下让不支持代理的程序使用代理
  12. 激光雷达数据集的采集与播放(C16/C32 系列多线混合固态激光雷达)
  13. Word插入脚注后分节符自动变成分页符解决办法
  14. 大型超市计算机管理系统论文,大型超市进销存管理系统的设计与实现
  15. git —— gerrit 问题初总结
  16. 红旗linux6桌面版系统安装,红旗Linux6.0桌面正式版光盘安装{图解教程}
  17. 数据仓库主题域如何划分
  18. 艾永亮:为什么国内品牌很难在市场中生存下去
  19. 用python爬虫来登录深信服ac行为控制器,涉及到js加密部分,更新url分类库(针对企业微信更新)
  20. adb: failed to install ebug.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE]

热门文章

  1. php如何写代码禁用广告,不再显示广告案例(php操作cookie)
  2. python寻找完全平方数_少儿编程|Python小课堂 – 寻找aabb完全平方数
  3. 畅销书系列:《引爆点》、《异类》、《从0到1》
  4. 机器学习实战——Logistic回归
  5. asp提交数据500服务器错误信息,windows2003运行ASP发送HTTP 500 - 内部服务器错误怎么处理啊?...
  6. java ee 三层架构_JavaEE的三层架构
  7. 写论文中所需的EndNote x9下载、安装以及与wps相关联教程
  8. Optimizate objective function in matrix
  9. 基于集成学习的小麦赤霉病高光谱图像识别方法研究
  10. python slice和列表切割_Python 列表切边 slice