网络瓶颈:网络传输性能及稳定性的一些相关元素

线程死锁:多个线程因竞争资源造成的一种僵局

下面我们通过一些实例来说明死锁现象。

先看生活中的一个实例,2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都同时占用一个资源,等待另一个资源,这个时候甲在等待乙吃完并释放它占有的筷子,同理,乙也在等待甲吃完并释放它占有的筷子,这样就陷入了一个死循环,谁也无法继续吃饭。。。
在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。

二、死锁产生的原因

1) 系统资源的竞争

2) 进程推进顺序非法

3) 死锁产生的必要条件

产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。
互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, ..., pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的资源被P0占有,如图2-15所示。

三、如何避免死锁

在有些情况下死锁是可以避免的。三种用于避免死锁的技术:

  1. 加锁顺序(线程按照一定的顺序加锁)
  2. 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
  3. 死锁检测

    那么当检测出死锁时,这些线程该做些什么呢?

    一个可行的做法是释放所有锁,回退,并且等待一段随机的时间后重试。这个和简单的加锁超时类似,不一样的是只有死锁已经发生了才回退,而不会是因为加锁的请求超时了。虽然有回退和等待,但是如果有大量的线程竞争同一批锁,它们还是会重复地死锁(编者注:原因同超时类似,不能从根本上减轻竞争)。

    一个更好的方案是给这些线程设置优先级,让一个(或几个)线程回退,剩下的线程就像没发生死锁一样继续保持着它们需要的锁。如果赋予这些线程的优先级是固定不变的,同一批线程总是会拥有更高的优先级。为避免这个问题,可以在死锁发生的时候设置随机的优先级。

    ---------------------
    作者:jayxu无捷之径
    来源:CSDN
    原文:https://blog.csdn.net/ls5718/article/details/51896159
    版权声明:本文为博主原创文章,转载请附上博文链接!

    内存泄露:内存申请后,用完没有释放,造成可用内存越来越少。C语言

    内存溢出:用户实际的数据长度超过了申请的内存空间大小,导致覆盖了其他正常数据,容易造成程序异常,严重的,攻击者可用以此获取程序的控制权
    栈(stack):系统自动分配空间,char a,运行后自己释放,像桶或盒子,后进先出
    堆(heap):程序员根据需要自己申请空间,malloc(10),10个字节空间,程序员忘记释放后会造成内存泄露
    AJAX:不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网友内容

转载于:https://www.cnblogs.com/gdf456/p/9879031.html

网络瓶颈、线程死锁、内存泄露溢出、栈堆、ajax相关推荐

  1. c语言中全局变量内存,C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】...

    目录: 一:全局变量 二:局部变量 三:C语言经过编译之后将内存分为以下几个区域 (1)栈(stack) (2)堆(heap) (3)全局(静态)存储区 (4)文字常量区 (5)程序代码区 四:区别 ...

  2. 内存溢出、内存泄露的概述及常见情形

    内存溢出(OutofMemoryError) 简述 java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存. JVM 提供的内存管理机 ...

  3. 内存泄露从入门到精通三部曲之基础知识篇

    一.首先以一个内存泄露实例来开始本节基础概念的内容: 实例1:(单例导致内存对象无法释放而泄露) 可以看出ImageUtil这个工具类是一个单例,并引用了activity的context. 试想这个场 ...

  4. Android内存泄露总结

    内存泄露是如何产生的? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...

  5. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

  6. 内存泄露从入门到精通三部曲之常见原因与用户实践

    2019独角兽企业重金招聘Python工程师标准>>> 内存泄露从入门到精通三部曲之常见原因与用户实践 腾讯Bugly特约作者: 姚潮生 常见原因 1.集合类 集合类如果仅仅有添加元 ...

  7. 关于Android 的内存泄露及分析

    博客园 首页 新随笔 联系 管理 订阅 随笔- 137  文章- 6  评论- 145  关于Android 的内存泄露及分析 一. Android的内存机制 Android的程序由Java语言编写, ...

  8. 什么情况下会导致内存泄露

    Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的可能是24M,当我们的内存占用超过了一定的程度后,就会出现OutOfMemory的错误. 下面说明几点可能导致内存泄露 ...

  9. Java内存泄露系列--内存泄露的原因及解决方案(大全)

    原文网址:Java内存泄露系列--内存泄露的原因及解决方案(大全)_IT利刃出鞘的博客-CSDN博客 简介 简介 本文介绍Java中内存泄露的一些原因与解决方案. 如果内存泄露的空间足够大,就会导致内 ...

最新文章

  1. 据说程序员等电梯的时候都想过调度算法
  2. 存储ic载板_【热点】深南电路:通讯PCB维持增长 IC载板打造成长新核心
  3. Chrome 技术篇-常用web调试技巧清除缓存并硬性重新加载
  4. array_map常用技巧
  5. Spring Data JPA 从入门到精通~EntityManager介绍
  6. jQuery上传插件-uploadify3.1使用说明
  7. Kooteam 0.2.0 发布,新增周报、日报功能
  8. linux中,一个目录的权限是777,普通用户为什么删除不了它呢?
  9. WebHubBot 网络爬虫
  10. android测试工具Demo,Android 测试工具,实时抓被测app crash实现思路
  11. echarts 自定义图表custom
  12. cocos2d-x面试题(一)
  13. 信签纸有虚线怎么写_信签纸写作文格式怎么用
  14. web项目运行时无法重命名MySQL表问题排查
  15. 对于安装破解版BurpSuite无法用java打开注册机的问题
  16. 三招搞定你的ubuntu安全问题
  17. Navicat导出excel数据量过大解决方案
  18. [含论文+源码等]微信小程序居家养老+后台管理系统[包运行成功]
  19. Lucene初学——3. 分词器学习
  20. RTL8188EUS WIFI驱动编译与使用说明书

热门文章

  1. 在 ASP.NET 网页中不经过回发而实现客户端回调
  2. (转)Android笔记--handler机制
  3. 多个CALayer的联动
  4. 在 Windows XP 中,无法使用 Windows 图片和传真查看器来查看图片
  5. 合并下载的Solaris镜像为DVD文件的方法
  6. linux字符界面教程,打造字符界面的多媒体Linux系统
  7. 超越对手pdf_如何创建一个超越竞争对手的移动应用
  8. rxswift中hud_如何在RxSwift中运行测试
  9. LVS_NAT实现负载均衡
  10. (C++)1036 跟奥巴马一起编程