网络-转载

本文属于-转-载

堆和栈

手写二分查找

    public boolean Find(int target, int[][] array) {
        if (array == null || array.length == 0 || (array.length == 1 && array[0].length == 0)) return false;
        for (int i = 0; i < array.length; i++) {
            int begin = 0;
            int end = array[0].length - 1;
            while (begin <= end) {
                int mid = (begin + end) / 2;
                if (target > array[i][mid]) {
                    begin = mid + 1;
                } else if (target < array[i][mid]) {
                    end = mid - 1;
                } else {
                    return true;
                }
            }
        }
        return false;
    }

二分法查找次数,100个数最多查找多少次?

20G大小的数据,但是内存也就10G,如何对20G数据排序?

手写冒泡

    /**
     * 冒泡排序
     *
     * @param array
     */
    private static void bubbleSort(int[] array) {
        if (array == null || array.length == 0 || array.length == 1)
            return;
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {//注意数组边界
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }
    
    private static void bubbleSort(int[] array) {
        if (array == null || array.length == 0 || array.length == 1)
            return;
        boolean flag = true;//发生了交换就为true, 没发生就为false,第一次判断时必须标志位true
        int k = array.length - 1;
        int pos = 0;//pos变量用来标记循环里最后一次交换的位置
        for (int i = 0; i < array.length - 1; i++) {
            flag = false;//每次开始排序前,都设置flag为未排序过
            for (int j = 0; j < k; j++) {//注意数组边界
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    flag = true;//表示交换过数据;
                    pos = j;
                }
            }
            k = pos;
            //判断标志位是否为false,如果为false,说明后面的元素已经有序,就直接return
            if (flag == false)
                return;
        }
    }

写一个后序遍历

四、操作系统

死锁,如何避免死锁

如果一个进程集合里面的每个进程都在等待只能由这个集合中的其他一个进程(包括他自身)才能引发的事件,这种情况就是死锁。

避免死锁:

  1. 安全状态

  2. 单个资源的银行家算法

  3. 多个资源的银行家算法

线程与进程的区别

进程:进程是操作系统资源分配的基本单位。每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。

线程:线程是CPU独立调度的基本单位。同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

线程和进程的生命周期:新建、就绪、运行、阻塞、死亡

进程间通信

  • 消息传递

    • 管道

    • 消息队列

    • 套接字

  • 共享内存

进程状态的切换图

五、网络

osi七层模型

OSI七层网络模型

对应网络协议

应用层

HTTP、TFTP、FTP、NFS、WAIS、SMTP

表示层

Telnet、Rlogin、SNMP、Gopher

会话层

SMTP、DNS

传输层

TCP、UDP

网络层

IP、ICMP、ARP、RARP、AKP、UUCP

数据链路层

FDDI、Ethernet、Arpanet、PDN、SLIP、PPP

物理层

IEEE 802.1A、IEEE 802.2到IEEE 802.11

传输层有哪些协议

tcp、udp

tcp和udp的区别

TCP:面向连接,提供可靠的服务,有流量控制,拥塞控制,无重复、无丢失、无差错,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),只能是点对点,首部 20 字节,全双工。

UDP:无连接,尽最大努力交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对多,首部 8 字节。

断网的时候,tcp和udp能检测到吗?

tcp 三次握手

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。整个流程如下图所示:

  1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

三次握手中accept函数处于第几次

三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。

http 的工作原理

HTTP协议 :Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

TCP与UDP的区别

TCP:面向连接,提供可靠的服务,有流量控制,拥塞控制,无重复、无丢失、无差错,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),只能是点对点,首部 20 字节,全双工。

UDP:无连接,尽最大努力交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对多,首部 8 字节。

TCP拥塞机制

TCP滑动窗口

GET,POST和PUT的区别

http1.0、http1.1、http2

HTTP/1.0:

  • 请求与响应支持头域

  • 响应对象以一个响应状态行开始

  • 响应对象不只限于超文本

  • 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST方法

  • 支持长连接(但默认还是使用短连接),缓存机制,以及身份认证

HTTP/1.1:

  1. 默认为长连接

  2. 提供了范围请求功能(宽带优化)

  3. 提供了虚拟主机的功能(HOST域)

  4. 多了一些缓存处理字段

  5. 错误通知的管理

HTTP/2.0:

  1. 二进制分帧

  2. 多路复用

  3. 头部压缩

  4. 请求优先级

  5. 服务端推送

http1.1中的keep-alive是怎么理解的?

HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

输入了一个URL之后发生了什么

域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户


打赏请扫码~