b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Linux C / C ++服务器后台开发面试问题汇总(服务器编程)

电脑杂谈  发布时间:2020-03-22 14:07:06  来源:网络整理

linux多线程编程面试题_posix线程编程指南 pdf_windows线程编程

原文转载于:linux C/C++服务器后台开发面试题总结

1. 多线程和多进程之间的区别(必须从cpu调度,上下文切换,数据共享,多核杯子利用率,资源占用等各个方面来回答焦点,然后必须存在一个问题将会问: 哪个是线程专用的?答案中必须包含寄存器,否则很遗憾)!

1)过程数据是分离的: 共享很复杂,需要IPC,并且同步很简单;多线程共享过程数据: 共享简单,同步复杂

2)进程的创建,破坏和切换是复杂且缓慢的;线程的创建,销毁和切换既简单又快速

3)进程占用更多内存,CPU使用率较低;线程占用更少的内存和较高的CPU使用率

4)简单的过程编程和简单的调试;复杂的线程编程和复杂的调试

5)进程不会互相影响;挂线程会导致整个过程挂起

6)流程适用于多核,多计算机分发;线程适用于多核

线程私有:

线程ID,寄存器值,堆栈,线程优先级和调度策略,线程的私有数据,信号掩码字,errno变量,

2. 多线程锁有哪些类型?

a. 互斥体b. 递归锁c. 旋转锁d. 读写锁

posix线程编程指南 pdf_linux多线程编程面试题_windows线程编程

3. 自旋锁和互斥锁有什么区别?

当锁被其他线程占用时,其他线程没有处于睡眠状态,而是不断消耗CPU来获取锁;否则,互斥锁将保持睡眠状态,直到释放并激活该互斥锁为止.

自旋锁,递归调用容易产生死锁. 对于可以长时间获取锁的情况linux多线程编程面试题,使用自旋锁很容易导致CPU效率低下. 仅在内核抢占式或SMP情况下才真正需要自旋锁.

4. 进程间通信和线程间通信

1). 管道2)消息队列3)共享内存4)信号量5)套接字6)条件变量

5. 如何为多线程程序体系结构设置线程数?

它应该与CPU核心数或CPU核心数+ 1相同.

6. 什么是原子操作,由gcc提供的原子操作原语,如何使用这些原语来实现读写锁定?

原子操作是不会被线程调度机制中断的操作;此操作一旦开始,它将运行到最后,而中间不会进行任何上下文切换.

Q组

762073882

7. 网络编程设计模式,反应堆/前驱/半同步和半异步模式?

posix线程编程指南 pdf_windows线程编程_linux多线程编程面试题

反应器模式: 同步阻塞I / O模式,注册相应的读取和写入事件处理程序,等待事件发生,然后调用事件处理程序以处理事件. proactor模式: 异步I / O模式. Reactor和Proactor模式之间的主要区别是谁执行实际的读取和写入操作. 在Reactor中,应用程序需要自己读取或写入数据. 在Proactor模式下,应用程序不需要执行实际的读写过程.

反应器是:

主线程向epoll内核注册一个套接字读取事件. 主线程调用epoll_wait以等待从套接字读取数据. 当套接字中有可用数据时,主线程将套接字可读事件放入请求队列中. 唤醒在请求队列上休眠的工作线程,处理客户端请求,然后向epoll内核注册套接字写请求事件. 主线程调用epoll_wait以等待写入请求事件. 当有事件要写入时,主线程将套接字可写事件放入请求队列中. 唤醒在请求队列中休眠的工作线程以处理客户端请求.

执行者:

主线程调用aio_read函数在套接字上向内核注册读取完成事件,并告诉内核用户读取缓冲区的位置以及读取完成后如何通知应用程序. 主线程继续处理其他逻辑. 当套接字上的数据为读入用户缓冲区后,会向应用程序发出信号,表明数据已准备就绪. 应用程序的预定义信号处理功能选择一个工作线程来处理客户端请求. 工作线程处理完客户请求后,它将调用aio_write函数在内核中注册套接字写完成事件linux多线程编程面试题,并告知内核写缓冲区的位置以及如何在写操作完成时通知应用程序. 主线程处理其他逻辑. 当用户高速缓存区域中的数据写入套接字时,内核会向应用程序发送信号,以通知应用程序已发送数据. 该应用程序的预定义数据处理功能可以完成这项工作.

