06 2022 档案
摘要:OpenPPL OpenPPL是商汤基于自研高性能算字库的开源深度学习推理平台,能够让人工智能应用高效可靠地运行在现有的CPU/GPU等计算平台上,为云端场景提供人工智能推理服务 OpenPPL基于全自研高性能算子库,拥有极致调优的性能,同时提供云原生环境下的 AI模型多后端部署能力,并支持Open
阅读全文
摘要:ubuntu安装中文输入法成功教程: https://zhuanlan.zhihu.com/p/508797663 博主希望尽量的不去宿主机中操作,达到对原系统的保护的效果,并且能够进行日常的深度学习网络的训练,因此想到了docker(Kubernetes 太高端) 使用docker安装带有显卡的镜
阅读全文
摘要:机器学习编译课程主要由华盛顿大学计算机系博士生 -- 陈天奇博士讲授,在读博期间,先后带领团队打造了模块化深度学习系统NNVM(2016年)和深度学习编译器TVM(2017年),共同组成了深度学习到各种硬件的完整优化工具链。 英文课程主页 https://mlc.ai/summer22/ 中文课程主
阅读全文
摘要:按照 CPU 功能升级迭代的顺序,CPU 的工作模式有实模式、保护模式、长模式,这几种工作模式下 CPU 执行程序的方式截然不同,下面我们一起来探讨这几种工作模式。 从一段死循环的代码说起 int main() { int* addr = (int*)0; cli(); //关中断 while(1)
阅读全文
摘要:本节来讲讲 ARM 的 AArch64 体系结构,扩展一下视野。 看看什么是 AArch64 体系,然后分析一下 AArch64 体系有什么特点,最后了解一下 AArch64 体系下运行程序的基础,包括 AArch64 体系下的寄存器、运行模式、异常与中断处理,以及 AArch64 体系的地址空间与
阅读全文
摘要:本届来看看操作系统下面的硬件层面,重点研究一下 CPU 的原理和它的加速套路。 CPU的原理初探 从操作系统的位置来看,它除了能够向上封装,为软件调用提供 API(也就是系统调用),向下又对硬件资源进行了调度和抽象。我们通常更为关注系统调用,但为了更好地设计实现一个 OS,我们当然也要对硬件足够了解
阅读全文
摘要:KVM 技术是基于内核的虚拟机,同样的 KVM 和传统的虚拟化技术一样,需要虚拟出一台完整的计算机,对于某些场景来说成本会比较高,其实还有比 KVM 更轻量化的虚拟化技术,也就是今天我们要讲的容器。 什么是容器 容器的名词源于 container,但不得不说我们再次被翻译坑了。相比“容器”,如果翻译
阅读全文
摘要:随着云计算、大数据和分布式技术的演进,我们需要在一台服务器上虚拟化出更多虚拟机,还要让这些虚拟机能够弹性伸缩,实现跨主机的迁移。 而虚拟化技术正是这些能力的基石。 亚马逊、阿里、腾讯等知名公司用到的云虚拟主机,看看其中的核心技术——KVM 虚拟化技术。 理解虚拟化的定义 什么是虚拟化? 在我看来,虚
阅读全文
摘要:上节课,我们通过实现一个获取时间的系统服务,学习了 Cosmos 里如何建立一个系统服务接口。Cosmos 为应用程序提供服务的过程大致是这样的:应用程序先设置服务参数,然后通过 int 指令进入内核,由 Cosmos 内核运行相应的服务函数,最后为应用程序提供所需服务。 这节课我们就来看看 Lin
阅读全文
摘要:Cosmos 系统已经有内存管理,进程、文件、I/O 了,这些重要的组件已经建立了,也就是说它们可以向应用程序提供服务了。 服务接口的结构 先来设计一下服务接口的整体结构,即 Cosmos 的 API 结构。因为 Cosmos 的 API 数量很多,所以我们先来分个类,它们分别是进程类、内存类、文件
阅读全文
摘要:上节了解了套接字的工作机制和数据结构,但套接字有哪些基本接口实现呢? 套接字接口 套接字接口最初是 BSD 操作系统的一部分,在应用层与 TCP/IP 协议栈之间接供了一套标准的独立于协议的接口。 Linux 内核实现的套接字接口,将 UNIX 的“一切都是文件操作”的概念应用在了网络连接访问上,让
阅读全文
摘要:现在我们来瞧一瞧 Linux 的网络程序,不过想要入门 Linux 的网络编程,套接字也是一个绕不开的重要知识点,正是有了套接字,Linux 系统才拥有了网络通信的能力。而且网络协议的最底层也是套接字,有了这个基础,你再去看相关的网络协议的时候也会更加轻松。 本节先来了解套接字的作用、工作原理和关键
阅读全文
摘要:这节课我会带你看看,现实世界中网络请求是如何穿过重重网络设备,实现大规模组网的。同时,我还会给你讲解网络架构的过去、现在,并展望一下将来的发展趋势。最后我会带你动手搭建一个现代互联网实验环境,通过实际的组网实践加深对网络架构的理解。 从传统网络架构聊起 是否好奇过,我们目前用的互联网是如何做到互联互
阅读全文
摘要:网络数据在内核中的流转,最终要服务于网络收发功能,所以先来了解下具体的网络发收过程,然后了解lwIP的网络收发。 具体的网络发收过程 理解软件的设计思想,最重要的是先理解需求,而内核中的数据流转也只是为了满足网络收发的需求而设计的。 发送过程总览 下面来看下应用程序通过网络发送数据的全过程。 应用程
阅读全文
摘要:本节作为网络篇的开始,将从一个面试高频出现的问题切入,梳理从输入URL到网卡的网络数据流动过程中都发生了什么事。 从一道经典面试题说起 输入 URL,从一个请求到响应都发生了什么事? 先概括一下全过程,让你有个整体印象。 1.常规的网络交互过程是从客户端发起网络请求,用户态的应用程序(浏览器)会生成
阅读全文
摘要:本节来瞧下Linux是如何管理文件,也验证下Linux那句口号:一切皆文件 为此,我们需要首先搞清楚什么是 VFS,接着理清为了实现 VFS 所用到的数据结构,然后看看一个文件的打开、读写、关闭的过程,最后我们还要亲自动手实践,在 VFS 下实现一个“小”且“能跑”的文件系统。 什么是 VFS VF
阅读全文
摘要:上节我们已经建立了仓库,并对仓库进行了划分,就是文件系统的格式化,有了仓库就需要往里面存取东西了,对于我们的仓库来说,就是存取应用程序的文件。 所以本节要给仓库增加一些相关的操作,这些操作主要用于新建、打开、关闭、读写文件,它们也是文件系统的标准功能,自然即使我们这个最小的文件系统,也必须要支持。
阅读全文
摘要:上节课,已经设计好了文件系统数据结构,相当于建好了仓库的基本结构。 本节将来探索仓库的划分,即什么地方存放仓库的管理信息,什么地方存放进程的“劳动成果”(也就是文件),对应于文件系统的格式化操作。 先来实现文件系统设备驱动,接着建立文件系统超级块,然后建立根目录,最后建立文件系统的位图 文件系统设备
阅读全文
摘要:进程加工处理的数据就是进程的劳动成果,这个“劳动成果”如何表示、如实组织、又放在哪里呢?这些问题都会在讲解文件系统的过程中得到解答 先来搞清楚什么是文件系统,然后解决文件系统如何组织文件,最后对文件系统进行设计并抽象成数据结构。 什么是文件系统 我们经常在计算机上听 APE 音乐、看 4K 视频、阅
阅读全文
摘要:本节了解下Linux是如何管理设备的,将从Linux如何组织设备开始,然后研究设备相关的数据结构,最后写一个Linux设备驱动实例。 感受一下Linux下的设备信息 Linux的设计哲学是一起皆是文件,各种设备在Linux系统下都是一个个文件,但这个文件并不对应磁盘上的数据文件,而是对应存在内存当中
阅读全文
摘要:上一讲实现了建立设备的接口,相当于制定了部门的相关法规,只要遵循这些法规就能建立一个部门。一个部门的职责不难确定,它应该能对上级下发的任务作出响应,并完成相关工作,而这对应到设备,就是如何处理内核的I/O包。 首先,需要搞清楚什么是I/O包,然后实现内核向设备发送I/O包的工作,最后完成一个驱动实例
阅读全文
摘要:在上节课里,我们对设备进行了分类,建立了设备与驱动的数据结构,同时也规定了一个驱动程序应该提供哪些标准操作方法,供操作系统内核调用。这相当于设计了行政部门的规章制度,一个部门叫什么,应该干什么,这些就确定好了。 本节继续探索部门的建立,也就是设备在内核中是如何注册的。我们先从全局了解一下设备的注册流
阅读全文
摘要:计算机的结构 计算机结构示意图: 主板上的各种芯片并非独立存在,而是以总线为基础连接在一起的,各自完成自己的工作,又能相互打配合,共同实现用户要求的功能。 如何管理设备 前面的学习中宏,实现了管理内存和进程,其实进程从正面看它是管理应用程序的,反过来看它也是管理CPU的,它能使CPU的使用率达到最大
阅读全文
摘要:Linux如何表示进程 在Cosmos中,设计了一个thread_t数据结构来代表一个进程,Linux也同样是用一个数据结构表示进程。 Linux进程的数据结构 在Linux系统下,把运行中的应用程序抽象成一个数据结构task_struct,一个应用程序所需要的各种资源,如内存、文件等都包含在tas
阅读全文
摘要:上节我们设计了Cosmos的进程调度器,但只有进程调度器是不够的,因为调度器它始终只是让一个进程让出CPU,切换到它选择的下一个进程上去。 结合进程生命周期,在多进程调度方面,还需要实现进程的等待与唤醒机制 进程的等待与唤醒 进程得不到所需的资源时就会进入等待状态,直到这种资源可用,才会被唤醒。那进
阅读全文
摘要:为什么需要多进程调度 1、CPU 同一时刻只能运行一个进程,而 CPU 个数总是比进程个数少,这就需要让多进程共用一个 CPU,每个进程在这个 CPU 上运行一段时间。 2、当一个进程不能获取某种资源,导致它不能继续运行时,就应该让出 CPU。 也可将第1点中的CPU时间视为一种资源,这样可以合并成
阅读全文
摘要:本节将了解操作系统里一个层次非常高的组件--进程,它非常依赖于内存管理、中断、硬件体系结构 在Linux终端中输入ps命令,就可以看到系统中有多少个进程,它会打印出具体进程的数据,如创建进程和用户、进程ID、使用CPU的百分比,进程运行状态,进程的建立时间、进程的运行时间、进程名等,这些数据综合起来
阅读全文
摘要:轻量化网络已经是一个热点,主要的技术路线如下: 1、压缩已经训练好的大模型:知识蒸馏、剪枝(权重剪枝、通道剪枝)、权值量化、注意力迁移 2、重新设计轻量化模型:SqueezeNet、MobileNet系列、ShuffleNet系列、EfficientNet、EfficientDet等 3、加速卷积运
阅读全文
摘要:在Linux系统中比页更小的内存对象要怎么分配呢? -- SLAB,学习下SLAB分配器的原理和实现 SLAB 与Cosmos物理页面管理器一样,Linux中的伙伴系统是以页面为最小单位分配到,现实更多要以内核对象为单位分配内存,其实更具体一点说,就是根据内核对象的实例变量大小来申请和释放内存空间,
阅读全文
摘要:在Linux系统中,用来管理物理内存页面的伙伴系统,以及负责分配比页更小的内存对象的SLAB分配器 本节先讲解Linux是如何管理内存页面的,何为伙伴系统 ###伙伴系统 伙伴系统源于 Sun 公司的 Solaris 操作系统,是 Solaris 操作系统上极为优秀的物理内存页面管理算法。 那 Li
阅读全文
摘要:上节课,已经建立了虚拟内存的开始流程,本节将来实现虚拟内存的核心功能:写出分配、释放虚拟地址空间的代码,最后实现虚拟地址空间到物理地址空间的映射。 ###虚拟地址的空间的分配与释放 整个虚拟地址空间是由一个个虚拟地址区间组成,那分配一个虚拟地址空间就是在整个虚拟地址空间分割出一个区域,而释放一块虚拟
阅读全文
摘要:一个应用往往拥有很大的连续地址空间,并且每个应用都是一样的,只有在运行时才能分配到真正的物理内存,在操作系统中这称为虚拟内存。 那操作系统要怎样实现虚拟内存呢?这节课,我们先进行虚拟地址空间的划分,搞定虚拟内存数据结构的设计,下节来实现虚拟内存的核心功能。 ###虚拟地址空间的划分 虚拟地址就是逻辑
阅读全文
摘要:我们建立了物理内存页面管理器,它既可以分配单个页面,也可以分配多个连续的页面,还能指定在特殊内存地址区域中分配页面。 但物理内存页面管理器一次分配至少一个页面,而对内存分页也是一个页面4K,即4096字节,对于小于一个页面的内存分配请求,它无能为力,那如果要实现小于一个页面的内存分配请求,要怎么办呢
阅读全文
摘要:本节将依赖前面建好的数据结构,实现内存页面管理算法 ###内存页的分配 如果让实现一次只分配一个页面,那只需要写一个循环代码,在其中遍历出一个空闲的msadsc_t结果,就可以返回了,这个算法就结束了, 但内存管理器要为内核、驱动,还有应用提供服务,它们对请求内存页面的多少、内存页面是不是连续,内存
阅读全文
摘要:上节确定了使用分页方式管理内存,并且设计了表示内存页、内存区相关的内存管理数据结构,但还没有在内存中建立相应的实体变量 本节将讲解在内存中建立数据结构对应的实例变量,搞定内存页的初始化问题。 ###初始化 在前面的课程中,在hal层初始化中,初始化了从二级引导器中获取的内存布局信息,即e820map
阅读全文