Linux常见面试题
参考:
Linux和Windows的区别,Linux相比windows有什么优势
1. Linux是一个以开发者为中心的操作系统,而windows是以消费者为中心的操作系统
2. Linux是免费的、开源的,更容易得到他的源代码,也就更容易实现个性化定制
3. Linux的命令行功能强大,不推崇界面,windows的命令行没这么厉害,但是界面操作方便
4. Linux基于网络,只要有相应权限,就能远程操控相应的服务器,是一个多用户操作系统,而windows是一个单用户操作系统
linux 的文件类型
1. 普通文件
它是最常使用的一类文件,其特点是不包含有文件系统信息的结构信息。通常用户所接触到的文件,如图形文件,数据文件,文档文件,声音文件等都属于这种文件。这种类型的文件按其内部结构又可分为文本文件和二进制文件。
2. 目录文件
目录文件是用于存放文件名及其相关信息的文件。它是内核组织文件系统的基本节点。目录文件可以包含下一级文件目录或普通文件。在linux中,目录文件是一种文件。但linux的目录文件和其他操作系统中“目录”的概念不同,它是linux文件的一种。
3. 链接文件
链接文件是一种特殊文件,实际上是指向一个真实存在的文件链接,类似于windows下的快捷方式。链接文件的不同,它又可细分为硬链接(Hard Link)文件和符号链接(Symbolic Link)文件。
4. 设备文件
设备文件是linux中最特殊的文件。正是由于它的存在,使得linux系统可以十分方便地访问外部设备。Linux系统为外部设备提供一种标准接口,将外部设备视为一种特殊文件。用户可以像当问普通文件一样访问任何外部设备,使linux系统可以很方便地适应不断发展的外部设备。通常linux系统将设备文件放在/dev目录下,设备文件使用设备的主设备号和次设备号来指定某外部设备。根据访问数据方式的不同,设备文件又可分为块设备和字符设备。
5. 管道文件
管道文件是一种很特殊的文件,主要用于不同进程的信息传递。当两个进程需要进行数据或信息传递时,可以使用通道文件。一个进程将需要传递的数据或信息写入管道的一端,另一进程从管道的另一端取得所需要的数据或信息,通常管道是建立在调整缓存中。
Linux 根目录下的目录及目录的功能各是什么?
(3)/boot : 存放内核及启动所需要的文件
(4)/dev = devices:存放设备相关的文件
(5)/etc ( editable text configurationChest ):存放系统的配置文件
(6)/home:存放用户文件的主目录,用户数据( cd ~ 可进入自己的主目录)
(7)/lib :存放启动时所需要的库文件
(8)/mnt :存放临时的映射文件,通常是一些用来安装其他设备的子目录(如 /mnt/cdrom /mnt/floppy)
(9)/proc = processes :这是一个虚拟的文件系统,存放当前系统的状态(有关进程和系统信息)
(10)/root: 超级用户主目录
(11)/sbin = Superuser binaries: 存放启动时所需要的系统管理程序
(12)/tmp = temporary :存放启动时产生的临时文件
(13)/usr = Unix shared resources : 包含一般不需要修改的应用程序,命令程序文件,程序库,手册,Unix共享资源
(14)/var = Variable:存放系统产生的经常变化的文件
僵尸进程怎么产生的
僵尸进程概述
孤儿进程概述
避免僵尸进程的方法是
Linux 有哪些IO分类,-- 有缓冲的IO和无缓冲的IO, 阻塞IO和非阻塞IO5. 有缓冲IO和无缓冲的IO有什么区别
多路复用有什么用
Java IO模型
Linux 内核 IO 模型
- 阻塞 IO
最传统的一种 IO 模型,在读写数据过程中会发生阻塞。
当用户线程发出 IO 请求后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,当数据就绪之后,内核会将数据拷贝到用户线程,并返回 IO 执行结果给用户线程,用户线程解除阻塞状态并开始处理数据。
对应于 Java 中的 BIO。
- 非阻塞 IO
当用户线程发起 IO 请求后并不需要等待,即使内核数据还没有准备好也会马上得到内核返回的一个结果,用户线程可以之后再次询问内核。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么内核就将数据拷贝到用户线程并通知用户线程。
在非阻塞 IO 中,用户线程需要不断询问内核数据是否准备就绪,在数据未就绪时可以处理其他任务。
- 多路复用 IO
在多路复用 IO 模型中会有一个 Selector 线程不断轮询多个 Socket 的状态,只有当 Socket 真正有读写事件时才通知用户线程进行实际的 IO 读写操作。阻塞 IO 和 非阻塞 IO 模型需要为每个 Socket 建立一个单独的线程处理数据,而多路复用 IO 只需要一个线程管理多个 Socket,并且只在真正有读写事件时才会使用操作系统的 IO 资源,大大节约了系统资源。
在非阻塞 IO 中不断询问 Socket 状态是通过用户线程进行的,而在多路复用 IO 中轮询每个 Socket 状态是内核在进行的,效率要比用户线程高。
对于多路复用 IO 模型来说在事件响应体很大时,Selector 线程会成为性能瓶颈,导致后续事件无法及时处理,影响下一轮事件轮询,因此实际应用中方法体内不做复杂逻辑处理,只做数据的接收和转发,而将具体业务操作转发给业务线程处理。
对应于 Java 中的 NIO,在 NIO 中通过
selector.select()
去查询每个 Channel 是否有事件到达,如果没有事件到达用户线程会一直阻塞,因此 NIO 也会导致用户线程的阻塞。 - 信号驱动 IO
当用户线程发起一个 IO 请求操作,会给对应的 Socket 注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用 IO 读写操作来进行实际的 IO 请求操作。
一般用于 UDP 中。
- 异步 IO
当用户线程发起异步 read 操作后,立刻就可以开始去做其它事。另一方面,从内核的角度,当它收到一个异步 read 之后会立刻返回一个状态,说明请求是否成功发起,用户线程不会任何阻塞。然后内核会等待数据准备完成并将数据拷贝到用户线程,完成后内核会给用户线程发送一个信号通知 read 操作已完成。
用户线程完全不需要关心实际的整个 IO 操作是如何进行的,只需要先发起一个请求,当接收内核返回的成功信号时表示 IO 操作已经完成,就可以直接去使用数据了。
在异步IO模型中,IO操作的两个阶段都不会阻塞用户线程,这两个阶段都是由内核自动完成,然后发送一个信号告知用户线程操作已完成,用户线程不需要再次调用 IO 函数进行具体的读写。在信号驱动模型中,当用户线程接收到信号表示数据已经就绪,然后需要用户线程调用IO函数进行实际的读写操作。
对应于 Java 中的 AIO。
BIO
Java BIO即Block I/O , 同步并阻塞的IO。服务端为每个socket建立一个线程来处理请求。
需要阻塞和等待
使用场景:连接数目少、服务器资源多、
NIO
同步非阻塞IO,相比于BIO有两大优势
1. 块传输:面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。
2. 多路复用:会有一个 Selector 线程不断轮询多个 Socket 的状态,只有当 Socket 真正有读写事件时才通知用户线程进行实际的 IO 读写操作。阻塞 IO 和 非阻塞 IO 模型需要为每个 Socket 建立一个单独的线程处理数据,而多路复用 IO 只需要一个线程管理多个 Socket,并且只在真正有读写事件时才会使用操作系统的 IO 资源,大大节约了系统资源。
需要等待结果数据返回,不需要阻塞
使用场景:连接数目多、连接时间短、请求消耗比较轻的业务场景。比如聊天服务器。
AIO
Java AIO即Async非阻塞,是异步非阻塞的IO。
不需要等待结果数据返回,不需要阻塞,等待相应的信号通知。
使用场景:连接数目多、连接时间长、请求消耗比较重的业务场景。比如涉及 I/O 操作的相册服务器。
同步/异步/阻塞/非阻塞
同步和异步是通信机制,阻塞和非阻塞是调用状态。
- 同步 IO 是用户线程发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行。需要等待有结果返回才能继续后续操作
- 异步 IO 是用户线程发起 I/O 请求后仍可以继续执行,当内核 I/O 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。
- 阻塞 IO 是指 I/O 操作需要彻底完成后才能返回用户空间 。
- 非阻塞 IO 是指 I/O 操作被调用后立即返回一个状态值,无需等 I/O 操作彻底完成。
linux如何查看进程死否死掉。
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
查看进程并进行杀死进程命令
ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
其他常见问题
du,df的区别
VI 显示所有行的行号:vi set number
找到共用80端口的线程
linux基本指令 awk、find、grep
shell脚本:统计一个文件中重复的行和重复次数
linux 如何将文件从一台服务器转移到另一台服务器
如何查找出现频率最高的100个ip地址
sh .sh source .sh ./a.sh区别