1
参考
《鸟哥的Linux私房菜》 《现代操作系统》
https://blog.csdn.net/SakuraA6/article/details/108810916
文件管理命令
cat命令
cat命令用于连接文件并打印到标准输出设备上,cat主要有三大功能:
-b 对非空输出行号
-n 输出所有行号
- 一次显示整个文件:
1
cat filename
- 从键盘创建一个文件:只能创建新文件,不能编辑已有文件
1
cat > filename
- 将几个文件合并为一个文件:
1
cat file1 file2 > file
chmod 命令
文件调用权限分为三级:文件拥有者、群组、其他。用于改变linux 系统文件或目
录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定
法;另一种是包含数字的数字设定法
1 | ls -l log2012.log |
第一列共有10个位置,第一个字符指定了文件类型。在通常意义上,一个目录也是
一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一
个目录。从第二个字符开始到第十个字符,3个字符一组,分别表示了3组用户对文
件或者目录的权限。权限字符用横线代表空许可,r代表只读,w代表写,x代表可
执行。权限代号如下
1 | r :读权限,用数字4表示 |
实际例子
1 | 增加文件 t.log 所有用户可执行权限 |
chown 命令
chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户
ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支
持通配符
文件的操作命令(增删改查)
- touch 文件名称: 文件的创建(增)
- cat/more/less/tail 文件名称 :文件的查看(查)。命令 tail -f文件
可以对某个文件进行动态监控,例如 tomcat 的日志文件,会随着程序的运行
,日志会变化,可以使用 tail -f catalina-2016-11-11.log 监控文件的
变化 - 修改文件的内容(改)。输入wq 代表写入内容并退出,即保存;输入q!代
表强制退出不保存 - rm -rf 文件: 删除文件(删)
Linux 目录树
- /bin:存放二进制可执行文件(ls、cat、mkdir等),常用命令一般都在这里
- /etc:存放系统管理和配置文件
- /home:存放所有用户文件的根目录,是用户主目录的基点,比如用户user
的主目录就是/home/user,可以用~user 表示 - /usr:用于存放系统应用程序
- /opt:额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把
tomcat 等都安装到这里 - /proc:虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获
取系统信息 - /root:超级用户(系统管理员)的主目录
- /sbin:存放二进制可执行文件,只有root 才能访问。这里存放的是系统管
理员使用的系统级别的管理命令和程序。如ifconfig 等 - /dev:用于存放设备文件
- /mnt:系统管理员安装临时文件系统的安装点,系统提供这个目录是让用
户临时挂载其他的文件系统 - /boot:存放用于系统引导时使用的各种文件
- /lib:存放着和系统运行相关的库文件
- /tmp:用于存放各种临时文件,是公用的临时文件存储点
- /var:用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,
比方说各种服务的日志文件(系统启动日志等)等 - /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归
”的文件(windows 下叫什么.chk)就在这里
Linux 基本命令
目录切换命令
- cd usr: 切换到该目录下 usr 目录
- cd ..: 切换到上一层目录
- cd /: 切换到系统根目录
- cd ~: 切换到用户主目录
- cd -: 切换到上一个操作所在目录
目录的操作命令(增删改查)
- mkdir 目录名称: 增加目录
- ls/ll(ll 是 ls -l 的别名,ll 命令可以看到该目录下的所有目录和文
件的详细信息):查看目录信息 - find 目录 参数: 寻找目录(查)
- 列出当前目录及子目录下所有文件和文件夹: find .
- 在/home目录下查找以.txt 结尾的文件名:find /home -name “*.txt”,
忽略大小写: find /home -iname “*.txt” - 当前目录及子目录下查找所有以.txt 和.pdf 结尾的文件:find . ( -name
*.txt” -o -name “*.pdf” )或find . -name “*.txt” -o -name “*
.pdf”
- mv 目录名称 新目录名称: 修改目录的名称(改)。注意:mv 的语法不仅
可以对目录进行重命名而且也可以对各种文件,压缩包等进行重命名的操作。mv
命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。后
面会介绍到mv 命令的另一个用法 - mv 目录名称 目录的新位置: 移动目录的位置—剪切(改)。注意:mv语
法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作。另外mv
与cp 的结果不同,mv 好像文件“搬家”,文件个数并未增加。而cp 对文件进行
复制,文件个数增加了 - cp -r 目录名称 目录拷贝的目标位置: 拷贝目录(改),-r 代表递归拷
贝 。注意:cp 命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和
压缩包时不用写-r 递归 - rm [-rf] 目录 : 删除目录(删)。注意:rm 不仅可以删除目录,也可以
删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文件,都
直接使用rm -rf 目录/文件/压缩包
压缩文件的操作命令
Linux 中的打包文件一般是以.tar 结尾的,压缩的文件一般是以.gz 结尾的。
而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般
.tar.gz。命令:tar -zcvf 打包压缩后的文件名 要打包压缩的文件
- z:调用 gzip 压缩命令进行压缩
- c:打包文件
- v:显示运行过程
- f:指定文件名
假如 test 目录下有三个文件分别是:aaa.txt bbb.txt ccc.txt,如果我
们要打包 test 目录并指定压缩后的压缩包名称为 test.tar.gz 可以使用
命令:tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt 或
tar -zcvf test.tar.gz /test/
解压压缩包
命令:tar [-xvf] 压缩文件,其中:x:代表解压
- 将 /test 下的 test.tar.gz 解压到当前目录下可以使用命令:
tar -xvf test.tar.gz - 将 /test 下的 test.tar.gz 解压到根目录/usr 下:
tar -xvf test.tar.gz -C /usr(- C 代表指定解压的位置)
Linux 的权限命令
操作系统中每个文件都拥有特定的权限、所属用户和所属组。权限是操作系统
用来限制资源访问的机制,在Linux 中权限一般分为读、写和执行,分为三
组。分别对应文件的属主,属组和其他用户,通过这样的机制来限制哪些用
户、哪些组可以对特定的文件进行什么样的操作
其他常用命令
- pwd 显示当前所在位置
- sudo + 其他命令:以系统管理者的身份执行指令,也就是说,经由sudo
所执行的指令就好像是root 亲自执行 - grep 要搜索的字符串 要搜索的文件 –color:搜索命令,–color 代
表高亮显示 - ps -ef/ps -aux: 这两个命令都是查看当前系统正在运行进程,两者的
区别是展示格式不同。如果想要查看特定的进程可以使用这样的格式:ps aux
|grep redis(查看包括redis字符串的进程),也可使用pgrep redis -a - kill -9 进程的pid: 杀死进程(-9 表示强制终止。)
网络通信命令
- 查看当前系统的网卡信息:ifconfig
- 查看与某台机器的连接情况:ping
- 查看当前系统的端口使用:netstat -an
进程上下文切换?
进程执行过程中所涉及到的CPU上下文切换,我们称之为特权模式切换。从用
户态到内核态的转变就发生一次特权模式切换,如从磁盘上读取一个文件,
就发生了一次内核调用,也就发生一次特权模式切换
- CPU需要将寄存器中的用户态的指令位置保存起来,截至执行内核态的代码
- CPU寄存器需要更新为内核态的新位置,最后跳转到内核态执行内核调用。
之后再恢复之前的用户态,这样的一次系统调用过程实际上发生了两次CPU上
下文切换
这不是进程上下文切换,进程上下文切换只是说一个进程切换到另一个进程
首先进程的管理是有内核进行管理和调度的。进程的切换只能发生在内核态
所以进程的上下文切换不仅仅包括了虚拟内存,栈,全局变量等用户空间
资源,还包括了内核态堆栈,寄存器等内核空间状态
中断上下文切换?
中断是为了快速响应硬件事件的,跟进程上下文不同,中断上下文不涉及进程
的用户态。即便打断的是一个用户态的进程,也不需要保存和恢复这个进程的
虚拟内存,全局变量等用户态资源。中断上下文只包括内核态中断服务程序执
行必需的状态。CPU寄存器,内核堆栈,硬件中断参数
为什么线程切换会有消耗,消耗啥?
线程切换过程包括:线程上下文的保存和恢复,用户态和内核态的转换,CPU
上下文的切换,这些工作都需要CPU去完成
- CPU上下文切换 CPU寄存器和程序计数器切换
- 线程上下文切换 涉及线程状态的保存和恢复,包括寄存器、栈等私有数据
- 特权模式切换 线程的调度是需要内核级别的权限的(操作CPU和内存),
也就是说线程的调度工作是在内核态完成的,因此会有一个从用户态到内核态
的切换。而且,不管是线程本身的切换还是特权模式的切换,都要进行CPU的
上下文切换
如何查看上下文切换情况?
- vmstat 查看系统的上下文切换情况
- pidstat 可以看到具体的某个应用程序的上下文切换情况
进程同步、互斥和通信的区别?
进程之间存在两种基本关系:竞争关系和协作关系。进程的互斥、同步、通信都
是基于这两种基本关系而存在的
- 为了解决进程间竞争关系(间接制约关系)而引入进程互斥
- 为了解决进程间松散的协作关系(直接制约关系)而引入进程同步
- 为了解决进程间紧密的协作关系而引入进程通信
- 资源竞争会产生两个问题:一个是死锁问题,一个是饥饿问题。进程的互斥
是解决进程间竞争关系(间接制约关系 ) 的手段。 进程互斥指若干个进程要
使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资
源的进程必须等待,直到占有资源的进程释放该资源。 - 某些进程为完成同一任务需要分工协作,这就需要相互协作的进程在某些协
调点上协调各自的工作。这种协作进程之间相互等待对方消息或信号的协调关
系称为进程同步,也就是说进程同步指两个以上进程基于某个条件来协调它
们的活动。一个进程的执行依赖于另一个协作进程的消息或信号,当一个进
程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号
到达才被唤醒 - 进程之间互相交换信息的工作称之为进程通信IPC,主要是指大量数据的交换
协程是什么?
协程是比线程更小的一种执行单元,你可以认为是轻量级的线程,一个线
程也可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程
序所控制(也就是在用户态执行)
为什么是轻量级的线程?
协成是基于线程实现的,协程的创建、切换、销毁都是在某个线程中来进行的
,协程占用内存少,只需要极少的栈内存(大概是4~5KB),默认情况下,
线程栈的大小为1MB
协程和线程的区别?
- 线程在进行切换的时候,需要将CPU中的寄存器的信息存储起来,然后读
入另外一个线程的数据 - 线程的切换会涉及到用户模式到内核模式的切换,据说每次模式切换都
需要执行上千条指令 - 线程切换时CPU的高速缓存中的数据,也可能失效,需要重新加载
- 协程在切换的时候,寄存器需要保存和加载的数据量比较小
- 协程没有用户模式到内核模式的切换操作
- 更有效率的调度,因为协程是非抢占式的,前一个协程执行完毕或者堵塞
,才会让出CPU,而线程则一般使用了时间片的算法,会进行很多没有必要的
切换 - 无需系统自动切换(系统自动切换会浪费很多的资源),而协程是我们用
户手动切换,而且是在同一个栈上执行,速度就会非常快而且省资源
Linux下如何查看tcp连接?
netstat -nat|grep -i “80”|wc -l
网络监听需要什么函数?
- listen listent函数创建一个监听队列以存放待处理的客户连接,将套接字
sockfd指定为被监听的socket
互斥锁和信号量的区别?
- 互斥锁和互斥量是一个意思,互斥锁的作用就是互斥,是用来保护临界区的
- 信号量是一种更高级的同步机制,mutex(互斥锁)可以说是信号量在仅取
值0/1时的特例。信号量可以有更多的取值空间,用来实现更加复杂的同步,而
不单单是线程间互斥
互斥锁与自旋锁的区别?
- 重量级锁需要通过操作系统自身的互斥量(mutex lock,也称为互斥锁)
来实现,然而这种实现方式需要通过用户态与和核心态的切换来实现,但这个
切换的过程会带来很大的性能开销 - 申请锁时,从用户态进入内核态,申请到后从内核态返回用户态(两次切
换),没有申请到时阻塞睡眠在内核态。使用完资源后释放锁,从用户态进入
内核态,唤醒阻塞等待锁的进程,返回用户态(又两次切换),被唤醒进程
在内核态申请到锁,返回用户态(可能其他申请锁的进程又要阻塞)。所以
,使用一次锁,包括申请,持有到释放,当前进程要进行四次用户态与内
核态的切换。同时其他竞争锁的进程在这个过程中也要进行一次切换 - 自旋锁与互斥锁不同的是自旋锁不会引起调用者睡眠。如果自旋锁已经被
别的进程保持,调用者就轮询(不断的消耗CPU的时间)是否该自旋锁的保
持者已经释放了锁 - 在申请锁失败的话,自旋锁会不断的查询,申请线程不会进入休眠,信号
量和互斥锁如果申请锁失败的话线程进入休眠,如果申请锁被释放后会唤醒
休眠的线程
sleep让进程睡眠,那我们能不能做到微妙级别的sleep呢?
- usleep()函数 单位是微秒
磁盘坏掉了,操作系统是怎么处理应对的?
- 磁盘扫描工具扫描磁盘驱动器
缓存?
缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此
速率很快
进程的内存空间分布?
用户空间被分为几个段,从高地址到低地址分别为:Stack, Heap, BSS,
Data, Text
- 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码
- 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据
- 未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据
- 堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放
- 栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,
用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动
释放内存
什么是中断?
- 中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的
程序,保存现场后自动去执行相应的处理程序,处理完该事件后再返回中断处
继续执行原来的程序 - 中断一般三类,一种是由CPU外部引起的,称为外中断。如I/O中断、时钟中
断,一种是来自CPU内部事件或程序执行中引起的中断,例如程序非法操作,
地址越界、浮点溢出)称为内中断,或者(异常,陷入),最后一种是在程序
中使用了系统调用引起的 - 中断处理一般分为中断响应和中断处理两个步骤,中断响应由硬件实施,中
断处理主要由软件实施
CPU在中断时会干嘛?
中断是CPU响应外设需求的一种模式,在外设需要CPU时,会向中断控制器发送
中断请求,这时CPU 要保护现场,即把正在运行的程序保存起来,一般是把状
态压入堆栈,然后读中断号,启动相应的中断服务程序,服务完成后,载入保
护现场,即把堆栈的数据弹出,继续运行之前的程序
中断分为几种?
- 中断(Interruption),也称外中断,指来自CPU执行指令以外的事件的发
生,如设备发出的I/O 结束中断,表示设备输入/输出处理已经完成,希望处
理机能够向设备发下一个输入 / 输出请求,同时让完成输入/输出后的程序
继续运行。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动
定时运行的任务等。这一类中断通常是与当前程序运行无关的事件,即它们
与当前处理机运行的程序无关 - 异常(陷入),也叫内中断。是由CPU内部事件所引起的中断,例如进程在
运算中发生了上溢或者下溢,有如程序出错,如非法指令,地址越界等。通常
把这类中断称为内中断或者陷入。若系统发现有陷入事件,CPU也将暂停正在
执行的程序,转去执行该陷入事件的处理程序
如何处理中断?
- 屏蔽中断 当处理机正在处理一个中断时,将屏蔽掉所有的中断,即处理机
对任何新到的中断请求,都暂时不予理睬,而让他们等待,直到处理机已完成
本次中断的处理后,处理机再去检查是否有中断发生,不适合用于对实时性要
求较高的中断请求 - 嵌套中断 当同时有多个不同优先级的中断请求时,CPU优先响应最高优先
级的中断请求
中断程序处理过程?
- 测定是否有未响应的中断信号
- 保护被中断进程的CPU环境
- 转入相应的设备处理程序
- 中断处理
- 恢复CPU的现场并退出中断
为什么要内核态/用户态?
- 在CPU的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃
,比如清内存、设置时钟等 - CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作
系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令
fd是什么?
- fd全称是file descriptor,是进程独有的文件描述符表的索引
- 每当进程用open()函数打开一个文件,内核便会返回该文件的文件操作
符(一个非负的整形值),此后所有对该文件的操作,都会以返回的fd文件
操作符为参数
多路复用怎么解决阻塞IO 存在的问题?
- 异步编程框架是说框架内的业务代码与框架的接口是异步的,而框架与操
作系统的接口是同步非阻塞
查看内存的命令?
- top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的
资源占用状况 - pmap -d 5647 可以根据进程查看进程相关信息占用的内存情况
- free Linux的free命令是常用来查看内存的命令
查看日志的命令?
- tail -n 10 test.log 查询日志尾部最后10行的日志
- head 跟tail是相反的head是看前多少行日志
Linux 查看文件中是否存在某字符
- grep “port:8080” pro.sh 查找pro文件中是否包含port:8080 内容
1
2
3grep 指定字符串 文件的完整路径
若不清楚字符串的大小写,可以在命令末尾加 -i ,这样查询将忽略字符串的大小写
若需要查询指定字符串在文件中的位置,可以在命令末尾加 -n
linux如何分割文件字符串?
- cut
1
2
3
4-d 指定分隔符,如:按照“:”分割,-d:
-c 提取第n个字节,如:-c5,表示提取每行的第5个字节
-f 指定输出的域
cut –d: -f1,2 //按照”:”来分割,并输出第1和2段
常用的消息队列以及区别?
消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘
上,队列可以存储消息直到它们被应用程序读走