博客
关于我
面试题刷题 9.12
阅读量:226 次
发布时间:2019-03-01

本文共 3081 字,大约阅读时间需要 10 分钟。

多进程与多线程的区别主要在于资源共享方式和调度机制。多进程通过进程间通信实现资源共享,而多线程则通过共享内存实现资源共享。多线程的线程切换开销较低,适合处理I/O密集型任务;而多进程提供更强的资源隔离,适合处理资源竞争严重的任务。

TCP协议的传输过程中,四层协议都会对报文进行处理。网络接口层通过物理层的数据帧处理,将报文拆分为帧;网络层通过IP分层协议将报文拆分为IP数据包;传输层通过TCP分层协议将报文拆分为TCP段;会话层则通过TCP会话管理协议将报文拆分为应用数据。

一个URL的获取过程包括以下步骤:1. 域名解析(DNS)通过域名查询得到目标主机的IP地址;2. TCP连接建立,客户端发送SYN包,服务器响应SYN-ACK包,客户端发送ACK包完成三次握手;3. HTTP请求通过TCP连接传输,服务器解析请求并返回响应;4. 服务器将响应通过TCP协议发送回客户端;5. 客户端解析并显示响应内容。

DNS解析过程通过DNS服务器查询域名对应的IP地址。客户端发送域名查询请求(DNS查询报文),DNS服务器解析域名并返回对应的IP地址。

多进程之间可以通过共享内存进行内存共享。进程间共享内存需要通过进程间共享的机制,如共享文件或使用共享内存段。

以下是两个编程题:

  • 实现一个能删除vector中所有为0的元素的函数。正确的实现方式是:
  • #include 
    #include
    using namespace std;void eraseZeroVector(vector
    & vec) { auto it = find(vec.begin(), vec.end(), 0); while (it != vec.end()) { erase(it); it = find(vec.begin(), vec.end(), 0); }}
    1. 找出二叉搜索树(BST)中的第k大节点。可以使用中序遍历的方法,记录访问节点直到找到第k大节点。
    2. 三次握手是TCP连接建立的过程,目的是建立可靠的数据传输通道。四次挥手是TCP连接断开的过程,确保双方的数据传输完整后正式关闭连接。

      四次挥手的时间等待状态(TIME_WAIT)是为了保证服务端与客户端完全断开连接,避免数据传输错误。该状态在客户端和服务端都可能出现,通常需要等待2MSL(最大段生存时间)。

      多线程和多进程的主要区别在于资源共享方式和调度机制。多线程通过共享内存实现资源共享,线程间调度更为频繁;多进程通过进程间通信实现资源共享,进程间调度更为较少。

      在Linux系统中,可以使用top命令查看CPU负载。

      以下是二叉搜索树的层序遍历(广度优先搜索)实现:

      public class BST {    public class Node {        int value;        Node left;        Node right;        public Node(int value) {            this.value = value;            left = null;            right = null;        }    }    public void levelOrderTraversal(Node root) {        if (root == null) return;        Queue
      q = new LinkedList<>(); q.add(root); while (!q.isEmpty()) { Node current = q.poll(); System.out.println(current.value); if (current.left != null) q.add(current.left); if (current.right != null) q.add(current.right); } }}

      协程是一种更高效的线程替代方案,通过用户态的切换减少了内核调度开销。协程采用上下文切换的方式,适合I/O密集型任务。

      Linux中的selectpollepoll都是I/O多路复用机制,但性能和功能上有所不同。select是基于轮询的单线程模型,poll是基于轮询的多线程模型,epoll是更高效的事件驱动模型,支持边缘触发。

      TCP和UDP的主要区别在于连接性和可靠性。TCP是三层协议,提供可靠传输,通过序列号、确认应答和重传机制确保数据完整性;UDP是两层协议,不提供连接性和可靠性,数据传输不保证顺序和完整性。

      在应用层实现可靠传输时,可以通过序列号标记数据包,使用重传机制重发丢失的数据包,确保数据完整性。

      以下是撕代码判断是否回文的实现:

      public class Palindrome {    public static boolean isPalindrome(String s) {        int l = 0;        int r = s.length() - 1;        while (l < r) {            if (s.charAt(l++) != s.charAt(r--)) {                return false;            }        }        return true;    }}

      我在腾讯云的面试中遇到了许多技术问题,涵盖了操作系统、网络、数据库、数据结构、算法等多个方面。面试官对我的项目经验、技术细节和算法实现提出了较高的要求。

      在讨论内存对齐时,我强调了内存对齐的重要性,特别是在不同系统的内存对齐方式可能不同,但总体原则是一致的。在谈到STL时,我提到了常用的容器如vector、deque、list以及string等,并举例说明了它们的使用场景和特点。

      关于内存扩容的问题,我详细解释了vector的动态内存分配机制,提到了默认的内存分配策略以及如何手动管理内存的使用。

      在迭代器失效的问题上,我强调了不同数据结构对迭代器失效的处理方式,如数组型数据结构的连续内存分配导致迭代器失效时需要使用erase返回下一个迭代器,而树型数据结构则需要使用erase(iter++)的方式。

      在讨论HTTP协议时,我重点提到了HTTP的无状态性以及如何通过Cookie和Session维持客户端与服务器之间的会话状态。

      关于协程,我详细介绍了协程的优势和应用场景,并举例说明了如何通过协程实现非阻塞的I/O操作。在编程题部分,我展示了如何实现链表的插入与删除操作,并详细解释了算法的思路和实现细节。

      在面试过程中,我还回答了关于多线程与多进程的区别、JVM的内存模型、数据库的三大范式、设计模式的实现等问题,并展示了我在项目中的实际应用经验。

      整个面试过程让我对自己的技术水平有了更清晰的认识,也让我意识到需要在某些领域进行更深入的学习和练习。

      通过这次面试,我深刻体会到了技术面试的难度和挑战,同时也积累了宝贵的经验,为今后的求职打下了坚实的基础。

    转载地址:http://imlv.baihongyu.com/

    你可能感兴趣的文章
    Qt笔记——解决添加Qt Designer Form Class时“allocation of incomplete type Ui::”
    查看>>
    poj 2386 Lake Counting(BFS解法)
    查看>>
    poj 2387 最短路模板题
    查看>>
    POJ 2391 多源多汇拆点最大流 +flody+二分答案
    查看>>
    POJ 2403
    查看>>
    poj 2406 还是KMP的简单应用
    查看>>
    POJ 2431 Expedition 优先队列
    查看>>
    Qt笔记——获取位置信息的相关函数
    查看>>
    POJ 2484 A Funny Game(神题!)
    查看>>
    POJ 2486 树形dp
    查看>>
    POJ 2488:A Knight&#39;s Journey
    查看>>
    SpringBoot为什么易学难精?
    查看>>
    poj 2545 Hamming Problem
    查看>>
    poj 2723
    查看>>
    poj 2763 Housewife Wind
    查看>>
    Qt笔记——模型/视图MVD 文件目录浏览器软件
    查看>>
    POJ 2892 Tunnel Warfare(树状数组+二分)
    查看>>
    poj 2965 The Pilots Brothers' refrigerator-1
    查看>>
    poj 3026( Borg Maze BFS + Prim)
    查看>>
    POJ 3041 - 最大二分匹配
    查看>>