- 博客(82)
- 资源 (6)
- 收藏
- 关注
原创 Iverilog源码分析 --- data type
在Verilog里面, 有2种类型的变量: net和variable, 每一种都有多种的数据类型, 这些都是通过vpiSignal.cc里面
2022-01-29 17:11:54
1350
原创 Verilog基础-- gate & switch
在Verilog里面, 定义了如下几种gate/swich:逻辑门type特征说明andN个输入, 一个输出输出多个输入的and操作结果nandN个输入, 一个输出输出多个输入的and操作取反的结果orN个输入, 一个输出输出多个输入的or操作结果norN个输入, 一个输出输出多个输入的or操作取反的结果xorN个输入, 一个输出输出多个输入的xor操作结果xnorN个输入, 一个输出输出多个输入的xor操作取反的结果缓
2021-05-30 16:14:26
1849
原创 Iverilog源码分析 -- vvp value change 类型
vvp_vecor4_t里面所有的value均为a/b bus代表01xz字符串;vvp_vector2_t采用unsigned long arr来进行存储;代表一系列的01字符串;vvp_scalar_tThe strength values are as defined here:HiZ - 0Small - 1Medium - 2Weak - 3Large - 4Pull - 5Strong - 6Supply – 7该class, 用一个byte记
2021-03-21 09:04:32
648
1
原创 Iverilog源码分析 -- VPI scope的实现
在Verilog里面采用module/endmodule 来组成整个design的hierarchy结构, 比如, 如下的代码:会产生如下的hierarchy结构:目前在Verilog的LRM, 有如下几种scope类型:ModuleTaskFuncionNamed block在IVerilog 里面, 定义了如下6中scope以及相关的定义如下:vpiModulevpiTaskvpiFunction上述3中, 比较常见, 忽略例子;vpiNamedBegin
2021-02-28 10:54:23
996
原创 Iverilog 源码分析 -- VPI的实现
在IVerilog中VVP可以通过-m或者-M制定需要加载的模块,本文介绍一下VPI的模块工作机制。每个模块通过vpip_load_module来加载指定的动态链接库, 然后在动态链接库里面找到“vpip_set_callback”函数来设定vpip_routines_s 结构内的函数指针,这些函数是VerilogLRM预定义的37个函数;然后查找vlog_startup_routines 内指定的启动函数并且逐个执行;void vpip_load_module(const char*name) {
2021-02-17 07:36:59
1552
1
原创 IVerilog 源码分析 --PLI框架简介
PLI 基础Verilog 提供了PLI(Programming Language Interface)机制, 用来进行硬件设计和软件设计者进行交互。 它可以在Verilog的设计之中加入用户自定义的系统函数,这些系统函数是通过C语言软件的方式实现, 这可以理解为, 通过插件的方式, 来扩充硬件设计语言的功能。PLI常见的功能如下:C语言bus函数建模;访问C语言代码库函数;延时计算功能;自定义输出显示;联合仿真;设计的debug功能;仿真结果分析;我们比较感兴趣的是访问C语言代码库
2021-02-15 19:35:40
1359
原创 性能问题的定位
线上程序常出现的状况是运行一段时间之后, 发现运行效率越来越差, 慢慢出现了累计或者相应慢的情况, 比较粗暴额解决方式是重启程序, 一切都正常了。 但是过了一段时间问题又出现了, 我们需要借助一些工具来定位为。通常我们的程序, 可以大致分为3种类型:计算型, cpu、 内存使用比较多, 比如我们常见的缓存, 计算型流失数据分析等;存储型, 磁盘IO使用比较多,通常的瓶颈在磁盘IO,比如数据库存储引擎, 存储系统等;网络资源消耗性, 比如网络库。top出现性能问题, 第一个能想到的就是用top
2020-06-27 07:17:16
632
原创 MooseFS的常见问题与操作
副本的设定作为一种分布式文件系统, 基本原理是将文件分块, 每个块分不到几台机器上面, 这样, 如果某台机器故障或者因为网络问题不可达, 系统会进行自动的异常平衡策略处理, 通常是将每个数据块的副本数设定为2, 假定者2个副本分布在机器A和B上面, 如果机器A发生故障, 只剩下B上面的副本, 这时候master会检测到机器A故障, 并且数据块上面的实际副本数少于制定的副本数, 根据机器负载以及策略, 选择新的机器C, 并将B上面的数据Copy一份到C上面。mfssetgoal -r 2 /mnt/mfs
2020-06-25 16:22:23
703
原创 haproxy的使用
haproxy的部署还是很简单的, 本文重点介绍一下它的配置文件的设置。haproxy的配置一般包含4部分: global, defaults, fornted, backend, 分别代表了全局设置, 默认设置, 前端设置, 后端设置。globalglobal部分设置了全局的变量, 通常包含:log, uid, gid, deamon等。其中log设置 了haproxy日志的输出等级, ...
2020-04-19 10:57:07
340
原创 redis command 执行过程的代码分析
本文通过命令从client端到server端的执行过程, 分析一下命令的处理过程。redisContext对于每一个连接, 会产生一个redisContext, 记录了连接的上下文信息, 比如:sock fd, 写入的buf, 以及sockaddr等。 这里,使用的是hiredis里面的接口和数据结构, 也就是说数据从client到server之间的传输使用了hiredis C driver的...
2020-01-05 15:17:05
938
原创 docker的使用
随着docker/K8S技术的日渐成熟, 越来越多的公司将自己的服务放进docker里面来运行, 以此来做到资源隔离和部署的简化。docker与虚拟机的区别从下图可以看出, docker与VM相比, 结构要简单, 更加轻量一些, docker的dockerd程序是操作系统的一个进程, 每个docker内部也不是有自己的操作系统, 这些都是公用主机的资源, 因此docker比虚拟机要轻很多, 与...
2019-11-30 10:55:34
150
原创 C++多线程的实现
在C++模式线面, 要实现多线程并发, 提升性能, 并不是一件很容易的事情。 难点不是如何划分出多个线程, 而是如何确认哪些内存是线程间公用的, 需要避免冲突, 另一个方面, 如何做到线程间同步。线程私有数据在一个线程里面, 线程ID和堆栈上的数据, 以及信号集等是线程私有的, 我们还可以通过一些函数指定线程的私有数据, 比如pthread_setspecific。线程之间通信线程之间的通...
2019-11-16 20:00:54
1937
原创 分布式文件系统
存储是分布式系统中很重要的一个方面, 常见的存储有包含了3种类型:类型特点常见程序结构化存储数据的表结构固定关系型数据库, 例如MySQL半结构化存储表结构不固定非关系型数据库, MongoDB等分布式文件系统存储BLOB类型数据, 例如图片,视频等文件形式GFS, HDFS等本文主要介绍分布式文件系统的分类以及主要特征。元数据存储方式根据...
2019-08-25 18:37:31
345
原创 LINUX文件系统概要
在LINUX系统下, 一切皆是文件。所有的读写, 包含块设备, 字符设备,socket, 管道等的操作, 都被设计为对文件的IO操作。文件系统的位置在LINUX系统下, 所有的文件及设备都是通过文件系统来操作的, 文件系统在整个系统中处于核心的地位。VFS架构LINUX能够支持多种文件系统, 比如, XFS,EXT3,EXT4以及GlusterFS等等, 它们对外的使用方式是一样的, 它...
2019-07-30 10:56:17
224
原创 一点总结
最近一直在看厦门的一些机会, 有一点感慨记录一下。认清楚一线城市与二三线的差异我们不得不承认, 目前国内的IT环境, 主要的大公司还集中在北上广深, 一些基础架构以及很底层的工作, 都集中在一线城市。 二三线城市比较多的是应用以及某个大公司的分部,负责前端的开发。在这样的情况下, Java大行其道, 我想大概是因为Java使用了大量的框架, 而这些框架需要挺久的时间才能够熟悉吧。知识的深度与...
2019-07-20 17:46:34
204
原创 MongoDB中并发控制(MVCC)
每当有新的数据写入, 首先是写入内存的缓存, 以及WAL log, 每隔一定的时间60秒或者WAL log文件达到一定的大小, 比如2G, 进行一次checkpoint, 结合checkpoint与WAL log可以做到在意外出现故障的时候, 快速的回复内存状态。cursorCacheevictreconcileblock managerWAL log...
2019-06-09 15:51:37
3978
原创 MongoDB的事务实现
WiredTiger对事务的支持, 是MongoDB支持事务的基础, 这里介绍一下WT下事务的实现过程。transaction 相关的数据结构__wt_txn_global在WT_CONNECTION中, 有一个全局的事务相关的上下文结构体__wt_txn_global, 用来记录事务实现的全局信息。 在open connection的时候调用__wt_txn_global_init来构建和...
2019-05-12 11:13:30
5451
原创 WiredTiger的journal日志实现
journal日志是实现WiredTiger持久化的关键, 所有的插入、更新操作, 都会在journal里面写入一条日志, 并且在服务器意外退出的时候, 通过checkpoint和该checkpoint之后的日志, 能够迅速的回复服务器的状态。在Wiredtiger里面, 通过log来表示journal相关的实现, 接下来, 我们看下是如何实现的。WT_CONNECTION_IMPL中log相...
2019-05-02 17:44:39
1765
原创 WiredTiger hazard指针
在WiredTiger里面, 采用Hazard pointers来管理一个内存页是否可以被Evict, 本文分析下其实现过程。Hazard pointersHazard pointers是在多线程环境下实现资源无锁访问的一种方法, 它采用内存换时间的方法:...
2019-04-30 19:17:53
778
原创 Golang下基于XORM的mysql使用
最近工作中发现, 同样的一个数据库, 不同语言开发的模块, Golang模块在数据库域名对应的底层数据库发生切换, 能够自动连接,但是Java的不会, 为什么会有这样的差异哪?Golang的连接池Java的连接池...
2019-03-03 13:33:19
4093
原创 MongoDB sharding 之 MoveChunk的实现过程
在分片集群模式下, 有一个Balancer的类,它启动一个名字为Balancer的后台线程, 用来保证不同分片之间chunk数的均匀。 每一个Mongos都有自己的Balancer, 不同的Balancer之间通过分布式锁来进行控制, 保证某个一时间只有一个Balancer在工作。先看一下Balancer的定义:class Balancer : public BackgroundJob {p...
2019-03-02 21:57:04
1868
1
原创 MongoDB 分片sharding概述
当MongoDB由于存储的数据越来越多, 由于性能原因, 或者单个主机资源限制, 垂直扩容没有办法进一步的时候, 我们就需要开始考虑水平扩容了。与垂直扩容不同的是, 水平扩容不需要新添加的机器有多么强大的功能,它的设计理念是将业务数据尽可能平均的划分成一段一段的, 每一段分布在一台机器上, 这样, 当系统需要进一步扩容的时候,只需要添加机器, 将现有数据的一部分迁移到新添加的机器上, 旧的系统就...
2019-02-24 07:48:18
955
原创 LINUX shell 下面调用脚本的3种方式
在LINUX下, 通过脚本执行一些命令, 通常需要执行好几个脚本共同完成任务, 这里的调用有3种方式:fork方式这是最常用的方式, 直接通过: /path/xx.sh 就可以啦。task.sh:#!/bin/shell/export/home/baijiwei/run.sh这里, task.sh本身启动了一个进程, 假设进程ID为10000,它会启动一个新的shell 来执行ru...
2019-02-17 11:06:25
2276
原创 MongoDB CRUD以及command的代码实现
我们在使用MongoDB的时候, 经常需要使用mongo shell或者各种语言的driver的API来进行CRUD以及数据库管理操作的command, 那么它是如何实现的?MongoDB wire protocolMongoDB通过一种特殊的client/server 之间的协议:wire protocol。它是一种基于socket的request/response之间的通信协议。用户通过m...
2019-01-20 14:17:17
2113
3
原创 MongoDB连接池的实现
几乎每一种数据库都会有连接池, 来减少频繁的创建删除连接的开销, 在MongoDB里面是通过信号量线程同步方式来对创建、销毁进行管理。信号量基础int sem_init(sem_t *sem, int pshared, unsigned int value)sem是要初始化的信号量,pshared表示此信号量是在进程间共享(=1)还是线程间共享(=0),value是信号量的初始值。int...
2019-01-13 13:27:33
14179
3
原创 MongoDB 单文档原子操作的实现
transaction的支持在 MongoDB 里面是逐渐进行的, 从3.2版本开始支持单文档的原子操作, 这是后续的多文档原子操作, 以及4.0 的副本集的事务, 以及后续的计划推出的4.2的分片的事务操作的基础。本文着重描述一下单文档的原子操作。原子性: 就是一个操作要么成功, 要么失败。具体来说, 就是一个插入、更新或者删除操作, 应该只有commit或者rollback两种结果中的一种。...
2019-01-12 20:18:17
1813
原创 MongoDB更新同步的oplog位置
在MongoDB中, 副本集节点之间为了保持一致性, 需要通过oplog的同步与回放来进行。MongoDB采用的是节点向源节点主动拉取的方式, 从源节点拉取oplog, 目的节点需要及时通知其他节点它的最新的同步到的时间点。如上图所示, 2个Secondary从Primary上面拉取oplog,每当secondary的时间点发生改变, 会调用replSetUpdatePosition来告诉在...
2018-12-30 13:33:43
3157
1
原创 golang http使用踩过的坑与应对
golang对http进行了很好的封装, 使我们在开发基于http服务的时候, 十分的方便, 但是良好的封装, 很容易是的我们忽略掉它们底层的实现细节。 如下是我踩过的一些坑, 以及相应的解决方法。调用http服务正确的实践如下:resp, err := http.Get("http://example.com/")if err != nil { // han...
2018-12-15 09:56:02
7471
原创 MySQL常用操作记录
在MySQL的使用过程中, 有一些基本的操作需要记录下来以备需要时方便查询。安装数据库比较方便的是yum 安装, 如果没有特别的指定, 直接yum安装:yum install -y mysql-server mysql-client如果需要指定特定的版本, 就需要修改yum指定的repo, 通常放在/etc/yum.repos.d/mysql-xxx.repo, 它里面会指定不同版本的r...
2018-10-27 14:33:48
172
原创 BloomFilter(布隆滤波器)原理与使用
BloomFilter在NoSql、大数据的去重、判断数据是否存在等领域有着广泛的应用。 它是一种空间效率极高的概率型算法和数据结构,用于判断一个元素是否在集合中(类似Hashset), 其核心一个很长的二进制向量和一系列hash函数。常见应用场景:Google著名的分布式数据库Bigtable以及Hbase使用了布隆过滤器来查找不存在的行或列,以及减少磁盘查找的IO次数;文档存储检查系统...
2018-10-03 13:44:38
3425
原创 LevelDB的实现框架
LevelDB是一个由Google提供的K-V型的存储引擎, 具有非常高的写入性能, 目前很多的存储系统底层都会用到LevelDB及其基础上的RocksDB。LevelDB的特征所有的key和value是任意的字符数组;按照key的排序来存储数值;使用者可以定制比较函数, 来覆盖默认的比较函数;基本的操作是:Put(key,value), Get(key), Delete(key);...
2018-09-26 13:21:00
589
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人