清华大学操作系统公开课笔记(向勇、陈渝)
转载:https://zhuanlan.zhihu.com/p/150510828
第一章:概述
内核功能:物理内存管理 | 虚拟内存管理 | 文件系统管理 | 中断处理和IO设备驱动 (底层硬件)
内核特征
并发 (指一段时间内多个程序运行;而并行是指一个时间点上多个程序运行,要求多个CPU):计算机系统中同时存在多个运行的程序,需要OS管理和调度
共享 “同时”访问或互斥共享
虚拟 利用多道程序设计技术,让每一个用户都觉得有一个计算机专门为他服务
异步 程序的执行不是一步到底的,而是走走停停,向前推进的速度不可预知但只要运行环境相同,OS要保证程序运行的结果也相同
第二章:操作系统基础操作
启动流程:BIOS首先将BootLoader加载到内存。BootLoader负载将OS加载到内存。
- 中断
- 含义 来源于外设。来自不同的硬件设备的计时器和网络的中断。
- 处理机制 硬件(外设、CPU):设置中断标记,获取中断事件的ID | 软件(操作系统):保存现场、中断服务程序处理、清除中断标记、恢复现场
- 异常
- 含义 来源于不良的应用程序,应用程序发生错误,交由OS处理。
- 处理机制 异常编号、保存现场、(异常处理:杀死产生异常的程序;重新执行异常指令)、恢复现场
- 系统调用
- 含义 来源于应用程序,应用程序向操作系统主动发起的服务请求。用户程序调用OS提供的高层次API进行系统调用,系统调用涉及到特权级从用户态到内核态的转换
- 用户态 应用程序在执行的过程中,CPU执行的特权级的状态(很低,不能访问特殊机器指令和IO)。
- 内核态 应用程序在执行的过程中,CPU执行的特权级的状态(高,操作系统可以执行CPU任何一条指令)。
用户态到内核态的开销包括:
- 建立中断/异常/系统调用号与对应服务例程映射关系的初始化开销;
- 建立内核堆栈(操作系统和应用程序的堆栈不一样);
- 验证参数(操作系统会检查数据);
- 内核态映射到用户态的地址空间,更新页面映射权限(内存拷贝开销);
- 内核态独立地址空间TLB。
第三章 连续式内存分配
计算机基本硬件结构:内存、CPU、设备(I/O)
- 内存管理的目标:
- 抽象:逻辑地址空间
- 保护:独立地址空间
- 共享:访问相同内存
- 虚拟化:更多地址空间
- 内存管理的实现:程序重定位、分段、分页、虚拟内存、按需分页虚拟内存
- 物理地址空间:硬件支持的地址空间
- 逻辑地址空间:一个运行的程序所拥有的的内存范围
逻辑地址到物理地址的映射:
- CPU:运算器ALU需要位于逻辑地址的内存内容——>MMU寻找逻辑地址和物理地址之间的映射 ——> 控制器从总线发起物理地址的内存内容的请求
- 内存:从总线发送物理地址的内存内容给CPU
- 操作系统:建立逻辑地址与物理地址之间的映射
地址安全检查:操作系统会为程序设定逻辑地址的基地址和界限,在程序发起逻辑地址内容请求时检查是否超出限制,来进行地址的安全检查。
- 连续内存分配方式 第一适配 | 最佳适配 | 最差适配
- 碎片整理 交换式、压缩式
第四章 非连续内存分配
- 分段特点 段号+段内偏移量。段大小不一致。
- 分段寻址流程 根据段号查找段表获取段起始地址和limit——>根据段起始地址和limit检查地址安全——>根据段起始地址和偏移量获取物理地地址
- 分页含义 划分物理内存至固定大小的帧,帧是非连续的物理内存,划分逻辑地址空间至相同大小的页,页是连续的虚拟内存
- 分页地址组成 物理地址:帧号+帧内偏移量 | 逻辑地址:页号+页内偏移量(其中帧内偏移量=页内偏移量 而 帧号不一定等于页号)
- 分页寻址流程 根据逻辑地址计算页号,在页表找到对应的页帧号,加上偏移量得到物理地址。
- 分页机制存在的时间/空间性能问题:
- 访问一个内存单元需要2次内存访问:一次获取页表项;一次是访问数据。
- 页表可能会非常大(页表的长度等于2^页号位数)
- 分页性能问题解决——TLB(缓存) TLB使用associate memory实现,具备快速访问性能。如果TLB命中,物理页号可以很快被获取;如果TLB未命中,对应的表项被更新到TLB中。
- 分页性能问题解决——二级/多级页表 将大页表拆分成两个页表,一级页表的value项存放的是二级页表的起始地址。逻辑地址被拆分成三部分,一级页表号,二级页表号和页内偏移量。先根据一级页表号在一级页表中查找到二级页表的起始地址,再根据这个起始地址与二级页表号查找帧号。这样一些不存在的逻辑地址,可以在二级页表中不存储,能够节省空间。
- 反向页表 key是物理地址,value是逻辑地址,优点是页表大小只与物理地址有关,比传统页表要小。
- 反向页表实现方案
- 关联存储器 关联存储器的特点是能够并行的查找,所以可以将反向页表存储成key为页号,value为帧号。缺点是关联存储器昂贵。
- 哈希 设计哈希函数使得输入PID和页号能够获得物理帧号。缺点是存在冲突。
第五章 虚拟内存
实现方式有三种 覆盖技术、交换技术、虚存技术
- 覆盖技术目标 在较小的可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用。
- 覆盖技术原理 把程序按照其自身逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。
- 覆盖技术缺点
- 由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度。
- 覆盖模块从外存装入内存,是以时间换空间。
- 交换技术目标 多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源。
- 交换技术原理 可将暂时不能运行的程序送到外存,从而获得空闲内存空间。操作系统把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将将外存中的某个进程的地址空间读入到内存中(换入swap in)。换入换出内容大小为整个程序的地址空间。
- 交换缺点
- 交换时机的确定:只有当内存空间不够或有不够的危险时换出
- 交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝,必须能对这些内存映像进行直接存取
- 程序换入时的重定位:因为换出换入后的内存位置不一定相同,所以最好采用动态地址映射的方法
- 虚存技术的核心——程序局部性原理
- 时间局部性 一条指令的当次执行和下次执行、一个数据的当次访问和下次访问集中在一个较短的时间内。
- 空间局部性 当前指令和邻近的指令、当前访问的数据和邻近的数据集中在较小区域内。
- 虚存技术的原理:用户程序执行时,不是把该程序的所有页面都放入内存进行执行,而是调入部分。在运行时发现数据不存在或者指令不存在内存,向系统发出缺页请求中断,系统在处理这个中断时,将外村相应页面调入内存,使得程序继续执行。
- 虚存技术中缺页中断处理流程
- 判断内存是否有空闲页帧:有则分配页帧f跳至第四步。
- 采用某种页面置换算法,选择将被替换的物理页帧,判断对应逻辑页q是否需要写回磁盘。
- 对q对应的页表项进行修改,驻留位置零。
- 将需要访问的页p装入物理页帧f中。
- 修改p对应的页表项的物理帧号和驻留位。
- 重新运行被中断的指令。
- 虚存技术性能 EAT(Effective memory access time) = 访存时间 * 命中率 + 缺页处理时间 * 缺页率
- 虚存技术各类数据存储形式
- 数据可以被映射为文件
- 代码段可以映射为二进制文件
- 动态加载的共享程序段可以映射到动态调用的库文件
- 程序中动态产生的文件可以映射到交换分区中的交换文件
第六章 页面置换算法
- 页面置换算法功能 缺页中断发生时,选择替换内存当中的哪一页。
- 页面置换算法目标 尽可能减少页面的换进换出次数。
- 局部页面置换算法:
- 最优页面置换算法 选择下一次访问的等待时间最长的页面(最晚用到的页面)。理想算法,现实无法实现,可用于评价其他算法的性能
- 先进先出算法(FIFO)选择在内存中驻留最长的页面(最老的页面)性能较差、有Belady现象
- 最近最久未使用算法(LRU)选择最久未使用的那个页面。利用了局部性原理。实现方式 用链表进行使用顺序的访问,每次访问页面,将该页面的节点移动到队首,每次淘汰队尾。开销较大
- 时钟页面置换算法(CLOCK)所有页都有一个访问位,刚被装入内存时,访问为置一。当该页面再次被访问时,访问位也置一。所有页面组成环形链表,指针指向某个页面,当发生缺页中断时,判断指针指向的页面访问为是否为0,如果是0的话淘汰,不然则清零,并判断下一个页面,直到找到访问位位0的页面。
- 二次机会法(Clock Enhanced)和Clock的区别是,除了Access Bit外还用到了Dirty Bit,只有两个Bit都为0,才会被换出。缺页中断时更新Bit的方式是 0 1 —— 0 0、 1 0 —— 0 0 、 1 1 —— 0 1。发生写操作时,会对两个bit都置1,发生读操作时只给Access Bit置1。核心思想是给写入操作的页更多的机会留在内存中。
- 最不常用算法(LFU) 选择最不常用的那个页面。开销比较大,每个页面要有计数器,缺页换出的时候还要遍历所有页面进行换出。
Belady现象 是指分配的物理页越多,缺页现象反而越频繁。
- 工作集:在一个时间段内使用到的页面集合。
- 常驻集:当前时刻,进程实际驻留在内存当中的页面集合。
全局页面置换算法:
- 工作集置换算法:每次工作集窗口平移,都会将不在工作集窗口的页面置换出去(即使没有发生缺页中断)
- 缺页率页面置换算法:使用缺页率(缺页次数 / 内存访问次数)算法来动态调整常驻集的大小
抖动 频繁的在内存与外存之间替换页面,使程序运行效率急速下降。解决方式 利用局部/全局页面置换,使平均缺页时间(MTBF)/ 页缺失服务时间(PFST)接近1
第七章 进程管理
- 进程含义 一个具有独立功能的程序在一个数据集合上的一次动态执行过程
- 进程组成 程序的代码、程序处理的数据、一组系统资源、程序计数器中的值等
- 进程特点
- 动态性 可动态的创建结束进程
- 并发性 进程可以被独立调度并占用处理运行:并发执行
- 独立性 不同进程的工作不相互影响
- 制约性 因访问共享数据/资源或进程间同步而产生制约
- PCB含义 进程控制块 Process Control Block,用于表示进程状态。OS根据PCB对并发执行的进程进行控制和管理。
- PCB组成 进程标识信息、处理机状态信息保存区、进程控制信息
- PCB组织方式 链表的形式,相同状态的进程组成一个链表
进程生命周期
- 创建
- 运行 内核选择一个就绪的进程,让他占用处理机进行执行
- 等待 请求并等待系统服务、启动某种操作无法马上完成、需要数据没有到达等(进程只能自己阻塞自己)
- 唤醒 被阻塞进程需要的资源可被满足、被阻塞进程等待的事件到达、将该进程的PCB插入就绪队列(进程只能被别的进程或操作系统唤醒)
- 结束 正常退出、错误退出、致命错误、被其他进程所杀
进程状态转换
- 运行状态 时间片用完进入就绪态 | 等待事件进入阻塞态
- 就绪状态 被调度进入运行态
- 阻塞状态 事件发生进入就绪态
- 进程挂起 指进程不占用内存空间的状态。
- 阻塞挂起状态 进程在外存并等待某事件的出现
- 就绪挂起状态 进程在外存,但只要进入内存就可运行。
- 线程含义 进程中的一条执行流程,进程可以视为一个资源管理的平台,其中的线程负责执行。
- 线程优点 一个进程可以同时存在多个线程、各个线程之间可以并发执行、线程共享进程的地址空间、文件等资源。
- 线程缺点 一个线程崩溃,会导致其所属进程的所有线程崩溃。
线程与进程区别
- 进程是资源分配单位 线程是CPU调度单位
- 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈
- 线程能减少并发执行的时间和空间开销:线程切换时间比进程短:不需要切换页表等等
线程实现 方式主要有三种:用户线程,内核线程和轻量级进程。
- 用户线程 不由操作系统进行管理,由线程库进行管理(即操作系统并不知道有用户线程的存在,均在用户态下管理)。存在以下缺点
- 如果一个线程发起系统调用而阻塞,则整个进程都在等待。
- 当一个线程开始运行,除非主动交出CPU,否则其他线程无法运行。
- 时间片分配给进程,分到线程的会更少,执行变慢。
- 内核线程 线程控制块TCB位于内核,每一次切换都涉及用户态和内核态的切换。
- 轻量级进程 它是内核支持的用户线程,一个进程可有一个或多个轻量级进程,每个轻量级进程由一个单独的内核线程来支持。
上下文切换是指在切换进程的时候,保存该进程恢复时需要用到的必要数据化,例如程序计数器、栈指针等等。并恢复要切换的进程的必要数据。
进程控制的系统调用命令
- fork 创建子进程,将父进程的地址空间拷贝一份(这里要注意fork函数实际上并没有在物理上进行copy,而是使用copy on write,这样能够显著的减少开销)
- exec 在同一个进程里用一个新程序代替调用exec的那个进程
- exit 终止进程,退出。大部分资源会被回收,但是类似PCB无法自己回收。
- wait 父进程等待子进程结束,子进程会向父进程发送一个值。
第八讲 CPU调度
CPU调度含义 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程
内核运行调度程序的条件(满足一条即可)
- 一个进程从运行状态切换到等待状态
- 一个进程终结了
CPU调度准则(一些指标)
- CPU使用率 CPU处于忙状态所占时间的比分比
- 吞吐量 在单位时间内完成的进程数量
- 周转时间 一个进程从初始化到结束,包括所有等待时间所花费的时间
- 等待时间 进程在就绪队列中的总时间
- 响应时间 从一个请求被提交到产生第一次响应所花费的总时间
基本调度算法
- FCFS 先来先服务
- 优点 简单
- 缺点 平均等待时间波动较大|花费时间较少的任务可能排在长任务后面|可能导致CPU和I/O之间的重叠处理
- SJF/SPN/SRT 最短作业优先
- 缺点 可能导致饥饿(长任务一直无法执行)|需要预先知道程序执行时间
- HRRN 最高响应比优先 R=(w+s)/s [w] 等待时间 [s] 执行时间
- 优点 解决最短作业优先可能存在的饥饿问题
- Round Robin
- 缺点 额外的上下文切换
- 特点 偏大的时间片大小,可能会退化为FCFS;偏小的时间片大小,可能频繁切换上下文
- Multilevel Feedback Queues 一个进程可以在不同的队列中移动,例如时间片大小随着队列的优先级增加而增加,一个任务在某一个队列中执行,如果在一个时间片内没有执行完成,则被降级到低一级的队列。
- Fair Share Scheduling 控制用户对系统资源的公平访问(用户级别而不是进程级别)
实时调度算法
- 定义 正确性依赖于时间和功能的操作系统。
- 性能指标 时间约束的及时性(deadline)。
- 实时系统分类 强实时系统 规定时间必须完成 | 弱实时系统 规定时间尽量完成
- 实时调度算法分类 静态优先级调度/动态优先级调度
- RM(Rate Monotonic)速率单调调度 最佳的静态优先级调度算法(周期越小,优先级越高)
- EDF(Earliest Deadline First)最早期限调度 最佳的动态优先级调度算法(deadline越早,优先级越高)
多处理器调度算法 一个任务来应该分配给哪个CPU、负载均衡
- 优先级反转 低优先任务执行,并占用共享资源——高优先任务抢占,因共享资源被占用无法继续执行,等待低优先任务释放——中优先任务抢占执行。上述的过程中,高优先任务最后需要等待中优先任务执行完毕才能继续执行,发生了优先级反转。
- 解决方法
- 低优先级任务继承高优先级任务的优先级依赖于他们共享的资源(上述例子中,低优先任务因为占用了高优先任务依赖的共享资源,优先级临时提升至高优先)
- 优先级天花板 资源优先级与共享资源使用优先级相同
第九章 同步
- 临界区 进程中的一段需要访问共享资源,并且当另一个进程处于相应代码区域时,便不会被执行的代码区域。
- 互斥 当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并且访问相同的资源。
- 死锁 两个或以上的进程,在相互等待完成特定任务,而最终没法将自身的任务进行下去。
- 饥饿 一个可执行的进程,被调度器持续忽略,以至于虽然处于可执行状态,却不被执行。
实现临界区的方法:
- 禁用硬件中断 进入临界区禁用中断 | 离开临界区启用中断
- 缺点 临界区可能任意长、一旦中断被禁用,线程无法被停止。不适用于多CPU的情况。
- 基于软件的解决方案
do{flag[i] = TURE;turn=j;while(flag[j]&&turn==j);critical sectionflag[i] = FALSE:remainder section
}while(1)
- 更高级的抽象方法——锁 利用硬件提供的一些原子操作进行临界区的设计
第十章 信号量和管程
- 信号量 一个整型,有两个原子操作:P和V,
- P是减一,如果信号量小于0,等待否则继续。
- V是加一,如果信号量小于等于0,唤醒一个等待的进程
- 管程
- 管程的组成:一个锁+0或者多个条件变量。
- 在同一时刻,只有一个进程能够进入管程,调用管城内定义的各种条件变量的操作。
经典同步问题 (思考怎么用信号量、管程来实现下面的问题)
- 读者-写者问题
- 哲学家就餐问题
第十一章 死锁和进程通信
- 死锁问题 一个阻塞的进程持有一种资源等待获取另一个进程所占有的资源。
- 系统模型 能看懂资源分配图、有环可能存在死锁
- 死锁特征互斥 | 持有并等待 | 非抢占 | 循环等待
死锁处理方法
- 死锁预防
- 互斥
- 持有并等待 进程请求资源的前提是不占用任何资源(一开始就占用所有资源)
- 非抢占 请求资源失败后暂时释放自身占有的资源
- 循环等待 为所有资源编号,请求高编号的资源的前提是已获取低编号的资源。
- 死锁避免
- 动态检查资源分配状态,以确保不会出现唤醒等待的状态(存在安全序列)。
- 银行家算法
- 死锁检测 允许系统进入死锁状态 | 死锁检测算法 | 恢复机制
- 死锁恢复 终止进程,关键是终止哪些进程、按照什么顺序终止进程。| 抢占资源。
IPC(进程间通信)
- 信号 信号触发接收方的处理函数
- 管道 数据交换,子进程从父进程继承文件描述符(linux中的|)
- 消息队列 能有多个发送方,发送的数据可以是有语义的信息
- 共享内存
第十二章 文件系统
- 文件系统 一种用于持久性存储的系统抽象
- 文件 文件系统中一个单元的相关数据在操作系统中的抽象。文件属性一般保存在文件头里。
- 文件描述符
- 程序在读取文件时,首先要“打开文件”,打开文件回返回一个文件描述符。
- 操作系统会维护每个进程打开的文件表,文件描述符实际上是文件表的index。
- 需要元数据管理文件 元数据包括文件指针、文件打开计数、文件磁盘位置、访问权限
- 目录 目录是一种特殊的文件 | 一个文件系统需要先挂载才能使用(linux中的mount)
- 文件别名 两个或多个文件名关联同一个文件
- 硬链接 多个文件项指向一个文件
- 软连接 快捷方式
- 文件系统种类
- 磁盘文件系统 文件存储在数据存储设备上,如磁盘。例如FAT,NTFS,ext2/3
- 数据库文件系统 文件根据其特征是可被寻址的
- 日志文件系统 记录文件系统的修改/事件
- 网络/分布式文件系统 例如NFS、SMB、AFS
- 特殊/虚拟文件系统
虚拟文件系统
- 目的 对所有不同文件系统的抽象
- 功能
- 提供相同的文件和文件系统接口
- 管理所有文件和文件系统关联的数据结构
- 高效查询例程,遍历文件系统
- 与特定文件系统模块的交互
- 组成
- 卷控制块 superblock 每个文件系统一个,包含了文件系统的详细信息,例如块的数量、块的大小、空余块、计数/指针等。
- 文件控制块 vnode/inode 每个文件一个,包含文件的详细信息,例如许可、拥有者、大小、数据库位置等。
- 目录节点 每个目录项一个,将目录项数据结构及树型布局编码成树型数据结构。
打开文件是指把文件控制块载入内存,返回一个文件描述符。
文件分配 分配方式的优劣主要看存储利用和访问速度两个指标
- 连续分配 文件头指定起始块和长度
- 优势 文件读取表现好 | 高效的顺序和随机访问
- 劣势 碎片 | 稳健增长问题
- 链式分配 文件以数据块链表方式存储 文件头包含了第一块和最后一块的指针
- 优势 创建、增大、缩小很容易 | 没有碎片
- 劣势 无法随机访问 | 可靠性差
- 索引分配 为每个文件创建一个名为索引数据块的非数据块,保存了到文件数据块的指针列表
- 优势 创建、增大、缩小很容易 | 没有碎片 | 支持直接访问
- 劣势 当文件很小时,存储索引的开销 | 大文件时索引数据块会不止一个,怎么管理?
空闲空间管理 跟踪在存储中的所有未分配的数据块。用位图代表空闲数据块的列表。
多磁盘管理 RAID 用多个磁盘提高吞吐量、可靠性和可用性。
磁盘调度 旋转延迟+寻道时间
- FIFO 按顺序处理请求,公平对待所有进程,接近随机调度的性能。
- SSTF 最短服务优先 选择从磁臂当前位置需要移动最少的IO请求,饥饿现象。
- SCAN 电梯算法,磁臂在一个方向上移动。
- C-SCAN 限制仅在一个方向上移动,到达终点立即返回。
- C-LOOK 限制仅在一个方向上移动,到达该方向最后一个请求立即返回。
- N-Step-SCAN / FSCAN 将请求分成N个队列,每次只扫描一个队列。
清华大学操作系统公开课笔记(向勇、陈渝)相关推荐
- Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”
Coursera公开课笔记: 斯坦福大学机器学习第七课"正则化(Regularization)" +13投票 斯坦福大学机器学习第七课"正则化"学习笔记, ...
- Coursera公开课笔记: 斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)”
Coursera公开课笔记: 斯坦福大学机器学习第十一课"机器学习系统设计(Machine learning system design)" 斯坦福大学机器学习斯坦福大学机器学习第 ...
- Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”
Coursera公开课笔记: 斯坦福大学机器学习第六课"逻辑回归(Logistic Regression)" 斯坦福大学机器学习第六课"逻辑回归"学习笔记,本次 ...
- Coursera公开课笔记: 斯坦福大学机器学习第四课“多变量线性回归(Linear Regression with Multiple Variables)”
Coursera公开课笔记: 斯坦福大学机器学习第四课"多变量线性回归(Linear Regression with Multiple Variables)" 斯坦福大学机器学习第 ...
- Coursera公开课笔记: 斯坦福大学机器学习第二课“单变量线性回归(Linear regression with one variable)”
Coursera公开课笔记: 斯坦福大学机器学习第二课"单变量线性回归(Linear regression with one variable)" 发表于 2012年05月6号 由 ...
- Coursera公开课笔记: 斯坦福大学机器学习第一课“引言(Introduction)”
Coursera公开课笔记: 斯坦福大学机器学习第一课"引言(Introduction)" 注:这是我在"我爱公开课"上做的学习笔记,会在52opencours ...
- 北京大学肖臻老师《区块链技术与应用》公开课笔记8——BTC挖矿篇
北京大学肖臻老师<区块链技术与应用>公开课笔记 比特币挖矿篇,对应肖老师视频:click here 全系列笔记请见:全系列笔记请见:click here About Me:点击进入我的Pe ...
- 北京大学肖臻老师《区块链技术与应用》公开课笔记23——ETH挖矿难度调整篇
北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊挖矿难度调整,对应肖老师视频:click here 全系列笔记请见:click here About Me:点击进入我的Persona ...
- 北京大学肖臻老师《区块链技术与应用》公开课笔记17——ETH数据结构篇1(状态树1)
北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊数据结构篇1--状态树1,对应肖老师视频:click here 全系列笔记请见:click here 以太坊数据结构篇1--状态树2请 ...
最新文章
- Xamarin开发Anroid应用介绍
- leetcode算法题--计算各个位数不同的数字个数
- 【MM模块】Schedule Agreement 计划协议
- spring security认证的底层实现
- java Junit 为什么@Test注解里的方法必须是public void修饰的
- 【揭秘】网易云视频点播加解密系统架构
- [短文速读] a=a+b和a+=b的区别
- SystemVerilog文本值和数据类型
- MySQL 集群方案介绍
- 网易数帆发布轻舟低代码平台2.0,聚焦中等复杂度企业级应用
- Java线程并发常用工具类使用
- 【数学工具?拉普拉斯机制?随机响应?】差分隐私系统学习记录(二)
- 到需要了解AD和LDAP的关系的时候了
- virtualenvwrapper
- SVN自助更新:运维利器Puppet实例讲解
- jetty client 与apache http client的实现、分析
- 外设获取物理内存数据_Linux系统对IO端口和IO内存的管理
- 软件测试思维总结(1)-----比较思维:利用好可参照的资源
- ASP.NET MVC Flash 在线拍照
- MiniUtilityFramework 九 CText和TEXT
热门文章
- 51nod 1092 回文字符串【LCS】
- SylixOS lsusb命令解析
- [20170515]数据库启动的一个疑问.txt
- 【2-SAT】URAL - 2089 - Experienced coach
- 【ASP.NET Web API教程】2 创建各种Web API
- [Lisp]slime
- 学习 WebService 第五步:在Local创建测试用WebService(WSDL)
- linux_network
- 计算机考试模拟系统无法进入,全国计算机等级考试上机考试模拟系统使用说明...
- linux特殊权限SUID,SGID和SBIT的介绍