levels 发布的文章

在Linux操作系统中,有几种常见的文件系统类型,其中包括ext1、ext2、ext3和ext4。下面是对它们的区别进行详细描述:

ext1(第一个扩展文件系统):

ext1是最早的扩展文件系统之一,用于早期的Linux系统。它是linux上第一个利用虚拟文件系统实现出的文件系统。它使用简单的文件组织结构,没有日志功能,也没有支持文件系统的日志记录和恢复功能。ext1不支持文件和目录的访问控制列表(ACL)。
由于缺乏日志功能,如果系统崩溃或意外断电,可能会导致数据损坏或丢失。

ext2(第二个扩展文件系统):

ext2是ext1的改进版本,增加了一些功能和性能改进。
ext2 的经典实现为LINUX内核中的ext2fs文件系统驱动,最大可支持2TB的文件系统。在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被删除。此外,同一文件在磁盘中存放和被打开时所对应的inode是不同的,并由内核负责同步。文件系统高效稳定。
ext2仍然不支持访问控制列表(ACL)。

ext3(第三个扩展文件系统):

ext3是ext2的演化版本,向后兼容ext2。
ext3在ext2的基础上增加了日志记录功能,提供了更好的数据一致性和错误恢复能力。
它支持访问控制列表(ACL),可以为文件和目录设置更详细的权限控制。
ext3仍然使用固定的索引节点(inode)大小,限制了文件系统的最大容量和性能。

特性:
1、高可用性:系统使用了ext3文件系统后,即使在非正常关机后,系统也不需要检查文件系统。
2、数据的完整性:避免了意外宕机对文件系统的破坏。
3、文件系统的速度:因为ext3的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之Ext2文件系统并来说,性能并没有降低。
4、数据转换 :“由ext2文件系统转换成ext3文件系统非常容易。
5、多种日志模式

ext4(第四个扩展文件系统):

ext4是ext3的进一步改进和升级版本,向后兼容ext2和ext3。
ext4增加了更高的文件系统容量限制和更大的文件大小支持。
它引入了多块分配、延迟分配和无日志写入等功能,提高了文件系统的性能和数据安全性。
ext4支持更快的文件系统检查和修复时间,并提供更灵活的文件系统扩展能力。

特性:

1.与Ext3兼容

2.更大的文件系统和更大的文件:Ext4分别支持1EB(1EB=1024PB,1PB=1024TB)的文件系统,以及16TB 的文件。

3.无限数量的子目录:而Ext4支持无限数量的子目录。

4.Extents:Ext4引入了extents概念,每个 extent 为一组连续的数据块,相比Ext3采用间接块映射,提高了不少效率。

5.多块分配:Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。

6.延迟分配

7.快速 fsck

8.日志校验

9.“无日志”(No Journaling)模式

10.在线碎片整理

11.inode 相关特性:较之Ext3默认的inode大小128字节,ext4默认inode大小为256字节


没有ext1的原因:

旧且过时:ext1是最早的扩展文件系统之一,用于早期的Linux系统。随着时间的推移,ext1已被后续的文件系统所取代,并且不再是当前Linux系统的标准选择。

缺乏重要特性:相比后续版本的ext文件系统,ext1缺乏许多重要的特性。它不具备文件系统日志功能,这意味着在系统崩溃或意外断电的情况下,数据完整性和一致性的保护能力较差。此外,ext1也不支持访问控制列表(ACL),这限制了对文件和目录权限的更精细控制。

不推荐使用:由于缺乏关键特性和相对较低的可靠性,Linux社区已经不再推荐使用ext1文件系统。后续的ext2、ext3和ext4文件系统提供了更多的功能和改进,可以更好地满足现代系统的需求。


相关资料:

Ext4 - Ubuntu Wiki: 这是Ubuntu操作系统的官方Wiki页面,涵盖了对ext4文件系统的详细介绍,包括特性、性能、格式化、调优和备份等方面的内容。
链接:https://wiki.ubuntu.com/Ext4

The Linux Kernel Documentation: ext4优化
链接:https://www.kernel.org/doc/html/latest/filesystems/ext4/

1. 静态库&动态库

1静态链接库的优点

(1)代码装载速度快,执行速度略比动态链接库快;

(2)只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。

2动态链接库的优点

(1)更加节省内存并减少页面交换;

