段页式存储
段式是用户为方便编程自己定义的,页式是系统为方便管理确定的。段式是一维的,段号;页式是二维的段号+页号。
分页是操作系统进行的,分段是用户确定的
段式的逻辑地址可以不连续,页式的逻辑地址是连续的
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配置文件,说法正确的是?
.bashrc 是在bash环境时.bash_profile的替补。
.bash_logout 类似于编程中的析构函数,当登录shell退出时,shell会寻找该文件,并按其指示办事。
统计日志中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