一夜之间从头开始实现开源 RISC-V。DarkRISCV softcore 一开始是作为开源 RISC-V 指令集的概念证明而开发。虽然与其他 RISC-V 实现相比,DarkRISCV 代码小而粗糙,但其有很多令人印象深刻的功能,包括有:
实现大部分 RISC-V RV32E 指令集,实现大部分 RISC-V RV32I 指令集(缺少 csr*、e * 和 fence*),在超大规模 ku040 中工作频率高达 250MHz(400MHz 带超频!),便宜的 spartan-6 高达 100MHz,适合小型 spartan-3E,例如 XC3S100E!,大多数时间(通常是 71% 的时间)可以维持每条指令 1 个时钟,灵活的 harvard 架构(易于集成缓存控制器、总线桥等),在真正的 xilinx(spartan-3、spartan-6、spartan-7、artix-7、kintex-7 和 kintex ultrascale)中运行良好,在一些真正的 altera 和 lattice FPGA 上运行良好,适用于 RISC-V 的 gcc 9.0.0(无需补丁!),使用 850-1500LUT(核心仅使用 LUT6 技术,取决于启用的功能和优化),可选的 RV32E 支持(与 LUT4 FPGA 配合使用效果更好),可选的 16x16 位 MAC 指令(用于数字信号处理),可选的 coarse-grained multi-threading (MT),pipeline stages 之间没有互锁,BSD 许可证。
DarkRISCV 的主要动机是为围绕 680x0/Coldfire 系列的一些项目创建迁移路径
qq721686791 发布的最新帖子
-
开源RISC-V的Verilog实现DarkRISCV
-
如何使用 .NET Alloc 拦截
在 PerfView 中有一个 .NET Alloc 选项,它可以拦截每一次对象分配,然后记录下 线程调用栈,再根据分配量计算权重,知道原理后,接下来就可以开启 .NET Alloc 拦截。
需要注意的是,对于这个选项,需要先开启收集,再启动程序,等程序执行完毕后,点击 Stop Collection ,稍等片刻,会看到如下截图。
点击 GC Heap Net MEM (Coarse Sampling) Stack列表,选择我们的进程,会看到当前的 System.String权重占比最高,所以调查它的分配源就是当务之急了,截图如下:
接下来双击 System.String 行,查看它的 Callers,逐一往下翻,终于找到了 Program.Alloc1() 方法,截图如下:
到这里就找到了问题函数 Alloc1() 。 -
实现键盘输入的中断函数
首先我们需要知道键盘是属于外设,所以对应的中断属于外部中断。在讲中断那一章节时,我们知道了外部中断的处理流程,不过对于键盘的输入中断,还需要增加一点点东西。
8048是键盘上的芯片,其主要任务就是监控哪个键被按下,一旦有按键信息,8048就将按键信息传递给键盘控制器8042(8042通常是Intel 8042或兼容芯片,集成在主机内部的主板上),再由8042发送中断信号给8259A。最重要的一点是,键盘的中断号。
我们可以看到键盘对应的是IR1口,这个是硬件上决定的,所以我们无法更改。除此之外,在我们的程序中,我们将IR0口的中断号设置为0x20,后面依次递增,所以我们可以知道键盘的中断号为0x21。这里我们不管按键信息如何,我们只需要知道一旦有按键按下,就会有中断触发,所以我们尝试写一下按键的中断处理函数。
在project/kernel目录下新建keyboard.c、keyboard.h文件,除此之外还需要修改interrupt.c文件。
最后编译运行,可以看到我们一旦按下按键,屏幕便会打印信息,而且释放按键也会打印信息。当然这是后面需要讲解的内容,总之到现在,我们已经成功实现了按键的中断处理函数。
-
搭建网络的方法
在过去,我们运维着“能做一切”的大型单体应用程序。这是一种将产品推向市场的很好的方式,因为刚开始我们也只需要让我们的第一个应用上线。
而且我们总是可以回头再来改进它的。部署一个大应用总是比构建和部署多个小块要容易。
集中式:
集群:
分布式:
分布式和集中式会配合使用。
我们在搭建网站的时候,为了及时响应用户的请求,尤其是高并发请求的时候,我们需要搭建分布式集群来处理请求。我们一个服务器的处理能力是有限的。如果用我们一台设备当作服务器,那么当并发量比较大的时候,同一时间达到上百的访问量。那服务器就宕机了。然后只能重启服务器,当出现高并发访问的时候,就又会宕机。
所以我们需要更多的服务器来并行工作,处理用户的请求。那么问题来了,我们服务器运行的时候,怎么分发大量的请求给不同的服务器呢?
一般会采用(1apache+nTomcat)或者服务器模式来分发并处理请求。或者采用nginx分发请求。
微服务是运行在自己的进程中的可独立部署的服务套件。他们通常使用 HTTP 资源进行通信,每个服务通常负责整个应用中的某一个单一的领域。在流行的电子商务目录例子中,你可以有一个商品条目服务,一个审核服务和一个评价服务,每个都只专注一个领域。
用这种方法让多语言服务(使用不同语言编写的服务)也成为可能,这样我们就可以让 Java/C++ 服务执行更多的计算密集型工作,让 Rails / Node.js 服务更多来支持前端应用等等。
微服务会成为大规模分布式应用的主流架构。任何复杂的工程问题都会归结为devide and conquer(分而治之),意思就是就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……
直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。微服务本质是对服务的拆分,与工程领域惯用的“分而治之”的思路是一致的。
-
朴素贝叶斯算法
朴素贝叶斯算法是统计学味道最浓的一款算法,也是最能体现我们日常生活经验的算法;
与我们读万卷书行万里路形成我们自己的生活经验类似,朴素贝叶斯算法也是基于收集的历史数据分析得到相关事情发生的原因,从而形成解决问题的模型;
与我们面对未知的未来类似,基于自己的生活经验计算各种可能的情况,最终选择一个最大可能的方向进行努力 ,朴素贝叶斯算法也是基于学习的模型计算给定的输入属于各个分类的概率,并选择概率最大的分类作为结果;
朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法;该算法是基于贝叶斯定理和特征条件独立假设的分类算法;该算法首先通过分析训练数据得到先验概率、似然度,从而得到输入输出的联合概率分布;最后基于此训练模型,利用贝叶斯定理计算得到输入的后验概率最大的分类;
联合概率P(X,Y)是通过计算先验概率和条件概率得到的;
朴素贝叶斯法通过训练数据集学习得到先验概率(=),=1,2,3,...,P(Y=ck),k=1,2,3,...,K
条件概率(=|=)=((1)=(1),...,()=()|=),=1,2,3,...,P(X=x|Y=ck)=P(X(1)=x(1),...,X(n)=x(n)|Y=ck),k=1,2,3,...,K
-
手把手教你使用映射器
鉴于我们希望把整个工程包下关于数据库操作的 DAO 接口与 Mapper 映射器关联起来,那么就需要包装一个可以扫描包路径的完成映射的注册器类。
当然我们还要把上一章节中简化的 SqlSession 进行完善,由 SqlSession 定义数据库处理接口和获取 Mapper 对象的操作,并把它交给映射器代理类进行使用。
有了 SqlSession 以后,你可以把它理解成一种功能服务,有了功能服务以后还需要给这个功能服务提供一个工厂,来对外统一提供这类服务。比如我们在 Mybatis 中非常常见的操作,开启一个 SqlSession。
以包装接口提供映射器代理类为目标,补全映射器注册机 MapperRegistry,自动扫描包下接口并把每个接口类映射的代理类全部存入映射器代理的 HashMap 缓存中。
而 SqlSession、SqlSessionFactory 是在此注册映射器代理的上次层使用标准定义和对外服务提供的封装,便于用户使用。我们把使用方当成用户 经过这样的封装就就可以更加方便我们后续在框架上功能的继续扩展了,也希望大家可以在学习的过程中对这样的设计结构有一些思考,它可以帮助你解决一些业务功能开发过程中的领域服务包装。
MapperRegistry 提供包路径的扫描和映射器代理类注册机服务,完成接口对象的代理类注册处理。
SqlSession、DefaultSqlSession 用于定义执行 SQL 标准、获取映射器以及将来管理事务等方面的操作。基本我们平常使用 Mybatis 的 API 接口也都是从这个接口类定义的方法进行使用的。
SqlSessionFactory 是一个简单工厂模式,用于提供 SqlSession 服务,屏蔽创建细节,延迟创建过程。 -
Shell脚本
Shell脚本是一款用 C 语言编写的程序,它是用户使用 Linux 系统的必备桥梁。Shell脚本既是一种命令语言,又是一种程序设计语言。Shell脚本是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh (shell脚本的缩写)是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell脚本语言。
说了这么多,那什么是脚本呢?简单来说脚本其实就是一条条的文字命令,这些文字命令都是能够看到的,比如可以用记事本执行打开查看、编辑等基础的操作。常见的脚本:如前端有JavaScript,VBScript, ASP,JSP,后端的PHP,数据库操作语言SQL,Perl,Shell,python,Ruby,JavaFX,Lua 等。
-
第一个shell脚本:打开文本编辑器(可以使用 touch/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
-
运行 Shell 脚本有两种方法:第一种方法是可以把Shell 脚本作为一个可执行程序,并将所需要的代码保存为 test.sh,并 cd 到相应目录。需要注意的是,一定要把后缀名写成 ./test.sh的形式,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
第二种方法则是把Shell 脚本直接够作为解释器参数。这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,这种方式运行的脚本,不需要在第一行指定解释器信息,不过即使写了也没有什么太大的作用。
-
-
数据库的发展历程
什么是数据库?顾名思义,数据库就是一个按照数据结构来组织、存储和管理数据的“仓库”。
数据库指的是数据都以一定方式储存在一起、能够为多个用户所共享、并且具有尽可能小的冗余度的特点的、与应用程序彼此独立的一个数据集合。
数据库可以通过统一的一些指令对数据进行增、删、改、查等一些列的基本操作。
数据库也可实现数据共享:数据共享中包含了所有的用户可以同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
减少数据的冗余度:相比于文件系统,由于数据库实现了数据共享,就会从一定程度上避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
保持数据的独立性:数据的独立性包括逻辑独立性,即:数据库中数据库的逻辑结构和应用程序相互独立;和物理独立性,即:数据物理结构的变化不影响数据的逻辑结构。
数据实现集中控制:在文件管理的方式中,数据是一直处于一种分散的状态中,不同的用户或同一用户在不同处理中其文件之间毫无关系。而利用数据库就可以对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
数据一致性和可维护性:以确保数据的安全性和可靠性:主要包括:安全性控制、完整性控制、并发控制,使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用。
故障恢复:由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏。数据库系统能尽快恢复数据库系统运行时出现的故障,可能是物理上或是逻辑上的错误。比如对系统的误操作造成的数据错误等。
-
什么是数仓
数据仓库的英文全称为Data Warehouse,简称DW。它是面向主题的,集成的,相对稳定的,反映历史变化的一款数据存储集合app,数据仓库被用于支撑企业的分析报告与决策。
数仓可以将不同数据源的数据在一个较高抽象层次上做整合,数据可以围绕某一主题进行汇总,如遇上电商可以围绕的主题有:订单、流量、商品、用户等方面 。数仓中的数据来源于不同数据源的集成,可以是tob业务系统数据源,也可以是toc业务系统数据源,亦或者是erp业务系统数据源,且这些数据源的存储方式可能不同:
有时候会用到mysql数据库、而有时也会用orcale、或者是用hive,基于以上不同的方式,因此使用者们需要做etl操作整合不同的数据源。数仓中的数据保存的是一些列历史快照数据,不允许数据被修改,使用人员只能查询或分析数据。数仓会定期接受新的集成数据,反映最新的数据变化。