大厂测试工程师面试题总结-二面(附参考答案)

二面:
1、线程与进程的区别?
一:进程与线程
概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程。当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程。
进程:进程是指处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配和调度的一个单位。当程序进入内存运行时,即为进程。

线程:
线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程。线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源。它与父进程的其他线程共享该进程的所有资源。

线程的特点:
线程可以完成一定任务,可以和其它线程共享父进程的共享变量和部分环境,相互协作来完成任务。
线程是独立运行的,其不知道进程中是否还有其他线程存在。
线程的执行是抢占式的,也就是说,当前执行的线程随时可能被挂起,以便运行另一个线程。
一个线程可以创建或撤销另一个线程,一个进程中的多个线程可以并发执行

二、线程的创建及使用
方案一:继承Thread类创建线程类

 步骤:① 定义Thread类的子类 并重写该类的Run方法,该run方法的方法体就代表了该线程需要完成的任务

        ② 创建Thread类的实例,即创建了线程对象

        ③ 调用线程的start方法来启动线程
public class ThreadTest extends Thread{
    private int i;
    @Override
    public void run() {//重写run方法
        for (int i = 0; i < 10; i++) {
            //获取当前正在执行的线程名
            System.out.println(getName()+"\t"+i);
            
        }
    }
    
}

public class MyTest{
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println("调用线程"+Thread.currentThread().getName()+"\t"+i);
            if(i==5) {
                ThreadTest t1=new ThreadTest();
                ThreadTest t2=new ThreadTest();
                //开启线程
                t1.start();
                t2.start();
            
            }
        }

    }

}

方案二:实现Runnable接口

扫描二维码关注公众号,回复: 12659982 查看本文章

 ①定义Runnable接口的实现类,并重写它的Run方法,run方法同样是该线程的执行体!

 ②创建Runnable实现类的实例,并将此实例作为Thread的target创建一个Thread对象,该Thread对象才是真正的线程对象!
public class TwoThread implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("调用线程"+Thread.currentThread().getName()+"\t"+i);
            if(i==10)
                System.out.println(Thread.currentThread().getName()+"执行完毕");
        }
        
    }

}

2、打开一个url,发生了什么?
基本概念:我们想要打开一个网站,首先是需要往浏览器的地址的URL输入框架中输入网地址。当我敲下回车后,通过HTTP协议,将网址传送到域名解析服务器,域名解析服务器根据网址找到对应的IP主机(系统服务器)。这个过程叫request,即请求;当IP主机拿到请求后,将相应的资源返回给用户浏览器。这个过程叫response,即响应。
  
当用户浏览器向系统服务器请求时,有几种方法,最常用的就是GET和POST两种方法。

3、http的请求方式?
get和post区别

  
区别:

    
get请求无消息体,只能携带少量数据

    
post请求有消息体,可以携带大量数据

  
携带数据的方式:

    
get请求将数据放在url地址中

     
post请求将数据放在消息体中

GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中; 

GET方式提交的数据最多只能有1024字节,而POST则没有此限制。 

4、http协议工作过程?
     一次HTTP操作称为一个事务,其工作整个过程如下:
     1 ) 、地址解析

     如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm

     从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
     协议名:http
     主机名:localhost.com
     端口:8080
     对象路径:/index.htm

      在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。

    2)、封装HTTP请求数据包

     把以上部分结合本机自己的信息,封装成一个HTTP请求数据包

     3)封装成TCP包,建立TCP连接(TCP的三次握手)

       在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口

     4)客户机发送请求命令

       建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。

     5)服务器响应

     服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

        实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

     6)服务器关闭TCP连接

     一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

    Connection:keep-alive

   TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

5、代码实现二叉树的高度(自己建树)

6、长连接,短连接,http1.0 http1.1。
http协议过程:
一次完整的请求过程:

  
(1)域名解析

  
(2)建立TCP连接,三次握手

  
(3)Web浏览器向Web服务端发送HTTP请求报文

  
(4)服务器响应HTTP请求

  
(5)浏览器解析HTML代码,并请求HTML代码中的资源(JS,CSS,图片)(这是自动向服务器请求下载的)

  
(6)浏览器对页面进行渲染呈现给客户

  
(7)断开TCP连接
HTTP 1.1在继承了HTTP 1.0优点的基础上,也克服了HTTP 1.0的性能问题

8、描述socket通信过程,每个函数。

9、解释抓包和构造包的过程。

10、i++和++i哪个效率高,有什么区别。
i++是先把i的值拿来用,然后在自增1
++i是想把i自增1然后拿来用
内建数据类型的情况,效率没有区别。
自定义数据类型的情况,++i效率较高。

12、线程间的同步方式。
13、扑克牌洗牌算法(提示用队列实现)

14、java/C++内存管理方式。

15、列举STL容器,解释vector和list.
 

猜你喜欢

转载自blog.csdn.net/u011485276/article/details/82909782