Linux C工程师面试常问技术要点

前言

最近在考虑跳槽,整理一下面试常问的东西,在给自己复习的同时也希望给需要面试的朋友有帮助~

系统编程常问技术点

  1. 物理内存+虚拟内存
  2. 内存分区(栈+堆)
  3. 进程+线程
  4. 分片
  5. 中断+系统调用
  6. 同步+异步

网络编程常问技术点

  1. IOS七层模型+TCP/IP四层体系结构
  2. TCP三次握手+四次挥手

系统编程常问技术点

1. 物理内存+虚拟内存

物理内存:字面意思就是物理存储嘛,比如内存条。
虚拟内存:进程运行时的内存空间(1G虚拟内核空间,3G用户空间)。虚拟内存是连续的地址空间,而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。

虚拟内存到物理内存的处理:
计算机会对虚拟内存地址空间分页产生页,对物理内存地址空间分页产生页帧,页和页帧的大小一样。页表是虚拟内存页到物理内存页的映射,确切的说是页号到页帧号的映射,而且一一对应。

虚拟内存页的个数 > 物理内存页帧的个数 如何解决?
操作系统有页面失效功能。系统找到一个最少使用的页帧,使其失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,如此保证所有的页都有被调度的可能。
虚拟内存地址由页号和偏移量组成。页号对应的映射到一个页帧。偏移量就是上面说的页或页帧的大小,即这个页或页帧能存的数据的大小。

举个栗子看一下虚拟内存如何工作的:
假设有一个虚拟地址它的页号是4,偏移量是20,那么寻址过程是这样的:首先到页表中找到页号4对应的页帧号(比如为8),如果页不在内存中,则用失效机制调入页,否则把页帧号和偏移量传给MMU(CPU的内存管理单元),组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。

2.内存分区

内存5大分区:
栈:先进后出,由系统自动分配内存,内存大小向下增长,地址向下减少,保存数据越多,栈地址越低。分配局部变量空间、函数参数、返回值。

堆:先进先出,动态分配,由程序员自由通过new或malloc()分配,delete或free()释放。内存向上增长,地址向上增长,保存数据越多,堆地址越高。

数据段:
1.bss段:保存未初始化的全局、全局静态变量。
2.data段:保存初始化了的全局、全局静态、局部静态变量。
这里引申一下:
在局部变量前加 static 变成静态局部变量是延长其在进程的生命周期。static 修饰给变量或函数作用域增加局限性,限制其只能在本文件中被使用。
extern 变量/函数 ---- 作用域扩充

代码段:存放程序执行代码。

各段的操作权限:
代码段 r-x 只能读
数据 rw 可读可写
栈 rw 可读可写
堆 rw 可读可写

指针变量在堆里,变量在栈里,const变量在代码段里,static在数据段。

这里被问到了常量区和栈区堆区的区别:
常量区在代码段中,栈区堆区不用说了吧。常量区是只读的,不能修改。栈区堆区是可读可写的。

3.进程+线程

(a)进程
进程是程序进行时在内存中独立的内存体,有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。

进程间通信:
管道:
半双工,数据只能单向流动,允许进程间按先进先出的方式传递数据。无名管道只可以在有亲缘关系的进程间通信。管道实质是一个内核缓存区,该缓存区可看作是一个循环队列。

消息队列:
1.消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构,每个数据块都有一个最大长度的限制。
2.消息队列就是一个消息链表,是一系列保存在内核中的消息列表。可以按照需要读取特定类型消息,不需要按排队次序。

消息队列编程模型:

进程A进程B
创建消息队列获取消息队列
发送消息接收消息
接收消息发送消息
删除消息队列

共享内存:
允许两个或以上个进程共享一个存储区。
系统加载一个进程的时候,分配给进程的内存是虚拟内存空间。让两个进程各自拿出一块虚拟地址空间来,映射到相同的物理内存中,这样两个进程虽然有着独立的虚拟内存空间,但有一部分却是映射到相同的物理内存,此为内存共享机制。
效率高,可以直接读写,可以很好着解决拷贝所消耗的时间。

信号量:
信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。
举个栗子:
信号量的初始值是 1,a进程来访问内存1的时候,将信号量的值设为 0,当b进程b也来访问内1时,看到信号量的值为 0 就知道已经有进程在访问内存1了,此时b进程将无法访问内存1。

