Linux面试常见问题

1. Linux常用命令

  1. 1s:列出当前目录下的文件和目录
  2. cd [目录名]:切换到指定的目录
  3. pwd :显示当前工作目录的路径
  4. touch[文件名]: 如果文件不存在,新建文件
  5. mkdir [目录名]: 创建新的目录
  6. rm[文件名]:删除指定的文件或目录
  7. cp [源文件] [目标文件]:复制文件
  8. mv [源文件] [目标文件]:移动或重命名文件
  9. cat [文件名]:查看文件内容、创建文件、追加 文件内容等功能
  10. more [文件名]:分屏显示文件内容
  11. grep [word] [文件名]:在文件中搜索指定的文本
  12. date:查看或设置系统时间
  13. cal:显示日历
  14. df :显示磁盘剩余空间
  15. ps:查看当前进程的状态
  16. top:动态显示运行中的进程并排序
  17. ki11 [进程ID]:结束指定的进程

2. 什么是软链接和硬链接

  1. 软链接: 软链接(也称为符号链接)是一个实实在在的文件,该文件指向存放在虚拟目录结构中某个地方的另一个文件。可以想象成Windows电脑的快捷方式。如果原始文件已删除,软链接显示红色,原始文件一闪一闪。修改软链接文件内容,原始文件内容也会被修改。删除软链接文件,原始文件仍然存在。
  2. 硬链接:硬链接创建的是一个独立的虚拟文件,其中包含了原始文件的信息以及位置。但是两者根本而言是同一个文件。就是一个文件更名了,实际上是同一文件。原始文件必须已经存在。如果原始文件已删除,创建的硬链接不会被删除。修改硬链接文件内容,原始文件内容也会被修改。删除硬链接文件,原始文件仍然存在。

3.硬链接和软链接有什么区别

  1. 本质:硬链接是同一个文件的多个名字,而软链接则是不同的文件
  2. 跨分区:硬链接不支持跨分区,而软链接则支持
  3. 目录:硬链接不支持链接到目录,而软链接则支持
  4. 相互关系:硬链接的文件之间是平等的关系,删除任何一个都不会影响其他的链接。而软链接的目标文件如果被删除,软链接就会失效
  5. 文件大小:硬链接文件显示的大小与原文件一样而软链接文件的大小则是链接路径的长
  6. Inode号:硬链接的原文件和链接文件共享同一个Inode号,说明它们是同一个文件,而软链接的原文件和链接文件拥有不同的Inode号,表明它们是两个不同的文件
  7. 文件属性:在文件属性上,软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等的关系。
  8. 链接数目:硬链接的链接数目会增加,而软链接的链接数目不会增加

4. 简述Linux系统态与用户态,什么时候会进入系统态

  • 用户态:用户态下应用程序只能执行受限的指令集,且不能直接访问底层系统资源。大多数代码都运行用户态
  • 内核态:在内核态下,操作系统拥有最高的权限和访问系统资源的能力,可以执行特权指令和直接访问硬件设
    备。当CPU处于内核态,可以随意进入用户态。
  • 切换时机:应用程序无法自由进入内核态,只能通过操作系统提供的API进入,或者中断操作发生的时候进
    入。例如,当CPU被中断操作(如定时器、键盘输入、I/0)中断时,CPU会停止运行当前它正在运行的程
    序,切换到内核态,调用中断处理器,

5. 进程、线程、协程是什么,有什么区别

进程、线程和协程都是计算机程序在运行时的不同表现形式。下面是它们的基本定义和区别

  • 进程: 进程是操作系统进行资源分配和调度的一个独立单位,是程序执行的实例。每个进程都有自己的独立内存空间和系统资源。进程是程序资源管理的最小单位
  • 线程: 线程是进程中的一个执行单元,也是处理器调度和分派的基本单位。一个进程可以包含多个线程,所有线程共享进程的资源,如内存空间和文件描述符等。线程是资源调度的最小单位了
  • 协程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。

区别

进程和线程的主要区别在于它们的内存空间:进程有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,一个进程无法直接访问另一个进程的变量和数据结构,需要通过进程间通信机制(如管道、信号、套接字等)来实现;

