Linux读书笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.Linux中“一切皆文件”的含义是什么?它的优势和不足在哪些方面有所表现。
看了一些资料,总结一下大致有这么几个说法:
①Linux所有的内容都是以文件形式存在的,普通文件本身就是文件,目录也是文件,硬件也抽象为文件,套接字、网络通信也是文件。
②对于所有的文件(包括目录等内容)使用的都是同一套函数处理,屏蔽了硬件的细节,将设备抽象为了文件。
优势:
对系统资源的读写,可以使用一套函数操作,因为Linux已经屏蔽了设备细节。
其次,我个人觉得很好的地方在于路径访问很方便,不区分盘符,所有不用管文件是不是都挤在c盘而不是其他非系统盘;也不用记忆软件到底安装再c盘的program目录还是d 盘的program目录中。
不足:
查阅了一些资料是这么说的----使用任何硬件设备都必须与根目录下某一目录执行挂载操作,否则无法使用。我们知道,本身Linux 具有一个以根目录为树根的文件目录结构,每个设备也同样如此,它们是相互独立的。如果我们想通过Linux 上的根目录找到设备文件的目录结构,就必须将这两个文件系统目录合二为一,这就是挂载的真正含义。
我对这句话的理解就是Linux的文件系统的起源就是一个从“/”开始,设计者依据不同的功能,将文件区分在不同的文件夹中,然后为了实现增加设备的功能,Linux留了一些空位置接纳新的设备(我觉得是类似指针的一个东西吧),当新设备加入时,这个“指针”就指向这个设备,就类似于在一颗树中的某个节点再接入一颗树形成一个更大的树一样。2.Linux系统中,构成文件的数据结构有哪些?各自的作用是什么?它们之间存在哪些逻辑上的联系?
2.Linux系统中,构成文件的数据结构有哪些?各自的作用是什么?它们之间存在哪些逻辑上的联系?
此处所提的主要是VFS虚拟文件系统,主要有四个类型对象(其实也不是对象,只是使用到了面向对象的思想进行设计),分别是:
1.超级块对象:一个超级块对应一个具体的文件系统(已经安装的文件系统类型如ext2,此处是实际的文件系统,不是VFS)。
2.索引节点对象iNode:inode是内核文件对象的元数据,inode 仅仅只是保存了文件对象的属性信息,包括:权限、属组、数据块的位置、时间戳等信息。
3.目录项对象(并不是目录文件):目录项对象是一个纯粹的内存结构,由文件系统在提供文件访问的过程中在内存中直接建立。dentry 中包含了文件名,文件的iNode 号等信息。
4.文件对象:注意file 对象描述的是进程已经打开的文件。因为一个文件可以被多个进程打开,所以一个文件可以存在多个文件对象。但是由于文件是唯一的,那么iNode 就是唯一的,目录项也是确定的。
关系:
1. 超级块对象和iNode对象分别对应有物理数据,在磁盘上有静态信息。
2. 目录项对象和文件对象描述的是一种关系,前者描述的文件与文件名的关系;后者描述的是进程与文件的关系,所以没有对应物理数据。例如有三个不同的进程打开同一个文件,其中有两个进程使用了相同的硬链接。三个进程拥有各自的文件对象,而只有两个目录项对象(同一个硬链接对应一个目录项对象,目录项对象不随进程打开文件而增加或改变)。两个目录项对象都指向同一个iNode。
3. 进程每打开一个文件,就会有一个文件对象结构与之对应。同一个进程可以多次打开同一个文件而得到多个不同的文件对象结构,文件对象结构描述被打开文件的属性,如文件的当前偏移量等信息。
4. 两个不同的文件对象结构可以对应同一个目录项对象结构。进程多次打开同一个文件时,对应的只有一个目录项对象结构。
5. 在存储介质中,每个文件对应唯一的inode结点,但是每个文件又可以有多个文件名。即可以通过不同的文件名访问同一个文件。这里多个文件名对应一个文件的关系在数据结构中表示就是目录项对象和inode的关系。
6. Inode中不存储文件的名字,它只存储节点号;而目录项对象则保存有名字和与其对应的节点号,所以就可以通过不同的目录项对象访问同一个inode。
7. 不同的目录项对象则是同个文件链接(ln命令)来实现的
图解,图片来自网上
3.在Linux内核实现内核的过程中,如何使用C语言实现面向对象的基本特点的,请用代码举例并附加文字说明的形式解释
面向对象的主要三个特征,封装、继承、多态,c语言虽然没原生支持面向对象,但是通过各种数据结构以及数据类型可以实现这三个特征。
封装:封装定义是在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
对于这个问题上的语言缺陷可以使用函数表。
假设我们有类A,其内含有a、b、c三个成员变量,并有操作方法 op_a(a)、op_b(b)、op_c(c)、op_ab(a, b)等。
struct Ops {
void (*op_a) (struct A *, loff_t, int);
void (*op_b) (struct A *, char __user *, size_t, loff_t *);
void (*op_ab) (struct A *, const char __user *, size_t, loff_t *);
…
};
首先这是一个只含有方法的结构体,我们称之为函数表,传递的结构体参数A为c++中默认编译器为类传递的this对象,这样,我们将结构体ops内嵌到结构体A中,如下:
Struct A{
Int a;
Int b;
Int c;
Struct Ops ops;
}
将方法封装到了结构体中。在这里结构体A相当于一个父类,而ops是作为父类公开给子类的接口
多态:是允许将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
由多态的定义,最关键的地方在于运行时切换即在编译期不能确定需要执行的代码。这里我们声明两个子操作表 ops1 、ops2,当需要使用ops2时,
将 A->ops = ops2,即将子类实例化到父类,下面类A的具体操作就会采用ops2操作表中的方法。如图:
代码示例:
Struct A a;
a-> ops = ops1;