美文网首页
tt一面准备2018-05-06

tt一面准备2018-05-06

作者: Observer_____ | 来源:发表于2018-05-06 19:55 被阅读0次

    一面

    1. 网络七层模型

    image
    https://blog.csdn.net/yaopeng_2005/article/details/7064869

    2. DNS流程

    http://blog.51cto.com/369369/812889
    [图片上传失败...(image-63d203-1526536188644)]
    [图片上传失败...(image-5917e4-1526536188644)]

    1、在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

    2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

    3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

    4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

    5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机

    6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

    3. 死锁

    死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

    死锁的发生必须具备以下四个必要条件:

    1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

    2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

    3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

    4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

    4. 银行家算法

    https://blog.csdn.net/roy_70/article/details/50958513

    5. 系统调用的过程

    https://blog.csdn.net/u010442934/article/details/72955236

    6. 内核级和用户级线程的区别

    https://blog.csdn.net/gatieme/article/details/51892437

    用户级线程(多对一模型)
    image

    用户级线程驻留在用户空间,对操作系统不可见,因而无法被调度到处理器内核。每个线程不具有自身的线程上下文,因此任意时刻每个进程内只能有一个线程在运行

    内核级线程(一对一模型)
    image

    ① 内核级线程是内核可感知的,用户级线程是内核不可感知的
    ②创建、撤销、调度——内核级线程需要OS内核支持,而用户级线程不需要
    ③用户级线程的程序实体运行在用户态下,而内核级线程的程序实体可以运行在任何状态下。
    ④在有内核级线程的系统内,CPU调度以线程为单位,由OS的线程调度程序负责调度;在只有用户级线程的系统内,CPU调度以进程为单位,由用户程序控制线程的轮换运行。


    image

    补充:对于用户级线程,每个进程中的线程表由运行时系统管理。当一个线程转换到就绪态或阻塞态时,线程表中存放重新启动该进程所需的信息,与内核在进程表中存放进程的信息一样

    7. java和js的区别

    8. 解释jvm

    9. 快排(手写,时间复杂度,什么情况下最差,什么情况下最好)

    快速排序简称快排,基本上别人问你数据结构学过没,都会让你手写个快排看看。

    快排就是一开始找个中介,然后把比它小的放左边,比它大的放右边,然后重新对中介两边的数据各自重新找个中介,如此循环。

    function quickSort(arr) {
      if (arr.length <= 1) { return arr }
         console.log("原数组是:" + arr)
      var pivotIndex = Math.floor(arr.length / 2)
      var pivot = arr.splice(pivotIndex, 1)[0]
      var left = []
      var right = []
       console.log("将中介提取出来后数组是:" + arr)
      for (var i = 0 ; i < arr.length ; i++){
                 console.log("此刻中介是:" + pivot + "当前元素是:" + arr[i])
        if (arr[i] < pivot) {
          left.push(arr[i])
                        console.log("移动" + arr[i] + "到左边")
        } else {
          right.push(arr[i])
                        console.log("移动" + arr[i] + "到右边")
        }
      }
      return quickSort(left).concat([pivot], quickSort(right))
    }
    
    var nums = [2,3,4,3,1,5,7,122,341,-1]
    console.log(quickSort(nums))
    
    
    image

    在脑中循环一下就知道用递归来写最容易理解。

    快排的时间复杂度是O(nlogn),属于不稳定的排序

    10. 数据库索引(什么情况下不能用索引)

    11. Js的继承方法(手写)

    12. cors

    http://www.ruanyifeng.com/blog/2016/04/cors.html

    13. Node的内存模型,垃圾回收

    https://www.jianshu.com/p/4129a3fce7bb

    14. Node的IO异步线程

    var fs = require("fs");
    fs.readFile("./testfile", "utf8", function(error, file) {  
         if (error) throw error;  
         console.log("我读完文件了!");
    });
    console.log("我不会被阻塞!");
    //我不会被阻塞!
    //我读完文件了!
    以上代码:进行I/O操作,给readFile绑定一个回调函数function(error,file){},并在读取testfile完成后执行回调函数。期间,后面的代码继续执行,不受I/O阻塞。
    

    二面
    给一个数组排序+去重
    js写一个观察者模式
    假设要综合cpu,gpu给一个手机性能做评价,怎么做
    js实现双向绑定
    移动端适配怎么做
    移动端点透问题
    移动端300ms延迟怎么解决
    nodejs的事件循环和浏览器的事件循环有何不同
    如何做的服务器端缓存
    三面
    字符串匹配
    正则
    Jquery选择器怎么实现的
    链式查找
    介绍项目

    xkl

    1.介绍一下自己的项目经历

    2.网络七层模型OSI

    3.死锁和解决办法

    http://www.cnblogs.com/balingybj/p/4782032.html
    产生死锁的原因:
    系统资源不足
    进程运行的顺序不当
    资源分配不当
    解决办法:
    ① 死锁的预防
    破坏四种死锁必要条件之一。
    i. 破坏互斥条件
    ii. 破坏不可剥夺条件
    iii. 破坏请求与保持条件。可以实行资源预先分配策略。进程在运行前一次性向系统申请所需的所有资源。但是这样资源利用率低,进程并发性降低。
    iv. 破坏循环等待条件。可以给资源编号,所有进程对资源的请求必须严格按照编号递增的顺序提出,进程占用了小号资源才能申请大号资源。但是增加了系统开销,增加了进程占用资源的时间(暂不需要资源的进程也要申请)
    ② 死锁的避免
    银行家算法
    ③死锁的检测与恢复
    系统设有专门检测的机构,可以检测到死锁的位置和原因,从而消除死锁:一次撤销全部进程或逐步撤销进程,优先撤销代价小的进程。

    4.进程和线程的区别

    进程是资源分配的基本单位,线程是程序执行的最小单元,调度、分配的基本单位。一个进程的实体有线程集、资源集组成,进程中的线程是动态的对象,代表了进程指令的执行。资源包含地址空间、打开的文件、用户信息等等,由进程内的线程共享。一个进程中至少有一个线程

    5.http请求七次握手

    三次握手:


    image

    四次握手:


    image

    6.SQL左连接、连接和右连接

    左连接:左表所有行,右表没有对应值就为null
    右连接:同上相反
    连接:左右所有行

    7.Node是单线程还是多线程,线程报错崩溃怎么办?

    Node是单线程。
    解决方案:Nginx反向代理
    用pm2,一个带有负载均衡功能的Node应用的进程管理器,以守护进程的方式运行node.js

    PM2的主要特性:
    内建负载均衡(使用Node cluster 集群模块)
    后台运行
    0秒停机重载,我理解大概意思是维护升级的时候不需要停机.
    具有Ubuntu和CentOS 的启动脚本
    停止不稳定的进程(避免无限循环)
    控制台检测
    提供 HTTP API
    远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

    8.http如何控制缓存(http响应头里的Expires/Cache-Control字段)

    1. Expires 指定一个日期/时间,超过这个日期则认为该响应已经过期。Expries是http1.0提出的,表示失效时间(GMT格式),只有在这个时间之前的请求才可以用强缓存。

    第一次向服务器请求一个资源后,浏览器不仅会把资源保存起来,也会保存Reponse Headers,包括其中的Expires。第二次发请求时先去缓存中寻找这个资源,取到Expires,与当前的请求时间做对比,如果在Expires之前,则从缓存中取,否则重新向服务器请求,Expires在重新加载时被更新。
    Expires: Thu, 01 Dec 1994 16:00:00 GMT

    2. Cache-Control 通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒

    Cache-Control: max-age=3600

    在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

    3. Last-Modified / If-Modified-Since

    第一次请求时返回的Response Headers中用Last-Modified表示请求的资源在服务器上最新的修改时间,第二次请求时在Request Headers中用If-Modified-Since带上这个值发到服务器,服务器对比这个值和这个资源市价上的最新修改时间决定是否直接返回304还是返回资源。当返回304时,表示资源没有更新,所以浏览器缓存中的Last-Modified也就不用更新了。

    4. ETag Etag / If-None-Match

    Etag是服务器根据被请求资源生成的一个唯一标识字符串,只要资源发生变化,Etag就会变,跟资源的最新修改时间没有关系,能弥补Last-Modified的不足。与Last-Modified类似,第二次请求时请求头会带上If-None-Match标识的Etag值,区别是由于服务器每次会根据资源重新生成一个Etag,再拿它跟浏览器传过来的Etag对比,如果一致则返回403,所以由于每次Etag都会重新生成,所以浏览器缓存中的Etag也必须每次都更新。
    一般Last-Modified和Etag是同时启用的,但是对于分布式系统多同机器间文件的Last-Modified必须一致,以免因为负载均衡到不同机器导致比对不一致,分布式系统尽量关闭Etag,因为每台机器生成的Etag也不一致。
    另外当使用F5刷新时会跳过强缓存,当强制刷新时,强缓存和协商缓存都会跳过。其他操作行为如前进后退,地址栏回车都会按正常流程走。
    浏览器默认都会缓存图片,js,css等静态文件,也可以通过待会再响应头中设置是否要启用缓存,或是通过服务器专门的配置文件统一设置Expires, Cache-control等。

    9.在不知道父元素宽高的情况下居中子元素

    flex布局

    <style>
      .container {    display: flex;    align-items: center;    justify-content: center;}
    </style>
    
    <div class="container">    
      <div class="inner">        this is a box fixed in center of screen<br>The second line    </div>
    </div>
    

    父元素display: table; 子元素display:table-cell;

    <style>.container {  display: table;}.inner {  display: table-cell;  vertical-align:middle;  text-align:center;}</style>
    
    <div class="container">  <div class="inner">    you own content  </div></div>
    

    父元素position: relative; 子元素position: relative、50%和translate

    <style>
      .container {  position: relative;}
      .inner {  position: absolute;  top: 50%;  left: 50%;  transform: translate(-50%, -50%);}
    </style>
    
    <div class="container">  <div class="inner">    your own content  </div></div>
    

    10.js基础题,看代码说出输出及原理(1&&2输出1||2输出1)

    11.如何实现跨域

    ①JSONP 只支持GET请求

    function todo(data){
      console.log('The author is: '+ data.name);
    }
    var script = document.createElement('script');
    script.src = 'http://www.jianshu.com/author?callback=todo';//向服务器www.jianshu.com发出请求。注意,该请求的查询字符串有一个callback参数,用来指定回调函数的名字。
    document.body.appendChild(script);
    //服务器收到这个请求以后,会将数据放在回调函数的参数位置返回。
    todo({"name": "fewjq"});
    //由于<script>元素请求的脚本,直接作为代码运行。这时,只要浏览器定义了todo函数,该函数就会立即调用。作为参数的JSON数据被视为JavaScript对象。
    

    ②CORS

    //第二个参数:允许跨域的域名称
        response.setHeader("Access-Control-Allow-Origin", "http://a.com", "http://b.com");
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
        response.setHeader("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS");
        //接受跨域的cookie
        response.setHeader("Access-Control-Allow-Credentials", "true");
    

    ③img标签 script标签

    12.Github如何回退到过去版本,rebase有什么作用

    Git教程: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
    版本回退:
    HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

    穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

    要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

    //恢复至add之前的版本
    git checkout readme.md

    rebase: https://blog.csdn.net/hudashi/article/details/7664631
    git rebase用于把一个分支的修改合并到当前分支。
    假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。
    $ git checkout -b mywork origin

    $ git checkout mywork
    $ git rebase origin
    这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

    13.写出快排代码的实现

    function quickSort3Way(a) {
      if (a.length <= 1) return a;
    
      var last = a.pop()
        , left = []
        , right = []
        , mid = [last];
    
      a.forEach(function(item) {
        if (item < last)
          left.push(item);
        else if (item > last)
          right.push(item);
        else
          mid.push(item);
      });
    
      var _left = quickSort3Way(left)
        , _right = quickSort3Way(right);
    
      return _left.concat(mid, _right);
    }
    

    其他:

    1. 继承实现的方式

    https://www.cnblogs.com/humin/p/4556820.html

    2. 三栏布局

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <style>
        .container {
                display: flex;
        }
        .main {
                flex-grow: 1;
            height: 300px;
            background-color: red;
        }
        .left {
            order: -1;
            flex: 0 1 200px;
            margin-right: 20px;
            height: 300px;
            background-color: blue;
        }
        .right {
            flex: 0 1 100px;
                margin-left: 20px;
            height: 300px;
            background-color: green;
        }
        </style>
    </head>
    <body>
        <div class="container">
        <div class="main"></div>
        <div class="left"></div>
        <div class="right"></div>
        </div>
    </body>
    </html>
    

    4. 排序方法

    5. TCP和UDP的区别, TCP怎样保证数据有序?怎样保证可靠性?

    1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输;
    2)面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,像打电话。
    3)TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。TCP用于传输数据量大,可靠性要求高的应用。
    UDP(用户数据报协议,User Data Protocol)
    1)面向非连接的(正式通信前不必与对方建立连接,不管对方状态就直接发送,像短信,QQ),不能提供可靠性、流控、差错恢复功能。UDP用于一次只传送少量数据,可靠性要求低、传输经济等应用。
    UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。 总结:

    TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
    UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

    6. React diff

    https://zhuanlan.zhihu.com/p/20346379

    7. 进程间通信,问内存的管理方式,分页和分段

    8. 项目用到Java,反射来讲讲

    9. Servlet呢?(基本忘完了…)

    10. 你用过什么数据库,来讲一下

    mySQL

    11. MySQL里面的索引用过吗

    https://www.cnblogs.com/panxuejun/p/5885374.html
    mySQL会自动为主键创建索引。
    另外自行创建:
    create index xxx on tablename (columnname1, column2, ...);

    Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引

    PRIMARY KEY(主键索引) 它 是一种特殊的唯一索引,不允许有空值。
    ALTER TABLE table_name ADD PRIMARY KEY ( col )
    UNIQUE(唯一索引) 与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
    ALTER TABLE table_name ADD UNIQUE (col)
    INDEX(普通索引) 最基本的索引,没有任何限制
    ALTER TABLE table_name ADD INDEX index_name (col)
    FULLTEXT(全文索引) 仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
    ALTER TABLE table_name ADD FULLTEXT ( col )
    组合索引 为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。创建复合索引时应该将最常用(频率)作限制条件的列放在最左边,依次递减。
    ALTER TABLE table_name ADD INDEX index_name (col1, col2, col3 )

    12. B+树了解过吗

    https://blog.csdn.net/aqzwss/article/details/53074186

    相关文章

      网友评论

          本文标题:tt一面准备2018-05-06

          本文链接:https://www.haomeiwen.com/subject/rnqurftx.html