同一进程下的所有线程共享同一地址空间和系统资源

线程和协程的主要区别在于协程的调度由用户自己 控制,而线程的调度由操作系统内核负责。

6. 有了进程,为什么还要有线程

线程早为了解决进程在并发执行时所付出的时空开销提高并发性"。线程相比进程有以下优点:

  1. 资源消耗少: 线程是一种非常"节俭"的多任务操作方式,相比进程需要更少的资源。一个进程的开销大约是一个线程开销的了30倍左右
  2. 切换效率高: 运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间比进程切换所需的时间少,从而提高了系统的效率
  3. 共享内存: 线程之间共享程序的公共状态,线程之间通过读-写内存中的公共状态来隐式通信。这使得线程间的通信更为方便,因为它们可以直接访问对方的内存。
  4. 提高响应性:在多线程环境中,当一个线程阻塞或进行长时间运算时,其他线程还可以继续运行这就使得程序在等待某些资源(如网络响应)的同时,仍然可以对用户输入做出响应
  5. 利用多处理器系统: 多线程可以充分利用多处理器系统。在此系统中,每个线程可以在不同的处理器上运行

7. Linux开发中怎么创建线程

  • 在Linux多进程开发中,创建一个新的进程通常使用fork()函数。fork()函数会创建一个新的进程,这个新进程是当前进程的一个副本。在父进程中fork()返回新创建的子进程的ID,而在子进程中fork()返回0。因此,我们可以通过fork()的返回值来判断当前进程是父进程还是子进程。
  • 此外,vfork()函数也创建新进程,vfork()会抢占父进程的资源,导致父进程无法继续运行
  • 创建新进程,需要exec()函数族执行新的程序,exce()函数族会用一个新的程序替换当前进程的内存空间
c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    printf("+++process %d start running");
    pid_t pid = fork();
    if (pid)
    { //父进程printf("parent:process %d start//do something
        //.
    }
    else
    { //子进程
        printf("child:process %d running");
        exit(0);
    }
    exit(0);
}

8. 进程间通信方式

