Linux自学笔记------Day01 基本概念

在这里插入图片描述


应用编程接口(application programming interface,简称API)
应用程序二进制接口(application binary interface,间标ABl)


文件:


文件偏移量(file position)= 文件位置(file offset)
文件的长度(length): 以字节为度量单位
     当一个文件首次打开时,文件位置是零且文件位置不可以是负值;
将字节写入文件的中间位置是不可能扩大文件的,因为会覆盖之前位于该偏移量的字节,多数的文件写入操作发生在文件末尾。文件位置的最大值受限于用来储存它的C数据类型的大小,就现代的 Linux 而言此大小为64位。
     一个文件可以被不同的进程甚至是相同的进程多次打开。每一个被打开的文件实体都会被赋予一个独一无二的fd,进程之间可以共享它们的fd,这让单一-描述符可以供一个以上的进程使用。内核并不会对同时进行的文件访问强加任何限制。可以有多个进程同时自由读写相同的文件。此类同时访问的结果取决于个别操作的先后顺序,通常难以预期。
    文件的访问通常是通过文件名称(filename ) ,但是文件与此类名称并没有直接的关联性。事实上,文件的引用 是通过inode (information node,信息节点),它会被赋予一个独一无二的数值。此值又称为inode number(信息节点编号),通常会被简写成i-number或者ino。inode用来储存与某个文件有关的元数据,例如文件的时间戳、拥有者、类型、长度以及文件内容的摆放位置一—然而就是没有文件名! inode 既是一个实际的对象(被放在磁盘上有Unix风格的文件系统中).也是–个概念性实体(由Linux内核中的一个数据结构来表示)。


目录与链接:


    通过文件的 i-number来访问文件很麻烦(而且具有潜在的安全漏洞),所以用户空间程序通常会使用名称(而不会使用i-number)来打开文件。目录(directory)可用来提供访问文件时所使用的名称。目录的功能就是把人类可阅读的名称映射至i-number。将名称和inode 配成对就称为链接(link)。目录看起来就像一般文件,不同之处在于目录中只包含名称与inode 之间的映射关系。
    目录里的链接可以只指向其他目录的inode。这意味着,目录可以嵌套在其他目录之中形成目录的层次结构。一个以根目录起头的路径名称被称为完全限定路径名称(fully qualified pathname)或绝对路径名称(absolute pathname)。有些路径名称并非完全限定的,相反,它们是相对于其他目录的(例如 todo/plunder)。这些路径名称被称为相对路径名称(relativepathname)。当所提供的是相对路径名称时,内核会从当前工作目录(current workingdirectory)开始进行路径名称的解析工作。内核可以从当前工作目录查找todo目录,从那里开始,内核可以取得plunder 的inode。


硬链接:


当多个链接将不同的名称映射至同一个inode时,我们称这些链接为硬链接(hard link )。
    硬链接让复杂的文件系统结构可以拥有多个指向相同数据的路径名称。硬链接可以位于相同的目录中,或者位于两个或多个不同的目录中。在这两种状况下,内核都会将路径名称解析成正确的inode。例如,/homelbluebeard/map.txt和/homelblackbeard/treasure.txt 可以硬链接至某个指向特定数据块的inode。
    删除一个文件包括了将它的链接从目录结构中移除,方法很简单,只要将它的名称和inode 的映射关系从目录中移除即可,这又称为 unlink 操作 。然而,因为Linux支持硬链接,所以在每次unlink操作之后,文件系统不会马上破坏inodc与它的相关数据。如果文件系统中存在另一个硬链接会怎样?在所有链接被移除之前,为了确保文件不会遭到破坏,每个inode都会包含一个 “链接计数”(link count) 字段来记录文件系统中有多少链接指向它。当一个路径名称被移除链接时,链接计数就会被递减1。只有当它变为0时,inode 与它的相关数据才会从文件系统中被实际移除。


符号链接:


    硬链接无法跨越文件系统,因为inode number如果位于inode 所隶属的文件系统之外便毫无意义。为了让链接可以跨越文件系统,Unix系统还实现了 符号链接(symboliclink 、常简写成symlink ) 。symlink若指向尚不存在的文件称为“不完整的链接”( broken link )。
    相较于硬链接,symlink 会招致更多的开销,因为symlink 的解析包括了两个文件(符号链接本身以及所链接的文件)的解析。硬链接不会招致额外的开销-一-多次访问链接至文件系统的某个文件并没有什么差别,一次只解析一个链接。symlink 的开销其实很小,但是仍然会被视为一项缺点。


