Linux
2.1、Linux的体系结构?
- 体系结构主要分为用户态(用户上层活动)和内核态
- 内核:本质上就是控制管理终端硬件设备的程序
- 系统调用:内核的访问接口,是一种能再简化的操作
- 公共函数库:系统调用的组合拳,更加的通用化
- shell:命令解释器,可编程
ls -lrt
列表出文件的大小,权限、名字等等各信息
less
工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,
tail
是显示一个文件的内容的最后多少行;
cat
是一个文本文件(查看)和(连接)工具,通常与more搭配使用,与more不同的是cat可以合并文件。查看一个文件的内容,用cat比较简单,就是cat后面直接接文件名。
2.2、Linux中的用户态和内核态是如何转换的?
TSS
Linux没有使用intel原始预设的为每个进程设置一段TSS这中方案作为进程切换时保存堆栈信息,CPU寄存器等进程上下文的方案.intel这种设计导致在进程切换时开销很大,因此Linux设计系统时仅为每个CPU设计一段TSS.在这段TSS中保存着一个很重要的变量:esp0,即当前运行进程的内核栈指针.TSS的地址存放在cpu的TR寄存器中,当然在GDT中也能定位这个TSS.
用户态和内核态切换
Linux系统调用通过软中断(int 0x80)的方式,从用户态陷入内核.为了在内核态运行,需要将esp,eip, cs, ds, ss等寄存器的值全都切换成内核态 .但在此之前先要保存各寄存器用户态的值,具体而言是将用户态栈指针压入内核栈,内核栈指针可由上段所述的TSS中获得. 然后将内核态栈地址赋给esp寄存器.这一步正式标志着切换的完成.
这里有一个很重要的地方,就是记住每个进程的内核栈指针是保存在TSS中的.
2.2.1、为什么要转换?
减少不必要的资源访问,避免使用冲突
因为操作系统的资源是有限的,如果访问资源的操作过多,必然会消耗过多的资源,而且如果不对这些操作加以区分,很可能造成资源访问的冲突。所以,为了减少有限资源的访问和使用冲突,Unix/Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念。简单说就是有多大能力做多大的事,与系统相关的一些特别关键的操作必须由最高特权的程序来完成。Intel的X86架构的CPU提供了0到3四个特权级,数字越小,特权越高,Linux操作系统中主要采用了0和3两个特权级,分别对应的就是内核态和用户态。
2.2.2.、什么是系统中断
中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。
2.2.3 、首先需要了解,什么情况下会发生从用户态向内核态切换。这里细分为3种情况。
1、发生系统调用时
这是处于用户态的进程主动请求切换到内核态的一种方式。用户态的进程通过系统调用申请使用操作系统提供的系统调用服务例程来处理任务。而系统调用的机制,其核心仍是使用了操作系统为用户特别开发的一个中断机制来实现的,即软中断。
2、产生异常时
当CPU执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行的进程切换到处理此异常的内核相关的程序中,也就是转到了内核态,如缺页异常。
3、外设产生中断时
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作的完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
2.3、查找Linux中特定 的文件?
先回答有三种方式:
- 精确查找
- 模糊查找
- 不区分大小写去查找
find -name “filename.XXX”
这里默认是在本文件下面的递归寻找
find path -name “filename.XXX”
在指定的文件里面递归寻找
find path -name “filename*”
通过匹配符 在指定文件的递归寻找 通用文件
find path -iname “filename.XXX”
忽略大小写去寻找文件
2.4、根据文件内容去检索
2.4.1、grep
语法:grep [options] Pattern file
从指定的文件里面寻找、可以使用正则表达式、若没有添加Pattern file ,则是从接下来输入的内容判断,
- 全称:Global Regular Expression Print
- 作用:查找文件里符合条件的字符串
2.4.2、管道操作符 |
- 可将指令连接起来,前一个指令的输出作为后一个指令的输入
- 如果前一个指令有误,则后面的指令将不会执行
- 右边的命令必须能够接收标准输入流,否则传递过程中数据被抛弃
2.4.3、grep经常使用的三种模式
grep 最好是配合| (管道符) 发挥更好的作用
- grep ‘ context’ Pattern file 查找指定文件的文本内容
- grep -o " context " -o :只显示被模式匹配到的字符串。 这个是配合 管道符的使用 |
- grep -v ‘grep’ -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
2.5、如何对文件内容做统计:
awk:
- 一次读取一行文本,按输入分隔符进行切片,切成多个组成部分
- 将切片直接保存在内建的变量中,$1,$2……($0 表示一行的全部)
面试里常用的方式:
- awk ‘{print $1,$4}’ Filename
- awk ‘$1=='tcp' && $2==2{print $0}’ Filename;
- awk ‘{array[$1]++} END {for (i in array) print i "\t" array[i] }’ Filename;
2.6、批量替换文本的内容
sed
语法 : sed [option] 'sed command' filename
- 全名为 stream editor ,流编辑器
- 适合用于对文本的编辑
使用:
- sed 's/^Str/String /' filename; 此时执行会将替换后的打印出来,不会修改文件内的内容
- sed -i 's/^Str/String /' filename; 此时执行会将替换后的打印出来,会修改文件内的内容
- sed -i ‘s/\\.$/\;/‘ filename 替换每行末尾的 . 号
示例:替换文本内容;
示例:替换全部符合要求的内容
删除文档中的空行:
2.$、本章小结
- 面试经常涉及到的Shell指令:
- 灵活的运行各种命令筛选出所需要的内容
- find grep 管道操作符 | awk sed 五种常用的文件检索指令