(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;

(3)不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;

(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

3不足之处

(1)使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

(2)使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见

2. Mask&Umask

Linux中的权限有r(读) w(写) x(执行),分别用数字4,2,1代表。
Umask是设置系统创建文件时的默认权限,是创建文件权限补码,对文件来说最大值是6
Umask设为为244,则创建的文件默认权限是422,文件的第一位是‘-’也就是-r—w–w-

3. 子进程&父进程

子进程继承父进程
    用户号UIDs和用户组号GIDs
    环境Environment
    堆栈
    共享内存
    打开文件的描述符
    执行时关闭(Close-on-exec)标志
    信号(Signal)控制设定
    进程组号
    当前工作目录
    根目录
    文件方式创建屏蔽字
    资源限制
    控制终端
子进程独有
    进程号PID
    不同的父进程号
    自己的文件描述符和目录流的拷贝
    子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
    不继承异步输入和输出
父进程和子进程拥有独立的地址空间和PID参数。
子进程从父进程继承了用户号和用户组号,用户信息,目录信息,环境(表),打开的文件描述符,堆栈,(共享)内存等。
经过fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父进程把自己克隆了一遍。事实上,父进程只复制了自己的PCB块。而代码段,数据段和用户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作时,才会产生中断,并为子进程分配内存空间。由于父进程的PCB和子进程的一样,所以在PCB中断中所记录的父进程占有的资源,也是与子进程共享使用的。这里的“共享”一词意味着“竞争”

4. EXT文件

ext
第一代扩展文件系统,一种文件系统,于1992年4月发表,是linux核心所做的第一个文件系统。采用Unix文件系统(UFS)的元数据结构,以克服MINIX文件系统性能不佳的问题。

ext2
第二代扩展文件系统是LINUX内核所用的文件系统,用以代替ext。

ext3
EXT3是第三代扩展文件系统。Ext3文件系统是从Ext2文件系统发展而来,目前已经非常稳定可靠。它完全兼容ext2文件系统。

ext4
EXT4是第四代扩展文件系统,是ext3文件系统的后继版本。Ext4是Ext3的改进版,修改了Ext3中部分重要的数据结构,Ext4可以提供更佳的性能和可靠性,还有更为丰富的功能

详细内容可阅读:ext文件系统笔记

5. nohup命令

如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用 nohup 命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup 就是不挂起的意思( no hang up )

6. 常见退出命令

Esc:在vi的插入模式或者底行命令模式下进入命令模式
q:用来退出 man 手册查看命令或者配置文件的状态,或者more、less等命令查看文件的状态
exit:一般用于退出会话式程序或者交互式命令行,如ssh远程连接,切换 shell(Linux中)
quit:一般用于图形界面的退出

7. git合并

( 1 ) git merge
( 2 ) git pull
( 3 ) git cherry-pick

8. 与或非符号

! 为非运算

-a (and)表示并且,与运算

-o (or)表示或,或运算

9. Select 与 Epoll

select 和 epoll效率差异的原因:select采用轮询方式处理连接,epoll是触发式处理连接。

Select:

  1. Socket 数量限制:该限制可操作的 Socket 数由 FD_SETSIZE 决定,内核默认32*32=1024.

2.操作限制:通过遍历FD_SETSIZE(1024)个 Socket 来完成调度,不管哪个 Socket 是活跃的,都遍历一遍。

Epoll

  1. Socket 数量无限制:该模式下的 Socket 对应的fd列表由一个数组来保存,大小不限制(默认4k)。

2.操作无限制:基于内核提供的反射模式,有活跃 Socket 时,内核访问该 Socket 的 callback ,不需要遍历轮询。

但当所有的 Socket 都活跃的时候,所有的 callback 都被唤醒,会导致资源的竞争。既然都是要处理所有的 Socket ,那么遍历是最简单最有效的实现方式。

10. crond 命令
速记:分食(时)日月粥(周)

crond是linux用来执行周期性任务的进程

crontab基本格式 :
分  时  日 月  周  命令
第1列表示分钟1~59 每分钟用或者 /1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

时间配置段为 5 部分:f1 f2 f3 f4 f5,其中 f1 是表示分钟(0-59),f2 表示小时(0-23),f3 表示一个月份中的第几日(1-31),f4 表示月份(1-12),f5 表示一个星期中的第几天(0-6)。

当 f1 为 时表示每分钟都要执行,f2 为 时表示每小时都要执行程序,其余类推;
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推;
当 f1 为 /n 时表示每 n 分钟个时间间隔执行一次,f2 为 /n 表示每 n 小时个时间间隔执行一次,其余类推;
当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其余类推。

题中 /30 3 表示:每月的 3 号,每 30 分钟执行命令。

11. Linux运行级别

0 : 系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭。

1 : 单用户工作状态,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。

2 : 多用户状态,没有NFS支持。

3 : 完整的多用户模式,有NFS,登陆后进入控制台命令行模式。

4 : 系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。

5 : X11控制台,登陆后进入图形GUI模式,XWindow系统。

6 : 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。运行init6机器就会重启

12. 磁盘默认权限

aqouta.user是用户磁盘配额需要的配置文件,而不是可执行文件

aquota.user 的权限是 -rw——,十进制值为 600

13. 常见的解/压缩命令

tar是操作.tar的命令
gzip是压缩.gz压缩包的命令
compress:压缩.Z文件
uncompress:解压缩.Z文件

14. 孤儿进程 & 僵尸进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上 ,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表上面出面处理它的一切善后工作。 因此孤儿进程并不会有什么危害。

有时会刻意使进程成为孤儿。比如 守护进程daemon,nohup命令

15. Linux启动流程

1,BIOS加电自检

2,从硬盘0柱面 0磁道 第一扇区读512字节的MBR主引导记录

3,运行引导程序Grub并根据其配置加载kernel镜像后初始化

4,根据/etc/inittab中系统初始化配置执行/etc/rc.sysinit脚本

5,根据第3步读到的runlevel值启动对应服务

6,运行/etc/rc.local

7,生成终端待用户登录

16. 产生死锁的必要条件

(1) 互斥条件:一个资源每次只能被一个进程使用
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
(3) 不剥夺条件:进程已获得的资源,在使用完之前,不能强行剥夺
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

**产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

17. POSIX互斥锁

POSIX,英文全称Portable Operating System Interface,也就是可移植操作系统接口。

POSIX互斥锁是指统一接口的互斥锁,它有一些相关的函数。

POSIX互斥锁相关函数有以下:

pthread_mutex_init 初始化一个互斥量
pthread_mutex_lock 给一个互斥量加锁
pthread_mutex_trylock 加锁,如果失败不阻塞
pthread_mutex_unlock 解锁
pthread_mutex_destroy 销毁互斥锁

前言

最近在refind里面发现了一个有意思的文章,文章说的是有关博客的一些myth(迷思),文章观点汇总如下:

  • myth: you need to be original
  • a bit more about my love for personal stories
  • myth: you need to be an expert
  • myth: posts need to be 100% correct
  • myth: writing boring posts is bad
  • myth: you need to explain every concept
  • writing has gotten harder as I get more experienced
  • myth: page views matter
  • myth: more material is always better
  • myth: everyone should blog
  • myth: some notes on pedantic/annoying comments

其实这些观点很好的总结了:为什么要写博客?为何写博客?写博客给谁?博客其实是在看完作者写完的文章观点后,我个人认为有点像一个 知识&观点的蓄水池 ,可以是 原创 ,也可以是在别人的观念的现有基础上做出属于自己的 演绎 ,也可以是 无情的搬运工 ,这不正是一个大型蓄水池吗?

博客本身

但我们应该要关注的点其实是写博客这一 本身 :博客是用来 记录分享阐述观点 的,因为每个人都有不同的view,获取knowledge的渠道也不同,因为差异才造就了 记录为博客 的必要,因为观点在不同视角下有正确的,有谬误的,不能因为某个角度是对的,有价值的,就否定另一个角度看到的结论的价值。能活下来,能被记录的观点肯定是有其原因和作用。读者就是那个有形的市场,但博客在某种程度上是anti市场的,因为博客的书写不是为了别人而写,而是为了 log ,为了 自己 而写。

Blog is a path

博客可以是 log 在 mist 中变成 path 来帮助后来的旅者的,但是这个 path 是无功利性的,需要的旅者自会发现,不需要的也有其对应感兴趣的 path 。作为 path 需要的是更为简洁的方向指明,而非不说人话扔出一堆术语来,但也不能过于详尽致使冗余增添麻烦。

每个人都可留下自己的 path ,但是不是每个人都愿意添加 path (这就好比游戏《死亡搁浅》,你可以靠着别人留的 path 通关,也可以自己留 path 通关,但是最终都不会影响结局)。写博客是一种爱好,一种分享欲的良性转移知识展示,也是一种自我名片完善拓展,但绝对不是优先用这个来获利的。

结尾

『知识无价,乐于分享,写给自己,写给旅者,写给过去,写给现在,写给未来』才是写博客的初心。

拓展阅读:
some-blogging-myths

When I saw the RSS feed I had subscribed to, I came across an intriguing sentence sourced from Hack News. Here it is:

I adopted a philosophy in life that helped me a lot in this regard. I started to see life as a series of 'games' played by 'roles'. My mission in life is to play my 'games' in the best way possible for my 'roles'. A game can be anything from being a good student, to being a father, to making sound financial decisions, to leading a project, to supporting a project as individual contributor, to making a house renovation, etc.

Once I started to see my work as a 'game' played by a 'role', a lot of stress was taken off of my back. I started to see situations in a neutral light regardless of who were the actors (including myself).

It doesn't matter if it's me receiving or giving constructive feedback, having a difficult conversation or managing a stressful situation. Through this perspective I'm able to abstract from people, power dynamics, etc. and see what's helpful, that's the best way forward, etc.

It made me ponder for a while: what if we viewed life as an RPG game? Let's analyze this concept in more detail. By envisioning life as a game, one immediate benefit is the sense of tranquility(平静) it brings. This allows us to approach things with a calm and thoughtful mindset, free from unnecessary haste(匆忙). Furthermore, just like in a game, life presents us with goals and rewards to motivate us towards their achievement. When we transition this game mentality(思想方法) into real life, the same principles apply. It is ingrained in our nature that our brains seek rewards upon completing tasks, regardless of their magnitude. In other words, we are wired to desire a sense of accomplishment. Alternatively, we could say: "Life is a game, and games are life."

If we delve(钻研) deeper into the discussion, we can consider life as a process of negentropy(负熵), with entropy representing senility(衰老) and death, while negentropy represents resistance against them. From bottom to top, our lives are guided by goals set by our families, partners, and society. These goals often require us to work hard, overcome obstacles(障碍), climb social ranks, and attain power. This predefined path to success, established by the majority, can be quite useful. However, it is important to take a moment of introspection(内省) and question if this path aligns with our personal desires. Not everyone has the opportunity to pursue their passions, excel in their strengths, or follow their true calling. Ultimately, what matters most is whether we genuinely(真正地) enjoy or at least accept the path we have chosen. Conversely, from top to bottom, life is short, so approaching it as a game with limited time can free us from the constant competition with peers, neighbors, and relatives.

Life is a journey of learning how to ignore others' opinions. It's important to take the views they offer with ease, accepting the ones you resonate with and ignoring those you don't. Instead, focus on the targets that truly matter to you, much like a gamer strives to achieve the highest score in a game.

Life game,game life.

在数据库设计中,我们经常会遇到以下三种关系类型:1:1(一对一)、1:n(一对多)和n:m(多对多)关系。这些关系描述了不同实体之间的连接方式和数量关系。而下面这首节选诗可以有助于对实体关系的理解。

一沙一世界,一花一天国,君掌无限天,刹那即永恒
  • "一沙一世界" 可以对应数据库中的 1:1 关系,表示两个实体之间的一对一关联。这意味着一个实体只与另一个实体相关联,就像每一粒沙子都代表一个世界。
  • "一花一天国" 可以对应数据库中的 1:n 关系,表示一个实体与多个相关实体之间的关联。就像每朵花都代表一个天国,一个实体(花)可以与多个相关实体(天国)相关联。
  • "君掌无限天,刹那即永恒" 可以对应数据库中的 n:m 关系,表示两个实体之间的多对多关联。一个实体可以与多个其他实体相关联,并且每个实体也可以与多个其他实体相关联。这种关系就像君主掌握着无数个天国,同时每个刹那都可以代表永恒。

这样的比喻有助于理解不同的数据库关系类型。在数据库设计中,通过对这一首诗歌的记忆并映射到关系上,进一步加深对实体关系联系的理解,再通过这些关系来建立实体之间的关联,确保数据的一致性和准确性。