LinuxTree

Linux技术研究

Linux整体架构

1. Process Scheduler 进程管理,进程调度,负责管理CPU资源,以便让各个进程可以以尽量公平的 方式访问CPU
2. Memory Manager 内存管理,负责管理内存资源,以便让各个进程可以安全地共享机器的内存资源, 另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于Memory的内存,
不用的数据通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。
3.VFS 虚拟文件系统,Linux内核将不同功能的外部设备,例如DISK设备,输入输出设备,显示设备                    等,抽象为可以通过统一的文件操作接口(open, close, read, write)来访问,这就是Linux一切皆是文件的体现
5.NetWork 网络子系统,负责管理系统的网络设备,并实现各种各样的网络标准
6.IPC 进程间通信,IPC不管理任务的硬件,它主要负责Linux系统间进程之间的通信

bin(binaries)存放二进制可执行文件
sbin(super user binaries) 存放二进制可执行文件,只有root才能访问
etc(etcetera)存放系统配置文件
usr(unix shared resources)用于存放系统的共享资源
home 存放用户文件的根目录
root 超级用户目录
dev(devices)用于存放设备文件
lib(library)存放跟文件系统中的程序运行锁需要的共享库和内核模块
mnt(mount)系统管理员安装零时文件系统的安装点
boot 存放用于系统引导时使用的各种文件
tmp(temporary)用于存放各种零时文件
var(variable)用于存放运行时需要改变数据的文件	

Linux下6大IPC机制

Linux下进程间通信IPC的集中主要手段
1)管道及有名管道 Pipe, named Pipe
2)信号 Signal
3) 消息队列  Message
5) 共享内存 
6) 信号量 Semaphore
7) Socket 套接字

内核空间VS用户空间

Linux系统只有两层
    高优先级模式(特权模式),低优先级模式(普通模式)
	Linux在高优先级模式中运行系统内核代码以及与硬件相关的代码。
	       低优先级运行营运程序与硬件部分无关部分。
	应用程序不能直接操控硬件或者调用内核函数,需要借助一系列接口函数申请让系统调用相关的代码在内核空间运行 

Linux系统中每个进程占有4G空间(虚拟空间,并不一定占用)
空间分布如下:
    用户空间: 0~(3G - 1) 普通的应用程序代码运行在此部分空间
    内核空间:  3G~(4G - 1) 内核代码段,其中驱动就运行在此部分空间	

    当内核模块或者线程访问内存时,代码中的内存地址都是逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0xc0000003对应的物理地址是0x3,逻辑地址与物理地址对应的关系为
	物理地址 = 逻辑地址 - 0xc00000000

###内存类型

Linux内存管理机制

内存管理的实现涵盖了许多领域
    1) 内存中的物理内存页的管理
    2)分配大块内存的伙伴系统
    3)分配较小块内存的slab, slub, slob分配器
    5)分配非连续内存块的vmalloc机制
    6)进程的地址空间

    内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被
    称为虚拟地址空间,以为32位CPU的虚拟地址空间大小为4G,这和实际的物理内存数量无关。

    Linux内核将虚拟地址空间分成了两部分:
       1)一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用
         户空间。
       2)一部分是内核保留使用的,这部分是地址空间的高地址部分,从KERNELBASE到结束,称为
         内核空间。

       用户进程可用的部分在进程切换时会发生改变,但是内核保留使用的部分在进程切换的时候是
       不变的,在32位系统上,两部分的典型划分比例为3:1,即4G虚拟地址空间中的3G是用户进程
       可访问的,而另外1G是保留给内核使用的,

       不同的进程使用不同的用户空间可以使得不同进程的用户空间部分相互隔离,从而保护进程的用
       户空间部分。

       内核空间的保护是通过CPU的特权等级实现的,所以现代CPU提供了多个特权等级,每个特权等
       级可以获得的权限不同,当CPU处在某个权限等级时就只能执行符合这个等级的权限限制的操作
       。

    物理地址到虚拟地址的映射:
       
          可用的物理内存会被映射到内核虚拟地址空间中,在32位系统中,内核会将一部分物理内存
      直接映射到虚拟地址空间中,如果访问内存时所使用的虚拟地址与内核虚拟地址起始值的偏移量
      不超过该部分内存的大小,则该虚拟地址会被直接关联到物理页帧;否则就必须借助高端内存
      来访问,因此可以看出之所以使用“高端内存”是因为CPU可寻址的虚拟地址空间可能小于实际的
      物理内存。

          64位CPU系统不适用高端内存,这时因为64位系统理论上可寻址的地址空间远大于实际的
      物理内存,因而就不必借助高端内存了,而对于用户进程来说,由于它的所有内存访问都是通过
      页表进行,不会直接进行,

