转载: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个队列,每次只扫描一个队列。

清华大学操作系统公开课笔记(向勇、陈渝)相关推荐

  1. Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化(Regularization)”

     Coursera公开课笔记: 斯坦福大学机器学习第七课"正则化(Regularization)" +13投票 斯坦福大学机器学习第七课"正则化"学习笔记, ...

  2. Coursera公开课笔记: 斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)”

    Coursera公开课笔记: 斯坦福大学机器学习第十一课"机器学习系统设计(Machine learning system design)" 斯坦福大学机器学习斯坦福大学机器学习第 ...

  3. Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”

    Coursera公开课笔记: 斯坦福大学机器学习第六课"逻辑回归(Logistic Regression)" 斯坦福大学机器学习第六课"逻辑回归"学习笔记,本次 ...

  4. Coursera公开课笔记: 斯坦福大学机器学习第四课“多变量线性回归(Linear Regression with Multiple Variables)”

    Coursera公开课笔记: 斯坦福大学机器学习第四课"多变量线性回归(Linear Regression with Multiple Variables)" 斯坦福大学机器学习第 ...

  5. Coursera公开课笔记: 斯坦福大学机器学习第二课“单变量线性回归(Linear regression with one variable)”

    Coursera公开课笔记: 斯坦福大学机器学习第二课"单变量线性回归(Linear regression with one variable)" 发表于 2012年05月6号 由 ...

  6. Coursera公开课笔记: 斯坦福大学机器学习第一课“引言(Introduction)”

    Coursera公开课笔记: 斯坦福大学机器学习第一课"引言(Introduction)" 注:这是我在"我爱公开课"上做的学习笔记,会在52opencours ...

  7. 北京大学肖臻老师《区块链技术与应用》公开课笔记8——BTC挖矿篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 比特币挖矿篇,对应肖老师视频:click here 全系列笔记请见:全系列笔记请见:click here About Me:点击进入我的Pe ...

  8. 北京大学肖臻老师《区块链技术与应用》公开课笔记23——ETH挖矿难度调整篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊挖矿难度调整,对应肖老师视频:click here 全系列笔记请见:click here About Me:点击进入我的Persona ...

  9. 北京大学肖臻老师《区块链技术与应用》公开课笔记17——ETH数据结构篇1(状态树1)

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊数据结构篇1--状态树1,对应肖老师视频:click here 全系列笔记请见:click here 以太坊数据结构篇1--状态树2请 ...

最新文章

  1. Xamarin开发Anroid应用介绍
  2. leetcode算法题--计算各个位数不同的数字个数
  3. 【MM模块】Schedule Agreement 计划协议
  4. spring security认证的底层实现
  5. java Junit 为什么@Test注解里的方法必须是public void修饰的
  6. 【揭秘】网易云视频点播加解密系统架构
  7. [短文速读] a=a+b和a+=b的区别
  8. SystemVerilog文本值和数据类型
  9. MySQL 集群方案介绍
  10. 网易数帆发布轻舟低代码平台2.0,聚焦中等复杂度企业级应用
  11. Java线程并发常用工具类使用
  12. 【数学工具?拉普拉斯机制?随机响应?】差分隐私系统学习记录(二)
  13. 到需要了解AD和LDAP的关系的时候了
  14. virtualenvwrapper
  15. SVN自助更新:运维利器Puppet实例讲解
  16. jetty client 与apache http client的实现、分析
  17. 外设获取物理内存数据_Linux系统对IO端口和IO内存的管理
  18. 软件测试思维总结(1)-----比较思维:利用好可参照的资源
  19. ASP.NET MVC Flash 在线拍照
  20. MiniUtilityFramework 九 CText和TEXT

热门文章

  1. 51nod 1092 回文字符串【LCS】
  2. SylixOS lsusb命令解析
  3. [20170515]数据库启动的一个疑问.txt
  4. 【2-SAT】URAL - 2089 - Experienced coach
  5. 【ASP.NET Web API教程】2 创建各种Web API
  6. [Lisp]slime
  7. 学习 WebService 第五步:在Local创建测试用WebService(WSDL)
  8. linux_network
  9. 计算机考试模拟系统无法进入,全国计算机等级考试上机考试模拟系统使用说明...
  10. linux特殊权限SUID,SGID和SBIT的介绍