Linux的I/O模型介绍以及同步异步阻塞非阻塞的区别(超级重要)
IO两个阶段
内核从IO设备读数据
进程从内核复制数据
内核从设备读取数据到内核空间的缓冲区
内核空间复制回用户空间进程缓冲区阶段
阻塞:调用IO操作的时候,如果缓冲区空或者满了,调用的进程或者线程就会处于阻塞状态直到IO可用并完成数据拷贝。
非阻塞:调用IO操作的时候,内核会马上返回结果,如果IO不可用,会返回错误,这种方式下进程需要不断轮询直到IO可用为止,但是当进程从内核拷贝数据时是阻塞的。
IO多路复用就是同时监听多个描述符,一旦某个描述符IO就绪(读就绪或者写就绪),就能够通知进程进行相应的IO操作,否则就将进程阻塞在select或者epoll语句上。
信号驱动IO模型
通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)。
同步IO:同步IO模型包括阻塞IO,非阻塞IO和IO多路复用,信号驱动IO模型。特点就是当进程从内核复制数据的时候都是阻塞的。
异步IO:在检测IO是否可用和进程拷贝数据的两个阶段都是不阻塞的,进程可以做其他事情,当IO完成后内核会给进程发送一个信号。
参考:https://www.cnblogs.com/euphie/p/6376508.html
linux命令
下查看负载的主要命令有:top, uptime,w,vmstat
查询进程占用CPU的命令(注意要了解到used,buf,代表意义)
used:已经使用物理内存的大小
total:总的物理内存
free:空闲的物理内存
buffers:用于内核缓存的内存大小
cache:缓冲的交换空间的大小**==
linux的其他常见命令(kill,find,cp等等)
kill命令用来删除执行中的程序或工作
find命令用来在指定目录下查找文件
任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
find /home -name "*.txt"
cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
cat的功能是将文件从第一行开始连续的将内容输出在屏幕上。当文件大,行数比较多时,屏幕无法全部容下时,只能看到一部分内容。所以通常使用重定向的方式,输出满足指定格式的内容。
cat语法:cat [-n] 文件名 (-n : 显示时,连行号一起输出)
tac的功能是将文件从最后一行开始倒过来将内容数据输出到屏幕上。我们可以发现,tac实际上是cat反过来写。这个命令不常用。
tac语法:tac 文件名。
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
vim 这个用的太普遍了,主要是用于编辑。
jobs 查看当前控制台的后台进程。想要停止后台进程,使用jobs命令查看其进程号(比如为num),然后kill %num即可
ps 查看后台进程
top查看所有进程和资源使用情况,类似Windows中的任务管理器
怎么找出含有关键字的前后4行
假设存在日志文件 hrun.log
,查询的关键字为"新增用户":
根据关键字查看日志
cat hrun.log | grep "新增用户"
根据关键字查看后10行日志
cat hrun.log | grep "新增用户" -A 10
根据关键字查看前10行日志
cat hrun.log | grep "新增用户" -B 10
根据关键字查看前后10行日志,并显示出行号
cat -n hrun.log | grep "新增用户" -C 10
查看日志前 50 行
cat hrun.log | head -n 50
查看日志后 50 行,并显示出行号
cat -n hrun.log | tail -n 50
说明:
-A 表示关键字之后,After
-B 表示关键字之前,Before
-C 表示关键字前后,Context
参考:https://www.jianshu.com/p/8594204d67c9
shell 是一种脚本语言
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)
linux软链接硬链接复制的区别
1.硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。
通过ls -al 查看到硬链接和源文件的文件类型一样为“-”而软链接为“l”
ls -ai 会显示文件的硬链接数量,如果有硬链接则>1
也可以用 stat XX 来查看文件的inode信息来区分两个文件是复制的还是硬链接的
其实硬链接和软链接和源文件三者任意一个改变三者都会同步改变,这是他们与复制之间的区别
2.硬链接只能用于文件,不能用于目录;软链接可以为目录建链接。
3.硬链接不能跨文件系统操作。
既然软链接和硬链接和源文件的内容是同步的,那软链接和硬链接的应用场景有什么不同呢
下面这句话吊了,一语道破了
A硬链B 删除B后A依然存在,且可用。
A软链B 删除B后A存在,但不可用了(相当于Windows下快捷方式指向的目标不存在了)
在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号inode
。软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows下的快捷方式的那个文件有很接近的意味)。软链接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)
硬连接是不会建立inode索引节点号的,他只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。相反都是软连接会重新建立一个inode,当然inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息。一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除的时候,系统调用会检查inode link count的数值,如果他大于等于1,那么inode不会被回收。因此文件的内容不会被删除
。
参考:https://blog.csdn.net/shenhuxi_yu/article/details/53053298
linux如何修改文件或目录的权限(chmod)
由于linux是一个多用户操作系统,linux对文件系统内的所有文件,实行了严格的权限划分管理。防止没有权限的用户访问某个文件。
Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
使用“chmod 777 test.sh”命令使用能使用linux系统的用户拥有相同的“读写可执行权限”。chmod命令是linux上用于改变权限的命令,-R 是递归遍历子目录,因为你要操作的文件使用的*通配符。777,第一个7代表文件所属者的权限,第二个7代表文件所属者所在组的权限,第三个7代表其它用户的权限,7=4+2+1,在linux中权限是可以通过数字来描述的。。例如:“755”怎么构成的:"0"表示没有权限、“1”表示可执行权限、“2”表示可写权限、“4”表示可读权限。“7=1+2+4,5=1+4”。
linux给文件或目录赋权限还有一种容易理解方法。比如:“chmod a-x”表示所有用户对此文件或目录将没有执行权限。
“a”表示所有用户,“u”表示创建者、“g”表示创建者同组用户、“o”表示其他用户;“+”表示添加权限,“-”表示取消权限;“r”表示读权限、“w”表示写权限、“x”表示写权限。
chgrp:改变文件所属用户组。命令格式为:chgrp用户名 文件或目录。如图,用户组原为root,现在被修改到nerd用户组。
chown:改变文件所有者。命令格式为:chown 所有者 文件或目录。如图,目录所属者原来为root,用chown该所属者为bin。