特殊文件:


    特殊文件就是被表示成文件的内核对象。是一种让特定的抽象概念可以融入文件系统的方法。Linux支持四种:块设备文件、字符设备文件、命名管道(named pipe)以及 Unix domain socket。
    Unix设备通常分成两类:字符设备(character device)以及块设备( block device)。 每一种设备类型都拥有自己专属的设备文件。
    字符设备 可被当成线性字节队列来访问。相对而言,块设备 可被当成字节数组来访问。命名导管(named pipe,通常称为FIFO,也就是“先进先出”的意思) 是一种进程间通信(interprocess communication,简称IPC)机制,它通过文件描述符提供了一个通信管道,你可以通过一个特殊文件来访问它。正规管道(regular pipe) 是指将一个程序的输出“用管道传输至”(pipe to)另一个程序的输入的方法,它们是由系统调用在内存中创建的,所以不会存在于任何文件系统中。命名管道的行为很像正规管道,但是它的访问是经一个称为FIFО的特殊文件来进行的。无关的进程可通过访问该文件来与命名管道通信。socket 是特殊文件的最后一种类型,它是IPC的一种高级形式,让不同的进程得以彼此通信,这些彼此通信的进程不仅可以位于相同的机器上,也可以位于不同的机器上。事实上,socket的通信形式是网络和 Internet程序设计的基础。socket有多种变化形式,其中包括Unix domain socket,这是 socket用于机器内部通信的一种形式。尽管socket通过Internet 通信时需要使用主机名称和端口号来识别通信的目标,但Unixdomain socket 却是使用文件系统中的一个特殊文件来进行通信,通常这个特殊文件就称为socket文件。


文件系统与命名空间:


    Linux为文件和目录提供了一个全局和统一的命名空间(namespace)。有些操作系统将磁盘和磁盘驱动器分成两个不同的命名空间–—例如,一个位于软盘上的文件可能要经路径名称A:\plank.jpg来访问,然而硬盘则位于C:\。在Unix 中,同一个位于软盘上的文件可能要通过路径名称/medialfloppy/plank.jpg来访问,或通过homelcaptain/stuff/plank.jpg来访问,不论文件来自哪个媒体。也就是说,在Unix 上,命名空间是统一的。
    一个文件系统(filesystem)就是在正式和有效的层次中一群文件和目录所构成的集合。文件系统可被单独地加入文件和目录的全局命名空间或是从全局命名空间移除。这两项操作称为 挂载〈mounting〉和卸载(unmouning) 。每个文件系统可以被挂载到命名空间中某个位置上,这就是所谓的 挂载点(mount point) 。然后文件系统的根目录可通过此挂载点被访问。举例来说,一片CD可以被挂载到/medialcdrom,这让CD上的文件系统根目录可以通过该挂载点被访问。第一个文件系统会被挂载到命名空间的root节,也就是“/”,这被称为根文件系统(root filesystem)。Linux系统通常会具有一个根文件系统。其他的文件系统则可被自由挂载到其他挂载点。
    文件系统通常物理存在着(也就是被存储在磁盘上),尽管Linux 也支持仅存在于内存中的虚拟文件系统(virtual filesystem)以及跨越网络存在于远程机器上的网络文件系统(network filesystem )。物理文件系统位于块存储设备上,例如光盘、软盘等。
     ;块设备上最小的可寻址单元就是扇区(sector)。扇区是设备的物理特性。扇区的大小通常是2的幂次方,512B是相当常见的尺寸。块设备无法移动或访问尺寸小于一个扇区的数据单元,所有的I/O都是以一个或多个扇区来进行的。同样地,块(block)是文件系统上最小的逻辑可寻址单元。块是文件系统的一个抽象概念.文件系统上并不存在这样的物理媒体。


