操作系统
进程
从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
进程之间是隔离的。有虚拟内存隔离数据访问。对共享资源的并发访问引起内核同步方法。
管道、信号、消息队列、共享内存、socket、信号量
进程间通讯的难题在于既要保证程序隔离又要保持通讯。而共享内存虽然快,但是麻烦,需要各种锁的配合。麻烦而且容易出错。其他方式提供了一些便利的操作,但也牺牲了部分性能。
安卓使用Binder来提供进程间通讯
linux进程地址空间
在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3。通过页表的将进程地址映射到物理内存或缓存(磁盘)上。进程并不能直接操作内存,因而称作虚拟内存。
栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。 向下生长(地址减少)
堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。 向上生长(地址增加)
未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。
初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。
程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。
线程
CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。或者说是分配CPU的基本单位。
实现线程其实就是实现程序在多个任务之间来回切换,而且要保证每个任务的上下文。因此如果具有中断功能那么就可以实现多线程,并不需要CPU的支持。但一般来说中断程序需要操作系统的 支持。如果不是那么严格的话,利用一些代码技巧使得不同任务来回切换利用了特殊的宏也可以实现多线程。
并发调度浅析
异步IO可以降低延迟但并不能增加吞吐量,频繁地切换反而可能降低性能。
异步io
文件系统
基于存储设备的文件系统类型:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
文件存储结构:1. 超级块(superblock) 2. inode 3. 数据区
软链接与硬链接
Linux文件系统详解
高速读写,使用共享内存与文件映射
网络原理
http错误码
不知道为什么人家老喜欢问,这个东西不是一查就知道么。都记得也不能反映出水平啊。
2xx 成功
200 正常;请求已完成。
201 正常;紧接 POST 命令。
202 正常;已接受用于处理,但处理尚未完成。
203 正常;部分信息 — 返回的信息只是一部分。
204 正常;无响应 — 已接收请求,但不存在要回送的信息。
3xx 重定向
301 已移动 — 请求的数据具有新的位置且更改是永久的。
302 已找到 — 请求的数据临时具有不同 URI。
303 请参阅其它 — 可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。
304 未修改 — 未按预期修改文档。 305 使用代理 — 必须通过位置字段中提供的代理来访问请求的资源。
306 未使用 — 不再使用;保留此代码以便将来使用。
4xx 客户机中出现的错误
400 错误请求 — 请求中有语法问题,或不能满足请求。
401 未授权 — 未授权客户机访问数据。
402 需要付款 — 表示计费系统已有效。
403 禁止 — 即使有授权也不需要访问。
404 找不到 — 服务器找不到给定的资源;文档不存在。
407 代理认证请求 — 客户机首先必须使用代理认证自身。
415 介质类型不受支持 — 服务器拒绝服务请求,因为不支持请求实体的格式。
5xx 服务器中出现的错误
500 内部错误 — 因为意外情况,服务器不能完成请求。
501 未执行 — 服务器不支持请求的工具。
502 错误网关 — 服务器接收到来自上游服务器的无效响应。
503 无法获得服务 — 由于临时过载或维护,服务器无法处理请求。
TCP握手协议
三次握手建立连接、四次握手
首先,两次握手就可以确保要发送的数据已经送达远端。
三次握手可以防止重复的建立连接的请求。也就是远端在建立连接的时候再问一次:你真的要连接么?所以需要三次。
而关闭连接的时候,需要发出请求确认对方能不能关闭。说关就关有如下问题1.对方还有数据没发就会丢失。2. 万一关闭连接的请求丢了,对方就傻了。 因此需要一个2次握手来发送关闭连接的请求。而后远端再执行两次握手来告知近端真的可以关闭了。所以四次握手拆解开来就是1.近端:我能关了么? 2. 远端:可以关了。每一步都需要二次握手来保证数据送达。值得注意的是,近端在第三次握手的时候就可以关闭了,但还要进入TIME_WAIT。这是因为这个时候还不知道远端收到没,如果再收到FIN再重发。
这里好像有个问题,如果TIME_WAIT跳过了,那远端不是傻傻等待?现实中好像没有出现这个问题,所以现状的实现是不是准守这个协议呢?(也有可能会等到连接超时)
数据
- 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
- 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
- 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。 如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。
一致性
序列化与反序列化
当需要跨语言跨平台,或者压缩数据时需要这些技术。代表protobuf
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。