面试真题 | 中科曙光

技术面,一个问题,不同的时间,不同的人,就会产生不同的问题。因此我真的很难去给你一个准确的回答。 其次是每次面试完,回来只记得问了什么知识点,但是怎么问的也确实记不得了。最稳当的方式是希望这个文章看了,会让你真的掌握这些知识,这也是为什么每次我每次一发一篇这个文章,就会迫使我整理出好多篇。 哈哈哈,花点心思好好看掌握,真的有用。读书这么多年,找工作的时候最后时候,多努力一点,就可以涨工资,这多值得的。

(1)linux内核空间和用户空间的通信;

在Linux系统中,内核空间与用户空间之间的通信是系统设计和实现中的一个重要方面。内核空间负责系统资源的管理、硬件的访问等核心功能,而用户空间则运行着用户程序。两者之间的通信主要通过以下几种方式进行:

1. 系统调用(System Call)

  • 定义:系统调用是用户空间程序请求操作系统内核服务的一种机制。
  • 工作原理:用户空间程序通过执行系统调用指令(如int 0x80或syscall指令),将控制权转交给内核。内核根据系统调用号执行相应的服务例程,完成后将控制权返回给用户空间。
  • 特点:这是最基本的通信方式,实现了用户空间对内核功能的访问。

2. 虚拟文件系统(VFS)

  • 定义:虚拟文件系统提供了一种通过文件系统接口与内核进行通信的方式。
  • 具体实现:如/proc文件系统,它允许用户空间程序通过读取特定的文件来获取内核信息或执行操作。
  • 特点:提供了一种结构化的数据访问方式,便于用户空间程序理解和操作内核数据。

3. Netlink

  • 定义:Netlink是Linux提供的一种用于内核与用户空间进程之间通信的特殊socket机制。
  • 特点
    • 支持全双工、异步通信。
    • 用户空间可使用标准的BSD socket接口(但Netlink并没有屏蔽掉协议包的构造与解析过程,推荐使用libnl等第三方库)。
    • 在内核空间使用专用的内核API接口。
    • 支持多播,可实现消息订阅。
    • 在内核端可用于进程上下文与中断上下文。
  • 应用:如NETLINK_ROUTE用于获取和设置路由与链路信息,NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。

4. 内存映射(Memory Mapping)

  • 定义:通过mmap系统调用,Linux允许用户空间程序将内核中的特定内存区域映射到自己的地址空间中,从而实现对内核内存的直接访问。
  • 特点:适用于需要快速大量交互数据的场景,但使用时需要谨慎,以避免破坏内核数据的安全性。

5. 信号(Signals)

  • 定义:信号是内核用于通知用户空间程序发生某种事件的一种方式。
  • 特点:虽然信号主要用于进程间的通信,但内核也可以通过发送信号来通知用户空间程序执行某项操作或处理某种异常情况。然而,由于信号机制的局限性(如无法传递复杂数据),它在内核与用户空间通信中的应用相对有限。

总结

Linux内核空间与用户空间之间的通信方式多种多样,每种方式都有其特定的应用场景和优缺点。在实际应用中,需要根据具体需求选择最合适的通信方式。以上信息主要基于Linux系统的通用特性和广泛认可的通信机制,并参考了相关权威网站和文档。

这里啰嗦讲讲NetLink,因为之前面试确实追问了我这个知识点。

Alan Cox在内核1.3版本的开发阶段最先引入了Netlink,刚开始时Netlink是以字符驱动接口的方式提供内核与用户空间的双向数据通信;随后,在2.1内核开发过程中,Alexey Kuznetsov将Netlink改写成一个更加灵活、且易于扩展的基于消息通信接口,并将其应用到高级路由子系统的基础框架里。自那时起,Netlink就成了Linux内核子系统和用户态的应用程序通信的主要手段之一。