1.信号是Linux系统中用于进程之间通信或操作的一种机制,信号可以在任何时候发送给某一进程。
2.信号是软件层次上对中断机制的一种模拟,是一种异步通信方式。
3.SIGKILL、SIGSTOP 应用程序无法捕捉和忽略,这是为了使系统管理员能在任何时候中断或结束某一特定进程。

套接字socket:
套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

(b)线程
线程是程序执行的最小单位,cpu调度的基本单位。

线程与进程的联系:
1)一个线程只能属于一个进程;一个进程可以有多个线程,至少拥有一个线程。
2)资源分配到进程,此进程中的所有线程共享此进程的所有资源。
3)处理机分配给线程,真正在处理机上运行的是线程。
4)线程在执行过程中,需要协作同步。不同进程的线程间的同步要利用消息通信的办法来实现。

线程与进程的区别:
1)进程是系统资源分配的最小单位,线程是程序执行的最小单位。
2)进程创建开销大,线程创建开销小。
3)进程间通信比较麻烦,线程间通信比较方便。
4)多进程程序更加健壮。多线程程序若出现某个线程挂掉,将会导致整个业务挂掉。多进程各进程有独立地址空间,一个进程挂掉的影响可能不是很大。

引申:
I/O多路复用(事件驱动模型):
多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,实现一个线程监视多个文件句柄,叫I/O多路复用。“多路”指网络连接,“复用”指的是复用同个线程。
多路复用是一种机制,可用来监听多种描述符,若其中任意一个描述符处于就绪状态,就会返回消息给对应的进程通知其采取下一步的操作。

4.锁

锁机制
通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。
锁可以理解为内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功。如果已经上锁,则返回失败。解锁时,则把锁状态修改为空闲状态。

什么是死锁?
死锁是指两个或以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁的原因包括系统资源不足、进程运行推进顺序不合适、资源分配不当等。
比如两只羊过桥。进程比作羊,资源比作桥。若两只羊互不相让,争着过桥,就产生死锁。

死锁产生的4个必要条件?
1)互斥条件:进程要求对所分配的资源进行排它性控制,即在一个资源每次只能被一个进程使用。
2)请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
3)不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
4)环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。存在一个进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一资源,……,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。

解决死锁的四个方式:
1)鸵鸟算法。(不会)
2)检测死锁并且恢复。(检测与解除策略)
3)仔细地对资源进行动态分配,以避免死锁。(避免策略)
4)通过破除死锁四个必要条件之一,来防止死锁产生。(预防策略)

5.分片

如果线程数不多于CPU核心数,会把各个线程都分配一个核心,不需分片,而当线程数多于CPU核心数时才会分片。

6.中断+系统调用

什么是中断?
中断是CPU的一个功能,就是CPU停下当前的工作,保留现场后自动地转去执行相应的处理程序,CPU控制权发生改变,处理完该事件后再返回断点继续执行被刚才被打断的程序。

中断的分类
分为软中断和硬中断
软中断:
a.编程异常通常叫做软中断。
b.软中断是通讯进程之间用来模拟硬中断的 一种信号通讯方式。
c.中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能。
d.软中断是软件实现的中断,也就是程序运行时其他程序对它的中断;而硬中断是硬件实现的中断,是程序运行时设备对它的中断。

硬中断:
a.硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无面外部施加中断请求信号,因此中断的发生不是随机的而是由程序安排好的。
b.硬中断的中断响应周期,CPU需要发中断回合信号(NMI不需要),软中断的中断响应周期,CPU不需发中断回合信号。
c.硬中断的中断号是由中断控制器提供的(NMI硬中断中断号系统指定为02H);软中断的中断号由指令直接给出,无需使用中断控制器。
d.硬中断是可屏蔽的(NMI硬中断不可屏蔽),软中断不可屏蔽。

区别:
a.软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的
b.软中断是由程序调用发生的,而硬中断是由外设引发的
c.硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间

系统调用:
系统提供API接口给应用程序,是计算机硬件与用户程序的中间层。

7.同步+异步

同步,就是在发出一个【调用】时,在没有得到结果之前,该【调用】就不返回。但是一旦调用返回,就得到返回值了。就是说,由【调用者】主动等待这个【调用】的结果。

