提供网站建设方案ppt,肃宁县做网站,企业网站建设要点,排名seo公司文章目录 锁自旋锁互斥锁悲观锁和乐观锁 内存管理物理/虚拟内存页表段表虚拟内存布局写时复制copy on writebrk#xff0c;mmap页面置换算法 中断中断分类中断流程 网络I/OI/O模型服务器处理并发请求 锁
自旋锁
自旋锁是一种基于忙等待#xff08;Busy-Waiting#xff09;… 文章目录 锁自旋锁互斥锁悲观锁和乐观锁 内存管理物理/虚拟内存页表段表虚拟内存布局写时复制copy on writebrkmmap页面置换算法 中断中断分类中断流程 网络I/OI/O模型服务器处理并发请求 锁
自旋锁
自旋锁是一种基于忙等待Busy-Waiting的同步机制。
通过 CPU 提供的 CAS 函数完成加锁解锁操作
第一步查看锁的状态为空则执行第二步
第二步将锁设置为当前线程持有
这两步是原子指令要么一次性执行完要么都不执行。
当线程尝试获取锁失败时它会循环检查锁的状态“自旋”直到它拿到锁。
等待时间较短的情况下效率较高因为避免了线程上下文切换的开销。但长时间等待会导致CPU资源的浪费。
适用于多核系统且临界区代码执行时间非常短的场景。
互斥锁
在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁,确保同一时间只有一个线程访问共享资源。 自旋锁和互斥锁的区别 工作机制自旋锁在获取不到锁时会一直循环检查而互斥锁会让线程进入睡眠挂起状态调度其他线程运行。 适用场景自旋锁适合保护执行时间极短的代码段自旋的代价可能小于线程切换的代价。互斥锁适合保护执行时间较长的代码段 性能影响自旋锁无上下文切换开销但一直占用CPU,互斥锁挂起唤醒线程产生下上文切换开销但等待期间CPU执行其他任务资源利用率更高. 实现复杂度自旋锁依赖CAS原子操作不需要操作系统调度而互斥锁复杂度高依赖操作系统调度 悲观锁和乐观锁
悲观锁先加锁再操作
认为并发操作一定会发生冲突因此每次访问数据时都会加锁比如synchronized和ReentrantLock。
适用写多的场景。
举个例子出门时锁门默认有小偷
乐观锁先操作提交时再检查冲突
认为并发操作很少发生冲突只在提交操作时检查是否冲突比如CAS操作数据库的乐观锁和Java中的Atomic类。
适用读多写少。
举个例子
1.购物车结算时才检查库存默认没人抢购
2.或者在网上订票系统显示还有1个座位你点击预订系统会先让你填写信息然后提交的时候检查是否还有座位。如果有预订成功如果没有提示你重新选择
内存管理 计算机系统的核心功能之一其目标是高效、安全地管理物理内存和虚拟内存资源确保多个进程能共享内存且互不干扰 物理/虚拟内存 物理内存 计算机硬件中的实际内存芯片容量固定由硬件决定直接由CPU通过物理地址访问是程序运行的真实存储空间。 虚拟内存 操作系统为每个进程提供的逻辑地址空间独立于物理内存通过通过页表、MMU内存管理单元负责管理内存访问和地址转换、缺页中断等机制管理将虚拟地址映射到物理地址或磁盘空间。 虚拟内存允许程序使用比物理内存更大的地址空间 每个进程拥有独立的虚拟地址空间彼此无法直接访问对方内存避免恶意或错误操作。
页表 操作系统与硬件如MMU协作实现虚拟内存的核心数据结构负责记录虚拟地址到物理地址的映射关系。 核心作用
地址映射 将进程的虚拟页号 映射到物理内存的物理页号。权限控制 通过页表项的权限位读/写/执行限制内存访问。状态标记 记录页是否在物理内存中、是否被修改过等状态信息。
工作流程
把虚拟内存地址切分成页号和页内偏移量根据页号从页表里面查询对应的物理页号直接拿物理页号加上前面的偏移量就得到了物理内存地址。
如果在页表中没有相应页号触发缺页中断。此时进入系统内核空间分配物理内存、更新进程页表最后再返回用户空间恢复进程的运行。
段表 虚拟地址也可以通过段表与物理地址进行映射的 程序的内存空间被划分为多个逻辑段每个段代表一个逻辑单元每个段有独立的基址起始地址和界限长度段的大小可变与程序逻辑直接对应例如代码段大小取决于代码量物理地址 段基址 段内偏移
虚拟内存布局 1. 代码段
位置低地址起始如0x400000。内容编译后的机器指令可执行代码。权限只读可执行防止代码被篡改。示例main函数、库函数的指令。
2. 数据段
位置紧接代码段。内容已初始化的全局变量和静态变量。权限可读写不可执行。示例int global_var 42;。
3. BSS段
位置紧接数据段。内容未初始化的全局变量和静态变量。权限可读写。示例int uninitialized_var;。
4. 堆
位置BSS段之上向高地址增长。管理通过malloc、free动态分配内存。特点碎片化问题常见需手动管理或依赖垃圾回收。示例int *arr malloc(100 * sizeof(int));。
5. 文件映射区域
位置堆与栈之间。内容 共享库如libc.so、libm.so。内存映射文件通过mmap映射的文件。匿名映射用于大块内存分配如malloc可能使用mmap。 权限按需设置如可读写、可执行。
6. 栈
位置高地址区域如0x7FFFFFFFFFFFF000向下增长。内容函数调用栈帧局部变量、返回地址、函数参数。管理自动分配/释放内存由编译器控制。限制栈大小固定默认几MB可通过ulimit调整。示例int local_var 10;。
7. 内核空间
位置虚拟地址空间的高位如64位Linux中高128TB。权限仅内核态可访问用户进程无权直接读写。内容内核代码、数据结构、设备内存映射等。
写时复制copy on write COW,一种内存管理优化技术,延迟数据的物理拷贝直到真正需要修改数据时才进行复制。 问题场景 假设父进程和子进程共享同一物理内存页未复制且子进程修改了某个变量。如果此时父进程读取该变量会发现值被意外改变。 示例 父进程定义变量 int x 42子进程修改 x 100。若未复制父进程的 x 也会变为 100导致逻辑错误。 COW 的解决方案 当子进程尝试写入 x 时触发复制子进程获得独立的物理页副本。 父进程的 x 保持 42子进程的 x 变为 100两者互不影响。
具体步骤
步骤1共享内存页 调用 fork() 时子进程与父进程共享所有物理内存页页表项标记为只读。步骤2触发复制 当父进程或子进程尝试写入共享页时触发缺页中断。操作系统捕获中断检查触发原因是 COW执行以下操作 分配新的物理页复制原页内容到新页。更新触发写入的进程的页表项指向新物理页并标记为可写。另一进程仍指向原物理页保持只读直到其写入时触发复制。 步骤3后续操作 修改后的页独立于原页后续写入不再触发复制。 COW有什么好 fork()的时候子进程不需要复制父进程的物理内存只需要复制父进程的页表避免了不必要的内存复制开销这时候父子进程的页表指向的都是共享的物理内存。 只有当父子进程任何有一方对这片共享的物理内存发生了修改操作这时候才会复制发生修改操作的物理内存。 brkmmap
int *arr malloc(100 * sizeof(int))
这里的动态分配内存malloc
1.如果请求分配的内存128KB则通过brk()申请
2.如果请求分配的内存128KB则通过mmap()申请 brk:修改指针向高地址移动获得新内存空间 mmap:从文件映射区申请一块内存
如果物理内存不足
当使用malloc()申请虚拟内存时如果虚拟内存还没有映射到物理内存CPU产生缺页中断缺页中断函数查看是否有空闲物理内存有则建立虚拟与物理内存的映射如果没有则开始回收内存页面置换/丢弃/终止 回收内存包括 页面置换 将部分物理内存页换出到磁盘Swap空间释放物理内存供其他进程使用。 释放可丢弃的干净页 直接丢弃未被修改的页如代码段、文件缓存页无需写回磁盘。 终止进程OOM Killer 强制终止占用内存过多的进程释放其所有内存极端情况下的最后手段。 1.后台内存回收唤醒 kswapd 内核线程来回收内存异步不阻塞进程执行
2.直接内存回收如果异步回收速度跟不上申请内存速度则直接回收同步阻塞进程执行 哪些内存可以被回收 文件页 内核缓存的磁盘数据Buffer和内核缓存的文件数据Cache都叫作文件页。需要读时重新读取磁盘即可。而如果修改过但还没写入磁盘的数据脏页需要先写进磁盘才进行回收。 匿名页 无实际载体所以不能直接释放内存。会把不常访问的内存先写到磁盘再释放这些内存。 如果经过上面的步骤物理内存仍不满足则触发Out-Of-Memory Killer
OOM根据算法杀死一个占用物理内存较高的进程释放其内存资源如果依然不满足继续杀死直至释放足够物理内存
页面置换算法 页面置换内存回收的核心手段之一。 选择一个物理页面换出到磁盘,然后把需要访问的页面换入到物理页。 最佳页面OPT 思想置换出在未来长时间不会使用的页面 先进先出FIFO 思想换出在内存中占用时间最长的页面 最近最久未使用LRU 思想换出前面长时间没有访问过的页面 时钟页面LOCK 思想将所有页面存在环形链表每页需要一个访问位0未访问1已访问 初始所有页访问位为0 缺页时指针移动 访问位为1重置为0指针后移 访问位为0选择换出内存 最不常用LFU 思想对每个页面增加一个访问计数器被访问一次计数器1发生缺页中断时换出访问次数最少的页面
中断 计算机系统响应外部或内部事件的机制允许 CPU 暂停当前任务转而处理紧急或异步事件(如键盘输入)。处理完后回来继续执行刚才的任务。 中断机制是操作系统实现多任务、设备管理、错误处理等功能的基础 中断分类
外部中断硬件中断
触发源外部设备如键盘、磁盘、定时器。类型 可屏蔽中断可通过中断屏蔽位如 IF 标志暂时关闭可随时处理甚至不处理。不可屏蔽中断必须立即处理如硬件故障、内存校验错误。
内部中断软件中断
触发方式由程序执行特定指令或发生异常。 异常同步触发由 CPU 执行指令时检测到错误如缺页、除零交由故障处理程序处理。陷阱一般是在编写程序时故意设下的陷阱指令而后执行到陷阱指令后CPU将会调用特定程序进行相应的处理处理结束后返回到陷阱指令的下一条指令。终止发生致命错误不可修复程序无法继续运行直接终止。
中断流程 发生中断设备或程序触发中断发送信号到 CPU 的中断控制器 中断响应保存上下文CPU 暂停当前任务将程序计数器PC、寄存器等压入内核栈保存当前执行现场以便处理完中断后恢复执行。 中断处理CPU根据中断向量表找到对应中断处理程序入口地址进行中断处理 恢复上下文继续执行之前的程序
网络I/O
I/O模型 网络I/O模型定义了应用程序如何管理输入和输出操作尤其是在处理多个并发连接时如何高效利用资源 阻塞I/O 工作原理 应用程序发起I/O操作后进程会被阻塞直到数据就绪或操作完成。在此期间进程无法执行其他任务。优点 实现简单代码直观适合低并发场景。缺点 每个连接需独立线程/进程资源消耗大无法支撑高并发。适用场景 简单的客户端应用或低负载服务实时性要求不高。 非阻塞I/O 工作原理 I/O操作立即返回结果成功或错误,不会被阻塞。若数据未就绪返回错误应用需轮询检查状态。优点 单线程可管理多个连接避免线程阻塞。缺点 轮询消耗CPU资源延迟较高。适用场景 需要同时处理少量连接且对延迟不敏感的场景多路复用。 I/O多路复用 工作原理 使用select、poll、epollLinux等系统调用同时等待多个I/O操作当任一I/O准备就绪时通知应用处理。优点 单线程处理高并发连接资源利用率高。缺点 事件通知后仍需同步处理I/O编程复杂度较高。适用场景 Web服务器如Nginx、即时通讯等高并发服务。 信号驱动I/O 工作原理 发起I/O请求后继续做其他事情当I/O操作就绪时内核发送信号通知处理应用执行I/O操作。优点 避免轮询减少CPU占用。缺点 信号处理复杂可能丢失事件多线程中难以管理。适用场景 需要异步I/O通知的场景提高系统并发能力。 异步I/O 工作原理 应用发起I/O请求后立即做其他事情内核完成整个I/O操作后通知应用。优点 无阻塞资源利用最优适合高吞吐场景。缺点 实现复杂需操作系统和库支持调试困难。适用场景 高并发高性能场景减少系统调用提高系统效率。
服务器处理并发请求 单线程web服务器 一次处理一个请求性能低 多进程/多线程web服务器 服务器生成多个进程/线程并行处理多个用户请求消耗大量系统资源 I/O多路复用web服务器 只用一个线程处理多个用户请求 多路复用多线程web服务器 避免一个进程服务于过多用户请求生成多个进程一个进程生成多个线程每个线程处理一个请求 考完操作系统不久结合小林Coding写了些笔记感谢大家的点赞收藏W