Linux 进程与线程


Linux CPU调度策略


###索引式文件系统

###闪盘FAT文件系统

Linux文件系统

      对于一个磁盘分区来说,在被指定为相应的文件系统后,整个分区被分为 1024,2048 和 
      4096 字节大小的块。根据块使用的不同,可分为:

      超级块(Superblock): 这是整个文件系统的第一块空间。包括整个文件系统的基本信息,如块
      大小,inode/block的总量、使用量、剩余量,指向空间 inode 和数据块的指针等相关信息。

      inode块(文件索引节点) : 文件系统索引,记录文件的属性。它是文件系统的最基本单元,是
      文件系统连接任何子目录、任何文件的桥梁。每个子目录和文件只有唯一的一个 inode 块。它
      包含了文件系统中文件的基本属性(文件的长度、创建及修改时间、权限、所属关系)、存放数据的
      位置等相关信息. 在 Linux 下可以通过 “ls -li” 命令查看文件的 inode 信息。硬连接和
      源文件具有相同的 inode 。

      数据块(Block) :实际记录文件的内容,若文件太大时,会占用多个block。为了提高目录访问
      效率,Linux还提供了表达路径与inode对应关系的dentry结构。它描述了路径信息并连接到节
      点inode,它包括各种目录信息,还指向了inode和超级块。

      Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出超级块、inode Table区块和
      data block数据区域。一个文件由一个超级块、inode和数据区域块组成。Inode包含文件的属
      性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文
      件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。

Linux 进程与文件

      1、进程表:内核维护一张进程表,记录每一个进程项,进程项中维持了一张在该进程中所有的
      打开的文件描述符,每个文件描述符记录了问价描述符标志和文件表项。

      2、文件表:内核维护一张文件表,用来记录所有的打开的文件表项。每个文件表项记录文件描述
      符状态标记、文件指针当前偏移量以及指向文件v节点所在地址的指针。

      3、v节点表:内核位置一张v节点表,记录所有打开的v节点,v节包含v节点信息以及i节点信
      息,每一个打开的文件有一个v节点结构,v节点中包含的i节点(索引节点)记录了文件的详细
      信息,例如记录了文件的长度,在盘中的地址等具体信息。

      进程之间对文件的管理就是通过这个三张表的关系层层连接。一个进程打开一个未打开的文件
      时候,就会生成产生文件描述符、文件表项一v节点结构,来记录这个文件的详细信息,如若另
      外一个进程打开与该进程相同的文件时候,则在另外一个进程中只会生成一个当前进程下的文
      件描述符和一个文件表项,但是是不会在生成v节点结构,一个打开的文件有且只有一个v节点
      结构,也就是两个进程的文件表项就会共用该v节点
维护工具daemontools:

      Daemontools是一款unix服务管理软件,提供一组工具来进行管理用户的一系列进程。
      Daemontools包含svscanboot,svscan,supervise,svc,svok,svstat等一系列工具。
      Daemontools主要有一下特点:
                 1)增加删除service:只需要在/service中删除或增加link即可
                 2)快速启动:在/service中增加服务, 即可自动在五秒内完成启动
                 3)可靠重启:service down掉之后,自动重启
                 5)简单可靠的控制:配置好 /service 之后, 使用svc命令,可以控制service daemon。
                 6)干净的进程状态:重启的service进程,跟第一次启动的一样干净,纯洁无暇
                 7)可移植:通过配置 /service,程序能在各个linux系统(Linux, BSD, 
                    Solaris, etc)上,按相同的方式运行