Linux面试题

来源:互联网 发布:合泰单片机c语言教程 编辑:程序博客网 时间:2024/06/05 04:36

**1、**PCB进程控制块可以用locate sched.h命令来查看位置。 
2、一个进程默认打开文件的个数1024。 
3、进程和线程的差别 
线程是指进程内的一个执行单元,也是进程内的可调度实体. 
与进程的区别: 
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. 
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。 
4、网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别? 
1)进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。 
2)线程:相对于进程而言,线程是一个更加接近于执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 
两者都可以提高程序的并发度,提高程序运行效率和响应时间。 
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。 
5、TCP为什么不是两次连接?而是三次握手? 
如果A与B两个进程通信,如果仅是两次连接。可能出现的一种情况就是:A发送完请报文以后,由于网络情况不好,出现了网络拥塞,即B延时很长时间后收到报文,即此时A将此报文认定为失效的报文。B收到报文后,会向A发起连接。此时两次握手完毕,B会认为已经建立了连接可以通信,B会一直等到A发送的连接请求,而A对失效的报文回复自然不会处理。依次会陷入B忙等的僵局,造成资源的浪费。 
6、管道的局限性: 
① 数据自己读不能自己写。 
② 数据一旦被读走,便不在管道中存在,不可反复读取。 
③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。 
④ 只能在有公共祖先的进程间使用管道。 
7、现今常用的进程间通信方式有: 
1)管道 (使用最简单) 
2)信号 (开销最小) 
3)共享映射区 (无血缘关系) 
4)本地套接字 (最稳定) 
5)fifo(无血缘关系) 
8、管道的优劣 
优点:简单,相比信号,套接字实现进程间通信,简单很多。 
缺点:1. 只能单向通信,双向通信需建立两个管道。 
2.只能用于父子、兄弟进程(有共同祖先)间通信。该问题后来使用fifo有名管道解决。 
9、线程共享资源 
1.文件描述符表 
2.每种信号的处理方式 
3.当前工作目录 
4.用户ID和组ID 
5.内存地址空间 (.text/.data/.bss/heap/共享库) 
线程非共享资源 
1.线程id 
2.处理器现场和栈指针(内核栈) 
3.独立的栈空间(用户空间栈) 
4.errno变量 
5.信号屏蔽字 
6.调度优先级 
10、线程优、缺点 
优点: 1. 提高程序并发性 2. 开销小 3. 数据通信、共享数据方便 
缺点: 1. 库函数,不稳定 2. 调试、编写困难、gdb不支持 3. 对信号支持不好 
优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。 
11、OSI七层模型与TCP/IP四层模型 
1)物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。 
2) 数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1 
3)网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。 
4)传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。 
5)会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。 
6)表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。 
7)应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。 
各层的作用: 
物理层:主要定义物理设备标准 
数据链路层:让格式化数据以帧为单位进行传输,错误检查和纠正 
网络层:为不同地理位置的网络主机提供连接和路径选择。 
传输层:定义了一些传输数据的协议和端口号 
会话层:通过端口建立数据传输的通路。 
表示层:确保一个系统的应用层所发送的信息可被另一个系统的应用层读取。 
应用层:为用户的应用程序提供网络服务。 
四层:应用层、传输层、网络层、链路层。 
12、建立连接(三次握手)的过程: 
1. 客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的段1。 
客户端发出段1,SYN位表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地址,每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺序,也可以发现丢包的情况,另外,规定SYN位和FIN位也要占一个序号,这次虽然没发数据,但是由于发了SYN位,因此下次再发送应该用序号1001。mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。 
2. 服务器端回应客户端,是三次握手中的第2个报文段,同时带ACK标志和SYN标志。它表示对刚才客户端SYN的回应;同时又发送SYN给客户端,询问客户端是否准备好进行数据通讯。 
服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就是应答了客户端的连接请求,同时也给客户端发出一个连接请求,同时声明最大尺寸为1024。 
3. 客户必须再次回应服务器端一个ACK报文,这是报文段3。 
客户端发出段3,对服务器的连接请求进行应答,确认序号是8001。在这个过程中,客户端和服务器分别给对方发了连接请求,也应答了对方的连接请求,其中服务器的请求和应答在一个段中发出,因此一共有三个段用于建立连接,称为“三方握手(three-way-handshake)”。在建立连接的同时,双方协商了一些信息,例如双方发送序号的初始值、最大段尺寸等。 
13、数据传输的过程: 
1. 客户端发出段4,包含从序号1001开始的20个字节数据。 
2. 服务器发出段5,确认序号为1021,对序号为1001-1020的数据表示确认收到,同时请求发送序号1021开始的数据,服务器在应答的同时也向客户端发送从序号8001开始的10个字节数据,这称为piggyback。 
3. 客户端发出段6,对服务器发来的序号为8001-8010的数据表示确认收到,请求发送序号8011开始的数据。 
14、关闭连接(四次握手)的过程: 
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
1. 客户端发出段7,FIN位表示关闭连接的请求。 
2. 服务器发出段8,应答客户端的关闭连接请求。 
3. 服务器发出段9,其中也包含FIN位,向客户端发送关闭连接请求。 
4. 客户端发出段10,应答服务器的关闭连接请求。 
建立连接的过程是三方握手,而关闭连接通常需要4个段,服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接之后就不能再发送数据给服务器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。 
15、 
命令查看ulimit -a 查看open files 对应值。默认为1024 
可以使用ulimit -n 4096 修改 
当然也可以通过修改系统配置文件永久修改该值,但是不建议这样操作。 
cat /proc/sys/fs/file-max可以查看该电脑最大可以打开的文件个数。 
16、什么是滑动窗口,作用是什么? 
滑动窗口(Sliding Window)是一种流量控制技术。可以改善吞吐量,控制传输。其特征是发送方在接收应答之前传送附加包,接收方告诉发送方某一时刻能送包的数量(即窗口尺寸)。作用是,如果发送接收端的速度不一致时,保证通信速度,不至丢失数据。存大小影响。 
17、简述NAT映射和打洞机制。 
NAT映射,功能是把公网的地址转翻译成私有地址。 通过路由器维护的NAT映射表和端口来完成私有IP与公网IP的转换。 
打洞,路由器的NAT机制决定了内网访问外网容易,而外网访问内网困难,两台私有IP主机之间,借助第三方服务器,完成直接数据传递,双向传递数据,说明打洞成功。 
18、什么是半关闭?有什么特性? 
TCP的半关闭是指TCP连接的一端调用shutdown操作,使数据只能往一个方向流动,只有一方发送了FIN,仍然可以正常收(或发)数据。 
19、简述TCP、UDP的优缺点及其各自使用场合。 
对于UDP来说,传输数据之前不需要先建立连接,远程主机在接收到UDP报文后,不需要确认。双方通讯的时候,没有应答和重传过程。 
优点:开销小,数据传输速度快,实时性强。缺点:传输正确率、传输顺序、流量得不到保证。用于视频会议、电话会议等对实时性要求较高的通信场合。 
TCP提供面向连接的服务,传输数据前必须先建立连接,接收方确认,数据传输结束号要释放连接。而在通讯时,是有应答和重传过程的。 
优点、缺点与UDP相反。用于,对数据正确率要求较严格场合。 
20、简述广播、组播的原理。 
广播,使用UDP协议,借助广播地址,向局域网中所有主机发送数据包。 
组播,通过分配组播地址,将终端分组。对各个组播组统一发送数据包。组播,也叫多播。 
21、什么是粘包,如何解决粘包问题? 
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 
为了避免粘包现象,可采取以下几种措施。 
一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满; 
二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象; 
三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。 
22、简述select、epoll的区别。 
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。 
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。 
23、什么是阻塞,什么是非阻塞? 
当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该进程等待的事件发生了(比如网络上接收到数据包,或者调用sleep指定的睡眠时间到了)它才有可能继续运行。与睡眠状态相对的是运行(Running)状态。 
非阻塞则不会造成进程挂起。通信双方常常处于异步通信状态。 
24、什么是管道,有什么特征及优缺点,使用场景是什么? 
特征:内核使用环形队列机制,借助内核缓冲区实现。其本质是一个伪文件,由两个文件描述符引用,一个表示读端,一个表示写端,数据从管道的写端流入管道,从读端流出。 
① 数据自己读不能自己写。 
② 数据一旦被读走,便不在管道中存在,不可反复读取。 
③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动 
④ 只能在有公共祖先的进程间使用管道。 
优点:简单,相比信号,套接字实现进程间通信,简单很多。 
缺点: 
1)只能单向通信,双向通信需建立两个管道。 
2)只能用于父子、兄弟进程(有共同祖先)间通信。 
25、进程有哪几种基本状态? 
初始态、就绪态、运行态、挂起态、终止态。 
26、父子进程间有哪些异同,是否共享数据?(共享哪些数据?) 
父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式… 
父子不同处: 1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集 
共享打开的文件结构体。共享mmap建立的映射区。 
27、 描述下僵尸进程和孤儿进程及守护进程。 
孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。 
僵尸进程:进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。 
守护进程:是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着。 
28、什么是环境变量,有什么作用? 
环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数。用于设置、修改、描述当前进程的运行环境信息。 
29、信号量与互斥锁的区别是什么? 
互斥锁也叫互斥量,是Linux系统提供的,用于资源同步的锁机制。取值有2种。加锁和解锁。规定,对共享数据操作前加锁,访问结束后立即解锁。 
信号量是进化版的互斥锁。它可看作一个计数器,用于多线程、多进程对共享数据对象的访问。访问共享数据时,先测试该资源的信号量,值为正,则进程(线程)可以使用该资源,并将信号量减1,表示使用了一个资源单位。如信号量的值已经为0,则进程进入休眠态。直至信号量大于0。 
30、Linux下线程和进程有哪些区别与联系,各自优缺点是什么?你在开发过程中倾向于哪种方式,原因是什么? 
线程优点: 1. 提高程序并发性 2. 开销小 3. 数据通信、共享数据方便 
线程缺点: 1. 库函数,不稳定 2. 调试、编写困难、gdb不支持 3. 对信号支持不好,优点相对突出,Linux下由于实现方法导致进程、线程差别不是很大。 
开发倾向,能有理有据即可。 
31、什么是线程同步,为什么要同步?有哪些同步方法?你熟知的线程同步方法有哪些?举一个实际应用过的例子。 
线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 
线程同步目的:在访问共享资源时,保证数据一致性,防止产生与时间有关的错误。 
互斥量、读写锁、条件变量、信号量。 
举例能自圆其说即可。

0 0