在Linux系统中,进程间通信(InterProcess Communication,IPC)主要有以下几种方式

  1. 管道(Pipe):包括无名管道和命名管道(FIFO)。管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。命名管道则允许无亲缘关系进程间的通信。
  2. 消息队列(Message Queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  3. 共享内存(Shared Memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,多个进程都可访问。共享内存是最快的IPC方式,是针对其他进程间通信方式运行效率低而专门设计的。
  4. 信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
  5. 套接字(Socket):套接字也是一种进程间通信机制,与其他机制不同的是,它可用于不同机器间的进程通信

9. 说说进程同步的方式?

在Linux系统中,进程同步主要有以下几种方式:

  1. 信号量(Semaphore):信号量是一个整数值用于进程间传递信号。在信号量上只有三种操作可以进行:初始化,P操作和V操作,这三种操作都是原子操作。P操作(送减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。
  2. 管程(Monitor):管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块。局郁数据变量只能被管程的过程访问,任何外都过程都不能访问。一个进程通过调用管程的一个过程进入管程。
  3. 消息传递(Message Passing):消息传递的实际功能以一对原语的形式提供:send(destination,message)和receive(source,message)。这是进程问进程消息传递所需要的最小操作集。

10. 进程常说的状态有哪些?

进程有五种状态:创建、就绪、执行、阻塞、终止。一个进程创建后,被放入队列处于就绪状态,等待操作系统调度执行,执行过程中可能切换到阻塞状态(并发),任务完成后,进程销毁终止。

  • 创建:一个应用程序从系统上启动,首先就是进入创建状态,需要获取系统资源创建进程管理块(PCB:Process Control Block)完成资源分配。
  • 就绪:在创建状态完成之后,进程已经准备好,处于就绪状态,但是还未获得处理器资源,无法运行。
  • 运行:获取处理器资源,被系统调度,当具有时间片开始进入运行状态。如果时间片用完了就进入就绪状态。
  • 阻塞:运行状态期间,如果进行了阻寒的操作,如耗时的I/0操作,此时进程暂时无法操作就进入到了阻塞状态,这些操作完成后就进入就绪状态。等待再次获取处理器资源被系统调度,当具有时间片就进入运行状态,
  • 终止:进程结束或者被系统终止,进入终止状态

11. 线程间通信的方式有哪些?

线程间的通信方式包括临界区、互斥量、信号量、条件变量、读写锁:

  1. 临界区:每个线程中访问临界资源的那段代码称为临界区(CriticalSection)(临界资源是一次仅允许一个线程使用的共享资源)。每次只准许一个线程进入临界区,进入后不允许其他线程进入。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。
  2. 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才可以访问。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
  3. 信号量:计数器,允许多个线程同时访问同一个资源。
  4. 条件变量:通过条件变量通知操作的方式来保持多线程同步。
  5. 读写锁:读写锁与互斥量类似。但互斥量要么是锁住状态,要么就是不加锁状态。读写锁一次只允许一个线程写,但允许次多个线程读,这样效率就比互斥锁要高。

12. 线程同步方式有哪些?

线程同步主要有以下几种方式:

  1. 互斥量[Mutex):每个线程在对共享资源操作前都会尝试先加锁,加锁成功才能操作,操作结束之后解锁。某个线程对互斥量加锁后,任何其他试图再对互斥量加锁的线程都将被阻塞直到当前线程释放该互斥锁。
  2. 读写锁:读写锁将操作分为读、写,可以多个线程同时占用读模式,这样使得读写锁具有更高的并行性。
  3. 条件变量:条件变量是一种同步机制,它允许一个线程在满足某种条件之前挂起,当条件满足时,其他线程可以晚醒挂起的线程。
  4. 信号量(Semaphore):信号量是一个计数器,可以用来控制多个线程对共享资源的访问。它通常作为一种锁机制,防止线程进入临界区。

13. Linux多线程开发中,怎么创建一个线程?

在Linux多线程开发中,可以使用pthread_create函数来创建一个新的线程。下面是一个简单的示例在这个示例中,pthread_create函数用于创建一个新的线程。这个函数接收四个参数。

  • 第一个参数是一个 pthread t类型的指针,用于存储新创建的线程的ID
  • 第二个参数是一个 pthread_attr_t类型的指针,设置线程的属性。如果传入NULL,线程使用默认的属性。
  • 第三个参数是一个函数指针,指向新线程开始执行时要调用的函数。
  • 第四个参数是一个 void 指针,可以传递给新线程开始执行时调用的函数。

pthread_create函数成功时返回0,失败时返回错误号。创建的新线程从指定的函数开始执行。当这个函数返回时,线程就会自动结束。如果我们希望主线程等待新线程结束,可以使用 pthread_join 函数。

14. 什么是死锁,死锁产生的条件,如何解决死

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。当多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进,这种情况就是死锁。死锁产生的四个必要条件

  1. 互斥条件:一个资源每次只能被一个进程使用
  2. 请求与保持条件:一个进程因请求资源而阻塞时对已获得的资源保持不放
  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺
  4. 循环等待条件:存在一个进程资源的循环等待链链中每一个进程已获得的资源同时被链中下一个进程所请求。

解决死锁的方法主要有以下几种:

  1. 按照顺序加锁:尝试让所有线程按照同一顺序获取锁,从而避免死锁
  2. 设置获取锁的超时时间:尝试获取锁的线程在规定时间内没有获取到锁,就放弃获取锁,避免因为长时间等待锁而引起的死锁
  3. 银行家算法:在程序运行时避免发生死锁
  4. 检测死锁并恢复:死锁发生时对其进行检测,一日发生死锁后,采取行动解决问题
  5. 通过仔细分配资源来避免死锁
  6. 通过破坏死锁产生的四个条件之一来避免死锁
相关推荐
pk_xz12345626 分钟前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强28 分钟前
Linux之sed命令详解
linux·运维·服务器
Lary_Rock3 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面4 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮6 小时前
Linux 使用中的问题
linux·运维
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零8 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
鱼跃鹰飞8 小时前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
小林熬夜学编程9 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法