2025年01月03日美蜥(杭州普瑞兼职)二面

目录

  1. 为何 nginx 可以实现跨域请求,原理是什么
  2. 为何 nodejs 可以实现跨域请求,原理是什么
  3. 浏览器的请求头有哪些
  4. 浏览器的响应头有哪些
  5. 浏览器输入网址后发生什么
  6. http 协议和 https 有什么区别
  7. 你的核心优势是什么
  8. 浏览器缓存机制
  9. https 的加密机制
  10. tcp 的三次握手和四次挥手
  11. get 和 post 有什么区别
  12. 讲一下 xss 攻击
  13. 讲一下浏览器同源策略问题
  14. 讲一下进程线程的区别

1. 为何 nginx 可以实现跨域请求,原理是什么

以下是关于 Nginx 可以实现跨域请求的原理和解释:

1. 跨域请求的基本概念
  • 跨域请求是指浏览器在执行 JavaScript 时,由于同源策略(Same-Origin Policy)的限制,当请求的源(协议、域名、端口)不同时,浏览器会阻止请求。例如,从 http://localhost:8080http://api.example.com 发送请求,如果没有特殊处理,会被视为跨域请求。
2. Nginx 实现跨域请求的原理
  • 添加响应头
    • Nginx 可以通过添加相应的 HTTP 响应头来允许跨域请求。
    • 常用的跨域响应头包括:
      • Access-Control-Allow-Origin:指定允许的源,可以是具体的域名,也可以是 *(表示允许任何源)。
      • Access-Control-Allow-Methods:允许的 HTTP 方法,如 GET, POST, PUT, DELETE 等。
      • Access-Control-Allow-Headers:允许的请求头。
      • Access-Control-Allow-Credentials:是否允许携带凭证,如 cookie 等。
3. 示例配置

以下是一个简单的 Nginx 配置示例,展示如何添加跨域响应头:

server {listen 80;server_name api.example.com;location /api/ {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';add_header Access-Control-Allow-Headers 'Content-Type, Authorization';if ($request_method = 'OPTIONS') {return 204;}...proxy_pass http://backend;}
}
  • 在这个配置中:
    • add_header 指令添加了跨域所需的响应头。
    • 对于 OPTIONS 请求(预检请求),使用 if ($request_method = 'OPTIONS') 进行处理,通常返回 204 状态码,因为预检请求只是浏览器在发送实际请求前的检查,不需要返回实际数据。
4. 代理服务器的角色
  • 代理机制
    • Nginx 可以作为代理服务器,将客户端的请求转发到实际的后端服务器,然后将后端服务器的响应转发给客户端。
    • 当作为代理服务器时,客户端请求的是 Nginx 服务器,而不是直接请求后端服务器,Nginx 服务器和客户端是同源的,因此不存在跨域问题。
    • 例如:
server {listen 80;server_name frontend.example.com;location /api/ {proxy_pass http://backend.example.com;}
}
  • 这里,前端应用在 frontend.example.com/api/ 发送请求时,请求会先到 Nginx 服务器,Nginx 会将请求转发到 backend.example.com,对于前端应用来说,它只与 frontend.example.com 的 Nginx 服务器通信,避免了跨域问题。
5. 解释与应用场景
  • 解释

    • 当浏览器发起跨域请求时,Nginx 可以通过添加跨域响应头告诉浏览器允许跨域,或者作为代理服务器绕过同源策略的限制。
    • 对于简单请求(如 GETPOST 请求,且请求头只包含简单的头信息),添加 Access-Control-Allow-Origin 等响应头通常可以解决跨域问题。
    • 对于复杂请求(如 PUTDELETE 或包含自定义请求头),浏览器会先发送 OPTIONS 预检请求,Nginx 可以处理这些预检请求并添加相应的响应头,确保后续请求可以正常进行。
  • 应用场景

    • 在前后端分离的架构中,前端和后端部署在不同的域名下,Nginx 可以作为中间的代理服务器,实现跨域请求的处理。
    • 在微服务架构中,不同服务可能部署在不同的域名或端口,Nginx 可以用来协调不同服务之间的请求,解决跨域问题。
面试回答示例

“Nginx 可以实现跨域请求主要有两种方式。首先,它可以通过添加相应的 HTTP 响应头来允许跨域请求,如添加 Access-Control-Allow-OriginAccess-Control-Allow-Methods 等响应头,通过这些响应头告诉浏览器允许哪些源、哪些方法和哪些请求头的跨域请求。对于预检请求(如 OPTIONS 请求),可以根据需要进行处理,通常返回 204 状态码。其次,Nginx 可以作为代理服务器,将客户端的请求转发到后端服务器,这样客户端与 Nginx 服务器同源,避免了跨域问题。在实际应用中,这在前后端分离架构和微服务架构中非常有用,它可以解决前端和后端不同源时的跨域问题,确保请求可以正常进行。”

通过这样的回答,可以向面试官展示你对 Nginx 实现跨域请求的原理的理解,包括添加响应头和作为代理服务器的机制,以及在不同架构中的应用场景,体现你对 Nginx 服务器和跨域问题的深入认识。

2. 为何 nodejs 可以实现跨域请求,原理是什么

以下是 Node.js 可以进行跨域处理的原理和原因:

1. 跨域的基本概念
  • 跨域是由于浏览器的同源策略(Same-Origin Policy)引起的,它限制了来自不同源(协议、域名、端口)的脚本访问当前源的资源。例如,从 http://localhost:3000http://api.example.com 发送请求,会被浏览器视为跨域请求。
2. Node.js 中的跨域处理方式
  • 设置响应头
    • Node.js 可以在服务器端设置响应头,允许跨域请求。
    • 常见的是使用 Express 框架进行处理,以下是一个简单的 Express 示例:
const express = require('express');
const app = express();app.use((req, res, next) => {res.setHeader('Access-Control-Allow-Origin', '*');res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');if (req.method === 'OPTIONS') {res.sendStatus(204);} else {next();}
});app.get('/api', (req, res) => {res.send('Hello from API');
});app.listen(3000, () => {console.log('Server is running on port 3000');
});
  • 在这个示例中:
    • res.setHeader('Access-Control-Allow-Origin', '*'):允许来自任何源的请求。
    • res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'):允许的请求方法。
    • res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'):允许的请求头。
    • 对于 OPTIONS 请求(预检请求),使用 res.sendStatus(204) 进行处理,返回 204 状态码,因为预检请求只是浏览器的检查,不需要返回实际数据。
3. 中间件的使用
  • Node.js 中的中间件可以方便地处理跨域请求。
  • 可以将跨域处理封装成一个中间件,然后在多个路由中使用,提高代码的复用性和可维护性。
  • 例如:
const express = require('express');
const app = express();const corsMiddleware = (req, res, next) => {res.setHeader('Access-Control-Allow-Origin', '*');res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');if (req.method === 'OPTIONS') {res.sendStatus(204);} else {next();}
};app.use(corsMiddleware);app.get('/api', (req, res) => {res.send('Hello from API');
});app.listen(3000, () => {console.log('Server is running on port 3000');
});
4. CORS 中间件的使用
  • 为了更方便地处理跨域,可以使用 cors 中间件。
  • 首先安装 cors 中间件:
npm install cors
  • 然后使用:
const express = require('express');
const cors = require('cors');
const app = express();app.use(cors());app.get('/api', (req, res) => {res.send('Hello from API');
});app.listen(3000, () => {console.log('Server is running on port 3000');
});
  • cors 中间件会自动处理跨域请求,添加必要的响应头,根据请求的源和方法自动设置 Access-Control-Allow-Origin 等响应头。
5. 原理解释
  • 服务器端控制

    • 跨域限制是由浏览器实施的,而 Node.js 作为服务器端,在服务器端设置响应头时,浏览器会读取这些响应头并根据它们来决定是否允许跨域请求。
    • 当 Node.js 服务器设置了 Access-Control-Allow-Origin 等响应头,浏览器会根据这些信息判断是否允许请求访问资源。
  • 预检请求的处理

    • 对于复杂请求(如 PUTDELETE 或包含自定义请求头),浏览器会先发送 OPTIONS 预检请求,Node.js 服务器可以通过设置相应的响应头和状态码来处理这些预检请求,确保后续请求可以正常进行。
面试回答示例

“Node.js 可以进行跨域处理,主要是因为它可以在服务器端设置相应的 HTTP 响应头来允许跨域请求。使用 Node.js 中的 Express 框架时,我们可以手动设置响应头,如 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers 等,来允许不同源的请求访问资源。对于预检请求(OPTIONS 请求),可以根据需要设置 204 状态码进行处理。另外,Node.js 可以使用中间件来处理跨域,将跨域处理逻辑封装在中间件中,方便在多个路由中复用。还可以使用 cors 中间件,它会自动处理跨域请求,根据请求的源和方法添加必要的响应头。其原理是,跨域限制是浏览器实施的,Node.js 作为服务器端可以通过设置响应头来告诉浏览器是否允许跨域,对于浏览器发送的预检请求,Node.js 可以正确处理,确保后续请求正常进行。”

通过这样的回答,可以向面试官展示你对 Node.js 处理跨域的深入理解,包括具体的实现方式、中间件的使用和原理,体现你对 Node.js 开发和跨域问题的掌握。

3. 浏览器的请求头有哪些

浏览器的请求头(HTTP Request Headers)是浏览器在向服务器发送请求时附带的一组键值对,用于传递请求的元信息(如浏览器类型、支持的编码、Cookie等)。以下是常见的请求头及其作用:


1. 通用请求头(General Headers)

适用于所有类型的请求(GET、POST等):

  • Host:请求的目标域名和端口(如 Host: example.com)。
  • Connection:控制连接是否保持活动(如 Connection: keep-alive)。
  • Cache-Control:指定缓存机制(如 Cache-Control: no-cache)。
  • User-Agent:标识浏览器和操作系统(如 User-Agent: Mozilla/5.0 (Windows NT 10.0))。
  • Accept:声明客户端可处理的响应内容类型(如 Accept: text/html, */*)。
  • Accept-Encoding:支持的压缩算法(如 Accept-Encoding: gzip, deflate)。
  • Accept-Language:优先的语言(如 Accept-Language: en-US, en;q=0.9)。

2. 请求专用头(Request-Specific Headers)
  • Authorization:身份验证凭证(如 Authorization: Bearer xxxxx)。
  • Cookie:发送服务器设置的Cookie(如 Cookie: name=value; name2=value2)。
  • Referer:当前页面的来源URL(可能被隐私设置屏蔽)。
  • Origin:请求的源(用于跨域请求,如 Origin: https://example.com)。
  • Content-Type:请求体的数据类型(如 Content-Type: application/json)。
  • Content-Length:请求体的字节数(如 Content-Length: 348)。

3. 条件请求头(Conditional Headers)

用于基于特定条件发送请求:

  • If-Modified-Since:资源修改时间比对(缓存控制)。
  • If-None-Match:ETag比对(缓存验证)。
  • If-Match / If-Unmodified-Since:用于并发控制。

4. 安全相关头(Security Headers)
  • Upgrade-Insecure-Requests:自动升级HTTP到HTTPS(如 Upgrade-Insecure-Requests: 1)。
  • Sec-Fetch-*:安全策略相关(如 Sec-Fetch-Site: same-origin)。

5. CORS相关头(跨域请求)
  • Access-Control-Request-Method:预检请求中声明实际请求方法(如 OPTIONS 请求)。
  • Access-Control-Request-Headers:预检请求中声明自定义头。

示例:典型GET请求头
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: session_id=123456

注意事项
  • 请求头可通过浏览器开发者工具(F12 → Network)查看。
  • 部分头由浏览器自动添加(如 User-Agent),部分可手动设置(如通过JavaScript的 fetch()XMLHttpRequest)。
  • 安全限制下,某些头不可修改(如 OriginHost)。

如果需要完整列表,可参考 MDN HTTP Headers 或实际抓包分析。

4. 浏览器的响应头有哪些

浏览器的响应头(HTTP Response Headers)是服务器返回给浏览器的一组键值对,用于传递响应的元信息(如内容类型、缓存策略、安全策略等)。以下是常见的响应头及其作用:


1. 通用响应头(General Headers)

适用于所有类型的响应:

  • Date:响应生成的日期和时间(如 Date: Tue, 15 Nov 2022 08:12:31 GMT)。
  • Connection:控制连接是否保持活动(如 Connection: keep-alive)。
  • Cache-Control:指定缓存机制(如 Cache-Control: no-storemax-age=3600)。
  • Transfer-Encoding:传输编码方式(如分块传输 Transfer-Encoding: chunked)。

2. 响应专用头(Response-Specific Headers)
  • Content-Type:响应体的数据类型(如 Content-Type: text/html; charset=utf-8)。
  • Content-Length:响应体的字节数(如 Content-Length: 1024)。
  • Content-Encoding:响应体的压缩算法(如 Content-Encoding: gzip)。
  • Content-Language:内容使用的语言(如 Content-Language: en-US)。
  • Last-Modified:资源最后修改时间(用于缓存验证,如 Last-Modified: Mon, 14 Nov 2022 12:00:00 GMT)。
  • ETag:资源的唯一标识符(用于缓存验证,如 ETag: "33a64df5")。

3. 缓存控制头(Caching Headers)
  • Expires:响应过期的绝对时间(如 Expires: Thu, 01 Dec 2022 16:00:00 GMT)。
  • Age:资源在缓存中已存储的时间(秒)(如 Age: 600)。
  • Vary:指定缓存依据的请求头(如 Vary: Accept-Encoding)。

4. 安全相关头(Security Headers)
  • Strict-Transport-Security (HSTS):强制HTTPS(如 Strict-Transport-Security: max-age=63072000)。
  • X-Content-Type-Options:禁止MIME类型嗅探(如 X-Content-Type-Options: nosniff)。
  • X-Frame-Options:防止点击劫持(如 X-Frame-Options: DENY)。
  • Content-Security-Policy (CSP):限制资源加载来源(如 Content-Security-Policy: default-src 'self')。
  • X-XSS-Protection:启用XSS过滤器(已逐步被CSP取代)。

5. CORS相关头(跨域资源共享)
  • Access-Control-Allow-Origin:允许的源(如 Access-Control-Allow-Origin: *https://example.com)。
  • Access-Control-Allow-Methods:允许的HTTP方法(如 Access-Control-Allow-Methods: GET, POST)。
  • Access-Control-Allow-Headers:允许的请求头(如 Access-Control-Allow-Headers: Content-Type)。
  • Access-Control-Allow-Credentials:是否允许发送Cookie(如 Access-Control-Allow-Credentials: true)。

6. 重定向相关头(Redirection Headers)
  • Location:重定向目标URL(如 Location: https://example.com/new-page)。
  • Refresh:自动刷新或重定向(如 Refresh: 5; url=https://example.com)。

7. Cookie相关头
  • Set-Cookie:服务器设置Cookie(如 Set-Cookie: sessionId=abc123; Path=/; Secure)。

示例:典型200响应头
HTTP/1.1 200 OK
Date: Tue, 15 Nov 2022 08:12:31 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1024
Content-Encoding: gzip
Cache-Control: public, max-age=3600
Last-Modified: Mon, 14 Nov 2022 12:00:00 GMT
ETag: "33a64df5"
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff

注意事项
  • 响应头可通过浏览器开发者工具(F12 → Network → 点击请求 → Headers)查看。
  • 安全头(如CSP、HSTS)对Web安全至关重要,建议在生产环境中配置。
  • 部分头由服务器框架自动添加(如 Server: nginx),部分需手动配置。

完整列表可参考 MDN HTTP Headers 或实际抓包分析。

5. 浏览器输入网址后发生什么

以下是从输入 URL 到页面呈现的详细过程:

1. 用户输入 URL
  • 用户在浏览器的地址栏中输入一个 URL(Uniform Resource Locator),例如 https://www.example.com
2. URL 解析
  • 浏览器会对输入的 URL 进行解析,将其拆分成几个部分:
    • 协议:如 https,确定使用的通信协议。
    • 域名:如 www.example.com,用于定位服务器。
    • 端口:如果没有指定,对于 https 协议默认是 443,对于 http 协议默认是 80。
    • 路径:如 /index.html,表示请求的资源路径。
    • 查询参数:如 ?param1=value1&param2=value2,提供额外的信息。
    • 片段标识符:如 #section1,用于定位页面内的特定部分。
3. DNS 查询
  • 浏览器会首先检查本地 DNS 缓存,看是否已经解析过该域名。
  • 如果没有,浏览器会向操作系统的 DNS 解析器发送请求,操作系统会先查看本地的 hosts 文件。
  • 如果还没有,请求会发送到 DNS 服务器,DNS 服务器会根据域名的层次结构进行解析,从根域名服务器到顶级域名服务器,再到权威域名服务器,最终找到对应的 IP 地址。
4. 建立 TCP 连接
  • 浏览器使用获取到的 IP 地址,与服务器建立 TCP 连接。
  • 对于 HTTPS,还需要进行 TLS 握手,包括:
    • 客户端向服务器发送 ClientHello 消息,包含支持的加密算法、随机数等。
    • 服务器向客户端发送 ServerHello 消息,选择的加密算法、证书等。
    • 客户端验证证书,生成一个随机的预主密钥,使用服务器的公钥加密并发送给服务器。
    • 服务器使用私钥解密得到预主密钥,双方根据预主密钥和之前交换的随机数生成会话密钥。
5. 发送 HTTP 请求
  • 一旦 TCP 连接建立(包括 TLS 握手完成),浏览器会向服务器发送 HTTP 请求。
  • 请求包括请求行(请求方法、请求路径、HTTP 协议版本)、请求头(包含各种信息,如 User-AgentAccept 等)和请求体(如果有)。
6. 服务器处理请求
  • 服务器收到请求后,会根据请求的信息进行处理:
    • 可能会调用后端程序(如 PHP、Node.js、Java 等),处理动态内容。
    • 或者直接从文件系统中读取静态文件(如 HTML、CSS、JavaScript、图片等)。
7. 服务器响应请求
  • 服务器会发送 HTTP 响应,包括:
    • 响应行(HTTP 协议版本、状态码、状态消息)。
    • 响应头(包含内容类型、内容长度、缓存信息等)。
    • 响应体(实际的数据内容)。
8. 浏览器接收和解析响应
  • 浏览器收到响应后,会检查状态码:
    • 对于 200 OK 等成功状态码,会继续处理响应。
    • 对于 404 Not Found 等错误状态码,会显示相应的错误页面。
  • 浏览器会根据响应头中的 Content-Type 解析响应体:
    • 对于 HTML,会开始解析 HTML 结构,构建 DOM 树。
    • 对于 CSS,会解析 CSS 规则,构建 CSSOM 树。
    • 对于 JavaScript,会执行 JavaScript 代码,可能会修改 DOM 或 CSSOM。
9. 渲染页面
  • 浏览器会将 DOM 树和 CSSOM 树结合起来,构建渲染树(Render Tree)。
  • 计算渲染树中每个节点的布局(Layout),确定元素的位置和大小。
  • 最后将渲染树绘制(Paint)到屏幕上,显示页面。
10. 后续操作
  • 浏览器会继续加载其他资源,如图片、CSS 文件、JavaScript 文件等,根据需要进行缓存操作。
  • 还会处理页面中的脚本,如监听用户事件、执行异步请求等。

在面试中可以这样回答:“当用户输入 URL 时,浏览器会对其进行解析,然后进行 DNS 查询找到服务器的 IP 地址。对于 HTTPS 请求,会进行 TLS 握手确保通信安全。接着建立 TCP 连接,发送 HTTP 请求。服务器收到请求后进行处理,然后发送 HTTP 响应。浏览器收到响应后,根据状态码和响应头处理响应内容,对于 HTML 会构建 DOM 树,对于 CSS 会构建 CSSOM 树,然后结合两者构建渲染树,进行布局和绘制操作,最终将页面呈现出来。后续还会继续加载其他资源并进行缓存操作,处理页面中的脚本等。这个过程涉及多个步骤,包括网络、安全、解析和渲染等多个方面,确保页面的正确呈现和用户的良好体验。”

这样的回答可以让面试官看到你对整个从输入 URL 到页面呈现的完整流程的理解,同时也可以根据需要进一步细化每个步骤的解释,比如详细说明 TCP 连接的三次握手、TLS 握手的详细过程等,展现你对网络和前端开发的深入知识。

6. http 协议和 https 有什么区别

HTTP(HyperText Transfer Protocol)和HTTPS(HTTP Secure)是用于在客户端和服务器之间传输数据的协议,但它们在安全性、工作原理和性能等方面有显著区别。以下是主要区别:


1. 安全性
  • HTTP

    • 不加密,数据以明文形式传输,容易被窃听、篡改或中间人攻击。
    • 不适合传输敏感信息(如密码、银行卡号等)。
  • HTTPS

    • 加密传输,通过 SSL/TLS 协议对数据进行加密,确保数据的机密性完整性
    • 防止数据被窃取或篡改,适合敏感信息传输。

2. 协议与端口
  • HTTP

    • 基于 TCP/IP,默认使用 80 端口
  • HTTPS

    • 在 HTTP 基础上加入 SSL/TLS 加密层,默认使用 443 端口

3. 证书与身份验证
  • HTTPS 需要数字证书
    • 由受信任的 CA(证书颁发机构) 签发,用于验证服务器身份,防止钓鱼网站。
    • 证书包含公钥、域名、有效期等信息。
  • HTTP 无证书,无法验证服务器真实性。

4. 性能与速度
  • HTTP

    • 无加密开销,速度稍快(但差异在现代硬件中已不明显)。
  • HTTPS

    • 加密/解密过程会增加少量计算开销(TLS 握手阶段)。
    • 现代优化技术(如 TLS 1.3、HTTP/2、会话复用)已大幅降低性能影响。

5. SEO 与浏览器支持
  • HTTPS 是搜索引擎的排名因素
    • Google 等搜索引擎优先收录 HTTPS 网站。
  • 浏览器标记不安全
    • 现代浏览器(Chrome、Firefox)会将 HTTP 网站标记为“不安全”。
    • HTTPS 网站显示锁图标,增强用户信任。

6. 应用场景
  • HTTP
    • 仅适用于不涉及敏感信息的场景(如静态博客、新闻网站)。
  • HTTPS
    • 必需:电商、银行、登录页面、API 接口等。
    • 现代浏览器已强制要求 HTTPS 支持新特性(如地理位置、Service Worker)。

7. 工作原理对比
步骤HTTPHTTPS
建立连接TCP 三次握手TCP 握手 + TLS 握手(交换密钥)
数据传输明文加密(对称加密,如 AES)
验证服务器通过证书验证身份

为什么 HTTPS 是趋势?
  1. 隐私保护:防止流量劫持、钓鱼攻击。
  2. 合规要求:如 GDPR、PCI-DSS 要求数据加密。
  3. 技术发展:免费证书(Let’s Encrypt)、自动化工具降低了部署成本。

总结
特性HTTPHTTPS
加密SSL/TLS 加密
端口80443
安全性高(防窃听、篡改)
证书不需要需要 CA 签发证书
速度略快稍慢(可优化)
适用场景非敏感数据敏感数据、现代网站

建议:当前所有网站都应迁移到 HTTPS,尤其是涉及用户数据的服务。

7. 你的核心优势是什么

我有 8 年大型前端架构经验,主导过多个百万级项目,我的核心优势是:高并发场景下的前端系统设计和通过技术驱动业务增长,具体体现在三个层面:

  1. 技术架构层面:

在美条电商大促项目中(峰值QPS 10w+),设计并落地了 边缘计算方案(Cloudflare Workers + SSR),将动态内容渲染耗时从800ms降至200ms,支撑了秒杀场景下零白屏的体验,GMV同比提升18%;

搭建前端监控体系(ELK + Sentry),实现从埋点、告警到根因分析的闭环,线上故障率下降60%。

  1. 工程体系层面:

从 0 到 1 构建团队前端微前端基座(基于qiankun2.0),整合6条业务线独立交付能力,容器化部署效率提升70%;

主导开发低代码平台(ProCode + LowCode混合模式),覆盖中后台80%表单/列表场景,人力成本降低50%。

  1. 业务协同层面:

作为前端 TL 与产品/后端共建灰度发布系统,实现AB测试流量分层和指标监控,功能迭代ROI评估效率提升3倍;

在外汇国际化项目中,设计多语言编译时方案(基于AST转换),减少运行时开销,首屏性能达标率100%。

我关注到贵司正在推进XX技术方向(如智能化/体验优化),我的架构经验和业务视角可以快速适配,也希望能在团队技术规划上深度参与。

8. 浏览器缓存机制

浏览器缓存机制是提升网页加载速度、减少服务器负载的关键技术,通过将静态资源(如 HTML、CSS、JS、图片等)存储在本地,避免重复请求。以下是浏览器缓存的详细机制和工作流程:

一、缓存类型

浏览器缓存分为两类:

  1. 强缓存
    • 直接使用本地缓存,不发送请求到服务器。
    • 通过 Cache-ControlExpires 响应头控制。
  2. 协商缓存
    • 向服务器验证缓存是否过期,若未过期则返回 304 Not Modified,继续使用缓存;否则返回新资源。
    • 通过 Last-Modified/If-Modified-SinceETag/If-None-Match 实现。
二、缓存控制字段
1. 强缓存相关字段
  • Cache-Control(HTTP/1.1 优先级高于 Expires
    常见指令:

    • max-age=3600:资源缓存有效期(秒)。
    • no-cache:禁用强缓存,需走协商缓存。
    • no-store:完全禁止缓存(敏感数据适用)。
    • public:允许代理服务器缓存。
    • private:仅允许浏览器缓存。
  • Expires(HTTP/1.0)

    • 指定缓存过期时间(如 Expires: Wed, 21 Oct 2025 07:28:00 GMT),依赖客户端时间,可能因时钟不同步失效。
2. 协商缓存相关字段
  • Last-Modified / If-Modified-Since

    • 服务器返回 Last-Modified(资源最后修改时间)。
    • 浏览器下次请求时带上 If-Modified-Since,服务器对比时间决定返回 304200
    • 缺点:精度仅到秒,频繁修改可能无法识别。
  • ETag / If-None-Match(优先级高于 Last-Modified

    • 服务器返回 ETag(资源的唯一标识符,如哈希值)。
    • 浏览器下次请求时带上 If-None-Match,服务器对比 ETag 决定返回 304200
    • 解决 Last-Modified 的精度问题。

三、缓存工作流程
  1. 首次请求

    • 无缓存,直接向服务器请求资源。
    • 服务器返回资源及缓存头(如 Cache-Control: max-age=3600)。
  2. 再次请求

    • 强缓存生效:检查 Cache-Control/Expires,若未过期则直接读取本地缓存(状态码 200 (from disk cache))。
    • 强缓存失效
      • 向服务器发送请求,携带 If-Modified-SinceIf-None-Match
      • 服务器验证后返回 304(使用缓存)或 200(返回新资源)。

四、用户行为对缓存的影响
用户操作强缓存协商缓存
正常刷新(F5)失效生效
强制刷新(Ctrl+F5)失效失效
地址栏回车/前进后退生效生效

五、实际应用建议
  1. 静态资源(CSS/JS/图片)

    • 设置长期强缓存:Cache-Control: max-age=31536000(1年)。
    • 通过文件名哈希(如 app.a1b2c3.js)实现内容更新后缓存失效。
  2. HTML 文件

    • 禁用强缓存:Cache-Control: no-cache,确保用户获取最新版本。
  3. API 接口

    • 根据场景选择 no-cache 或短时间 max-age,避免数据过期。

六、示例配置(Nginx)
# 静态资源(强缓存)
location ~* \.(js|css|png|jpg)$ {expires 1y;add_header Cache-Control "public, max-age=31536000";
}# HTML 文件(协商缓存)
location / {add_header Cache-Control "no-cache";
}

七、调试工具
  • Chrome DevTools
    • Network 面板:查看请求的缓存状态(from disk cache304)。
    • Application → Cache Storage:检查缓存的资源。

总结

浏览器缓存通过减少网络请求显著提升性能,合理配置需要结合资源类型和更新频率。强缓存优先用于静态资源,协商缓存确保动态内容的及时更新。

9. https 的加密机制

HTTPS 的加密机制通过 SSL/TLS 协议 实现,结合 对称加密非对称加密数字证书散列算法,确保数据在传输过程中的 机密性完整性身份认证。以下是详细的分步解析:

一、HTTPS 加密的核心组件
  1. 对称加密(如 AES)

    • 作用:加密实际传输的数据。
    • 特点:加密/解密速度快,但需共享密钥。
  2. 非对称加密(如 RSA、ECC)

    • 作用:在握手阶段交换对称加密的密钥。
    • 特点:公钥加密、私钥解密,安全性高但性能差。
  3. 数字证书(CA 签发)

    • 作用:验证服务器身份,防止中间人攻击。
    • 内容:包含公钥、域名、签发机构等信息。
  4. 散列算法(如 SHA-256)

    • 作用:生成消息摘要,确保数据完整性(防篡改)。

二、HTTPS 加密流程(TLS 握手)

TLS 1.2 为例(简化版):

步骤 1:Client Hello
  • 客户端向服务器发送:
    • 支持的 TLS 版本、加密套件(如 TLS_AES_256_GCM_SHA384)。
    • 随机数(Client Random),用于后续生成密钥。
步骤 2:Server Hello
  • 服务器返回:
    • 选定的 TLS 版本和加密套件。
    • 随机数(Server Random)。
    • 数字证书(包含公钥和 CA 签名)。
步骤 3:证书验证
  • 客户端验证证书:
    1. 检查证书是否过期、域名是否匹配。
    2. 通过 CA 的公钥(内置在操作系统/浏览器中)验证签名是否合法。
    • 若验证失败:浏览器提示“不安全连接”。
步骤 4:密钥交换
  • 客户端生成 预主密钥(Pre-Master Secret),用服务器的公钥加密后发送。
  • 服务器用私钥解密获取预主密钥。
步骤 5:生成会话密钥
  • 客户端和服务器通过 Client RandomServer RandomPre-Master Secret,使用相同算法生成 主密钥(Master Secret),再派生出 会话密钥(Session Key)(对称加密密钥)。
步骤 6:加密通信
  • 双方使用会话密钥进行对称加密通信(如 AES-256),后续数据传输均加密。
三、关键安全机制
  1. 混合加密

    • 非对称加密 用于安全交换对称密钥(解决密钥分发问题)。
    • 对称加密 用于高效加密数据(解决性能问题)。
  2. 数字证书防伪

    • CA 机构对证书签名,客户端通过预置的 CA 公钥验证,确保服务器身份真实。
  3. 完整性校验

    • 使用 HMAC 或 AEAD 模式(如 AES-GCM)防止数据被篡改。
  4. 前向保密(Forward Secrecy)

    • 通过 ECDHE 密钥交换协议,即使服务器私钥泄露,历史会话也无法解密。

四、TLS 1.3 的优化
  • 简化握手:减少为 1-RTT(甚至 0-RTT),提升速度。
  • 废弃不安全算法:移除 RSA 密钥交换、SHA-1 等。
  • 强制前向保密:仅支持 ECDHE 密钥交换。

五、示例对比(HTTP vs HTTPS)
阶段HTTPHTTPS(TLS 加密)
数据传输明文加密(AES-256)
身份验证数字证书验证
密钥交换非对称加密(RSA/ECDHE)
防篡改散列算法(SHA-256)

六、常见问题
  1. 为什么不用纯非对称加密?

    • 性能差(RSA 加密比 AES 慢 1000 倍以上)。
  2. 如何防止中间人攻击?

    • 依赖 CA 签发的证书,浏览器内置可信 CA 列表。
  3. HTTPS 一定安全吗?

    • 不一定,若服务器配置错误(如使用弱加密套件)或客户端忽略证书警告,仍可能被攻击。

七、配置建议
  • 使用 TLS 1.2/1.3,禁用旧版本(如 SSLv3)。
  • 选择强加密套件(如 AES256-GCM-SHA384)。
  • 定期更新证书(推荐免费证书:Let’s Encrypt)。
总结

HTTPS 的加密机制通过 混合加密证书体系,在安全与性能之间取得平衡。理解其原理有助于优化配置和排查安全问题。现代网站应强制启用 HTTPS,并遵循最佳实践(如 HSTS、OCSP Stapling)。

10. tcp 的三次握手和四次挥手

TCP(传输控制协议)是一种面向连接的可靠传输协议,三次握手用于建立连接,四次挥手用于终止连接。以下是详细解析:

一、TCP 三次握手(建立连接)

目的:确保双方(客户端和服务端)的发送和接收能力正常,并同步初始序列号(ISN)。
流程

  1. 第一次握手(SYN=1, seq=x)

    • 客户端发送 SYN 包(同步序列号)到服务端,并随机生成初始序列号 xISN)。
    • 客户端进入 SYN_SENT 状态。
  2. 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)

    • 服务端收到 SYN 后,回复 SYN+ACK 包:
      • 确认客户端的序列号(ack=x+1)。
      • 发送自己的初始序列号 yISN)。
    • 服务端进入 SYN_RCVD 状态。
  3. 第三次握手(ACK=1, seq=x+1, ack=y+1)

    • 客户端收到 SYN+ACK 后,回复 ACK 包(ack=y+1)。
    • 服务端收到 ACK 后,双方进入 ESTABLISHED 状态,连接建立完成。

为什么需要三次?

  • 防止历史重复连接的初始化(如旧的 SYN 包延迟到达)。
  • 确保双方发送和接收能力均正常(两次无法确认客户端的接收能力)。

二、TCP 四次挥手(终止连接)

目的:双方安全关闭连接,确保数据完整传输。
流程(假设客户端主动关闭):

  1. 第一次挥手(FIN=1, seq=u)

    • 客户端发送 FIN 包,进入 FIN_WAIT_1 状态,表示不再发送数据。
  2. 第二次挥手(ACK=1, ack=u+1)

    • 服务端收到 FIN 后,回复 ACK 包(ack=u+1),进入 CLOSE_WAIT 状态。
    • 客户端收到 ACK 后进入 FIN_WAIT_2 状态。
    • 此时服务端仍可发送未传完的数据
  3. 第三次挥手(FIN=1, ACK=1, seq=v, ack=u+1)

    • 服务端完成数据发送后,发送 FIN+ACK 包,进入 LAST_ACK 状态。
  4. 第四次挥手(ACK=1, seq=u+1, ack=v+1)

    • 客户端收到 FIN 后,回复 ACK 包,进入 TIME_WAIT 状态(等待 2MSL)。
    • 服务端收到 ACK 后关闭连接,客户端在 2MSL 后也关闭连接。

为什么需要四次?

  • TCP 是全双工的,必须分别关闭两个方向的连接:
    • 客户端关闭发送(第一次挥手)。
    • 服务端关闭接收(第二次挥手)。
    • 服务端关闭发送(第三次挥手)。
    • 客户端关闭接收(第四次挥手)。
三、关键问题解析
1. TIME_WAIT 状态的作用
  • 等待 2MSL(最大报文段生存时间)
    • 确保最后一个 ACK 能到达服务端(若丢失,服务端会重发 FIN)。
    • 让网络中残留的旧报文失效,避免影响新连接。
2. SYN 洪水攻击
  • 攻击者伪造大量 SYN 包但不回复 ACK,耗尽服务端资源。
  • 防御:启用 SYN Cookie 或限制并发连接数。
3. 为什么握手三次、挥手四次?
  • 握手时,服务端的 SYN+ACK 可以合并为一步。
  • 挥手时,服务端的 ACKFIN 通常不能合并(因为中间可能有数据待发送)。
四、示意图
三次握手
客户端                         服务端|-------- SYN (x) ------->|  |<----- SYN+ACK (y, x+1)--|  |------- ACK (y+1) ------>|  
四次挥手
客户端                         服务端|-------- FIN (u) ------->|  |<------- ACK (u+1) ------|  |<------- FIN (v) --------|  |------- ACK (v+1) ------>|  
五、实际应用注意
  1. 优化 TIME_WAIT
    • 高并发服务器可调整内核参数(如 net.ipv4.tcp_tw_reuse)。
  2. 快速重传
    • 若连续收到重复 ACK,立即重传丢失的包(无需等待超时)。
  3. 长连接
    • HTTP/1.1 的 Keep-Alive 或 HTTP/2 复用连接,减少握手开销。
总结
  • 三次握手:解决同步初始序列号和双向通信能力确认问题。
  • 四次挥手:确保全双工连接的两个方向安全关闭。
  • TCP 的可靠性依赖于序列号、确认机制和状态机设计,理解这些细节对网络调试和优化至关重要。

11. get 和 post 有什么区别

GET 和 POST 是 HTTP 协议中最常用的两种请求方法,它们在设计目的、使用场景和底层实现上有显著区别。以下是详细对比:

一、核心区别总结
特性GETPOST
语义获取资源(幂等)提交数据(非幂等)
数据位置URL 的查询字符串(?key=value请求体(Body)
数据长度限制受 URL 长度限制(通常 2KB~8KB)无限制(服务器可配置限制)
安全性数据明文暴露在 URL 中(不适合敏感信息)数据在 Body 中,HTTPS 下更安全
缓存可被缓存(浏览器/CDN)默认不缓存
历史记录保留在浏览器历史/日志中不保留
编码类型application/x-www-form-urlencoded支持多种(如 multipart/form-data、JSON)
幂等性幂等(多次请求结果相同)非幂等(可能修改服务器状态)

二、深入解析
1. 设计目的
  • GET

    • 用于安全操作(Safe),即不应修改服务器状态(如查询数据)。
    • 符合幂等性(Idempotent),多次请求效果相同。
  • POST

    • 用于非安全操作(可能修改数据,如提交表单)。
    • 非幂等(重复提交可能产生副作用,如多次下单)。
2. 数据传输方式
  • GET

    GET /search?q=hello&page=1 HTTP/1.1
    Host: example.com
    
    • 数据通过 URL 的**查询参数(Query String)**传递,明文可见。
  • POST

    POST /submit HTTP/1.1
    Host: example.com
    Content-Type: application/x-www-form-urlencodedusername=admin&password=123456
    
    • 数据放在请求体(Body)中,支持多种编码格式(如 JSON、文件上传)。
3. 安全性误区
  • GET 不安全?
    • 即使使用 HTTPS,GET 的 URL 参数仍可能被浏览器历史记录、服务器日志记录,导致信息泄露。
  • POST 更安全?
    • 仅在 HTTPS 下安全(Body 加密),但 HTTP 下 Body 仍是明文。敏感数据(如密码)必须用 HTTPS + POST。
4. 缓存机制
  • GET
    • 可被浏览器、代理服务器缓存(通过 Cache-ControlExpires 头控制)。
    • 适合静态资源请求(如 JS、CSS)。
  • POST
    • 默认不缓存(除非显式设置 Cache-Control)。
5. 幂等性与网络问题
  • GET
    • 请求失败时可自动重试(不影响结果)。
  • POST
    • 重试可能导致重复提交(如支付场景需额外防重机制)。

三、使用场景
适合 GET 的情况
  • 检索数据(如搜索、分页查询)。
  • 无副作用的操作(如获取用户信息)。
  • 需要缓存的请求(如静态资源)。
适合 POST 的情况
  • 提交敏感数据(如登录、支付)。
  • 上传文件或大量数据(如表单提交)。
  • 修改服务器状态的操作(如创建订单、删除数据)。
四、常见面试问题
1. GET 能否传 Body?POST 能否用 Query String?
  • GET 的 Body
    • 协议不禁止,但多数服务器会忽略(如 curl -X GET --data "key=value")。
  • POST 的 Query String
    • 可以(但数据通常放在 Body 中更合理)。
2. 为什么 POST 更安全?
  • 仅因为数据不直接暴露在 URL 中,但实际安全性依赖 HTTPS。
3. RESTful API 中的用法
  • GET /users:获取用户列表。
  • POST /users:创建新用户。
五、总结
  • GET:轻量、可缓存、适合读操作。
  • POST:灵活、无长度限制、适合写操作。
  • 关键选择依据
    • 是否修改服务器状态? → 是则用 POST。
    • 数据是否敏感或超长? → 是则用 POST + HTTPS。

永远不要用 GET 传输密码或敏感信息!

12. 讲一下 xss 攻击

一、XSS攻击基本概念

XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web安全漏洞,攻击者通过在目标网站上注入恶意脚本,当其他用户访问该页面时,这些脚本会在用户的浏览器中执行。

为什么叫XSS而不是CSS?

为了避免与层叠样式表(CSS)混淆,安全专家将其缩写为XSS。

二、XSS攻击的三种主要类型
1. 反射型XSS(非持久型)
  • 特点:恶意脚本来自当前HTTP请求
  • 攻击流程
    1. 攻击者构造包含恶意脚本的URL
    2. 诱骗用户点击该URL
    3. 服务器将恶意脚本"反射"回用户的浏览器执行
  • 示例
    http://example.com/search?q=<script>alert('XSS')</script>
    
2. 存储型XSS(持久型)
  • 特点:恶意脚本被永久存储在目标服务器上
  • 攻击流程
    1. 攻击者将恶意脚本提交到网站数据库(如评论区)
    2. 其他用户访问包含该内容的页面时自动执行
  • 危害性:更大,影响所有访问者
3. DOM型XSS
  • 特点:完全在客户端执行,不涉及服务器
  • 攻击流程
    1. 恶意脚本通过修改DOM环境在客户端执行
    2. 通常利用URL片段(#)或hash值
  • 示例
    // 假设网站有这段代码
    document.write(location.hash.substring(1));// 攻击URL
    http://example.com#<script>alert('XSS')</script>
    
三、XSS攻击的危害
  1. 窃取用户Cookie:获取用户会话信息
  2. 钓鱼攻击:伪造登录表单
  3. 键盘记录:监控用户输入
  4. 篡改页面内容:显示虚假信息
  5. 传播蠕虫:自动转发攻击内容
四、XSS防御措施
1. 输入过滤
  • 对用户输入进行严格验证
  • 过滤或转义特殊字符(<, >, &, ", '等)
  • 示例代码:
    function escapeHtml(str) {return str.replace(/[&<>'"]/g, tag => ({'&': '&amp;','<': '&lt;','>': '&gt;',"'": '&#39;','"': '&quot;'}[tag]));
    }
    
2. 输出编码
  • 根据输出上下文使用不同的编码:
    • HTML实体编码:< → &lt;
    • JavaScript编码:' → \x27
    • URL编码:& → %26
3. 使用CSP(内容安全策略)

HTTP头部设置:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com

限制:

  • 内联脚本执行
  • 外部资源加载源
4. 其他措施
  • 设置HttpOnly Cookie:防止JavaScript访问
  • 使用X-XSS-Protection头部(现代浏览器已弃用)
  • 框架自带防护(如React的JSX自动转义)
五、现代Web开发中的XSS防护
  1. 前端框架:React/Vue/Angular等都有内置防护
  2. 模板引擎:如Handlebars、EJS等自动转义
  3. 安全库:DOMPurify、sanitize-html等
六、测试XSS漏洞
  1. 使用简单payload测试:<script>alert(1)</script>
  2. 工具:
    • OWASP ZAP
    • Burp Suite
    • XSS Hunter(用于盲测)

XSS攻击虽然历史悠久,但在现代Web应用中仍然常见。开发者需要采取多层次防御策略,从输入验证到输出编码,结合现代开发框架的安全特性,才能有效防范这类攻击。

14. 讲一下浏览器同源策略问题

一、同源策略基本概念

同源策略(Same-Origin Policy)是浏览器最核心的安全策略之一,它限制了一个源(origin)的文档或脚本如何与另一个源的资源进行交互。

1. 什么是"同源"?

两个URL在以下三个方面完全相同才被认为是同源:

  • 协议相同(http/https)
  • 域名相同(example.com)
  • 端口相同(默认80/443)
URL1URL2是否同源原因
https://example.com/ahttps://example.com/b协议、域名、端口相同
http://example.comhttps://example.com协议不同
https://example.comhttps://api.example.com域名不同
https://example.com:8080https://example.com端口不同
二、同源策略的限制范围

同源策略主要限制以下三类行为:

1. DOM访问限制
  • 不同源的页面无法通过JavaScript访问彼此的DOM
  • 例如:iframe.contentWindowwindow.open()返回的窗口对象
2. 网络请求限制
  • 通常禁止向不同源发送AJAX请求(可通过CORS解除)
  • 限制WebSocket和Fetch API的跨源请求
3. 存储访问限制
  • 限制不同源页面访问彼此的Cookie、LocalStorage、IndexedDB等
三、同源策略的例外情况
1. 允许跨源嵌入的资源
  • <script src="..."> (JSONP利用此特性)
  • <link rel="stylesheet" href="...">
  • <img>, <video>, <audio>等媒体标签
  • <iframe> (但限制父子文档间的DOM访问)
2. 允许跨源写入
  • 表单提交(但无法读取响应结果)
  • 重定向
3. 允许有限跨源读取
  • 某些嵌入资源可以读取部分信息:
    • iframewindow.length
    • 图片的width/height
    • 脚本的错误信息
四、解决跨源问题的方案
1. CORS (跨源资源共享)
  • 服务端设置Access-Control-Allow-Origin响应头
  • 预检请求(preflight)处理复杂请求
  • 示例:
    Access-Control-Allow-Origin: https://example.com
    Access-Control-Allow-Methods: GET, POST, PUT
    Access-Control-Allow-Headers: Content-Type
    
2. JSONP (仅限GET请求)
  • 利用<script>标签不受同源策略限制的特性
  • 示例:
    function handleResponse(data) {console.log(data);
    }
    const script = document.createElement('script');
    script.src = 'https://api.example.com/data?callback=handleResponse';
    document.body.appendChild(script);
    
3. 代理服务器
  • 同源服务器转发跨源请求
  • 示例(Nginx配置):
    location /api/ {proxy_pass https://api.example.com/;
    }
    
4. postMessage API
  • 跨文档通信的标准方法
  • 示例:
    // 发送方
    otherWindow.postMessage('Hello', 'https://target.com');// 接收方
    window.addEventListener('message', (event) => {if (event.origin !== 'https://trusted.com') return;console.log(event.data);
    });
    
5. 修改document.domain (仅限子域)
  • 适用于主域相同、子域不同的情况
  • 示例:
    // a.example.com和b.example.com都设置
    document.domain = 'example.com';
    
五、现代Web开发中的同源策略
1. 开发环境解决方案
  • Webpack DevServer代理
  • Chrome禁用安全标志(仅限开发)
    google-chrome --disable-web-security --user-data-dir=/tmp
    
2. 生产环境最佳实践
  • 合理配置CORS
  • 使用JWT代替Cookie进行身份验证
  • 对敏感操作实施CSRF保护
六、安全注意事项
  1. 不要随意设置Access-Control-Allow-Origin: *

    • 仅对需要公开的API使用通配符
    • 敏感API应指定具体域名
  2. 正确处理postMessage的origin验证

    window.addEventListener('message', (event) => {if (event.origin !== 'https://trusted.com') return;// 处理消息
    });
    
  3. 避免不安全的JSONP实现

    • 确保JSONP端点不返回敏感数据
    • 考虑弃用JSONP转向CORS

同源策略是Web安全的基石,理解其工作原理和解决方案对于现代Web开发至关重要。合理使用CORS、postMessage等技术可以在保证安全性的同时实现必要的跨源功能。

15. 讲一下进程线程的区别

一、基本概念对比
特性进程 (Process)线程 (Thread)
定义操作系统资源分配的基本单位CPU调度和执行的基本单位
独立性独立的内存空间和系统资源共享所属进程的内存和资源
创建开销大(需要分配独立资源)小(共享进程资源)
通信方式进程间通信(IPC):管道、消息队列等直接读写进程的共享内存
稳定性一个进程崩溃不影响其他进程一个线程崩溃会导致整个进程终止
并发性进程间并行线程间并发
二、技术层面深度解析
1. 内存结构差异

进程内存模型

  • 独立地址空间
  • 包含:代码段、数据段、堆、栈
  • 通过虚拟内存机制隔离

线程内存模型

  • 共享进程的地址空间
  • 每个线程有独立的栈空间
  • 共享堆、全局变量等内存区域

图示:

进程A
├── 代码段
├── 数据段
├── 堆
└── 线程1└── 栈
└── 线程2└── 栈
2. 上下文切换成本
  • 进程切换

    • 需要保存/恢复:内存映射、寄存器、文件描述符等
    • 通常涉及TLB刷新
    • 开销大(微秒级)
  • 线程切换

    • 只需保存/恢复:寄存器、栈指针等
    • 共享地址空间,无需TLB刷新
    • 开销小(纳秒级)
三、实际应用场景
适合使用进程的情况:
  1. 需要高度稳定性的服务(如系统守护进程)
  2. 需要严格隔离的任务(如浏览器多标签页)
  3. 利用多核CPU实现真正并行
适合使用线程的情况:
  1. 需要频繁通信的任务(如GUI应用)
  2. 需要快速创建/销毁的轻量级任务
  3. IO密集型应用(避免进程切换开销)
四、现代技术发展
1. 协程(Coroutine)
  • 更轻量级的"用户态线程"
  • 由程序员控制调度(非抢占式)
  • 典型实现:Go语言的goroutine
2. 线程池优化
  • 避免频繁创建/销毁线程
  • Java的ExecutorService
  • C++的std::thread_pool
3. 多进程架构新趋势
  • 容器化技术(Docker)使多进程部署更轻量
  • 微服务架构提倡进程级隔离
五、常见面试问题解析
Q1:为什么线程比进程更轻量级?

A:线程共享进程资源,创建时无需分配新内存空间,上下文切换只需保存少量寄存器状态。

Q2:多线程程序一定比单线程快吗?

A:不一定。对于CPU密集型任务,线程数超过CPU核心数反而会因频繁切换降低性能。IO密集型任务通常能受益于多线程。

Q3:何时会引发线程安全问题?

A:当多个线程同时访问共享资源且至少有一个线程执行写操作时。典型场景:

  • 修改全局变量
  • 操作共享文件描述符
  • 访问共享内存数据结构
六、编程语言实现差异
语言进程创建线程创建
Cfork()pthread_create()
Pythonos.fork()threading.Thread()
JavaProcessBuilder.start()new Thread().start()
Go无原生支持,需execgo func() { … }
七、性能优化建议
  1. 避免线程爆炸

    • 使用线程池控制线程数量
    • 一般设置为CPU核心数的1-2倍
  2. 减少锁竞争

    • 使用读写锁替代互斥锁
    • 考虑无锁数据结构
  3. 进程间通信优化

    • 大数据传输使用共享内存
    • 小消息使用管道或消息队列

理解进程与线程的区别是系统编程的基础,合理选择并发模型可以显著提升程序性能和稳定性。现代开发中通常采用混合模式(如Nginx的多进程+单线程事件循环),根据实际需求平衡隔离性与性能开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择合适的光源?

目录 工业相机光源类型全面指南 1. 环形光源及其变体 高角度环形光源 优点 缺点 典型应用场景 低角度环形光源&#xff08;暗场照明&#xff09; 优点 缺点 典型应用场景 2. 条形光源与组合照明系统 技术特点 组合条形光源 优点 缺点 典型应用场景 3. 同轴光源…

「OC」源码学习——对象的底层探索

「OC」源码学习——对象的底层探索 前言 上次我们说到了源码里面的调用顺序&#xff0c;现在我们继续了解我们上一篇文章没有讲完的关于对象的内容函数&#xff0c;完整了解对象的产生对于isa赋值以及内存申请的内容 函数内容 先把_objc_rootAllocWithZone函数的内容先贴上…

【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 一、初识list容器1.1 什么是list&#xff1f;1.2 核心特性1.3 典型应用场景 二、核心成员函数…

labelimg快捷键

一、核心标注快捷键 ‌W‌&#xff1a;调出标注十字架&#xff0c;开始绘制矩形框&#xff08;最常用功能&#xff09;‌A/D‌&#xff1a;切换上一张(A)或下一张(D)图片&#xff0c;实现快速导航‌Del‌&#xff1a;删除当前选中的标注框 二、文件操作快捷键 ‌CtrlS‌&…

linux-文件操作

在 Linux 系统中&#xff0c;文件操作与管理是日常使用和系统管理的重要组成部分。下面将详细介绍文件的复制、移动、链接创建&#xff0c;以及文件查找、文本处理、排序、权限管理等相关知识。 一、文件的复制 在 Linux 里&#xff0c;cp 命令可用于复制文件或目录&#xff…

C++ 复习

VS 修改 C 语言标准 右键项目-属性 输入输出 //引用头文件&#xff0c;用<>包裹起来的一般是系统提供的写好的代码 编译器会在专门的系统路径中去进行查找 #include <iostream> //自己写的代码文件一般都用""包裹起来 编译器会在当前文件所在的目录中査…

openGauss新特性 | HTAP新特性介绍

一、行列融合功能简介 HTAP 行列融合特性在单机、主备场景下&#xff0c;通过节点的行列双格式内存模式&#xff0c;实现openGauss HTAP一体化数据库架构。 通过高效的行列转换技术方案&#xff0c;节点读取磁盘行存数据&#xff0c;生成列存储单元&#xff08;Column Unit&am…

双目测量中的将视差图重投影成三维坐标图

双目测距主要步骤如下&#xff1a; 左右两张图片 → 匹配 → 得到视差图 disp&#xff1b; 使用 cv2.reprojectImageTo3D(disp, Q) 将视差图 重投影 成三维坐标图 → 得到 points_3d 什么是 points_3d&#xff1f; points_3d cv2.reprojectImageTo3D(disp, Q)points_3d.shap…

《深度剖析:SOAP与REST,API集成的两极选择》

API作为不同系统之间交互的桥梁&#xff0c;其设计与实现的优劣直接影响着整个软件生态的运转效率。而在API的设计领域&#xff0c;SOAP和REST犹如两座巍峨的山峰&#xff0c;各自代表着截然不同的设计理念与应用方向&#xff0c;成为开发者在构建API时必须慎重权衡的关键选项。…

非对称加密算法(RSA、ECC、SM2)——密码学基础

对称加密算法&#xff08;AES、ChaCha20和SM4&#xff09;Python实现——密码学基础(Python出现No module named “Crypto” 解决方案) 这篇的续篇&#xff0c;因此实践部分少些&#xff1b; 文章目录 一、非对称加密算法基础二、RSA算法2.1 RSA原理与数学基础2.2 RSA密钥长度…

Pillow 玩图术:轻松获取图片尺寸和颜色模式

前言 在这个“图像为王”的时代,谁还敢说自己没被一张图折磨过?一张图片不讲武德,说崩就崩,说卡就卡,仿佛像素里藏着程序员的眼泪。不管你是网页设计师、AI炼丹师,还是只是想把猫片修得像艺术品,图片的尺寸和颜色模式都是你必须掌握的第一手情报。如果你不知道它有多宽…

下载core5compat 模块时,被禁止,显示 - servese replied: Forbbidden. -->换镜像源

怎么解决&#xff1f; --->换镜像源 方法 1&#xff1a;使用命令行参数指定镜像源 在运行 Qt 安装器时&#xff0c;通过 --mirror 参数指定镜像源&#xff1a; # Windows qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject# Linux/macO…

WPF中Behaviors

行为的好处 可以把复杂的界面逻辑抽象出去&#xff0c;让xaml的界面设计更简单&#xff0c;更清爽 1.安装包 Microsoft.Xaml.Behaviors.Wpf2.简单实现拖动效果 <Border Width"100"Height"100"Background"Red"><i:Interaction.Behav…

GitHub 趋势日报 (2025年05月03日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1582⭐ 59337Python2aip…

Oracle OCP认证考试考点详解083系列08

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 36. 第36题&#xff1a; 题目 解析及答案&#xff1a; 关于数据库闪回&#xff08;FLASHBACK DATABASE&#xff09;功能&#xff0c;以下…

优化01-统计信息

Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象&#xff08;如表、索引、列等&#xff09;的元数据信息&#xff0c;帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍&#xff1a; 一、统计信息的分类 表统…

动态规划-面试题08.01三步问题-力扣(LeetCode)

一、题目解析 此题可以类比第N个泰波那契数 二、算法解析 1、状态表示 根据上面的分析和题目要求&#xff0c;dp[i]表示&#xff1a;到达i位置&#xff0c;一共有多少种方法 2、状态转移方程 以i位置的状态&#xff0c;以最近一步划分问题 dp[i] 从i-1->i dp[i-1] 从…

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段&#xff08;带参数 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…

Java使用JDBC操作数据库

1.创建一个数据库一会用来连接 2.使用idea新建一个Java项目 3.在pom文件中加上相关依赖&#xff0c;并配置Maven路径 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>…

重名导致does not name a type

今天在Ubuntu24.04上编成时&#xff0c;makefile编译报错: falsecolor.h:48:9: error: ‘FalseColor’ does not name a type48 | FalseColor* content ;| ^~~~~~~~~~falsecolor.h的部分代码如下: class FalseColor {public:FalseColor(int w, int h){width …