异步,【调用】在发出之后,这个调用就直接返回了,所以没有返回结果。即当一个异步过程调用发出后,调用者不会立刻得到结果。而是在【调用】发出后,【被调用者】通过状态、通知来通知调用者,或通过回调函数处理这个调用。

举个栗子:
你打电话问书店老板有没有《论如何约到妹子》这本书,如果是同步通信机制,书店老板会说“你稍等,我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你“我查一下啊,查好了打电话给你”,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

网络编程常问技术点

1.IOS七层模型+TCP/IP四层体系结构

在这里插入图片描述
重点说TCP/IP四层模型
也有说五层,那把五层也加上叭!

四层五层
应用层 应用程序(FTP协议 客户端&服务器)应用层
传输层 TCP/UDP (TCP协议)传输层
网络层 IP/ICMP/IGMP(IP协议)网络层
链路层 以太驱动程序(以太协议)链路层
ARP /ARAP物理层

五层:
物理协议----电气协议
物理层------电器接口 网线8根 水晶头大小 网卡网口

TCP/IP协议簇(包含多个协议),实际关心的是网络层和传输层之间的传输。

tcp与udp的区别是什么?
TCP是面向连接(双向)的安全协议,连接时通过3次握手实现。将源主机的数据有序无差错的发往目标主机,用于实现可靠传输的情况,如文件传输。
UDP是无连接协议,用于高速传输和实时性较高的场合,比如直播。若出现丢包,仅会短暂卡顿,若tcp丢包,会长时间卡顿。

1、连接方面区别
TCP面向连接(如打电话要先拨号建立连接)。
UDP是无连接的,即发送数据之前不需要建立连接。

2、安全方面的区别
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。
UDP尽最大努力交付,即不保证可靠交付。

3、传输效率的区别
TCP传输效率相对较低。
UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

4、连接对象数量的区别
TCP连接只能是点到点、一对一的。
UDP支持一对一,一对多,多对一和多对多的交互通信。

tcp的3次握手与4次挥手
3次握手:
1.客户端告诉服务器,我要连接,发送连接请求:
SYN KH_ISN : KH_ISN(0)
mss

2.服务端收到后,告诉客户端,我知道你要链接了,发送回应:
SYN FW_ISN : FW_ISN(0)
ack KH_ISN+1 mss

3.客户端收到后,告诉服务端,我知道你知道我要连接了,我开始了哦!于是发送回应:
ack FW_ISN+1

4.连接建立了,然后客户端与服务端就开始通信了。

4次挥手:
1.客户端告诉服务端,我要断连,发送一个断连请求给服务端:
FIN KH_ISN+1 : KH_ISN+1(0) ack FW_ISN+1

2.服务器跟客户端确认,你真的要断联吗?发送一个确认:
ack KH_ISN+2

3.如果客户端没有回应,那就是确认要断联,于是服务端进行断联并跟客户端回应,我断联了哦!你那也断联叭!
FIN FW_ISN+1 : FW_ISN+1(0) ack KH_ISN+2

4.然后客户端回应说 我断连了!
ack FW_ISN+2

5.双方断联成功!

TCP编程模型
在这里插入图片描述
UDP编程模型
在这里插入图片描述

最后一点补充:

指针的问题
指针变量在32位系统中占多少字节,为什么占这么多字节?
指针就是地址,地址就是指针。
而地址是内存单元的编号。所以,一个指针占几个字节,等于是一个地址的内存单元编号有多长。
譬如以前是16位系统,指针即为2个字节,现在一般是32位系统,所以是4个字节,64位,则就为8个字节。

数据结构的问题
栈与队列:都是线性列表,栈是先进后出,队列先进先出。

数组与链表:
(1)存储形式:
数组是一块连续的空间,声明时就要确定长度。
链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。

(2)数据查找:
数组的线性查找速度快,查找操作直接使用偏移地址。
链表需要按顺序检索结点,效率低。

(3)数据插入或删除:
链表可以快速插入和删除结点。
数组则可能需要大量数据移动。

(4)越界问题:
链表不存在越界问题。
数组有越界问题。

查询使用什么?插入删除使用什么?
在选择数组或链表数据结构时,一定要根据实际需要进行选择。数组便于查询,链表便于插入删除。数组节省空间但是长度固定,链表虽然变长但是占了更多的存储空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值