zoukankan      html  css  js  c++  java
  • 猴子补丁 GC机制 操作系统

    猴子补丁

    猴子补丁的定义:是指再动态语言中,不去改变源码而对功能进行追加和变更。

            猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerilla patch)”,后来guerilla就渐渐的写成了gorllia(猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的。

    猴子补丁的用处:1.再运行时替换方法,属性等

                                   2.再不修改第三方代码的情况下增加原来不支持的功能

                                    3.再运行时为内存中的对象增加patch而不是再磁盘的源代码中增加

    垃圾回收机制(GC):

    什么是垃圾回收机制:

    是python解释器自带的一种机制,专门用来回收不可用的变量值所占用的内存空间

    为什么要用垃圾回收机制:

    在程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,所以需要用到垃圾回收机制。提高程序员工作效率。

    栈区:存放变量名与值内存地址关联关系

    堆区:存放变量值,内存管理回收的则是堆区的内容

    直接引用:从栈区出发直接引用到的内存地址

    间接引用:指的是从栈区出发引用到堆区后,再通过进一步引用才能到达的内存地址。

     
    直接引用与间接引用

    GC原理分析:

    引用计数:变量值与变量名关联的次数

    缺点:有可能出现循环引用

     
    循环引用

    循环引用会导致:值不再被任何名字关联,但是值的引用计数不会为0,应该被回收,但是不能被回收

    标记清除:

    栈区相当于‘根’,凡是从‘根’出发可以访问到的,都可以称之为‘有根之人,有根之人当活,无根之人当死’

    内部发生的原理:标记的过程其实就是,遍历所有的GC Roots对象(栈区内容中的所有内容或者线程都可以称之为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除。清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉

    再进行标记清除的过程中,每次循环检查一遍会引发效率问题,所以会用到分代回收

    分代回收:

    分代:其核心思想是在多次扫描的情况下,都没有被回收的变量,gc机制就会认为改变量是常用变量,gc对其扫描的频率会降低。原理如下:

                新生代:新定义的变量名   扫描频率最大,当经过几次扫描后,该值一直存在,会被系统标记为青春代

                青春代:扫描频率一般,当经过几次扫描后,该值一直存在,会被系统标记为老年代

                老年代:扫描频率最低,最安全

    回收:引用计数为0,就会被回收

     
    分代回收

    操作系统:

    什么是操作系统:是一个协调,控制,管理计算机硬件资源与软件资源的应用程序

    操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的。

     

    代计算机或者网络都是多用户的,多个用户不仅共享硬件,而且共享文件,数据库等信息,共享意味着冲突和无序。

    操作系统主要使用来

    1.记录哪个程序使用什么资源

    2.对资源请求进行分配

    3.为不同的程序和用户调解互相冲突的资源请求。

    我们可将上述操作系统的功能总结为:处理来自多个程序发起的多个(多个即多路)共享(共享即复用)资源的请求,简称多路复用

    多路复用有两种实现方式

    1.时间上的复用

    当一个资源在时间上复用时,不同的程序或用户轮流使用它,第一个程序获取该资源使用结束后,在轮到第二个。。。第三个。。。

    例如:只有一个cpu,多个程序需要在该cpu上运行,操作系统先把cpu分给第一个程序,在这个程序运行的足够长的时间(时间长短由操作系统的算法说了算)或者遇到了I/O阻塞,操作系统则把cpu分配给下一个程序,以此类推,直到第一个程序重新被分配到了cpu然后再次运行,由于cpu的切换速度很快,给用户的感觉就是这些程序是同时运行的,或者说是并发的,或者说是伪并行的。至于资源如何实现时间复用,或者说谁应该是下一个要运行的程序,以及一个任务需要运行多长时间,这些都是操作系统的工作。

    2.空间上的复用

    每个客户都获取了一个大的资源中的一小部分资源,从而减少了排队等待资源的时间。

    例如:多个运行的程序同时进入内存,硬件层面提供保护机制来确保各自的内存是分割开的,且由操作系统控制,这比一个程序独占内存一个一个排队进入内存效率要高的多。

    有关空间复用的其他资源还有磁盘,在许多系统中,一个磁盘同时为许多用户保存文件。分配磁盘空间并且记录谁正在使用哪个磁盘块是操作系统资源管理的典型任务。

    这两种方式合起来便是多道技术

    一 操作系统的作用:

        1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口

        2:管理、调度进程,并且将多个进程对硬件的竞争变得有序

    二 多道技术:

        1.产生背景:针对单核,实现并发

        ps:

        现在的主机一般是多核,那么每个核都会利用多道技术

        有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个

        cpu中的任意一个,具体由操作系统调度算法决定。

        2.空间上的复用:如内存中同时有多道程序

        3.时间上的复用:复用一个cpu的时间片

          强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样

                才能保证下次切换回来时,能基于上次切走的位置继续运行

  • 相关阅读:
    RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例
    com.rabbitmq.client.impl.ForgivingExceptionHandler.log:119 -An unexpected connection driver error occured
    ActiveMq报错Channel was inactive for too (>30000)long
    CentOS 7.x 如何关闭 numa
    Ubuntu 18.04 使用Systemd管理MySQL 5.6
    Ubuntu 18.04 启用 rc.local 设置开机启动
    java.lang.IllegalArgumentException: No enum constant org.apache.ws.commons.schema.XmlSchemaForm.
    Caused by: io.protostuff.ProtobufException: Protocol message contained an invalid tag (zero).
    Innodb中MySQL如何快速删除2T的大表
    springmvc log4j配置
  • 原文地址:https://www.cnblogs.com/ltyc/p/14454979.html
Copyright © 2011-2022 走看看