六.热修复

前言
什么是热修复?

应用在上线后出现bug需要及时修复,不用再发布新的安装包,只需要发布补丁包,在用户无感知情况下修复掉bug。

如何进行热修复?
  • 服务端:补丁包管理
  • 用户端:执行热修复
  • 开发端:生成补丁包
热修复需要解决的问题

开发端

  • 补丁包是什么?

    补丁包就是修复了bug的dex文件和jar包。

  • 如何生成补丁包?

    将修复了bug的java文件通过javac编译成class文件,然后通过dx工具将class文件打包成dex文件或者是jar包,这就是补丁包。

  • 开启混淆后呢?

    开启混淆后,类名和包名会发生改变,为了保证混淆产生的包名和类名不变,我们需要通过mapping文件来解决。

  • 对比改动自动生成补丁包(gradle)?

    gradle生成热修复的插件方式,适合的场景是问题较小、编写的代码不多的情况。
    用户端

  • 什么时候执行热修复?

    越早越好,要在加载bug类之前执行,完成热修复。

  • 如果应用已经在运行,并且这个类已经加载过了,还能进行热修复吗?

    不能进行热修复了,因为如果这个类已经加载过了,就会存在于缓存中,不会再从dex文件中去查找这个类的class文件。

  • 热修复完成后,补丁包dex文件和原来的dex文件,是否需要删除?

    不能删除。
    如果补丁包dex文件被删除,缓存又被清空的情况下,又会执行原来没有bug的流程;
    如果原来的dex文件被删除,那么dex文件中包含的所有逻辑代码都被会删除,我们的app将无法运行。

  • 怎么执行热修复(使用补丁包)?

    将补丁包下载下来,然后通过反射技术,将补丁包通过DexPathList中的makeElement方法生成修复bug的Element[]数组,再通过反射技术,获取到存在bug的Element[]数组,将修复了bug的Element[]和存在bug的Element[]拼接成一个新的数组,在进行类加载的时候,就会优先加载修复了bug的dex文件中的class,从而实现热修复。

  • Android版本兼容性问题
    1. AndroidN(Android7.0)热点代码存在JIT即时编译,解决方案是自定义一个PathClassLoader,去掉缓存代码逻辑,就可以先加载修复了bug的代码。
    2. Dalvik(Android5.0)虚拟机存在不同的dex文件使用兼容性问题,如果没有直接使用别的dex文件中的类,该dex文件中这个类就会被打上标签标识,从而无法加载修复了bug的dex文件。
      解决方案是,通过字节码插桩技术,对存在bug的dex文件中的字节码文件进行代码编写,引用别的dex文件中的类,消除标签标识,从而可以通过热修复加载修复bug的dex文件中的class,完成热修复。
    3. 不同的版本,一些方法的方法名和参数个数和参数类型不尽相同,所以也需要进行适配。
1.Android常用的热修复解决方案
Tinker(腾讯)QZone(腾讯)AndFix(阿里)Robust(美团)
类替换YYNN
so替换YYNN
资源替换YYNN
全平台生效YYYY
及时生效NNYY
性能损耗较小较大较小较小
补丁包大小较小较大一般一般
开发透明YYNN
复杂度较小较小复杂复杂
gradle支持YNNN
rom体积较大较小较小较小
成功率较高较高一般最高

AndFix(补丁包是.dex文件)
是由阿里开发的热修复框架,但是已经废弃,很多年没有维护了。
他的热修复实现原理如下:
在native层动态替换Java层的方法,通过native层hook Java层代码。

Robust(补丁包是.dex文件)
由美团开发,目前抖音就采用这种热修复方案,可以及时生效。
他的热修复实现原理如下:
利用gradle插件,在我们写的类中,编译时生成一个静态接口变量,在方法中会对这个接口变量进行判断。
如果我们需要进行热修复,就写一个接口的实现类,然后通过类加载和反射,找到我们写的类并创建实例,赋值给要修复bug的类中的静态接口变量即可,当我们的方法中判断到这个接口变量非空时,就会去执行实现类中的业务逻辑,从而达到了修复bug的目的,并且是及时生效的。

