死锁、内部碎片、外部碎片、多进程/多线程、服务器高并发、集群

发布时间 2023-12-27 16:52:12作者: 廿陆

死锁:两个(多个)线程互相等待对方数据的过程

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服务器的前置机来降低网络和服务器的负载,提高访问效率。

集群:在局域网或互联网中连接多台计算机,通过软件和硬件实现资源共享和任务分配;