进程与线程
进程与线程的区别进程(Process)和线程(Thread)是操作系统中执行程序的基本单位,它们在资源分配、调度、并发、独立性、系统开销和通信机制等方面存在显著差异。以下从这些方面详细对比进程和线程,并介绍进程切换过程及Linux中的进程和线程实现。 1. 资源分配 进程: 进程是操作系统分配资源的基本单位,每个进程拥有独立的地址空间,包括代码段、数据段、堆、栈等。 进程分配独立的资源,如内存、文件句柄、I/O设备等,进程间资源隔离,互不干扰。 每个进程有自己的进程控制块(PCB,Process Control Block),记录进程状态、寄存器值、内存分配等信息。 线程: 线程是进程内的执行单元,共享进程的地址空间和资源(如代码段、数据段、文件句柄)。 线程只拥有少量私有资源,如栈、寄存器、程序计数器(PC),其他资源由所属进程提供。 多个线程在同一进程内共享内存和资源,减少资源分配的开销。 对比:进程资源隔离,独占资源;线程共享进程资源,资源利用率更高。 2....
tls/ssl握手
HTTPS 详细介绍HTTPS(超文本传输协议安全版,Hypertext Transfer Protocol Secure)是HTTP的加密版本,通过在HTTP和传输层之间引入SSL/TLS(安全套接字层/传输层安全协议)提供安全性。HTTPS旨在确保数据传输的保密性、完整性和身份验证,广泛应用于需要保护用户数据的场景,如在线银行、电子商务和敏感信息传输。 HTTPS 与 HTTP...
http/https
HTTP(超文本传输协议)作为Web通信的核心协议,具有简单,灵活易于扩展,无状态,明文传输,不安全的特点。 简单:基本报文格式是head+body的形式,头部信息也是key-value的简单文本形式,易于理解。 灵活和易于扩展:http工作在第七层应用层,https在http和tcp之间加入了ssl/tls的安全传输层,http把tcp换成了udp HTTP/1.0新机制: 基本请求-响应模型:HTTP/1.0定义了客户端向服务器发送请求并接收响应的基本机制,支持GET、POST和HEAD方法。 头部字段:引入了请求和响应的头部字段(如Content-Type、Content-Length),用于传递元数据。 状态码:定义了状态码(如200 OK、404 Not...
从浏览器输入url并按下回车之后...
浏览器输入URL后发生了什么当在浏览器中输入一个URL(如 https://www.example.com)并按下回车后,浏览器会执行一系列复杂的过程,将用户请求的资源加载并呈现在屏幕上。以下是详细步骤,使用Markdown格式,结合上下文确保清晰且技术准确。 1. 解析URL URL结构:URL(Uniform Resource Locator)由协议(如 https)、域名(如 www.example.com)、端口(默认 HTTPS 为 443)、路径(如 /path)、查询参数(如 ?key=value)等组成。 浏览器行为: 解析输入的URL,检查合法性。 若无协议前缀(如输入 example.com),浏览器可能自动补全为 https://example.com 或尝试搜索。 清理URL(如去除多余空格,规范化编码)。 示例:输入 example.com → 解析为 https://example.com/。 2. 检查缓存 浏览器缓存: 浏览器检查本地缓存(内存缓存、磁盘缓存)是否有请求资源的有效副本。 缓存策略(如...
TCP和UDP
期末月叠加面试真是嘎嘎上压力,周二快手一面,呜呜呜,我要当手孝子。 我们一般说网络有七层,是指OSI模型,从下到上依次为: 物理层 (Physical Layer) 数据链路层 (Data Link Layer) 网络层 (Network Layer) 传输层 (Transport Layer) 会话层 (Session Layer) 表示层 (Presentation Layer) 应用层 (Application...
几种排序
常见排序算法的时间复杂度和空间复杂度以下是常见排序算法的时间复杂度和空间复杂度的总结,列出了最佳、平均和最坏情况下的时间复杂度,以及空间复杂度。所有复杂度以大 O 表示法表示。 排序算法 最佳时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定 冒泡排序 ( O(n) ) ( O(n^2) ) ( O(n^2) ) ( O(1) ) 是 选择排序 ( O(n^2) ) ( O(n^2) ) ( O(n^2) ) ( O(1) ) 否 插入排序 ( O(n) ) ( O(n^2) ) ( O(n^2) ) ( O(1) ) 是 希尔排序 ( O(n \log n) ) 取决于步长序列(如 ( O(n^{1.3}) )) ( O(n^2) ) ( O(1) ) 否 归并排序 ( O(n \log n) ) ( O(n \log n) ) ( O(n \log n) ) ( O(n) ) 是 快速排序 ( O(n \log n) ) ( O(n \log n) ) ( O(n^2) ) ( O(\log n)...
死锁
死锁:定义、必要条件及避免方法蚂蚁一面没过QAQ,不知道是存储岗对学历要求比较高还是怎么样,唉,反正确实项目这一块回答的确实不好,等下周的腾讯和快手吧 1. 死锁的定义死锁(Deadlock)是指多个进程或线程因互相等待对方持有的资源而无法继续执行,导致所有相关进程/线程永久阻塞的状态。 类比:类似多个线程在访问跳表或B+树时,各自持有部分节点锁并等待对方释放,形成循环等待。 2. 死锁产生的四个必要条件死锁发生需要以下四个条件同时满足(缺一不可): 互斥条件(Mutual Exclusion): 资源(如锁、文件)一次只能被一个进程/线程独占。 示例:互斥锁(Mutex,上下文回答)保护跳表节点,同一时间仅一个线程可操作。 类比:B+树节点加锁,禁止并发修改。 持有并等待条件(Hold and...
select,poll,epoll
1. 阻塞与非阻塞 (Blocking vs Non-Blocking) **阻塞 (Blocking)**: 操作在完成之前会暂停调用者的执行。例如,在阻塞I/O中,调用read()或write()时,线程会等待直到操作完成或超时。 特点:简单但效率较低,适合单线程或低并发场景。 示例:阻塞socket的recv()调用会等待数据到达。 **非阻塞 (Non-Blocking)**: 操作立即返回,无论是否完成。如果数据或资源不可用,通常返回错误码(如EAGAIN)或部分结果。 特点:适合高并发场景,但需要开发者处理未完成的情况。 示例:非阻塞socket的recv()会立即返回,若无数据则返回错误码。 2. 异步与同步 (Asynchronous vs Synchronous) **同步...
c++17/20新特性
C++17 和 C++20 新特性 C++17 新特性C++17(2017 年发布)引入了许多实用功能,改进语言的表达力和标准库的可用性。 语言特性 结构化绑定(Structured Bindings) 允许解构 tuple、pair 或结构体到多个变量。 示例:12std::pair<int, std::string> p{1, "hello"};auto [id, value] = p; // id=1, value="hello" 用途:简化多返回值处理。 if 和 switch 初始化语句 在 if/switch 中初始化变量,限制作用域。 示例:123if (auto it = map.find(key); it != map.end()) { return it->second;} 用途:代码更紧凑,减少作用域污染。 内联变量(Inline Variables) 允许在头文件中定义内联静态变量。 示例:1inline static int...
缓存穿透
什么是缓存穿透?缓存穿透是指攻击者或异常请求频繁查询缓存和后端数据库中都不存在的数据,导致每次请求都直接穿透缓存,命中数据库,增加数据库压力,可能导致系统性能下降甚至崩溃。 产生原因 恶意攻击:攻击者故意请求不存在的 key(如随机生成的 ID)。 业务逻辑问题:用户查询的数据在系统中不存在(如查询无效商品 ID)。 缓存失效:热点数据未及时缓存,导致请求直接访问数据库。 影响 数据库负载激增,响应变慢。 系统吞吐量下降,可能引发雪崩效应。 如何解决缓存穿透?以下是常见的解决方案,结合实际场景选择使用: 缓存空对象 方法:当查询的数据在数据库中不存在时,在缓存中存储一个空对象(如 null 或空字符串),并设置较短的过期时间。 优点:简单有效,减少对数据库的直接访问。 缺点:可能占用缓存空间,需设置合理过期时间。 示例(伪代码):12345678value = cache.get(key)if value is None: value = db.query(key) if value is None: cache.set(key,...