Tinker(补丁包是差分包)
由腾讯开发,目前微信就采用了这中热修复方案,优点是可以可以修复类、so包和资源文件。
他的热修复实现原理如下:
由有bug的apk文件和修复bug的apk文件共同生成一个差分包patch,这个patch文件就是我们的补丁包,下载这个差分包和有bug的apk,就可以生成修复bug的apk。如果没有资源文件修复,那么就会生成的就是一个.dex文件,可以通过类加载和反射技术,加载修复bug的类,从而实现热修复。

2.ClassLoader类加载机制
2.1 Android类加载器

ClassLoader继承关系:

  • ClassLoader
    • BootClassLoader 用于加载Android Framework层class文件
    • BaseDexClassLoader 包含了DexPathList{dexElement[]、findClass()、makeElement[]}
      • PathClassLoader 额外提供的动态类加载器
        加载指定的dex、以及jar、zip、apk中的classes.dex
      • DexClassLoader Android应用程序类加载器
        加载指定的dex、以及jar、zip、apk中的classes.dex

使用举例:

public class MyApplication extends Application {

  private final String TAG = MyApplication.class.getSimpleName();

  @Override
  public void onCreate() {
    super.onCreate();

    //获取使用ClassLoader的场景
    ClassLoader classLoader1 = TKActivity.class.getClassLoader();
    ClassLoader classLoader2 = AppCompatActivity.class.getClassLoader();
    ClassLoader classLoader3 = Application.class.getClassLoader();
    ClassLoader classLoader4 = getClassLoader();
    Log.e(TAG, "classLoader1:" + classLoader1.toString());
    Log.e(TAG, "classLoader2:" + classLoader2.toString());
    Log.e(TAG, "classLoader3:" + classLoader3.toString());
    Log.e(TAG, "classLoader4:" + classLoader4.toString());
  }
}
 
打印日志:
E/MyApplication: classLoader1:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tangkun.xiangxuestudy-4SJ9lfa-q8--dmTGHgBPbA==/base.apk"],nativeLibraryDirectories=[/data/app/com.tangkun.xiangxuestudy-4SJ9lfa-q8--dmTGHgBPbA==/lib/arm64, /system/lib64, /product/lib64]]]
E/MyApplication: classLoader2:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tangkun.xiangxuestudy-4SJ9lfa-q8--dmTGHgBPbA==/base.apk"],nativeLibraryDirectories=[/data/app/com.tangkun.xiangxuestudy-4SJ9lfa-q8--dmTGHgBPbA==/lib/arm64, /system/lib64, /product/lib64]]]
E/MyApplication: classLoader3:java.lang.BootClassLoader@4c33cb2
E/MyApplication: classLoader4:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tangkun.xiangxuestudy-4SJ9lfa-q8--dmTGHgBPbA==/base.apk"],nativeLibraryDirectories=[/data/app/com.tangkun.xiangxuestudy-4SJ9lfa-q8--dmTGHgBPbA==/lib/arm64, /system/lib64, /product/lib64]]]
2.2 双亲委托机制

当我们在页面中使用PathClassLoader去加载一个类的全路径时,代码如下:
getClassLoader().loadClass("com.tangkun.study.MainActivity");
此时,getClassLoader方法返回的是PathClassLoader,但是该类中没有loadClass方法;所以我们从他的父类BaseDexClassLoader中去寻找这个方法,这个类中同样没有loadClas方法;所以我们再从他的父类ClassLoader中去查找这个方法,代码如下:

//ClassLoader.java
//这一段就是双亲委托机制代码,要找到某个class文件,先委托给父类parent去查找,
//如果父类没有查找到,则通过子类去查找class文件,并且找到的class文件会被存放在缓存中
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
        //若class被加载过了,会存到缓存中。所以先从缓存中查找是否存在class
        //缓存中的class是从native层中查找得来
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            try {
                //parent是BootClassLoader
                if (parent != null) {
                    //调用BootClassLoader.loadClass去查找class;
                    //这里会调用到native层的findLoadedClass方法,从缓存中查找class
                    c = parent.loadClass(name, false);
                } else {
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
            }
            //如果父类无法加载到class,则从PathClassLoader中去查找class
            if (c == null) {
                //findClass是一个抽象方法,在子类BaseDexClassLoader中实现了该方法
                c = findClass(name);
            }
        }
        return c;
}

