• Linux常见面试题


    参考:

    Java 网络编程学习笔记 

    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 根目录下的目录及目录的功能各是什么?

    (2)/bin = binary :存放启动时所需要的普通程序
    (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:存放系统产生的经常变化的文件
      (15) /opt = Optional application software packages 可选应用软件包
    参考资料:

    僵尸进程怎么产生的

    僵尸进程概述

    一个进程使用 fork() 创建子进程,如果子进程运行结束,而父进程并没有调用waitwaitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。僵尸进程会浪费系统资源。

    孤儿进程概述

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

    避免僵尸进程的方法是

    1. 创建一个信号响应函数,每当子进程终止都会发出一个信号,信号响应函数捕获到这个信号后调用wait_pid()回收已经结束的子进程。
    2. fork()两次,让孙子进程执行程序,而终止子进程,让这个让孙子进程成为孤儿进程,从而成为init进程的子进程,

    Linux 有哪些IO分类,-- 有缓冲的IO和无缓冲的IO, 阻塞IO和非阻塞IO5. 有缓冲IO和无缓冲的IO有什么区别

    有缓冲的话系统会在内存中建立缓冲区,用于暂存读入的数据或者需要写出的数据,一次性从外存读取缓存区大小的数据或者等缓冲区满了一次性写入外存,这样可以不用每次读取或者写出数据都访问外存,降低了访存次数,提高了程序的效率。比如我们Java里面的BufferedInputStream和BufferedOutputStream就是有缓冲区的IO流,而FileInputStream和FileOutputSteam则是无缓冲区的流

    多路复用有什么用

    在多路复用 IO 模型中会有一个 Selector 线程不断轮询多个 Socket 的状态,只有当 Socket 真正有读写事件时才通知用户线程进行实际的 IO 读写操作。阻塞 IO 和 非阻塞 IO 模型需要为每个 Socket 建立一个单独的线程处理数据,而多路复用 IO 只需要一个线程管理多个 Socket,并且只在真正有读写事件时才会使用操作系统的 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  -ef  | grep nginx 
    查看僵死进程
    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基本指令 awkfindgrep

    shell脚本:统计一个文件中重复的行和重复次数

    linux 如何将文件从一台服务器转移到另一台服务器

    如何查找出现频率最高的100ip地址

    sh .sh source .sh ./a.sh区别

  • 相关阅读:
    spring cloud图形化dashboard是如何实现指标的收集展示的
    浮躁的我们
    c/c++学习系列之内存对齐
    c/c++学习系列之取整函数,数据宽度与对齐
    c/c++学习系列之memset()函数
    c/c++学习系列之putchar、getchar、puts、gets的运用
    c#学习系列之静态类,静态构造函数,静态成员,静态方法(总之各种静态)
    c#学习系列之字段(静态,常量,只读)
    C#中MessageBox用法大全(附效果图)<转>
    c#学习系列之Application.StartupPath的用法(美女时钟的做法)
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/14156887.html
Copyright © 2020-2023  润新知