所以,知识会消失的,对不对?—Lunix高频面试题解析

在这里插入图片描述
以下文章来源于公众号“程序员求职之路

想进大厂,不会Lunix可不行,来接受Lunix面试挑战吧,看看你能坚持到哪里?

1.Linux 中主要有哪几种内核锁?

Linux 的同步机制从 2.0 到 2.6 以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。
Linux 的内核锁主要是自旋锁和信号量。自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被征用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被征用,请求它的执行线程便能立刻得到它并且继续进行。
Linux 中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

2.Linux 虚拟文件系统的关键数据结构有哪些?

struct super_block
struct inode
struct file
struct dentry

3. 创建进程的系统调用有哪些?

clone(),fork(),vfork();
系统调用服务例程:sys_clone,sys_fork,sys_vfork;

4. 调用 schedule()进行进程切换的方式有几种?

系统调用 do_fork();
定时中断 do_timer();
唤醒进程 wake_up_process
改变进程的调度策略 setscheduler();
系统调用礼让 sys_sched_yield();

5. Linux 中有哪几种设备?

字符设备和块设备。
网卡是例外,他不直接与设备文件对应,mknod 系统调用用来创建设备文件。

6. 字符设备驱动程序的关键数据结构是哪个?

字符设备描述符struct cdev,cdev_alloc()用于动态的分配cdev描述符,cdev_add()用于注册一个cdev描述符,cdev包含一个 struct kobject 类型的数据结构它是核心的数据结构

7. 如何唯一标识一个设备?

Linux 使用一个设备编号来唯一的标示一个设备。
设备编号分为:主设备号和次设备号,一般主设备号标示设备对应的驱动程序,次设备号对应设备文件指向的设备。
在内核中使用 dev_t 来表示设备编号,一般它是 32 位长度,其中 12 位用于表示主设备号,20 位用于表示次设备号,利用MKDEV(int major,int minor);用于生成一个 dev_t 类型的对象。

8. 通过伙伴系统申请内核内存的函数有哪些?

在物理页面管理上实现了基于区的伙伴系统(zone based buddy system)。对不同区的内存使用单独的伙伴系统(buddy system)管理,而且独立地监控空闲页。相应接口 alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。

9. Linux 中的浮点运算由应用程序实现还是内核实现?

应用程序实现,Linux 中的浮点运算是利用数学库函数实现的,库函数能够被应用程序链接后调用,不能被内核链接调用。这些运算是在应用程序中运行的,然后再把结果反馈给系统。
Linux 内核如果一定要进行浮点运算,需要在建立内核时选上 math-emu,使用软件模拟计算浮点运算,据说这样做的代价有两个:用户在安装驱动时需要重建内核,可能会影响到其他的应用程序,使得这些应用程序在做浮点运算的时候也使用 math-emu,大大的降低了效率。

10. Linux通过什么方式实现系统调用?

靠软件中断实现的。
首先,用户程序为系统调用设置参数,其中一个编号是系统调用编号,参数设置完成后,程序执行系统调用指令,x86 上的软中断是有 int 产生的,这个指令会导致一个异常,产生一个事件,这个事件会导致处理器跳转到内核态并跳转到一个新的地址。并开始处理那里的异常处理程序,此时的异常处理就是系统调用程序。

11. Linux软中断和工作队列的作用是什么?

Linux 中的软中断和工作队列是中断处理。
1.软中断一般是“可延迟函数”的总称,它不能睡眠,不能阻塞,它处于中断上下文,不能进城切换,软中断不能被自己打断,只能被硬件中断打断(上半部),可以并发的运行在多个 CPU 上。所以软中断必须设计成可重入的函数,因此也需要自旋锁来保护其数据结构。
2.工作队列中的函数处在进程上下文中,它可以睡眠,也能被阻塞,能够在不同的进程间切换。已完成不同的工作。可延迟函数和工作队列都不能访问用户的进程空间,可延时函数在执行时不可能有任何正在运行的进程,工作队列的函数有内核进程执行,他不能访问用户空间地址。

12. 用户进程间通信主要哪几种方式?

1.管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
2.命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令 mkfifo 或系统调用 mkfifo 来创建。
3.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux 除了支持 Unix 早期信号语义函数 sigal外,还支持语义符合 Posix.1 标准的信号函数 sigaction(实际上,该函数是基于 BSD 的,BSD为了实现可靠信号机制,又能够统一对外接口,用 sigaction 函数重新实现了 signal 函数)。
4.消息(Message)队列:消息队列是消息的链接表,包括 Posix 消息队列 system V 消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
5.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用 IPC 形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
6.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
7.套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由 Unix 系统的 BSD 分支开发出来的,但现在一般可以移植到其它类 Unix 系统上:Linux 和System V 的变种都支持套接字。

根据岗位不同,各厂笔试的内容也不尽相同,技术岗尤其会重点考察编程硬实力。
对于互联网行业来说,出题主要有以下几个方向:
历年的题目
● 对互联网行业知识掌握
● 岗位要求的能力
● 结合时事热点话题
● 围绕公司的产品

对求职者而言,结合出题点准备笔试,是更加高效的方法。
为了方便大家更好的准备笔试,顺利通过残酷的笔试环节。

这里向大家推荐一份收录了1700+真题;涵盖BAT、美团等一线大厂的面试题合集:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
本题库主打以下两个特点:
第一:十秒检索!
秉承拿来即用、精简实用的观念,投入大量时间对收集的资料进行筛选、分类、去重和统一排版。对大家关心的Case Interview、面经等内容排出目录方便查找。让你只需一点点时间便能快速找到想要且有用的内容。

第二:每月更新!
不满足于现状,题库及时收纳各厂本月最新面试题。带你了解大厂实时需求,准备什么、补强什么一目了然。不会真的有人可以拒绝“带着剧本”去面试的诱惑吧。

懂你所想、知你所需,后台回复「面试题库」,做足功课为自己的面试交出满意答卷吧。
在这里插入图片描述
扫码关注公众号
给你贴心有效的职业规划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值