March
6th,
2018
操作系统
- 进程与线程
- 进程与线程的区别:
- 进程是一段程序动态执行的过程,内部可以分解成线程。进程是资源分配最小单位,线程是cpu调度。
- 进程有独立的地址空间,进程健壮(崩溃不会对其它进程产生影响),切换开销大;线程……有自己的栈和局部变量。
- 通信:进程间通信通过IPC(管道、信号、消息队列、共享内存、信号量),线程中通过全局变量、静态变量等。
- 线程同步
- 互斥量:互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
- 信号量:(资源数量,+1,-1)它允许多个线程访问,但是需要控制最大线程数量。
- 事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
- 进程同步:
- 信号,软件中断,ctrl+C,仅能用作快速响应机制;
- 管道,基于内存文件,从父进程继承的文件描述符;
- 消息队列,基本单位为字节序列;
- 共享存储,进程与线程机制不一样,需要同步机制(信号量),速度快(不需要系统调用)
- 套接字
- 死锁
- 多进程争夺资源造成的僵局
- 原因:互斥、非抢占、持有并等待、循环等待
- 处理:银行家算法,剩余资源是否满足所有线程的未来需要。
- 进程与线程的区别:
- 内存管理
- 连续物理内存
- MMU:逻辑地址 => 物理地址
- 连续内存分配:动态分区分配(最先匹配、最佳、最差)
- 碎片整理:紧凑,分区兑换(等待进程搬至外存,开销大)
- 非连续物理内存(非连续物理地址、动态加载、段页表开销)
- 段式(满足代码逻辑):按数据、堆栈、堆、代码分离,段基址+段内偏移
- 页式(提高代码利用率):页帧(物理),页面(逻辑),(页帧偏移相同,号不相同),页表(页号、帧号对应)
- 段页式:段号+页号+页内偏移。共享(指向同一个页表基址)
- 虚拟存储
- 虚拟页式存储:程序部分装入页面=>缺页异常=>加载相应页面
- 置换算法:减少页面调入调出次数(最优、FIFO、LRU、LFU、时钟)
- Belady现象:物理页面增加,缺页次数增加(FIFO存在)
- 连续物理内存
- 文件系统:管理持久性数据(分配空间,管理集合,可靠性与持久性)
- 文件描述符
- 打开文件表的索引
- 数据块:基本访问单位(4KB)
- 访问模式:顺序,随机(虚拟内存),内容(数据库)
- 虚拟文件系统VFS
- 对不同文件系统的抽象
- 卷控制块(文件系统信息), 文件控制块(文件信息),目录节点
- 文件描述符
计算机网络
- OSI7层模型
- 物理:利用传输介质提供物理连接,实现比特流的传输。RJ45、中继器,集线器
- 数据链路层:通过控制协议,将有差错的物理信道变为无差错的数据链路。VLAN、MAC (网桥,交换机)
- 网络层:将数据转换为数据包,让信息在网络设备间传输。IP、(路由器)
- 传输层:提供可靠的差错和流量控制,保证报文的正确传输。TCP、UDP
- 会话层:协调两个会话进程之间的通信,并对数据交换进行管理。
- 表示层:对数据进行翻译、加密和压缩。
- 应用层:允许访问OSI环境的手段。FTP、DNS、HTTP、WWW
- TCP、UDP
- 三次握手
- 客户端发送连接请求,SYN置1,序号x;进入SYN_SEND状态,等待确认
- 服务器收到SYN报文,SYN置1,确认号x+1,序号y;进入SYN_RECV状态
- 客户端收到SYN+ACK包,ACK为y+1
- 为什么:存在网络延迟时,信号可能在失效后到达server,此时server相应,并一直等待(浪费),而client并不理会。
- 四次分手
- 主机1设置序号和确认号,发送一个FIN报文段;主机1进入FIN_WAIT_1状态。
- 主机2收到FIN包后,确认序号为收到序号+1;主机1进入FIN_WAIT_2状态。
- 主机2发送FIN报文段;同时主机2进入LAST_ACK状态。
- 主机1收到FIN后,发送确认序号为收到序号+1。
- 为什么:将确认关闭和关闭连接分开,先快速同意,然后将缓冲中剩下的数据发送。
- TCP(或传输控制协议)和 UDP(用户数据报协议)区别
- TCP通信前需要建立连接(三次握手),可靠性高,效率低;
- TCP面向字节流,数据可以被分割并在接收端重组;UDP面向数据报传输,数据分割后接受端不会重组。
- 三次握手
- 解析网址
- 在浏览器缓存、系统缓存、路由器缓存查找DNS信息,ISP DNS服务器解析域名,得到IP
- 建立TCP连接,3次握手
- 浏览器向web服务器发送一个HTTP请求
- 服务器发送HTTP响应报文
C++
- volatile:可能被额外的因素改变(操作系统等),直接从内存中读取数据,禁止编译器做寄存器优化
- new、malloc:构造函数,指定大小,异常,返回void*
- 宏定义区别:无返回值,没有类型检查,简单替换,不占内存
- 堆与栈:程序员分配、动态、容量大、碎片
- 初始化成员列表:const、reference、基类构造函数、成员对象构造函数(避免二次赋值)
- 静(动)态链接:静态链接编译时拷贝库,改变时要重新编译,运行时执行效率高。