//BaseDexClassLoader.java
private final DexPathList pathList;
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
    List<Throwable> suppressedExceptions = new ArrayList<Throwable>();
    //pathList是传入的DexPathList对象,所以我们从DexPathList类中查看findClass方法
    Class c = pathList.findClass(name, suppressedExceptions);
    //省略非核心代码
    return c;
}

//DexPathList.java
//一个dex文件对应dexElements数组中一个元素Element;
//因为我们打出来的apk包中可能存在多个dex文件,所以是数组。
//DexPathList包含了内部类Element
private Element[] dexElements;
public Class<?> findClass(String name, List<Throwable> suppressed) {
    //从dex文件数组中遍历每个dex文件
    for (Element element : dexElements) {
        //Android中,多个java文件会被编译成多个.class文件,多个class文件会被打包成一个dex文件
        //一个dex文件中包含多个class文件,所以从class文件集合中去查找某一个确定的class文件
        //最后会调用到native层去查找这个class
        Class<?> clazz = element.findClass(name, definingContext, suppressed);
        if (clazz != null) {
            return clazz;
        }
    }
    //省略非核心代码
    return null;
}
2.3 类查找流程

class查找流程:

  • 先从缓存中去查找class是否存在;
  • 如果缓存中不存在,则委托给父类,由父类查找class是否存在;
  • 若父类无法查找到class,则由当前子类去查到该类。
3.插桩式热修复运行期修复落地

制作补丁包流程:
1、把Bug修复掉后,先生成类的class文件。
2、执行命令:
dx --dex --output=patch.jar com/tangkun/study/Utils.class

应用补丁包: patchElment(补丁包生成的) + oldElement(APK原有的) 赋值给oldElement
1、获取程序的PathClassLoader对象
2、反射获得PathClassLoader父类BaseDexClassLoader的pathList对象
3、反射获取pathList的dexElements对象 (oldElement)
4、把补丁包变成Element数组:patchElement(反射执行makePathElements)
5、合并patchElement+oldElement = newElement (Array.newInstance)
6、反射把oldElement赋值成newElement

makePathElements参数:
1、补丁包:List[new File(“/sdcard/patch.jar”)]
2、optimizedDirectory 传一个私有目录就行比如:context.getCacheDir()
3、ArrayList suppressedExceptions = new ArrayList();

3.1 什么是字节码插桩?

所谓字节码插桩,就是在字节码文件中进行代码编写,而我们的class文件就属于字节码文件。

我们编写的java文件在经过编译后,会生成class文件,class文件是2进制格式的,0101这种格式,我们肯定是无法直接在这种格式的文件上进行编码的。所以我们需要借助于别的工具来进行字节码文件代码编写的,比如:第三方框架ASM

如果直接对字节码操作是什么样的一个流程呢?

  • 通过文件输入流将字节码文件读到字节数组(byte[])中;
  • 对字节数组(byte[])中的数据进行修改;
  • 通过文件输出流将字节数组(byte[])写回字节码文件。
3.2 ASM

概念:ASM是用来操作字节码(.java文件生成的.class文件)的框架,按照class文件的格式,解析、修改、生成class,可以动态生成类或者增强现有类的功能。
类似于Gson框架,是用来操作json格式字符串的。

怎么使用ASM?
首先需要在build.gradle依赖ASM的的库,然后让我们需要使用字节码插桩的地方(比如:类、方法、属性),添加上ASM注解并带上插桩的实现类,然后在插桩的实现类中完成相应的功能。
开始和结束的地方,仍然还是需要使用文件输入输出流,用于读取和写入字节码文件;中间就是要我们自己实现借助于ASM来完成插桩代码的编写工作;在手写插桩代码之前,我们可以将需要实现的功能写入我们的java文件中,然后编译生成class文件,然后借助javap命令查看class文件中的代码(也可以通过ASM Bytecode Viewer插件来查看,我的AS由于版本原因,即使安装了这个插件还是看不了java文件的字节码代码;但是可以通过编译后生成的class文件,然后再利用这个插件查看,嘿嘿(*^▽^*)),然后借助于这些代码和ASM的功能,来完成插桩代码的编写。