进程:


    如果说文件是Unix系统中最基本的抽象概念,那么进程就是第二基本的抽象概念。进程(process)是执行中的目标码(object code):正在运行的程序。 但是它不仅仅是目标码,进程由数据、资源、状态以及一个虚拟的计算机组成。
    进程的生命始于可执行目标码(executable object code),这是采用内核所了解的 可执行格式(Linux中最常见的格式为ELF) 的机器可运行代码〈machine-runnable code ) 。可执行格式包括元数据(metadata )以及多个代码和数据段(sections of code and data) 。这些段是会被加载至内存的线性块的目标码的线性块(linear chunk)。最重要和最常用的段是text 段、data段以及bss段。 text段 中包含可执行代码以及只读数据(例如常变量),而且通常会被标示成只读及可执行。data段 中包含已初始化的数据(例如定义过初始值的C变量),而且通常会被标示成可擦写。bss段 中包含尚未初始化的全局数据。因为C标准规定C变量的默认值基本上都为零,所以不需要将零存入磁盘上的目标码。
    在内核内部,–个进程所配得的资源会随着进程的相关数据及统计值一同被存入进程的生程描述符( process clescriptor)。


线程:


    每个进程由一个或多个执行的线程(threads of execution、通常只简写为threads)所构成。线程就是进程内最小的执行单位,该抽象对象负责执行程序代码以及维护进程的运行状态。
    多数进程仅由单一线程构成,它们被称为单线程(single-threaded),而那些包含多个线程的进程被称为多线程(multithreaded)。传统上,Unix程序都是单线程的,这是因为Unix历来着重简单、快速的进程创建时间以及稳固的IPC机制,这些都会降低对线程的需求。
     线程由堆栈(.stack,用来存放它的局部变量,如同无线程系统上的进程堆栈)、处理器的状态以及目标码中的当前位置(通常存放在处理器的指令指针中)组成。 进程的其余部分多半由所有线程所共享。


进程的层次结构:


    每个进程可通过一个具唯一性的正整数被标识,这称为 进程标识符(process ID、简称pid) 。第一个进程的 pid是1,之后每个进程都会收到一个独一无.二的新pid。在Linux中,所有进程会呈现出一个层次结构,这称为进程树(process tree) 。进程树的根节点是第一个进程,也就是init进程,通常就是init(8)程序。可通过fork ()系统调用创建新进程。此系统调用会替进行调用的进程(calling process)创建一个副本。原本的进程称为父进程(parent ),新的进程称为子进程(child)。第一个进程除外,每个进程皆有父进程。 如果父进程在其子进程之前先终止了,内核会将该子进程重新指派给init进程。
    当一个进程终止时,它并不会立即从系统中被移除。事实上,内核会把该进程的一部分保留在内存中,这让该进程的父进程可以打听到它的终止状态。这被称为***等候(waitingon〉已终止的进程*** 。一旦父进程等到其已终止的子进程,子进程会被完全移除。一个已被终止的进程,如果没有父进程在等候它,则被称为 僵尸进程(zombie )


用户与组:


    Linux 中的授权机制由用户 (user)和组(group)提供。每个用户会被分配一个独一无二的正整数,称为 用户标识符(user ID,简称uid) 。每个进程恰好会被关联到一个uid,用来识别运行进程的用户,这被称为 进程的真实用户标识符(real uid ) 。在 Linux 内核内部,用户ID就代表用户。


使用权限:


    每个文件会被关联到一个拥有用户、一个拥有组以及一组权限位(permission bit)。权限位描述了拥有用户、拥有组以及其他任何人是否有权力读取、写入与执行该文件﹔ 这三种用户权限设定各需要用到3位,所以总共需要用到9位。这些拥有者以及权限位的设定就存储在文件的inodc 中。

    表1-1完整地列出了这9个权限位、它们的八进制值(常用来表示这些位的值)、它们的文本值(如同ls 所显示的方式)以及它们所代表的意义。
Linux自学笔记------Day01 基本概念_第1张图片***

信号:


    信号(signal)是一种单向异步通知机制。 信号可以从内核送往一个进程,从一个进程送往另-个进程,或者从一个进程送给它自己。信号通常用来通知某个进程发生了某个事件,Linux内核大约实现了30多种信号(实际的数目因架构而异)。每种信号可以使用数值常量以及文字名称来表示。
     SIGKILL(通常用于终止进程)和SIGSTOP(通常用于中止进程),


进程间通信:


     Linux所支持的IPC机制包括:管道、命名管道、信号量(semaphore)、消息队列、共享内存以及快速用户空间互斥体。

你可能感兴趣的:(Linux,linux,操作系统)