精华内容
参与话题
问答
  • PID控制详解

    万次阅读 多人点赞 2018-12-16 10:43:04
    PID控制详解 一、PID控制简介 PID( Proportional Integral Derivative)控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性...

    PID控制详解

    一、PID控制简介

       PID( Proportional Integral Derivative)控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。

       在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节,它实际上是一种算法。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。

       从信号变换的角度而言,超前校正、滞后校正、滞后-超前校正可以总结为比例、积分、微分三种运算及其组合。

       PID调节器的适用范围:PID调节控制是一个传统控制方法,它适用于温度、压力、流量、液位等几乎所有现场,不同的现场,仅仅是PID参数应设置不同,只要参数设置得当均可以达到很好的效果。均可以达到0.1%,甚至更高的控制要求。

    PID控制的不足

      1. 在实际工业生产过程往往具有非线性、时变不确定,难以建立精确的数学模型,常规的PID控制器不能达到理想的控制效果;

      2. 在实际生产现场中,由于受到参数整定方法烦杂的困扰,常规PID控制器参数往往整定不良、效果欠佳,对运行工况的适应能力很差。

    二、PID控制器各校正环节

       任何闭环控制系统的首要任务是要稳(稳定)、快(快速)、准(准确)的响应命令。PID调整的主要工作就是如何实现这一任务。

      增大比例系数P将加快系统的响应,它的作用于输出值较快,但不能很好稳定在一个理想的数值,不良的结果是虽较能有效的克服扰动的影响,但有余差出现,过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏。积分能在比例的基础上消除余差,它能对稳定后有累积误差的系统进行误差修整,减小稳态误差。微分具有超前作用,对于具有容量滞后的控制通道,引入微分参与控制,在微分项设置得当的情况下,对于提高系统的动态性能指标,有着显著效果,它可以使系统超调量减小,稳定性增加,动态误差减小。

       综上所述,P—比例控制系统的响应快速性,快速作用于输出,好比"现在"(现在就起作用,快),I—积分控制系统的准确性,消除过去的累积误差,好比"过去"(清除过去积怨,回到准确轨道),D—微分控制系统的稳定性,具有超前控制作用,好比"未来"(放眼未来,未雨绸缪,稳定才能发展)。当然这个结论也不可一概而论,只是想让初学者更加快速的理解PID的作用。

      在调整的时候,你所要做的任务就是在系统结构允许的情况下,在这三个参数之间权衡调整,达到最佳控制效果,实现稳快准的控制特点。

       比例控制可快速、及时、按比例调节偏差,提高控制灵敏度,但有静差,控制精度低。积分控制能消除偏差,提高控制精度、改善稳态性能,但易引起震荡,造成超调。微分控制是一种超前控制,能调节系统速度、减小超调量、提高稳定性,但其时间常数过大会引入干扰、系统冲击大,过小则调节周期长、效果不显著。比例、积分、微分控制相互配合,合理选择PID调节器的参数,即比例系数KP、积分时间常数τi和微分时间常数τD,可迅速、准确、平稳的消除偏差,达到良好的控制效果。

      1. 比例环节

       成比例地反映控制系统的偏差信号e(t),偏差一旦产生,控制器立即产生控制作用,以减小偏差。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。

       P参数越小比例作用越强,动态响应越快,消除误差的能力越强。但实际系统是有惯性的,控制输出变化后,实际y(t)值变化还需等待一段时间才会缓慢变化。由于实际系统是有惯性的,比例作用不宜太强,比例作用太强会引起系统振荡不稳定。P参数的大小应在以上定量计算的基础上根据系统响应情况,现场调试决定,通常将P参数由大向小调,以能达到最快响应又无超调(或无大的超调)为最佳参数。

      优点:调整系统的开环比例系数,提高系统的稳态精度,减低系统的惰性,加快响应速度。

      缺点:仅用P控制器,过大的开环比例系数不仅会使系统的超调量增大,而且会使系统稳定裕度变小,甚至不稳定。
      
      2. 积分环节

       控制器的输出与输入误差信号的积分成正比关系。主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数T,T越大,积分作用越弱,反之则越强。

      为什么要引进积分作用?

       比例作用的输出与误差的大小成正比,误差越大,输出越大,误差越小,输出越小,误差为零,输出为零。由于没有误差时输出为零,因此比例调节不可能完全消除误差,不可能使被控的PV值达到给定值。必须存在一个稳定的误差,以维持一个稳定的输出,才能使系统的PV值保持稳定。这就是通常所说的比例作用是有差调节,是有静差的,加强比例作用只能减少静差,不能消除静差(静差:即静态误差,也称稳态误差)。

       为了消除静差必须引入积分作用,积分作用可以消除静差,以使被控的y(t)值最后与给定值一致。引进积分作用的目的也就是为了消除静差,使y(t)值达到给定值,并保持一致。

       积分作用消除静差的原理是,只要有误差存在,就对误差进行积分,使输出继续增大或减小,一直到误差为零,积分停止,输出不再变化,系统的PV值保持稳定,y(t)值等于u(t)值,达到无差调节的效果。

       但由于实际系统是有惯性的,输出变化后,y(t)值不会马上变化,须等待一段时间才缓慢变化,因此积分的快慢必须与实际系统的惯性相匹配,惯性大、积分作用就应该弱,积分时间I就应该大些,反之而然。如果积分作用太强,积分输出变化过快,就会引起积分过头的现象,产生积分超调和振荡。通常I参数也是由大往小调,即积分作用由小往大调,观察系统响应以能达到快速消除误差,达到给定值,又不引起振荡为准。

       对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。PI控制器不但保持了积分控制器消除稳态误差的“记忆功能”,而且克服了单独使用积分控制消除误差时反应不灵敏的缺点。

      优点:消除稳态误差。
      
      缺点:积分控制器的加入会影响系统的稳定性,使系统的稳定裕度减小。

      3. 微分环节

       反映偏差信号的变化趋势,并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间。在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。

      为什么要引进微分作用?

       前面已经分析过,不论比例调节作用,还是积分调节作用都是建立在产生误差后才进行调节以消除误差,都是事后调节,因此这种调节对稳态来说是无差的,对动态来说肯定是有差的,因为对于负载变化或给定值变化所产生的扰动,必须等待产生误差以后,然后再来慢慢调节予以消除。

       但一般的控制系统,不仅对稳定控制有要求,而且对动态指标也有要求,通常都要求负载变化或给定调整等引起扰动后,恢复到稳态的速度要快,因此光有比例和积分调节作用还不能完全满足要求,必须引入微分作用。比例作用和积分作用是事后调节(即发生误差后才进行调节),而微分作用则是事前预防控制,即一发现y(t)有变大或变小的趋势,马上就输出一个阻止其变化的控制信号,以防止出现过冲或超调等。
    D越大,微分作用越强,D越小,微分作用越弱。系统调试时通常把D从小往大调,具体参数由试验决定。

       如:由于给定值调整或负载扰动引起y(t)变化,比例作用和微分作用一定等到y(t)值变化后才进行调节,并且误差小时,产生的比例和积分调节作用也小,纠正误差的能力也小,误差大时,产生的比例和积分作用才增大。因为是事后调节动态指标不会很理想。而微分作用可以在产生误差之前一发现有产生误差的趋势就开始调节,是提前控制,所以及时性更好,可以最大限度地减少动态误差,使整体效果更好。但微分作用只能作为比例和积分控制的一种补充,不能起主导作用,微分作用不能太强,太强也会引起系统不稳定,产生振荡,微分作用只能在P和I调好后再由小往大调,一点一点试着加上去。

       自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入“比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势。这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。PD控制只在动态过程中才起作用,对恒定稳态情况起阻断作用。因此,微分控制在任何情况下都不能单独使用。

      优点:使系统的响应速度变快,超调减小,振荡减轻,对动态过程有“预测”作用。

       在低频段,主要是PI控制规律起作用,提高系统型别,消除或减少稳态误差;在中高频段主要是PD规律起作用,增大截止频率和相角裕度,提高响应速度。因此,控制器可以全面地提高系统的控制性能。

    三、PID控制器的参数整定

       PID控制器的参数整定是控制系统设计的核心内容。它是根据被控过程的特性确定PID控制器的比例系数、积分时间和微分时间的大小。PID控制器参数整定的方法很多,概括起来有两大类:

      1. 理论计算整定法

       它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。

      2. 工程整定方法

       它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定。但无论采用哪一种方法所得到的控制器参数,都需要在实际运行中进行最后调整与完善。现在一般采用的是临界比例法。利用该方法进行 PID控制器参数的整定步骤如下:

      (1)首先预选择一个足够短的采样周期让系统工作;

      (2)仅加入比例控制环节,直到系统对输入的阶跃响应出现临界振荡,记下这时的比例放大系数和临界振荡周期;

      (3)在一定的控制度下通过公式计算得到PID控制器的参数。

      PID调试一般原则

      a.在输出不振荡时,增大比例增益P。
      b.在输出不振荡时,减小积分时间常数Ti。
      c.在输出不振荡时,增大微分时间常数Td。

      PID调试一般步骤

      a. 确定比例增益P

      确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。

      b. 确定积分时间常数Ti

      比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。

      c. 确定微分时间常数Td

      微分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。

      d. 系统空载、带载联调,再对PID参数进行微调,直至满足要求。

       变速积分的基本思想是,设法改变积分项的累加速度,使其与偏差大小相对应:偏差越大,积分越慢;反之则越快,有利于提高系统品质。

    转载的地址http://blog.sciencenet.cn/blog-699887-948853.html

    大家再看看维基百科上面的PID的动图。

     

    https://zh.wikipedia.org/wiki/PID%E6%8E%A7%E5%88%B6%E5%99%A8

    维基百科上面讲的也比较清楚,结合起来看挺好。

    多谢小伙伴更正了里面的小错误,步骤C为微分时间@lubingabby

    展开全文
  • C++ 补码详解

    万次阅读 2020-12-07 19:37:06
    计算机补码详解

    一、引例

    	printf("%d\n", abs(INT_MIN));
    
    • 这段的代码正确输出应该是什么呢?
    • 凭直觉肯定是个正数,因为 abs 这个函数是求一个数的绝对值,数学上任何数的绝对值都是大于等于0的;然而…

    -2147483648

    • 那么我们来研究一下,计算机背后到底做了什么手脚;

    二、机器数和真值

    1、机器数

    • 我们知道计算机是内部由 0 和 1 组成的编码,无论是整数还是浮点数,都会涉及到负数,对于机器来说是不知道正负的,而 “正” 和 “负” 正好是两种对立的状态,所以规定用 “0” 表示 “正”,“1” 表示 “负”,这样符号就被数字化了,并且将它放在有效数字的前面,就成了有符号数;
    • 把符号 “数字化” 的数称为 机器数

    2、真值

    • 而带有 “+” 或者 “-” 的数称为 真值
    • 然而,当符号位和数值部分放在一起后,如何让它一起参与运算呢?那就要涉及到接下来要讲的计算机的各种编码了;

    三、计算机编码

    1、原码

    • 这里的原码并不是源码(源代码)的意思,而是机器数中最简单的一种表示形式;为了快速理解,这里只介绍整数,不介绍小数的情况;

    【原码定义】 符号位为 0 代表正数,符号位为 1 代表负数,数值位为真值的绝对值。

    [x]={x(0<=x<2n1)2n1x(2n1<x<=0) [x]_原 = \begin{cases} x & (0 <= x < 2^{n-1})\\ 2^{n-1} - x & (-2^{n-1} < x <= 0)\\ \end{cases}
    (这里 nn 的取值是 81632648、16、32、64,目前计算机的整型 int 都是 32 位的,但是为了便于阅读,本文介绍的整数都按照 8 位来举例)

    【原码举例】

    • 1)当真值 x = +100101 时,原码为:00100101;

    • 2)当真值 x = -100101 时,原码为:10100101;

    • 原码是最贴近人类的编码方式,并且很容易和真值进行转换,但是让计算机用原码进行加减运算过于繁琐,如果两个数符号位不同,需要先判断绝对值大小,然后用绝对值大的减去绝对值小的,并且符号以绝对值大的数为准,本来是加法却需要用减法来实现;为了让计算机做的事情尽量简单,于是设计出来了补码;

    2、补码

    【补码定义】 正数的补码是它本身,符号位为0;负数的补码为原码数值位取反后+1,符号位为1;
    [x]={x(0<=x<2n1)2n+x(2n1<=x<0) [x]_补 = \begin{cases} x & (0 <= x < 2^{n-1})\\ 2^{n} + x & (-2^{n-1} <= x < 0)\\ \end{cases}
    【补码举例】

    • 1)当真值 x = +100101 时,补码为:00100101;
    • 2)当真值 x = -100101 时, 补码为:11011011;

    (尝试把负数的数值部分和它的补码进行相加运算,可以得到 2n2^n

    3、反码

    • 反码一般用来作为 补码 求 原码 或者 原码 求 补码 的中间过渡;

    【反码定义】 整数的反码是它本身,符号位为0;负数的反码为原码数值取反,符号位为1;
    [x]={x(0<=x<2n1)2n1+x(2n1<x<=0) [x]_反 = \begin{cases} x & (0 <= x < 2^{n-1})\\ 2^{n}-1 + x & (-2^{n-1} < x <= 0)\\ \end{cases}
    【反码举例】

    • 1)当真值 x = +100101 时,补码为:00100101;
    • 2)当真值 x = -100101 时, 补码为:11011010;

    (尝试把负数的数值部分和它的补码进行相加运算,可以得到 2n12^n-1

    4、编码总结

    • 1)这三种机器数的最高位均为符号位;
    • 2)当真值为正数时,原码、补码、反码的表示形式相同,符号位用 “0” 表示,数值部分真值相同;

    [+1]=[00000001]=[00000001]=[00000001][+1] = [00000001]_原 = [00000001]_反 = [00000001]_补

    • 3)当真值为负数时,原码、补码、反码的表示形式不同,但是符号位都用 “1” 表示,数值部分:反码是原码的 “每位求反”,补码是原码的 “取反加1”;

    [1]=[10000001]=[11111110]=[11111111][-1] = [10000001]原 = [11111110]反 = [11111111]补

    四、为什么要用补码

    1、主要目的

    • 计算机的四则运算希望设计的尽量简单。但是引入符号位的概念,对于计算机来说还要考虑正负数相加,等于引入了减法,所以希望是计算机底层只设计一个加法器,就能把加法和减法都做了。

    2、原码运算

    • 对于原码的加法,两个正数相加的情况如下:

    1+1=[00000001]+[00000001]=[00000010]1 + 1 = [00000001]_原 + [00000001]_原 = [00000010]_原 = 2

    • 好像没有什么问题?于是人们开始探索减法,但是起初设计的人的初衷是希望不用减法,只用加法运算就能够将加法和减法都包含进来,于是,我们尝试用原码的负数表示来做运算;

    12=1+(2)=[00000001]+[10000010]=[10000011]1 - 2 = 1 + (-2) = [00000001]_原 + [10000010]_原 = [10000011]_原 = -3

    • 这个结果是错的,于是为了解决减法问题,引入了反码运算;

    3、反码运算

    • 对于反码的加法,一正一负两数相加的情况如下:

    12=1+(2)=[00000001]+[11111101]=[11111110]1 - 2 = 1 + (-2) = [00000001]_反 + [11111101]_反 = [11111110]_反 = -1

    • 没有什么问题?但是某种情况下,反码会有歧义,当两个相同的数相减时,如下:

    11=1+(1)=[00000001]+[11111110]=[11111111]1 - 1 = 1 + (-1) = [00000001]_反 + [11111110]_反 = [11111111]_反 = -0

    • 这里出现了一个奇怪的概念,就是 “负零”,反码运算过程中会出现有两个编码表示零这个数值;
    • 为了解决正负零的问题引入了补码的概念;

    4、补码运算

    • 1)一正一负两个数相加,且非零的情况:

    12=1+(2)=[00000001]+[11111110]=[11111111]1 - 2 = 1 + (-2) = [00000001]_补 + [11111110]_补 = [11111111]_补 = -1

    • 2)一正一负两个数相加,且答案为零的情况:

    11=1+(1)=[00000001]+[11111111]=[00000000]1 - 1 = 1 + (-1) = [00000001]_补 + [11111111]_补 = [00000000]_补 = 0

    两个互为相反数的数相加后,得到的数的补码为 2n2^n(你可以认为是是溢出了),和我们之前提到的定义吻合;

    • 综上所述,计算机内部都是用补码表示;

    五、回到原点

    • 最后我来回答下,文章一开始提到的那个问题,即为什么一个负数的绝对值还是一个负数;
    • 这个负数不是一个一般的负数,它是32位有符号整型的最小值,即:
      INT_MIN=231INT\_MIN = -2^{31}
    • 它的补码表示为:
      [231]=[10000000  00000000  00000000  00000000][-2^{31}]_补 = [10000000\ \ 00000000\ \ 00000000\ \ 00000000]_补
    • 从补码的定义出发:
      [x]={x(0<=x<231)232+x(231<=x<0) [x]_补 = \begin{cases} x & (0 <= x < 2^{31})\\ 2^{32} + x & (-2^{31} <= x < 0)\\ \end{cases}

    231231=231+(231)=X+[231]=02^{31} - 2^{31} = 2^{31} + (- 2^{31}) = X + [-2^{31}]_补 = 0

    解这个简单方程得到 XX 唯一的值为:
    [10000000  00000000  00000000  00000000][10000000\ \ 00000000\ \ 00000000\ \ 00000000]_补

    • 所以在 32位有符号整数体系内, INT_MIN=INT_MININT\_MIN = -INT\_MIN
    展开全文
  • Linux中top命令参数详解

    万次阅读 多人点赞 2019-07-31 19:28:22
    top命令用法 top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。 top的使用方式 top [-d number] | top [-bnp] 参数解释: -d:number代表秒数,表示top...

    top命令用法

    top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。

    top的使用方式 top [-d number] | top [-bnp]

    参数解释:

    -d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。 -b:以批次的方式执行top。 -n:与-b配合使用,表示需要进行几次top命令的输出结果。 -p:指定特定的pid进程号进行观察。

    在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):

    ?:显示在top当中可以输入的命令 P:以CPU的使用资源排序显示 M:以内存的使用资源排序显示 N:以pid排序显示 T:由进程使用的时间累计排序显示 k:给某一个pid一个信号。可以用来杀死进程 r:给某个pid重新定制一个nice值(即优先级) q:退出top(用ctrl+c也可以退出top)。

    top各输出参数含义

    下面是使用top命令来进行性能检测的截图:

    图一(ubuntu):

    图二(centos):

    一、top前5行统计信息

    第1行:top - 05:43:27 up 4:52, 2 users, load average: 0.58, 0.41, 0.30 
    第1行是任务队列信息,其参数如下:

    内容 含义
    05:43:27 表示当前时间
    up 4:52 系统运行时间 格式为时:分
    2 users 当前登录用户数
    load average: 0.58, 0.41, 0.30 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

    load average: 如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。 

    第2行:Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie 
    第3行:%Cpu(s): 37.0 us, 3.7 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 
    第2、3行为进程和CPU的信息 
    当有多个CPU时,这些内容可能会超过两行,其参数如下:

    内容 含义
    159 total 进程总数
    1 running 正在运行的进程数
    158 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    37.0 us 用户空间占用CPU百分比
    3.7 sy 内核空间占用CPU百分比
    0.0 ni 用户进程空间内改变过优先级的进程占用CPU百分比
    59.3 id 空闲CPU百分比
    0.0 wa 等待输入输出的CPU时间百分比
    0.0 hi 硬中断(Hardware IRQ)占用CPU的百分比
    0.0 si 软中断(Software Interrupts)占用CPU的百分比
    0.0 st  


    第4行:KiB Mem: 1530752 total, 1481968 used, 48784 free, 70988 buffers 
    第5行:KiB Swap: 3905532 total, 267544 used, 3637988 free. 617312 cached Mem 
    第4、5行为内存信息 
    其参数如下:

    内容 含义
    KiB Mem: 1530752 total 物理内存总量
    1481968 used 使用的物理内存总量
    48784 free 空闲内存总量
    70988 buffers(buff/cache) 用作内核缓存的内存量
    KiB Swap: 3905532 total 交换区总量
    267544 used 使用的交换区总量
    3637988 free 空闲交换区总量
    617312 cached Mem 缓冲的交换区总量。
    3156100 avail Mem 代表可用于进程下一次分配的物理内存数量

    上述最后提到的缓冲的交换区总量,这里解释一下,所谓缓冲的交换区总量,即内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。 

    计算可用内存数有一个近似的公式: 
    第四行的free + 第四行的buffers + 第五行的cached

    二、进程信息

    列名 含义
    PID 进程id
    PPID 父进程id
    RUSER Real user name
    UID 进程所有者的用户id
    USER 进程所有者的用户名
    GROUP 进程所有者的组名
    TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
    PR 优先级
    NI nice值。负值表示高优先级,正值表示低优先级
    P 最后使用的CPU,仅在多CPU环境下有意义
    %CPU 上次更新到现在的CPU时间占用百分比
    TIME 进程使用的CPU时间总计,单位秒
    TIME+ 进程使用的CPU时间总计,单位1/100秒
    %MEM 进程使用的物理内存百分比
    VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    SWAP 进程使用的虚拟内存中,被换出的大小,单位kb
    RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    CODE 可执行代码占用的物理内存大小,单位kb
    DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    SHR 共享内存大小,单位kb
    nFLT 页面错误次数
    nDRT 最后一次写入到现在,被修改过的页面数。
    S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
    COMMAND 命令名/命令行
    WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
    Flags 任务标志

    其他

    默认进入top时,各进程是按照CPU的占用量来排序的。

    1、在top基本视图中,按键盘数字“1”可以监控每个逻辑CPU的状况: 

     
    2、敲击键盘‘b’(打开关闭加亮效果)top视图变换如下: 

    PID为16283为当前top视图中唯一的运行态进程。也可以敲击键盘‘y’来打开或者关闭运行态进程的加亮效果。

    3、敲击键盘‘x’(打开/关闭排序列的加亮效果),top视图变换如下: 

    可以看到现在是按"%CPU"进行排序的,可以按”shift+>”或者”shift+<”左右改变排序序列。

    4、改变进程显示字段

    在top基本视图中,敲击”f”进入另一个视图,在这里可以编辑基本视图中的显示字段:

     

    用上下键选择选项,按下空格键可以决定是否在基本视图中显示这个选项。

    top命令是一个非常强大的功能,但是它监控的最小单位是进程,如果想监控更小单位时,就需要用到ps或者netstate命令来满足我们的要求。

    参考文献

    1、https://blog.csdn.net/quiet_girl/article/details/50668126

    2、http://www.zhimengzhe.com/linux/298422.html

    展开全文
  • Python3开发详解

    万人学习 2017-09-22 15:40:58
    Python3 开发详解,课程从基础的环境搭建讲起,详细讲述了Python开发的方方面面,内容包括:编程基础、函数、数据结构、异常处理、字符串、数字、网络编程、多线程、数据库处理等。
  • TCP/IP协议详解

    万次阅读 多人点赞 2019-05-11 08:40:41
    认识HTTP协议 它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本的构架。 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网... ...

    为什么会有TCP/IP协议

    在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。

    但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP就是为此而生。TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。

    TCP/IP模型

    在这里插入图片描述
    应用层:
    向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。

    传输层:
    提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。

    网络层 :
    负责相邻计算机之间的通信。其功能包括三方面。
    一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。

    二、处理输入数据报:首先检查其合法性,然后进行寻径–假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。

    三、处理路径、流控、拥塞等问题。

    网络接口层:
    这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。

    IP

    IP 用于计算机之间的通信。

    IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。

    通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。

    IP 负责将每个包路由至它的目的地。

    IP地址

    每个计算机必须有一个 IP 地址才能够连入因特网。

    每个 IP 包必须有一个地址才能够发送到另一台计算机。

    网络上每一个节点都必须有一个独立的Internet地址(也叫做IP地址)。现在,通常使用的IP地址是一个32bit的数字,也就是我们常说的IPv4标准,这32bit的数字分成四组,也就是常见的255.255.255.255的样式。IPv4标准上,地址被分为五类,我们常用的是B类地址。具体的分类请参考其他文档。需要注意的是IP地址是网络号+主机号的组合,这非常重要。

    CP/IP 使用 32 个比特来编址。一个计算机字节是 8 比特。所以 TCP/IP 使用了 4 个字节。
    一个计算机字节可以包含 256 个不同的值:
    00000000、00000001、00000010、00000011、00000100、00000101、00000110、00000111、00001000 … 直到 11111111。
    现在,你知道了为什么 TCP/IP 地址是介于 0 到 255 之间的 4 个数字。

    TCP 使用固定的连接

    TCP 用于应用程序之间的通信。

    当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。

    这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

    UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。

    IP 路由器

    当一个 IP 包从一台计算机被发送,它会到达一个 IP 路由器。

    IP 路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器。

    在一个相同的通信中,一个包所经由的路径可能会和其他的包不同。而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址。

    域名

    12 个阿拉伯数字很难记忆。使用一个名称更容易。

    用于 TCP/IP 地址的名字被称为域名。www.baidu.com就是一个域名。

    当你键入一个像https://www.baidu.com/这样的域名,域名会被一种 DNS 程序翻译为数字。

    在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。

    当一个新的域名连同其 TCP/IP 地址一同注册后,全世界的 DNS 服务器都会对此信息进行更新。

    TCP/IP

    TCP/IP 意味着 TCP 和 IP 在一起协同工作。

    TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。

    IP 负责计算机之间的通信。

    TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

    IP 负责将包发送至接受者。

    TCP报文格式

    在这里插入图片描述
    16位源端口号:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址。

    16位目的端口号:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

    32位序号:32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现,序列码实际上是初始序列码(Initial Sequence Number,ISN),而第一个数据字节是ISN+1。这个序列号(序列码)可用来补偿传输中的不一致。

    32位确认序号:32位的序列号由接收端计算机使用,重组分段的报文成最初形式。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。

    4位首部长度:4位包括TCP头大小,指示何处数据开始。

    保留(6位):6位值域,这些位必须是0。为了将来定义新的用途而保留。

    标志:6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。

    16位窗口大小:用来表示想收到的每个TCP数据段的大小。TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16字节字段,因而窗口大小最大为65535字节。

    16位校验和:16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。检验和覆盖了整个的TCP报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。

    16位紧急指针:指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。

    选项:长度不定,但长度必须为1个字节。如果没有选项就表示这个1字节的域等于0。

    数据:该TCP协议包负载的数据。

    在上述字段中,6位标志域的各个选项功能如下。

    URG:紧急标志。紧急标志为"1"表明该位有效。

    ACK:确认标志。表明确认编号栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。

    PSH:推标志。该标志置位时,接收端不将该数据进行队列处理,而是尽可能快地将数据转由应用处理。在处理Telnet或rlogin等交互模式的连接时,该标志总是置位的。

    RST:复位标志。用于复位相应的TCP连接。

    SYN:同步标志。表明同步序列编号栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

    FIN:结束标志。

    TCP三次握手

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
    在这里插入图片描述
    (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

    (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

    (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    简单来说,就是

    1、建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认

    2、服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态

    3、客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。

    SYN攻击:

    在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:

    #netstat -nap | grep SYN_RECV
    

    TCP四次挥手

    所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
    在这里插入图片描述
    由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

    (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

    (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

    (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

    为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

    这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

    为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
    原因有二:
    一、保证TCP协议的全双工连接能够可靠关闭
    二、保证这次连接的重复数据段从网络中消失

    先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

    再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

    认识HTTP协议

    它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本的构架。

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

    HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

    HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

    TCP/IP协议它们并不是一个协议,而是一个协议簇,这些协议的目的,就是使计算机之间可以进行信息交换,并且两大协议其中都包含其他的协议,虽然放在了一起,但它们的作用和工作是不一样的。

    HTTP协议定义了内容的格式,这是一个应用层的协议,应用层协议的内容需要通过传输层在浏览器和服务器之间传送,TCP/IP协议是ISO网络参考模型的一种实现。在TCP/IP协议中,与网络程序员相关的主要有两层:传输层和应用层。

    传输层协议负责解决数据传输问题,包括数据通行的可靠性问题。传输层依赖更底层的网络层来完成实际的数据传输,在TCP/IP网络协议中,负责可靠通信的传输层协议为TCP协议。而网络层一般用网络驱动来实现,普通的程序员不会涉及;在TCP/IP协议中,网络层的协议为IP协议。

    HTTP请求处理图解

    浏览器与Web服务器之间的协议是应用层协议,当前,我们主要遵循的协议为HTTP/1.1。HTTP协议是Web开发的基础,这是一个无状态的协议,客户机与服务器之间通过请求和相应完成一次会话(Session)。
    在这里插入图片描述

    客户端、web服务器、HTTP三者之间的联系

    (1)客户端与web服务器工作过程
    当浏览器寻找到Web服务器的地址之后,浏览器帮助我们把对服务器的请求转换为一系列参数发送给Web服务器。服务器受到浏览器发来的请求参数之后,将会分析这些数据,并进行处理。然后向浏览器回应处理的结果,也就是一些新的数据;这些数据通常是HTML网页或者图片。浏览器收到之后,解析这些数据,将它们呈现在浏览器的窗口中,这就是我们看到的网页。
    (2)客户端与web服务器遵守共同标准:HTTP协议
    在浏览器与Web服务器的对话中,需要使用双方都能够理解的语法规范进行通信,这种程序之间进行通信的语法规范,我们称之为协议。协议有许多种,根据国际标准化组织ISO的网络参考模型,程序与程序之间的通信可分为7层,从低到高依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

    ISO模型:
    在这里插入图片描述
    (3)客户端、web服务器、数据库服务器图解
    在这里插入图片描述

    浏览器与服务器图解

    HTTP协议就是TCP/IP协议中专门用于浏览器与Web服务器之间通信的应用层协议。应用层协议依赖于传输层协议完成数据传输,传输层协议依赖于网络层协议王城数据传输,他们之间的关系如下图(浏览器与服务器之间网络通信的传输过程):
    在这里插入图片描述

    展开全文
  • ViewPager 详解(一)---基本入门

    万次阅读 多人点赞 2014-08-09 09:48:01
    前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能...1、《ViewPager 详解(一)---基本入门》 2、《ViewPager 详...
  • VC++深入详解

    千次下载 热门讨论 2012-12-01 09:11:40
    VC++深入详解教程,供大家一起参考学习。
  • adb操作命令详解及大全

    万次阅读 多人点赞 2011-10-11 19:07:48
    adb是什么?:adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具。adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的...
  • c语言链表详解(超详细)

    万次阅读 多人点赞 2018-06-03 16:16:01
    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入...
  • 【目标检测】Faster RCNN算法详解

    万次阅读 多人点赞 2016-04-21 15:08:06
    继RCNN,fast RCNN之后,目标检测界的领军人物Ross Girshick在2015年提出faster RCNN。目标检测速度达到15fps。
  • python多线程详解(超详细)

    万次阅读 多人点赞 2019-09-28 08:33:31
    python中的多线程是一个非常重要的知识点,今天为大家对多线程进行详细的说明,代码中的注释有多线程的知识点还有测试用的实例。 import threading from threading import Lock... python多线程详解 什么是线程? ...
  • 博客文章《完成端口详解》配套代码

    千次下载 热门讨论 2011-10-31 17:50:38
    这份代码是我博客里的文章《完成端口详解 - 手把手教你玩转网络编程系列之三》的配套代码 里面的代码包括VC++2008/VC++2010编写的完成端口服务器端的代码,还包括一个对服务器端进行压力测试的客户端,都是经过我...
  • javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV) javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV...

空空如也

1 2 3 4 5 ... 20
收藏数 957,731
精华内容 383,092
关键字:

详解