2001年,ForCES IETF委员会正式对Netlink进行了标准化的工作。Jamal Hadi Salim提议将Netlink定义成一种用于网络设备的路由引擎组件和其控制管理组件之间通信的协议。不过他的建议最终没有被采纳,取而代之的是我们今天所看到的格局:Netlink被设计成一个新的协议域,domain。

Linux之父托瓦斯曾说过“Linux is evolution, not intelligent design”。什么意思?就是说,Netlink也同样遵循了Linux的某些设计理念,即没有完整的规范文档,亦没有设计文档。只有什么?你懂得---“Read the f**king source code”。

当然,本文不是分析Netlink在Linux上的实现机制,而是就“什么是Netlink”以及“如何用好Netlink”的话题和大家做个分享,只有在遇到问题时才需要去阅读内核源码弄清个所以然。

一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是Netlink可以实现双工通信。Netlink协议基于BSD socket和AF_NETLINK地址簇(address family),使用32位的端口号寻址(以前称作PID),每个Netlink协议(或称作总线,man手册中则称之为netlink family),通常与一个或一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。

(2)linux进程间通信方式?

  • 管道(PIPE)
  • FIFO(有名管道)
  • XSI消息队列
  • XSI信号量
  • XSI共享内存
  • POSIX信号量
  • 域套接字(Domain Socket)
  • 信号(Signal)
  • 互斥量(Mutex)

其中信号(signal)和信号量(semaphore)本质上并不算是进程间通信方式,应该是进程间同步的方式,但是也可以起到一定的通信作用,故也列在上面。

另外普通的mutex是作用线程间同步用的,但是可以将进程A和进程B共享的内存中初始化一个mutex,这样就可以用将此mutex用作进程间通信用了。

在Linux系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间交换数据或信号的一种方式。当面试官询问Linux进程间通信方式时,可以从以下几个方面进行回答:

一、常见的Linux进程间通信方式

  1. 管道(Pipe)

    • 定义:管道是一种半双工的通信方式,数据只能单向流动,通常用于父子进程或兄弟进程之间的通信。
    • 类型:包括匿名管道(无名管道)和命名管道(FIFO)。匿名管道只存在于内存中,而命名管道以文件的形式存在于文件系统中,允许无亲缘关系的进程间通信。
    • 特点:管道简单高效,但只能传递无格式的字节流,且缓冲区大小有限。
  2. 共享内存(Shared Memory)

    • 定义:多个进程可以映射同一块物理内存区域,从而实现对共享数据的读写。
    • 特点:共享内存是最快的IPC方式之一,因为它避免了数据的拷贝。但需要与其他同步机制(如信号量)结合使用,以确保数据的一致性和互斥访问。
  3. 消息队列(Message Queue)

    • 定义:消息队列是一种通过消息传递实现进程间通信的方式。进程可以将消息发送到队列中,其他进程则可以从队列中接收消息。
    • 特点:消息队列实现了进程间的异步通信,提供了灵活的消息传递机制。克服了管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  4. 信号量(Semaphore)

    • 定义:信号量是一种计数器,用于控制多个进程对共享资源的访问。
    • 特点:信号量通常用于同步进程之间的操作,以避免竞争条件。它可以作为锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
  5. 套接字(Socket)

    • 定义:套接字是一种网络编程接口,不仅可以用于不同主机间的进程通信,也可以用于同一主机上的进程通信。
    • 特点:套接字提供了灵活的通信方式,支持面向连接(如TCP)和无连接(如UDP)的通信。它是网络通信的基础,也是进程间通信的一种重要方式。
  6. 信号(Signal)

    • 定义:信号是软件层次上对中断机制的一种模拟,是一种异步通信方式。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

ARM/Linux嵌入式真题 文章被收录于专栏

让实战与真题助你offer满天飞!!! 每周更新!!! 励志做最全ARM/Linux嵌入式面试必考必会的题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通。 因为技术知识工作中也会用到,所以踏实学习哦!!!

全部评论

相关推荐

点赞 8 评论
分享
牛客网
牛客企业服务