阿里蚂蚁金服春招电话一面(2021/3/5 15:00)
首先是自我介绍,然后开始了基础知识的提问(下面是问题及答案,答案是从网上找的,如果侵权请联系我删除)
1. 线程和进程的区别
-
根本区别:进程是资源分配的基本单位,而线程是CPU任务调度和执行的基本单位
-
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
-
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
-
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
-
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
-
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
2. 进程间通信
- 共享内存 共享内存允许两个或多个进程访问同一个逻辑内存。这一段内存可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取读出,从而实现了进程间的通信**。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其它通信机制(如信号量**)配合使用,来实现进程间的同步和通信
- 消息传递:消息队列 消息传递模型通过在协作进程间交换消息来实现。消息传递对于交换较少数量的数据很有用,因为无需避免冲突
- 信号量 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段
- 管道(pipe)
连接读写进程以实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读)
- 匿名管道是一个未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信
- 命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信
- 套接字(socket) 套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信
- 信号 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
3. 线程间同步
- 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
- 信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
4. 什么是死锁,死锁产生的4个条件
在两个或多个并发进程中,如果存在多个进程持有某种其他进程请求的资源不放,而又请求别的进程的占有资源就会形成死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。 死锁产生的四个条件(只要有一个条件不满足,就不会产生死锁)
- 互斥条件:一个资源只能同时被一个进程使用
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获资源保持不放
- 非抢占条件:进程获得的资源,在未完全使用完之前,不得被抢占
- 循环等待条件:若干进程形成一种头尾相接的循环等待资源的关系
5. 三次握手和四次挥手
6. 为什么三次握手和四次挥手
7. 排序的复杂度和稳定性
8. 盒子模型
- W3C的标准盒模型
- IE的盒模型
9. position
10. flex布局
弹性布局,用来为盒状模型提供最大的灵活性。
容器默认存在两根轴:水平的主轴(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打包优化
- 减小打包后文件体积
- 按需加载
- Tree Shaking: 可以实现删除项目中未被引用的代码
- Scope Hoisting: 分析出模块之间的依赖关系,尽可能的把打包出来的模块合并到一个函数中去。
- 加快打包速度
- 优化 Loader
20. XSS
21. node.js
前后大约聊了1个小时