都说三天不写,手生。 练一个多月的车,考驾驶证。 有很多东西,我本以为我还记得,但是一到写起来的时候有不少细节我真的想不起来了,又得回头到搜索引擎去查。 搞技术的人,自己的博客真的就是自己的第二个大脑,要多往里面存存东西才是。 无论是多简单的东西,记一记总是好的。至少,自己的博客可不会嫌我啰嗦,不是吗?
QA整理: 进程和线程的概念 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 “进程是资源分配的最小单位,线程是CPU调度的最小单位”。 1、进程是什么? 是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独 立运行的一段程序。 2、线程又是什么? 线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。 在运行时,只是暂用一些计数器、寄存器和栈 。 进程和线程的关系 1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。 2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。 3. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。 4. 处理机分给线程,即真正在处理机上运行的是线程。 5. 线程是指进程内的一个执行单元,也是进程内的可调度实体。 二者之间的区别 1. 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。 2. 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。 3. 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。 做个简单的比喻:进程=火车,线程=车厢 线程在进程下行进(单纯的车厢无法运行) 一个进程可以包含多个线程(一辆火车可以有多个车厢) 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘) 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易) 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源) 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢与前一节产生断裂,将影响后面的所有车厢) 进程可以拓展到多机,进程最适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上) 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁" 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
1 2 3 4 ping是应用层直接使用网络层ICMP的一个例子,它没有通过传输层的TCP或UDP。---计算机网络 谢希仁第七版第149页 Ping是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。 Ping 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报。
文件访问权限的设置和管理 1 2 3 4 5 6 7 8 u-g-o:表示用户-用户组-其他用户。 a : 表示所有 用户,x : 执行权限,r:读权限,w:写权限。 r(Read,读取,权限值为4):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目 录的权限。 w(Write,写入,权限值为2):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。 x(eXecute,执行,权限值为1):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。 例如:rwx rwx r-x = 775(4-2-1表示r-w-x)
正则竖线的作用 1 2 3 (abc|def) 表示 字符串 或 匹配,只要符合任一字符串即可。 拓展: ?:表示匹配里面的字符串,但是不捕获。
中国ping美国服务器,一般至少要多久? 1 2 3 中美距离是半个地球,光一秒钟30万公里,绕地球7.5圈,1秒钟=1000毫秒,则绕地球半圈速度是1000/15=66毫秒,数据返回需要同样的时间 66+66 = 132毫秒(132ms) 中国ping美国机房,则数据仅仅从海底光缆这头到那头,就已经需要133ms应答和传送时间了。加上双方到海缆之前经过的路由处理时间,中美服务器之间的ping值,最好的期望值,是180ms,一般来说小于300都是算不错的
对数据库MyISAM和InnoDB的理解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 MyISAM索引文件和数据文件是分离的,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。 与 MyISAM相同的一点是,InnoDB 也采用 B+Tree这种数据结构来实现 B-Tree索引。而很大的区别在于,InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引,所谓“聚集”,就是指数据行和相邻的键值紧凑地存储在一起,注意 InnoDB 只能聚集一个叶子页(16K)的记录(即聚集索引满足一定的范围的记录),因此包含相邻键值的记录可能会相距甚远 区别: 1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败; 3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。 4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快; 5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 如何选择: 1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM; 2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。 3. 系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB; 4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。如果你不知道用什么存储引擎,那就用InnoDB,至少不会差。 总结: 1. myisam查询效率更高,支持全文索引。innodb不支持全文索引,查询效率差myisam6-7倍。 2. innodb支持事务,行锁,外键。myisam不支持。 如果数据表涉及的存储数据多、查询多,用myisam,如文章表。如果数据表涉及业务逻辑多,增删改操作多,就用innodb,如订单表。
对闭包、装饰器、迭代器、深拷贝/浅拷贝、并发、协程的理解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 闭包浅识: 在python中,函数可以作为另一个函数的参数或返回值,可以赋给一个变量。函数可以嵌套定义,即在一个函数内部可以定义另一个函数,有了嵌套函数这种结构,便会产生闭包问题。 闭包定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure) 举个栗子: def outer(x): def inner(y): return x + y return inner 结合代码分析定义: 如果在一个内部函数里 — inner()就是内部函数。 对在外部作用域(但不是在全局作用域)的变量进行引用 — x就是被引用的变量,x在外部作用域,但不在全局作用域。 那么内部函数就被认为是闭包 -- inner就是一个闭包。
1 2 3 4 5 6 装饰器浅识: 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。 有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。 内置装饰器:@staticmathod、@classmethod、@property
1 2 3 4 5 6 7 迭代器浅识: 顾名思义,迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了 __next__ 方法 (python2 是 next)的对象都可以称为迭代器。 它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。 比如列表含有中一千万个整数,需要占超过400M的内存,而迭代器只需要几十个字节的空间。 因为它并没有把所有元素装载到内存中,而是等到调用 next 方法时候才返回该元素(按需调用 call by need 的方式,本质上 for 循环就是不断地调用迭代器的next方法)
1 2 3 4 5 6 7 迭代器浅识: 顾名思义,迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了 __next__ 方法 (python2 是 next)的对象都可以称为迭代器。 它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。 比如列表含有中一千万个整数,需要占超过400M的内存,而迭代器只需要几十个字节的空间。 因为它并没有把所有元素装载到内存中,而是等到调用 next 方法时候才返回该元素(按需调用 call by need 的方式,本质上 for 循环就是不断地调用迭代器的next方法)
1 2 3 4 5 深拷贝/浅拷贝浅识: 深拷贝是将对象本身复制给另一个对象, 浅拷贝则是将对象的引用复制给另一个对象。 所以当复制后的对象改变时,深拷贝的原对象值不会改变,而浅拷贝原对象的值会被改变。
1 2 3 4 5 6 7 8 并发浅识: 实际开发中很多人会因为并发,并行,串行,同步,异步等名词搞混,搞不清楚这些名称的意思和之间对应的关系。其实这也是实际开发中必须掌握一些知识点。掌握和理解这些概念也有助于我们去更好去开发。 并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。 并行:指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。(hadoop集群就是并行计算的)
1 2 3 4 5 6 7 8 9 10 11 协程浅识: 由于GIL的存在,导致Python多线程性能甚至比单线程更糟。 于是Python3.4 开始也支持协程。 协程: 协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。 协程是由程序主动控制切换,没有线程切换的开销,所以执行效率极高。 对于IO密集型任务非常适用,如果是cpu密集型,推荐多进程+协程的方式。 在Python3.4之后就内置了asyncio标准库,官方真正实现了协程这一特性。
TCP建立连接和释放连接的过程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 绝了...老生常谈.. TCP三次握手建立连接,四次挥手释放链接。 三次握手: 1. client对Server发送给SYN(J)包,并进入SYN-SENT状态,等待Server的ACK回复 2. Server收到client的SYN包后返回ACK(J+1)包和自己的SYN(K)包,并进入RECIVED状态,等待回复 3. client接收到server的ACK(J+1)包后进入ESTABLISHED(连接成功)状态。然后根据收到的SYN(K)包对Server返回ASK(K+1)包。server收到以后也进入(连接成功)状态。 到此,三次握手结束。客户端和服务端可以正常进行通信了。 四次挥手: 1. client发送FIN(M),此时进入FIN-WAIT-1状态(结束等待) 2. server收到FIN(M)返回ACK(M+1)包,此时server也进入CLOSE-WAIT状态,client在整理也进入FIN-WAIT-2状态。 3. server向client发送FIN(N)包,请求关闭连接,同时进入LAST-ACK状态。 4. client收到FIN(N)包进入TIME-WAIT状态。向server发送ACK(N+1)包,Server收到后进入CLOSE状态。client等待时间内若没收到server其他回复就进入CLOSE状态。 到此,四次挥手结束。
总结 本以为并不会有多少的,结果一整理,居然有这么多。 好多概念细节性的东西,要去记了。 光记住还不够,还得会自己组织语言去表述他们。 很多东西只是做了很浅的整理,没过于深入的去探究。 这需要一个积累的过程,希望以后能更多的用到它们,来加深印象吧。