半同步和半异步模式:

上级任务(例如查询,文件传输)使用同步I / O模型,从而简化了编写并行程序的难度.

基础任务(例如网络控制器的中断处理)使用异步I / O模型,从而提高了执行效率.

8. 有一个计数器,并且需要更新多个线程. 会遇到什么问题,原因是什么,我该怎么办?如何优化?

一个线程更新的数据可能已被另一个线程更新,更新后的数据可能会异常,您可以锁定它以确保数据更新只能由一个线程完成.

最近对一千个程序员的常见问题进行了分析. 欢迎大家提出问题和想法.

所有问题,想法和答案都将安排在公共帐户中,您可以扫描代码以进行关注,交流和学习. 按照此步骤,您将免费获得2020年技术学习促进礼品包! (包括文档,电子书,视频等)

windows线程编程_posix线程编程指南 pdf_linux多线程编程面试题

9. 如果select返回可读的结果,并且结果为只读至0个字节,会发生什么?

套接字集尚未准备好. 您可以选择将FD_CLR设置为0来清除内存.

10. Connect可能阻塞了很长时间,如何解决?

1. 使用计时器; (最常见,最有效的方法)

2. 使用非阻止模式: 设置非阻止,然后使用select在返回后检查状态.

11. 什么是Keepalive?如何使用?

keepalive是一种可以检测TCP中无效连接的机制.

1). 如果主机可访问,则另一方将以ACK响应进行响应,并认为它仍然有效.

2). 如果可以访问,但应用程序退出,则对方发送RST响应并发送TCP取消连接.

3). 如果可以访问,但应用程序崩溃,则另一方发送FIN消息.

4). 如果另一个主机未响应ack,rst,它将继续发送直到超时,然后取消连接. 默认值为两个小时.

12. 套接字何时可读?

windows线程编程_posix线程编程指南 pdf_linux多线程编程面试题

1. 套接字接收缓冲区中已接收的数据字节数大于或等于套接字接收缓冲区的低潮限制的当前值;在此类套接字上的读取操作将不会阻塞并返回大于0的值(准备好读取数据字节数).

2. 返回已读连接的一半已关闭(即从另一方收到的FIN的TCP连接),并返回0;

3.socket收到了对方的连接请求,已完成的连接数不为零. 这样的套接字处于可读状态; <​​/ p>

4. 通常情况下,套接字读取操作不会阻塞,并且将返回错误(-1).

13. udp调用connect有什么作用?

1). 因为UDP可以是,多对一,一对多或多对多通信,所以每次调用sendto()/ recvfrom()时,必须指定目标IP和端口号. . 通过调用connect()建立端到端连接,可以使用send()/ recv()传递数据(如TCP),而不必每次都指定目标IP和端口号. 但是它与TCP的不同之处在于它没有三向握手过程.

2). 您可以通过在已经建立连接的UDP套接字上调用connect()来指定新的IP地址和端口号并断开连接.

14. 套接字编程. 如果客户端关闭电源,服务器如何快速知道?

使用计时器(适合数据流);

使用套接字选项SO_KEEPALIVE(适用于没有数据流的情况);

1). 编写自己的心跳包程序. 简而言之,您的程序添加了一个线程来定期向对等方发送数据包,检查是否存在ACK,并根据ACK的返回来管理连接. 这种方法比较通用,通常使用业务层心跳处理,灵活,可控,但是改变了现有协议;

2)使用TCP保持活动机制. 不建议UNIX网络编程使用SO_KEEPALIVE进行心跳检测.

keepalive原理: TCP嵌入了心跳包. 以服务器为例. 当服务器检测到超过特定时间段(/ proc / sys / net / ipv4 / tcp_keepalive_time 7200为2小时)时,没有数据传输. 终端发送一个keepalive数据包.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-148398-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...