字节二面 广智救我字节一面爽歪歪,黑神话悟空开心挤爆大头儿子,却没想被广智给灭了。却也没想,字节二面面试官,也是个广智,
字节一面爽歪歪,黑神话悟空开心挤爆大头儿子,却没想被广智给灭了。却也没想,字节二面面试官,也是个广智,把我虐的妥妥的。
字节二面
1. 死锁有什么解决办法
我面的是前端岗吗? 我在哪里?仿佛落到了如来佛祖手心,只能到此一游了。各位,408字节考的还是挺多的....
死锁是指在多线程或多进程环境中,两个或多个进程相互等待对方释放资源,从而导致所有进程都无法继续执行的情况,是操作系统中的一个重要概念。
假设系统中有两个线程(Thread A 和 Thread B)和两个资源(Resource 1 和 Resource 2),死锁可能发生的具体场景如下:
- Thread A 获取了 Resource 1 的锁。
- Thread B 获取了 Resource 2 的锁。
- Thread A 需要获取 Resource 2 才能继续执行,但 Resource 2 已被 Thread B 占用,所以 Thread A 进入等待状态。
- Thread B 需要获取 Resource 1 才能继续执行,但 Resource 1 已被 Thread A 占用,所以 Thread B 也进入等待状态。
此时,Thread A 和 Thread B 都在等待对方释放资源,导致两个线程都无法继续执行,从而进入了死锁状态。
怎么解决:
锁超时 (Lock Timeout) 在获取锁时设置超时时间,如果一个线程在超时后还没有获得锁,就自动放弃锁并回滚操作。这种方法可以避免线程长时间等待,虽然不能完全防止死锁,但可以减少死锁的发生几率。
死锁预防 (Deadlock Prevention)
-
互斥 (Mutual Exclusion) : 尽量减少资源的独占使用,例如使用可共享的资源。
-
占有且等待 (Hold and Wait) : 在获取资源之前,进程必须先释放所有持有的资源,或者在开始执行前一次性申请所有资源。
-
不可剥夺 (No Preemption) : 允许操作系统强制剥夺某个进程的资源,以避免死锁。
-
环路等待 (Circular Wait) : 规定资源的申请顺序,例如按照资源的序号依次申请,防止形成循环等待。
死锁避免 (Deadlock Avoidance)
- 银行家算法 (Banker's Algorithm) : 在进程申请资源时,系统通过模拟分配判断是否进入不安全状态,如果不会导致不安全状态,则允许分配资源;否则,拒绝分配,避免死锁。
2. 假如没有ip地址只使用Mac地址会有什么问题
- IP地址是用于在计算机网络中标识设备位置的唯一地址,帮助设备进行数据通信和路由。
- MAC地址是网络设备的物理地址,由制造商分配,用于在局域网内唯一标识设备并控制网络通信。
- IP地址用于在网络层标识设备的位置,以便在不同网络之间路由数据,而MAC地址用于在链路层唯一标识设备,确保在同一局域网内可靠地传输数据。两者结合使用,使得数据能够准确地找到并传送到目标设备,无论是在局域网内还是跨网络的通信中。
如果没有IP地址,只使用MAC地址,通信将局限于局域网内,无法实现跨网络的数据传输和路由。MAC地址是固定的物理地址,无法适应不同网络拓扑结构,导致设备无法在广域网或互联网中有效定位和通信,网络扩展性和管理性会受到严重限制。此外,数据包的路由将变得复杂和低效。
3. css中怎么让一段文字的首字加粗和字体变大
::first-letter
伪元素来使文本的首字母加粗并变大
p::first-letter {
font-weight: bold; /* 加粗 */
font-size: 2em; /* 使字体变大 */ }
4. css中的长度单位你知道多少?有什么区别?
CSS中的长度单位有很多种,主要可以分为绝对单位和相对单位。
绝对单位
- px (像素) :最常用的单位,表示屏幕上的一个点。它是绝对的,与设备分辨率无关。
相对单位
- em:相对于父元素的字体大小。如果父元素的字体大小是16px,1em等于16px。
- rem (根em) :相对于根元素(
<html>
)的字体大小。更适用于全局字体大小设置。 - % (百分比) :相对于父元素的尺寸。例如,宽度为50%意味着子元素宽度为父元素宽度的50%。
- vw (视口宽度) :相对于视口宽度的百分比。1vw等于视口宽度的1%。
- vh (视口高度) :相对于视口高度的百分比。1vh等于视口高度的1%。
区别
- 绝对单位 通常用于需要精确控制元素尺寸的场景,例如打印样式。
- 相对单位 更具灵活性,适用于响应式设计和布局调整,因为它们与父元素或视口大小相关联。
5. 手写Promise.all
function myPromiseAll(promises) {
// 返回一个新的 Promise
return new Promise((resolve, reject) => {
// 如果输入的不是数组,直接返回一个拒绝的 Promise
if (!Array.isArray(promises)) {
return reject(new TypeError('Argument must be an array'));
}
// 保存所有 Promise 结果
let results = [];
// 记录已完成的 Promise 数量
let completed = 0;
// 记录总 Promise 数量
const total = promises.length;
// 如果数组为空,直接返回一个已解析的 Promise
if (total === 0) {
return resolve(results);
}
// 遍历所有传入的 Promise
promises.forEach((promise, index) => {
// 确保每个项都是 Promise 实例
Promise.resolve(promise)
.then(value => {
// 记录每个 Promise 的结果
results[index] = value;
completed += 1;
// 如果所有 Promise 都已完成,返回结果数组
if (completed === total) {
resolve(results);
}
})
.catch(error => {
// 如果任何一个 Promise 被拒绝,返回拒绝的 Promise
reject(error);
});
});
});
}
// 使用示例
const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = new Promise((resolve) => setTimeout(resolve, 100, 3));
myPromiseAll([p1, p2, p3])
.then(results => console.log(results)) // [1, 2, 3]
.catch(error => console.error(error));
6. vue的两种路由方式怎么实现的
vue-router
支持两种主要的路由方式:哈希模式(Hash Mode)和 历史模式(History Mode)
1. 哈希模式(Hash Mode)
哈希模式 是 Vue Router 的默认路由模式,它使用 URL 的哈希部分(#
)来保存路由状态。这样,路由变化不会引起页面的刷新,也不会与服务器的路由冲突。
2. 历史模式(History Mode)
历史模式 通过 HTML5 的 History API 实现路由。它不使用哈希(#
),而是直接使用 URL 的路径部分。历史模式可以使 URL 更加干净,但需要服务器配置以支持前端路由。
服务器配置(仅针对历史模式)
使用历史模式时,你需要配置服务器,以便在刷新页面或直接访问某个路由时,服务器能够返回 index.html
文件,而不是返回 404 错误。以下是一些常见服务器的配置示例:
server {
listen 80;
server_name yourdomain.com;
root /path/to/your/dist;
location / {
try_files $uri $uri/ /index.html;
}
}
- hashMode 用的是hashChange事件,historyModel用的是pushState/replaceState/popstate
7. 项目里为什么选择JWT
相比较于cookie, JWT 有以下优势:
- 无状态认证
JWT 是无状态的,这意味着服务器不需要存储用户的会话数据。所有需要的信息都包含在 JWT 中,服务器通过验证 JWT 来确认用户身份。
这减少了服务器的开销,特别适合分布式系统和微服务架构,因为每个服务节点都可以独立验证 JWT,而无需共享会话数据。
基于服务器会话的 Cookie 认证通常需要在服务器端存储会话数据,增加服务器开销,并且在分布式架构中需要共享会话状态,管理复杂,不如无状态的 JWT 适合分布式系统。
-
跨域和跨服务通信
特点: JWT 是自包含的,可以在不同的域名或服务之间安全传递。 优势: 在微服务架构中,JWT 可以被多个服务使用,方便在不同服务间传递用户身份,避免了跨域请求的复杂性。
-
易于扩展
特点: JWT 可以包含自定义的声明(claims),这些声明可以携带用户角色、权限或其他重要信息。
优势: 这种灵活性使得 JWT 很容易适应不同的应用需求,比如在访问控制中可以直接依据 JWT 中的角色信息做决策。
-
安全性 JWT 可以使用对称或非对称加密算法进行签名,确保其内容不可篡改。JWT 的签名部分可以验证它的真实性和完整性。
优势: 一旦签发,JWT 的内容无法被篡改,除非持有签名密钥或私钥。这提升了系统的安全性,特别是在不依赖会话的情况下。
Cookie 的安全性较低,因为它容易受到会话劫持、XSS 和 CSRF 攻击,而 JWT 通过签名保护数据完整性,相对更安全。
8. get和post有什么区别
GET 请求用于从服务器获取数据,参数包含在 URL 中,适合读取操作,安全性较低;POST 请求用于向服务器发送数据,参数包含在请求体中,适合修改操作,更安全且适合传输大数据量。
特性 | GET | POST |
---|---|---|
用途 | 从服务器获取数据 | 向服务器发送数据 |
参数位置 | URL 中的查询字符串 | 请求体 (Request Body) 中 |
数据长度 | 受 URL 长度限制 (通常 2048 字符以内) | 没有明确长度限制,适合传输大数据 |
安全性 | 安全性较低,参数在 URL 中易被截取和篡改 | 相对安全,参数在请求体中不直接暴露 |
幂等性 | 幂等 (多次请求不会改变资源状态) | 非幂等 (每次请求可能改变资源状态) |
缓存 | 通常会被浏览器缓存 | 默认不缓存 |
对服务器的影响 | 对服务器的副作用较小,通常用于查询操作 | 对服务器可能有副作用,通常用于更新操作 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data |
9. git commit 之后把代码删除能找回吗?git add之后呢?
git commit
之后:可以通过历史提交恢复已删除的代码。
//查看提交历史
git log
// **查找你想恢复的提交**,然后使用 `git checkout` 来恢复文件:
git checkout <commit_hash> -- <path_to_file>
// **将文件恢复到当前分支**:
git checkout -b temp-branch <commit_hash>
git add
之后:可以通过git restore
恢复暂存区或工作目录中的文件。
// **查看暂存区的状态**:
git status
// **恢复暂存区的文件**:
git restore --staged <path_to_file>
//恢复工作目录中的文件
git restore <path_to_file>
10. 力扣796旋转字符串
可以通过将 A
连接到自己(即 A + A
)来创建一个新的字符串,然后检查 B
是否是这个新字符串的子字符串。如果是,那么 B
可以通过旋转得到。
function rotateString(A, B) {
// 长度不同,直接返回 false
if (A.length !== B.length) return false;
// 连接 A 到自己,检查 B 是否是其中的子字符串
const doubledA = A + A;
return doubledA.includes(B);
}
// 示例
console.log(rotateString("abcde", "cdeab")); // 输出: true
console.log(rotateString("abcde", "abced")); // 输出: false
总结
要不是408一上来就突突, 业务就和胡总一起拥抱在7平米的字节外景房了....
加油, 挥舞棒子......
转载自:https://juejin.cn/post/7409965146695024678