zoukankan      html  css  js  c++  java
  • 运维岗春招--part2

    段页式存储

    段式是用户为方便编程自己定义的,页式是系统为方便管理确定的。段式是一维的,段号;页式是二维的段号+页号。

    分页是操作系统进行的,分段是用户确定的

    段式的逻辑地址可以不连续,页式的逻辑地址是连续的

    Mysql中的myisam与innodb的区别

    MyISAM引擎
    1、锁级别为表锁,表锁优点是开销小,加锁快;缺点是锁粒度大,发生锁冲动概率较高,容纳并发能力低,这个引擎适合查询为主的业务。
    2、此引擎不支持事务,也不支持外键。
    3、INSERT和UPDATE操作需要锁定整个表;
    4、它存储表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。
     
    InnoDB引擎
    1、支持事务处理、ACID事务特性;
    2、实现了SQL标准的四种隔离级别;
    3、支持行级锁和外键约束;
    4、可以利用事务日志进行数据恢复。
    5、锁级别为行锁,行锁优点是适用于高并发的频繁表修改,高并发是性能优于 MyISAM。缺点是系统消耗较大。
    6、索引不仅缓存自身,也缓存数据,相比 MyISAM 需要更大的内存。
     

    varchar(10)和varchar(100)有什么区别?

    先举个例子:如果要存储'hello12345'这个字符串,使用varchar(10)varchar(100)存储,占用磁盘空间是一样的么?

    答案是:占用磁盘的存储空间是一样的。

    (此时,varchar(10)和 varchar(50)存储,所占用的空间一样

    既然存储时磁盘占用空间一样,还有什么其他的区别吗?

    虽然使用varchar(100)varchar(10)存储'hello12345'字符串占用的磁盘空间一样,但是消耗的内存不一样,更长的列消耗的内存会更多。因为MySQL通常会分配固定大小的内存块来保存内部值。尤其是使用临时表进行排序会操作时,会消耗更多的内存。在使用磁盘进行排序时,也是一样。

    所以此时varchar(100) 会消耗更多的内存。

    varchar(10)和varchar(100)的优劣势是什么?

    因为涉及到文件排序或者基于磁盘的临时表时,更长的列会消耗更多的内存,所以在使用使用时,我们不能太过浪费内存空间,还是需要评估实际使用的长度来设置字符的长度。推荐冗余10%的长度(因业务而异)。

    所使用varchar(10)会更加节约内存空间,但是实际业务中字符长度一旦超过10就需要更改表结构,在表数据量特别大时,不易拓展

    而这时使用更长的列:varchar(100)无需更改表结构,业务拓展性更好

    字符串“hello”,用 char(10)和varchar(10)存储,所占用的空间不一样

    char的占用存储空间是固定的,不是动态分配的,此时为char(10) == len(10)

    varchar(10) == len(hello)

    PYTHON装饰器

    作用(解耦、为已有函数添加额外的功能)

    正则表达式:

     "^":匹配行或字符串的起始位置。例如匹配一个以 a  开头的字符串,"^a"

     "$":匹配行或字符串的结尾。例如匹配一个以 b 结尾的字符串,"b$"

     "":匹配一个单词边界,也就是字和空格间的位置。例如提取出 "we are joker" 中的 "are","are"

    更多:(https://www.cnblogs.com/mayytest1202/p/10307463.html

    finally的特点:

    (1) 是异常处理的一部分,用于释放资源;
    (2) 一般来说,被finally控制的代码一定会执行;
    (3) 特殊情况:如果在执行到finally之前jvm退出了(比如:System.exit(0),但是,请注意,return语句并没有让jvm退出),就不再执行了,只要jvm没有退出,finally里面的代码都会执行。

    计算机网络套接字:

     http://blog.itpub.net/28624388/viewspace-2649629/

    Socket可以作插口或者插槽,可以想象为一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以在通信之前,双方都要建立一个Socket.

     

    占用字节问题:

    utf-8中文字符占三个字节,GB18030兼容GBK兼容GB2312中文字符占两个字节,ISO8859-1是拉丁字符(ASCII字符)占一个字节

    两者的区别:

    re.search用来查找,单个的字符串,从中提取所需的,不同域值,即不同group的值;(找到了就返回)

    re.findall,一次性提前多个匹配到

    • 单个完整的字符串(可以后续接着用re.search再去提取不同group的值)
    • 一个tuple值,其中包括了每个group的值 -> 省却了在用re.search提起不同组的值
    • (找全部)

     re.match()  正则表达式模块re的 ~方法用来在字符串开始处进行指定模式的匹配。

     如何在Python中实现多线程?

    1. 答: Python有一个multi-threading包,但是如果你想让multi-thread加速你的代码,那么使用它通常不是一个好主意。

    2. Python有一个名为Global Interpreter Lock(GIL)的结构。 GIL确保只有一个“线程”可以在任何时候执行。一个线程获取GIL,做一点工作,然后将GIL传递到下一个线程。

    3. 这种情况很快发生,因此对于人眼看来,您的线程似乎并行执行,但它们实际上只是轮流使用相同的CPU核心。

    所有这些GIL传递都增加了执行的开销。这意味着如果您想让代码运行得更快,那么使用线程包通常不是一个好主意。

    这是什么意思: *args,**kwargs?我们为什么要用呢?

    我们用*args当我们不确定将多少个参数传递给函数时,或者我们是否要将存储的列表或参数元组传递给函数时。**kwargs当我们不知道将多少关键字参数传递给函数时,或者它可以用于将字典的值作为关键字参数传递时使用。标识符args和kwargs是一个约定,你也可以使用*bob和**billy,但这不是明智之举.

    从出生到现在过了多少天

    import datetime
     
    now_day = datetime.datetime(2020,8,21)
    birth_day = datetime.datetime(1996,8,21)
    passed_days = now_day - birth_day
    print("从出生到现在一共经过了%d天" % passed_days.days)
    

     

    linux文件权限构成

    Linux用户分为:拥有者、组群(Group)、其他(other)
    linux中的文件属性过分四段,如  -rwzrwz---
    第一段  -  是指文件类型 表示这是个普通文件
    文件类型部分
    -为:表示文件
    d为:表示文件夹
    l为:表示<a href="https://www.baidu.com/s?wd=%E9%93%BE%E6%8E%A5%E6%96%87%E4%BB%B6&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1Y3nWnzPWbzmHNBn1RYuHmd0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3En1TvPHmzn1b4" target="_blank">链接文件,可以理解为 windows中的快捷方式(link file)
    b为:表示里面可以供存储周边设备
    c为:表示里面为一次性读取装置
     
    第二段  rwz  是指拥有者具有可读可写可执行的权限  
    类似于windows中的所有者权限比如 administrator 对文件具有 修改、读取和执行权限
     
    第三段  rwz 是指所属于这个组的成员对于这个文件具有,可读可写可执行的权限      
    类似于windows中的组权限比如administrators组,属于这个组的成员对于文件的都有 可读可写可执行权限
     
    第四段  --- 是指其他人对于这个文件没有任何权限
    类似于windows中的 anyone 一样就是说所有人对着个文件都会有一个怎样的权限
    </a>
    

      

    Linux

    echo 输出

    export 执行

    下列哪种函数参数定义不合法?

    A def myfunc(*args):

    B def myfunc(a=1,**args):

    C def myfunc(*args,a=1):

    D def myfunc(arg1=1):

    答案是C,在python2中,c选项是错的,因为a=1被当做了默认参数,而默认参数只能在可变参数之前

    Python2参数顺序:必选参数、默认参数、可变参数和关键字参数

    在Python3中,c选项是对的,因为a=1被当做了命名关键字参数,而命名关键字参数需要在可变参数之后

    python3参数顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

    python 调用函数的四种方式

    1、必须参数(位置参数)
          必需参数:先用形式参数定义,然后在调用时对应位置使用实参(具体的数值)调用,定义的形式参数和调用的实际参数必需一一对应(顺序、数量)。
    
          def sum(a, b):
              return a + b
    
          sum(5, 6)
    
    2、关键字参数
          关键字参数:先使用形式参数定义,然后调用时以关键字的形式(形式参数 = 实际参数)传入参数,函数调用时不关心参数的顺序。
    
          def sub(a, b):
              return a - b
    
          s1 = sub(a=6, b=3)
          s2 = sub(b=3, a=0)
          s3 = sub(9, b=3)
    
    3、默认参数
          默认参数:默认参数是指函数在定义时,参数被预先赋予相应的默认值。这样在调用时,可以重新赋值, 也可以(对默认参数)不用赋值而使用默认的值。特别注意,默认参数只能定义在后面。
    
          def mul(a, b=3, c=2):
                print("a:{0}, b:{1}, c:{2}".format(a, b, c))
                return a*b*c
    
          print(mul(2))
          print(mul(2, b=4))   #若要对默认值参数重新赋值,需要使用 关键字=值 的形式传参
          print(mul(2, b=4, c=6))
    
     
    
    4、不定长参数
         不定长参数:数需求传入的参数数量不明确的情况下,一般使用 *args或者 **kwargs形式声明参数的形式
    
        (1)以*args形式声明参数在函数内使用args获取传入的参数(args的值是由参数构成的元组)
    
         def fun(*args):
               print(args)
    
         #调用示例1
         fun(1, 2, 3, 4, 'a')
         fun()
         fun(4,'a')
    
         #调用示例2
         l = [1, 2, 3, 4]
         t = ('a', 'b', 'c')
        d = {1:2, 2:3, 3:4}
        #当传入参数为列表、元组、或者字典的时候,参数名字前需要加*
         fun(*l)
         fun(*t)
         fun(*d)
    
      (2)**kwargs形式的可变参数,在函数内部kwargs是一个字典,字典的key是我们传入的形式参数的名字,值为实际参数的值,若以字典形式传入时,注意字典的key必须时字符串
    
        def fun(**kwargs):
              print(kwargs)
    
        #调用形式1:
        fun(a = 1, b = 2, c = 3)
        fun()
    
        #调用形式2
        d = {'1':2,'2':3,'3':4}
        fun(**d)
    

     

    apache的worker可以在服务器负载下降时自动减少子进程数

     prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。 worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。

    Zabbix

    Zabbix agent用于采集上传监控数据

    Zabbix server负责配置和接收监控信息

    Zabbix proxy负责分担server的处理性能压力

    Zabbix sender用于agent主动上传数据

    Zabbix get用于server主动拉取数据

    clone是fork的升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)、有选择的继承父进程的内存、甚至可以将创建出来的进程变成父进程的兄弟进程等等

    fork() 函数复制时将父进程的所以资源都通过复制数据结构进行了复制,然后传递给子进程,所以 fork() 函数不带参数; clone() 函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定,所以 clone() 函数带参数,没有复制的资源可以通过指针共享给子进程

    下面有关bash配置文件,说法正确的是? 

    .bash_profile 类似于编程中的构造函数,当登录shell时,shell会寻找该文件做环境初始化。
    .bashrc 是在bash环境时.bash_profile的替补。
    .bash_logout 类似于编程中的析构函数,当登录shell退出时,shell会寻找该文件,并按其指示办事。
    /etc/profile是系统文件,对系统下全体用户起作用
    /dev/null文件的权限是crw-rw-rw- root root所以一般用户是不具备执行权限的,也就无法通过/dev/null删除dirs了(要sudo  或者 chmod)
     

    统计日志中ip登陆次数,下面可以正确统计的为

    cat catalina.log  | awk -F ' ' '{print $3}' | sort | uniq -c | wc -l
    cat catalina.log | awk '{print $3}' | sort -k1nr | uniq -c | wc –l
    1、awk -F ' ' '{print $3}' 指定空格是分隔符进行分割,取第三个。(不指定默认分隔符也是空格)
    2、uniq -c(uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。参数 - c :进行计数)
    3、wc -l 行计数。
     
     
  • 相关阅读:
    Spring xml中进行面向切面的配置
    Spring 基于Java的Bean声明
    Spring context:component-scan中使用context:include-filter和context:exclude-filter
    Spring context:component-scan代替context:annotation-config
    Spring 使用context:annotation-config的设置
    Spring xml中进行autowired的方式
    margin三个值
    Spring util-namespace下标签相关操作
    use strict 的优点
    Spring MVC整合DWR
  • 原文地址:https://www.cnblogs.com/tfknight/p/12753017.html
Copyright © 2011-2022 走看看