死锁、内部碎片、外部碎片、多进程/多线程、服务器高并发、集群
死锁:两个(多个)线程互相等待对方数据的过程
1.死锁产生条件(解决办法):
🔴 互斥条件:所需求的资源具有排他性,其他请求进程只能等待(可以允许多进程、多线程访问)
🔴 不剥夺条件:未主动释放,不能被其他进程夺走(可以强制剥夺)
🔴 请求和保持:进程或线程至少持有一个资源,并且在等待其他资源时不释放已占有资源(一次性申请所有需要的资源)
🔴 循环等待:存在一个进程或线程资源申请序列,使得每个进程或线程都在等待下一个进程或线程的资源(对资源编号,只能按照编号递增序列申请资源,避免循环等待)
2.死锁处理方法:
🔴 鸵鸟策略:因为解决死锁代价高,发生死锁不会有太大影响,采用鸵鸟策略,大多数操作系统解决死锁就是忽略死锁;
🔴 死锁避免;
内部碎片与外部碎片:
内部碎片:分配给某些进程的内存区域中有些部分没用上,常见于固定分配方式
外部碎片:内存中某些空闲区因为比较小,难以利用,一般出现在动态分配方式
内存总量:100M
固定分配:100M分为10块,每块10M,一个程序需要45M,那么需要分配5块,第五块只用了5M,剩下的5M为碎片;
分段式分配:按需分配,程序45M,分配45M内存,不存在内部碎片;
内存总量:100M
内存依次分配 5M,15M,50M,25M 程序允许一段时间后,5M 和 15M 程序允许完毕,释放内存,其他还在允许,再次分配一个10M程序,只能从头开始分配,存在 10M +5M的外部碎片
如何消除碎片文件:
对于外部碎片,通过紧凑技术:即操作系统不时对进程进行移动和整理,但这需要动态重定位寄存器支持,且相对费时;
对于内部碎片,通过内存交换:换出硬盘,换回的时候与其他程序一起占用一个较大的内存区域
多进程和多线程:实际应用常见的是进程加线程结合的方式
🔴 频繁修改:需要频繁创建和销毁的优先(多线程)
🔴 计算量:大量计算优先(消耗大量CPU且切换频繁)(多线程)
🔴 相关性:任务相关性比较强的用(线程之间数据共享和同步简单)(多线程)
🔴 多分布:可能要扩展到多机分布(多进程),多核分布(多线程)
服务器高并发的解决方案:
🔴 应用数据与静态资源分离:将静态资源(图片、视频、js、css等)单独保存到专门的静态资源服务器中;
在客户端访问的时候从静态资源服务器中返回静态资源,从主服务器中返回应用数据;
🔴 客户端缓存:因为效率最高、消耗资源最小的就是纯静态的 html 页面,所以可以把 网站上的页面 尽可能用静态的来实现;
在页面过期或者有数据更新置换再将页面重新缓存,或者首先 生成静态页面,然后用 ajax 异步请求获取动态数据。
🔴 集群和分布式:集群是所有服务器都有相同的功能,请求哪台都可以,主要起分流作用
分布式是将不同的业务放到不同的服务器中,处理一个请求可能需要使用到多台服务器,起到加快请求处理的速度;
可以使用服务器集群和分布式架构,使得原本属于一个服务器的计算压力分散到多个服务器上,同时加快请求处理的速度;
🔴 反向代理:反向代理服务器位于用户与目标服务器之间(用户视角,反向服务器就是目标服务器);
反向代理服务器可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
集群:在局域网或互联网中连接多台计算机,通过软件和硬件实现资源共享和任务分配;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)