阿里春招电话一面(2021/3/5)

259 阅读11分钟

阿里蚂蚁金服春招电话一面(2021/3/5 15:00)

首先是自我介绍,然后开始了基础知识的提问(下面是问题及答案,答案是从网上找的,如果侵权请联系我删除)

1. 线程和进程的区别

  • 根本区别:进程是资源分配的基本单位,而线程是CPU任务调度和执行的基本单位

  • 资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

  • 包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

  • 内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

  • 影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

  • 执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

2. 进程间通信

  • 共享内存 共享内存允许两个或多个进程访问同一个逻辑内存。这一段内存可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取读出,从而实现了进程间的通信**。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其它通信机制(如信号量**)配合使用,来实现进程间的同步和通信
  • 消息传递:消息队列 消息传递模型通过在协作进程间交换消息来实现。消息传递对于交换较少数量的数据很有用,因为无需避免冲突
  • 信号量 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段
  • 管道(pipe) 连接读写进程以实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读)
    • 匿名管道是一个未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信
    • 命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信
  • 套接字(socket) 套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信
  • 信号 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

3. 线程间同步

  • 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
  • 信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
  • 事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。

4. 什么是死锁,死锁产生的4个条件

在两个或多个并发进程中,如果存在多个进程持有某种其他进程请求的资源不放,而又请求别的进程的占有资源就会形成死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。 死锁产生的四个条件(只要有一个条件不满足,就不会产生死锁)

  • 互斥条件:一个资源只能同时被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获资源保持不放
  • 非抢占条件:进程获得的资源,在未完全使用完之前,不得被抢占
  • 循环等待条件:若干进程形成一种头尾相接的循环等待资源的关系

5. 三次握手和四次挥手

6. 为什么三次握手和四次挥手

7. 排序的复杂度和稳定性

image.png

8. 盒子模型

  • W3C的标准盒模型 标准盒模型
  • IE的盒模型 IE盒模型

9. position

image.png

10. flex布局

弹性布局,用来为盒状模型提供最大的灵活性。 image.png 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。 项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

详细介绍链接

1. 容器的6个属性:
  • flex-direction

    • row(默认值):主轴为水平方向,起点在左端。
    • row-reverse:主轴为水平方向,起点在右端。
    • column:主轴为垂直方向,起点在上沿。
    • column-reverse:主轴为垂直方向,起点在下沿
  • flex-wrap

  • flex-flow flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。

  • justify-content 定义了项目在主轴上的对齐方式

  • align-items align-items属性定义项目在交叉轴上如何对齐。

    • flex-start:交叉轴的起点对齐。
    • flex-end:交叉轴的终点对齐。
    • center:交叉轴的中点对齐。
    • baseline: 项目的第一行文字的基线对齐。
    • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度
  • align-content align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用 可取值:

2. 项目的6个属性
  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

11. 垂直居中

垂直居中实现介绍

12. 原型,原型链

深入理解原型原型链

13. js继承

详细介绍

14. MVVM

  • View层:视图层 在前端开发中,通常就是DOM层,主要的作用是给用户展示各种信息。
  • Model层:数据层 数据可能是我们固定的死数据,更多的是来自我们服务器,从网络上请求下来的数据。
  • ViewModel层:视图模型层 视图模型层是View和Model沟通的桥梁。一方面它实现了Data Binding,也就是数据绑定,将Model的改变实时的反应到View中;另一方面它实现了DOM Listener,也就是DOM监听,当DOM发生一些事件(点击、滚动、touch等)时,可以监听到,并在需要的情况下改变对应的Data

15. 数据双向绑定

  • Vue是采用数据劫持结合发布/订阅模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
    • getter函数,获取object对象的属性值。
    • setter函数,对object对象的属性进行赋值。
    • 发布函数,发布的时候执行相应的回调。
    • 订阅函数,添加订阅者,传入发布时要执行的函数,可能会携额外参数。
    • 数据劫持:Object.defineProperty来劫持对象属性的setter和getter操作,并“种下”一个监听器,当数据发生变化的时候发出通知

16. 虚拟DOM

  • 是一层对真实DOM的抽象,以JavaScript 对象 (VNode 节点) 作为基础的树,用对象的属性来描述节点,最终可以通过一系列操作使这棵树映射到真实环境上。
  • 在Javascript对象中,虚拟DOM 表现为一个 Object对象。并且最少包含标签名 (tag)、属性 (attrs) 和子元素对象 (children) 三个属性,不同框架对这三个属性的名命可能会有差别
  • 创建虚拟DOM就是为了更好将虚拟的节点渲染到页面视图中,所以虚拟DOM对象的节点与真实DOM的属性一一照应
  • 通过事务处理机制,将多次DOM修改的结果一次性的更新到页面上,从而有效的减少页面渲染的次数,减少修改DOM的重绘重排次数,提高渲染性能。
  • 在vue或者react内部封装了diff算法,通过这个算法来进行比较,渲染时修改改变的变化,原先没有发生改变的通过原先的数据进行渲染。

17. 从浏览器输入网址到界面显示的过程

  • 1、输入网址
  • 2、DNS解析
  • 3、建立tcp连接
  • 4、客户端发送HTPP请求
  • 5、服务器处理请求
  • 6、服务器响应请求
  • 7、浏览器展示HTML
  • 8、浏览器发送请求获取其他在HTML中的资源。

18. 浏览器缓存

浏览器缓存

  • http缓存:
    • 强缓存:不会向服务器发送请求,直接从缓存中读取资源。
    • 协商缓存:强制缓存失效后,浏览器携带缓存标示向服务器发起请求,由服务器决定是否需要使用缓存。
  • 本地缓存:
    • localStorage:在前端设置,可以减少数据请求,长期存储
    • sessionStorage:在前端设置,只存在当前会话中即重新打开浏览器则数据消失
    • cookie:在后端设置,保存在客户端本地文件,通过set-cookie设置且Cookie的内容自动在请求的时候被传递到服务器。
    • indexDB:为浏览器提供本地数据库,提供查找接口,还能建立索引

cookie和session: cookies是网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的浏览器缓存。 session:会话控制,当用户在Web页面之间跳转时,存储在Session对象中的变量不会丢失,直到用户终止会话。

  • 共同点:

    • cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
    • 两个都可以用来存私密的东西,同样也都有有效期的说法,区别在于session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过去与否可以在cookie生成的时候设置进去。
  • 不同点

    • cookie数据存放在客户的浏览器上,session数据放在服务器上
    • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
  • 用法

    • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
    • 单个cookie在客户端的限制是3K
    • 所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

19. webpack打包优化

  1. 减小打包后文件体积
  • 按需加载
  • Tree Shaking: 可以实现删除项目中未被引用的代码
  • Scope Hoisting: 分析出模块之间的依赖关系,尽可能的把打包出来的模块合并到一个函数中去。
  1. 加快打包速度
  • 优化 Loader

详细介绍

20. XSS

21. node.js

前后大约聊了1个小时