然后我们就可以得到修复bug后的class文件,然后通过SDK的dx工具,通过执行命令行的命令,可以将class文件转换成dex文件或者是jar文件,我们就直接转换成dex文件,给后面热修复使用。

3.3 热修复落地实现

1、获取程序的PathClassLoader对象
2、反射获得PathClassLoader父类BaseDexClassLoader的pathList对象
3、反射获取pathList的dexElements对象 (oldElement)
4、把补丁包变成Element数组:patchElement(反射执行makePathElements)
5、合并patchElement+oldElement = newElement (Array.newInstance)
6、反射把oldElement赋值成newElement

3.4 热修复存在的版本兼容性问题

AndroidN(也就是Andorid7.0)

会进行JIT即时编译编译,会将app经常使用的一些代码也叫做热点代码,存储到profile文件中,在手机空闲的时候,会执行这些热点代码,从而产生了缓存。
因此,会导致我们热修复失败,因为即使我们通过Hook技术将修复了bug的class放在了有bug的class数组前面;但是由于缓存的原因,不会访问我们这个修复了bug的Element数组;而直接从缓存中获取class进行加载,而这个缓存中的class是存在bug的。所以,热修复无效。
如何解决上面这个问题呢?
采取运行时替换掉PathClassLoader方案,重新创建一个自定义的PathClassLoader,但是不重写缓存的代码,虽然会存在一些性能的影响,但是相较于有bug,这点性能的损耗还是值得的;自定义的PathClassLoader由于没有重写缓存逻辑,因此我们在进行热修复后,会优先执行修复了bug的class,从而问题得到解决。

Android5.0 Dalvik虚拟机

5.0及以下使用的虚拟机是Darvik,存在不同的dex文件之间使用问题,如果有bug的dex文件的类中没有直接引用过别的dex文件中的类时(需要对别的dex文件中类进行导包才行,反射不可以),这个类就会被标记成isVerified;在有这个标记之后,有bug的dex文件就无法使用别的dex文件中的类。
如何解决上面的问题呢?
采用字节码插桩技术,在有bug的类编译成的class文件中,通过字节码插桩技术,将另外一个dex文件中的类通过插桩技术写入并且导包,从而将有bug的类取消isVerified标记。我们就可以通过热修复,将修复bug的dex文件中的class添加到有bug的class数组前面,从而优先执行我们修复bug的class中的代码。

扩展知识:
不同版本还存在方法名称、方法中参数个数以及类型的差异,所以,我们还需要对这些情况做版本适配。
比如:我们DexPathList类中的makePathElements方法,是用来生成Element[]数组的。我们通过热修复,将修复bug的dex文件添加到这个数组的前面,达到优先执行修复bug的目的。但是这个方法在不同的版本中存在一定的差异,举例:
Android9.0.0: makePathElements(List<File> files, File optimizedDirectory,List<IOException> suppressedExceptions)
Android5.1.0: makeDexElements(ArrayList<File> files, File optimizedDirectory, ArrayList<IOException> suppressedExceptions)

4.自动化补丁方案
4.1 自定义插件

自己开发插件有3种方式:

  • Build script脚本
    • 把插件写在build.gradle中,一般用于简单的逻辑,只在该build.grale中文件可见。
  • buildSrc目录
    • 将插件源代码放在buildSrc/src/main/groovy/中,只在该项目中可见。
    • 实现Plugin接口,并重写apply方法。
  • 独立项目
    • 一个独立的Java项目/模块,可以将文件发布到仓库(Jcenter),使其他项目方便引入。
4.2 判断哪些文件需要打包进补丁包

可以采用缓存机制,将之前的class文件和这个class文件生成的md5值存起来;

  • 如果缓存中没有这个class文件,则表示我们的这个class文件是新建的,所以需要打包进入补丁包
  • 如果缓存中有这个class文件,那么就去比较缓存中class文件的md5值与我们重新生成的class文件的md5值是否一致,不一致表示新的class文件有代码更改,同样需要打包进入补丁包;
  • 如果缓存文件和新生成的class文件的md5值相同,则无需打包进入补丁包。

