从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
进程之间是隔离的。有虚拟内存隔离数据访问。对共享资源的并发访问引发内核同步方法。
管道、信号、消息队列、共享内存、socket、信号量
进程间通信的难题在于既要保证程序隔离又要保持通信。而共享内存虽然快,可是麻烦,须要各类锁的配合。麻烦并且容易出错。其余方式提供了一些便利的操做,但也牺牲了部分性能。
安卓使用Binder来提供进程间通信html
linux进程地址空间
在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3。经过页表的将进程地址映射到物理内存或缓存(磁盘)上。进程并不能直接操做内存,于是称做虚拟内存。node
栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操做方式相似于数据结构中的栈。 向下生长(地址减小)
堆 (Heap):存储动态内存分配,须要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式相似于链表。 向上生长(地址增长)
未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。linux
初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。
程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。程序员
64位进程的地址空间redis
CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。或者说是分配CPU的基本单位。
实现线程其实就是实现程序在多个任务之间来回切换,并且要保证每一个任务的上下文。所以若是具备中断功能那么就能够实现多线程,并不须要CPU的支持。但通常来讲中断程序须要操做系统的 支持。若是不是那么严格的话,利用一些代码技巧使得不一样任务来回切换利用了特殊的宏也能够实现多线程。算法
并发调度浅析
异步IO能够下降延迟但并不能增长吞吐量,频繁地切换反而可能下降性能。
异步io数据库
基于存储设备的文件系统类型:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
文件存储结构:1. 超级块(superblock) 2. inode 3. 数据区
软连接与硬连接
Linux文件系统详解
高速读写,使用共享内存与文件映射segmentfault
不知道为何人家老喜欢问,这个东西不是一查就知道么。都记得也不能反映出水平啊。缓存
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 没法得到服务 — 因为临时过载或维护,服务器没法处理请求。服务器
三次握手创建链接、四次握手
首先,两次握手就能够确保要发送的数据已经送达远端。
三次握手能够防止重复的创建链接的请求。也就是远端在创建链接的时候再问一次:你真的要链接么?因此须要三次。
而关闭链接的时候,须要发出请求确认对方能不能关闭。说关就关有以下问题1.对方还有数据没发就会丢失。2. 万一关闭链接的请求丢了,对方就傻了。 所以须要一个2次握手来发送关闭链接的请求。然后远端再执行两次握手来告知近端真的能够关闭了。因此四次握手拆解开来就是1.近端:我能关了么? 2. 远端:能够关了。每一步都须要二次握手来保证数据送达。值得注意的是,近端在第三次握手的时候就能够关闭了,但还要进入TIME_WAIT。这是由于这个时候还不知道远端收到没,若是再收到FIN再重发。
这里好像有个问题,若是TIME_WAIT跳过了,那远端不是傻傻等待?现实中好像没有出现这个问题,因此现状的实现是否是准守这个协议呢?(也有可能会等到链接超时)
- 脏读 :脏读就是指当一个事务正在访问数据,而且对数据进行了修改,而这种修改尚未提交到数据库中,这时,另一个事务也访问这个数据,而后使用了这个数据。
- 不可重复读 :是指在一个事务内,屡次读同一数据。在这个事务尚未结束时,另一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,因为第二个事务的修改,那么第一个事务两次读到的的数据多是不同的。这样就发生了在一个事务内两次读到的数据是不同的,所以称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,做者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。若是 只有在做者所有完成编写后编辑人员才能够读取文档,则能够避免该问题。
- 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的所有数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,之后就会发生操做第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉同样。例如,一个编辑人员更改做者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现做者已将未编辑的新材料添加到该文档中。 若是在编辑人员和生产部门完成对原始文档的处理以前,任何人都不能将新材料添加到文档中,则能够避免该问题。
当须要跨语言跨平台,或者压缩数据时须要这些技术。表明protobuf