扩展知识:
可以通过Java代码,执行命令行,然后进行打包操作:

  1. 把.java编译为.class
    Runtime.getRuntime().exe("javac -bootclasspath android.jar路径 java源码和R.java路径");
  2. 把.class编译为.dex
    Runtime.getRuntime().exe("dx --dex classes路径");
4.3 代码混淆问题的解决方案

需要保证这一次混淆后的类名和上一次混淆后的类名相同,通过-applyMapping配置

代码混淆的时候会生成一份mapping文件,通过将mapping文件缓存下来,然后找到没有混淆的文件名、方法名等,然后进行处理。

面试题
1.说一说热修复的方案有哪些,并说说他们的区别?
Tinker(腾讯)QZone(腾讯)AndFix(阿里)Robust(美团)
类替换YYNN
so替换YYNN
资源替换YYNN
全平台生效YYYY
及时生效NNYY
性能损耗较小较大较小较小
补丁包大小较小较大一搬一搬
开发透明YYNN
复杂度较小较小复杂复杂
gradle支持YNNN
rom体积较大较小较小较小
成功率较高较高一搬最高

AndFix(补丁包是.dex文件)
是由阿里开发的热修复框架,但是已经废弃,很多年没有维护了。
他的热修复实现原理如下:
在native层动态替换Java层的方法,通过native层hook Java层代码。

Robust(补丁包是.dex文件)
由美团开发,目前抖音就采用这种热修复方案,可以及时生效。
他的热修复实现原理如下:
利用gradle插件,在我们写的类中,编译时生成一个静态接口变量,在方法中会对这个接口变量进行判断。
如果我们需要进行热修复,就写一个接口的实现类,然后通过类加载和反射,找到我们写的类并创建实例,赋值给要修复bug的类中的静态接口变量即可,当我们的方法中判断到这个接口变量非空时,就会去执行实现类中的业务逻辑,从而达到了修复bug的目的,并且是及时生效的。

Tinker(补丁包是差分包)
由腾讯开发,目前微信就采用了这中热修复方案,优点是可以可以修复类、so包和资源文件。
他的热修复实现原理如下:
由有bug的apk文件和修复bug的apk文件共同生成一个差分包patch,这个patch文件就是我们的补丁包,下载这个差分包和有bug的apk,就可以生成修复bug的apk。如果没有资源文件修复,那么就会生成的就是一个.dex文件,可以通过类加载和反射技术,加载修复bug的类,从而实现热修复。

2.热修复用到了哪些技术?说一说双亲委托机制?说说如何通过类加载和反射实现热修复的?

热修复用到了类加载和反射技术。

双亲委托机制,就是在通过PathClassLoader加载某个类的时候,首先委托给他的父类去加载这个类,当父类没有加载成功时,才由子类去加载这个类。

要实现热修复功能,就需要用到Hook技术。
就是在加载有bug的class之前,先去加载我们修复了bug的class类,即可实现热修复技术。
class类是包含在dex文件中的,我们的app打包成apk的时候,就会生成一个.dex文件。如果我们要进行热修复,就需要生成修复了bug的dex文件,然后利用反射技术,在获取到PathClassLoader的前提下,然后通过反射去获取他的父类BaseDexClassLoader,然后再获取里面的属性(DexPathList)pathList,再获取这个属性中的Element[]数组,这个Element[]数组就是有bug的数组。
数组中的每个Element元素就对应一个dex文件,所以我们只需要再通过反射技术,将修复了bug的dex文件下载下来,然后通过makeElement方法生成修复了bug的Element[]数组。
最终将修复了bug的Element[]数组与有bug的Element[]数组组成一个新的数组,修复了bug的数组元素在前,存在bug的数组元素在后;在类加载加载class的时候,就会先加载到修复了bug的Element数组元素中的class类,从而修复了bug。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库服务器项目技术规范书 采购方需要采购数据库服务器组建大规模数据库系统。关于数据库服务器主要性能要 求如下: 一、基本要求 1. 原厂商的非OEM产品; 2. 不影响现有系统的使用,即新设备及软件将融入原有系统中,而不是替代原有系统 部分设备、软件或部分功能; 二、兼容性要求 1. 兼容现有市场上X86服务器上能够运行的主流操作系统,尤其包括以下操作系统:w indows7/XP windows sever2003/2008,RHEL4.5/5.2; 三、主机安全标准 1. 通过的质量和安全标准:3C认证; 2. 操作环境(温度、湿度):10°C~35°C; 3. 支持插拔冗余电源; 四、设备能力要求 1. 处理器要求:四路八核处理器,主频2.4G及以上; 2. 内存要求:32G DDR3; 3. 硬盘:4T以上SATA硬盘,集成1G Cache RAID卡; 4. 网络:有电口GE×2; 5. 其他:加配一块双端口8Gbps HBA卡; 五、设备功能要求 1. 设备管理功能要求:配置IPMI远程管理口,支持图形管理界面; 、服务要求 1. 提供全范围内免费送货至用户指定地点 2. 交货时间:按照合同执行 3. 整机保修:交货后3年 4. 安装、调试、现场技术培训服务:有技术人员提供现场服务 5. 整机免费换货期限:交货后1个月 6. 免费上门服务期限:交货后3年内 7. 质保期内产品故障服务响应时限:4小时 8. 上门时间:第2个工作日内 9. 故障修复时限:48小时 10. 技术服务线:7*24小时 11. 现场保修和技术支持服务:5*8小时 12. 质保期满后的保修服务费用:只收取更换部件的成本费,免收上门服务费 、配置清单 存储设备配置清单 "序号 "产品名称 "产品规格和描述 "数量 " "1 "曙光A840 "(四路八核处理器,主频2.4G及以上,内存:32G "1台 " " " "DDR3,硬盘:4T) " " "2 "硬件安装服"全国范围内免费送货至用户指定地点,有技术人员"1台 " " "务 "提供现场服务 " " ----------------------- 数据库服务器项目技术规范书全文共2页,当前为第1页。 数据库服务器项目技术规范书全文共2页,当前为第2页。
目 录 基础知识 产品知识(各类产品特有的技术、参数) 销售知识 高级技术培训(针对产品专员、维修人员、工程师) 服务器基础知识培训全文共74页,当前为第1页。 基础知识部分 硬件(名词解释、分类等) 软件(操作系统、应用软件) 网络(网络分类解释) 其它 服务器基础知识培训全文共74页,当前为第2页。 硬件基础知识 服务器 工作站 存储 配件 服务器基础知识培训全文共74页,当前为第3页。 服务器基础知识 服务器概念 服务器分类 · 按应用层次划分 · 按服务器的处理器架构 · 按服务器按用途划分 · 按服务器的外形来划分 服务器基础知识培训全文共74页,当前为第4页。 服务器概念 服务器"Server "是一种高性能计算机,指的是网络环境下为客户机( Client )提供某种服务的专用计算机。 特性: · 服务器与普通PC在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面存在很大的区别; · 其中最大差异就是在多用户多任务环境下的可靠性上:服务器所面对的是整个网络的用户,需要全天不间断工作,所以它必须具有极高的稳定性; · 在处理能力方面服务器通过采用对称多处理器(SMP)安装、插入大量的高速内存来保证工作; · 另外为了保证足够的安全性,还采用了大量普通电脑没有的技术,如冗余技术、系统备份、在线诊断技术、故障预报警技术、内存纠错技术、插拔技术和远程诊断技术等等,使绝大多数故障能够在不停机的情况下得到及时的修复,具有极强的可管理性。 服务器基础知识培训全文共74页,当前为第5页。 服务器与PC的对比 指标 服务器 PC(个人电脑) 处理器性能 支持多处理器 性能高 一般不支持多处理器 性能低 I/O(输入/输出)性能 强大 相对弱小 可管理性 高 相对低 可靠性 非常高 相对低 扩展性 非常强 相对弱 服务器基础知识培训全文共74页,当前为第6页。 服务器分类 按应用层次划分 1.入门级服务器 2.工作组级服务器 3.部门级服务器 4.企业级服务器 按服务器的处理器架构 1. CISC(IA/X86)架构服务器 2. RISC架构服务器 3. VLIW架构服务器 按服务器按用途划分 1.通用型服务器 2.功能服务器 按机箱结构划分 1.塔式服务器 2.机架式服务器 3.刀片式服务器 4.机柜式服务器 服务器基础知识培训全文共74页,当前为第7页。 9、要学生做的事,教职员躬亲共做;要学生学的知识,教职员躬亲共学;要学生守的规则,教职员躬亲共守。23.6.423.6.4Sunday, June 4, 2023 10、阅读一切好书如同和过去最杰出的人谈话。08:41:5308:41:5308:416/4/2023 8:41:53 AM 11、一个好的教师,是一个懂得心理学和教育学的人。23.6.408:41:5308:41Jun-234-Jun-23 12、要记住,你不仅是教课的教师,也是学生的教育者,生活的导师和道德的引路人。08:41:5308:41:5308:41Sunday, June 4, 2023 13、He who seize the right moment, is the right man.谁把握机遇,谁就心想事成。23.6.423.6.408:41:5308:41:53June 4, 2023 14、谁要是自己还没有发展培养和教育好,他就不能发展培养和教育别人。2023年6月4日星期日上午8时41分53秒08:41:5323.6.4 15、一年之计,莫如树谷;十年之计,莫如树木;终身之计,莫如树人。2023年6月上午8时41分23.6.408:41June 4, 2023 16、提出一个问题往往比解决一个更重要。因为解决问题也许仅是一个数学上或实验上的技能而已,而提出新的问题,却需要有创造性的想像力,而且标志着科学的真正进步。2023年6月4日星期日8时41分53秒08:41:534 June 2023 17、儿童是中心,教育的措施便围绕他们而组织起来。上午8时41分53秒上午8时41分08:41:5323.6.4 2、Our destiny offers not only the cup of despair, but the chalice of opportunity. (Richard Nixon, American President )命运给予我们的不是失望之酒,而是机会之杯。二〇二一年月十七日2021年6月17日星期四 3、Patience is bitter, but its fruit is sweet. (Jean Jacques Rousseau , French thinker)忍耐是痛苦的,但它的果实是甜蜜的。10:516.17.202110:516.17.2021
网络安全保障措施 一、建立健全的网络安全保障制度、信息安全保密制度、用户信息安全管理制 度;建立健全的本单位负责人、网络负责人、网络维护人员三级信息安全责任制和信息 发布的审批制度。 二、建立专门的标准机房,放置网络服务器,配备8小时以上的 UPS,及足够功率的空调。 三、机房门窗安全、牢固,防撬防盗性能好,非工作人员不得随意进入。 四、网络服务器性能稳定、安全性好。服务器和其他计算机之间设置经公安部 认证的防火墙, 并与专业网络安全公司合作,做好安全策略,拒绝外来的恶意攻击,保障网络正常运行。 五、网络服务器由技术人员管理维护,每天负责看系统日志,随时解决可能出现的异常问 题。 、网络服务器及工作站上均安装了正版的防病毒软件,对计算机病毒、有害 电子邮件有整套的防范措施,防止有害信息对网络系统的干扰和破坏。 七、网络信息管理系统建立双机备份机制,一旦主系统遇到故障或受到攻击导致不能 正常运行,保证备用系统能及时替换主系统提供服务。   八、关闭操作系统中暂不使用的服务功能,及相关端口,并及时用补丁修复系统漏洞,定期 责杀病毒。 九、网络提供集中式权限管理,针对不同的应用系统、终端、操作人员,由网 站系统管理员设置共享数据库信息的访问权限,并设置相应的密码及口令。不同的操作 人员设定不同的用户名,且定期更换,严禁操作人员泄漏自己的口令。对操作人员的权 限严格按照岗位职责设定,并由网络系统管理员定期检查操作人员权限。 十、服务器平时处于锁定状态,并保管好登录密码。 十一、后台管理界面须设置超级用户名及密码,并绑定IP,以防他人登入。 十二、所有信息发布之前必须经分管领导审核。 十三、工作人员采集信息必须严格遵守国家的有关法律、法规和相关规定。 十四、用户信息由网络工作人员专人负责管理,并执行严格保密制度,未经允许 不得向他人泄露。 ----------------------- 网络安全保障措施全文共2页,当前为第1页。 网络安全保障措施全文共2页,当前为第2页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值