自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

baijiwei的博客

不积跬步, 无以至千里!

  • 博客(82)
  • 资源 (6)
  • 收藏
  • 关注

原创 Iverilog源码分析 --- data type

在Verilog里面, 有2种类型的变量: net和variable, 每一种都有多种的数据类型, 这些都是通过vpiSignal.cc里面

2022-01-29 17:11:54 1247

原创 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 1569

原创 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 529 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 770

原创 Iverilog 源码分析 -- VCD的实现机制

VCD是Verilog LRM中定义的, 本文介绍VCD的实现过程。

2021-02-17 08:26:04 1081

原创 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 1210 1

原创 IVerilog 源码分析 --PLI框架简介

PLI 基础Verilog 提供了PLI(Programming Language Interface)机制, 用来进行硬件设计和软件设计者进行交互。 它可以在Verilog的设计之中加入用户自定义的系统函数,这些系统函数是通过C语言软件的方式实现, 这可以理解为, 通过插件的方式, 来扩充硬件设计语言的功能。PLI常见的功能如下:C语言bus函数建模;访问C语言代码库函数;延时计算功能;自定义输出显示;联合仿真;设计的debug功能;仿真结果分析;我们比较感兴趣的是访问C语言代码库

2021-02-15 19:35:40 1072

原创 性能问题的定位

线上程序常出现的状况是运行一段时间之后, 发现运行效率越来越差, 慢慢出现了累计或者相应慢的情况, 比较粗暴额解决方式是重启程序, 一切都正常了。 但是过了一段时间问题又出现了, 我们需要借助一些工具来定位为。通常我们的程序, 可以大致分为3种类型:计算型, cpu、 内存使用比较多, 比如我们常见的缓存, 计算型流失数据分析等;存储型, 磁盘IO使用比较多,通常的瓶颈在磁盘IO,比如数据库存储引擎, 存储系统等;网络资源消耗性, 比如网络库。top出现性能问题, 第一个能想到的就是用top

2020-06-27 07:17:16 583

原创 MooseFS的常见问题与操作

副本的设定作为一种分布式文件系统, 基本原理是将文件分块, 每个块分不到几台机器上面, 这样, 如果某台机器故障或者因为网络问题不可达, 系统会进行自动的异常平衡策略处理, 通常是将每个数据块的副本数设定为2, 假定者2个副本分布在机器A和B上面, 如果机器A发生故障, 只剩下B上面的副本, 这时候master会检测到机器A故障, 并且数据块上面的实际副本数少于制定的副本数, 根据机器负载以及策略, 选择新的机器C, 并将B上面的数据Copy一份到C上面。mfssetgoal -r 2 /mnt/mfs

2020-06-25 16:22:23 595

原创 haproxy的使用

haproxy的部署还是很简单的, 本文重点介绍一下它的配置文件的设置。haproxy的配置一般包含4部分: global, defaults, fornted, backend, 分别代表了全局设置, 默认设置, 前端设置, 后端设置。globalglobal部分设置了全局的变量, 通常包含:log, uid, gid, deamon等。其中log设置 了haproxy日志的输出等级, ...

2020-04-19 10:57:07 273

原创 redis 备份过程代码分析

在redis中, RDB主要用来进行数据库的全量备份。

2020-01-27 15:33:00 363

原创 redis command 执行过程的代码分析

本文通过命令从client端到server端的执行过程, 分析一下命令的处理过程。redisContext对于每一个连接, 会产生一个redisContext, 记录了连接的上下文信息, 比如:sock fd, 写入的buf, 以及sockaddr等。 这里,使用的是hiredis里面的接口和数据结构, 也就是说数据从client到server之间的传输使用了hiredis C driver的...

2020-01-05 15:17:05 833

原创 2019年小结

2019年就要过去了

2019-12-28 16:57:26 179

原创 分布式系统的性能优化方法

本文主要记录在分布式系统下优化的常用方法。

2019-12-28 16:30:21 3478

原创 docker的使用

随着docker/K8S技术的日渐成熟, 越来越多的公司将自己的服务放进docker里面来运行, 以此来做到资源隔离和部署的简化。docker与虚拟机的区别从下图可以看出, docker与VM相比, 结构要简单, 更加轻量一些, docker的dockerd程序是操作系统的一个进程, 每个docker内部也不是有自己的操作系统, 这些都是公用主机的资源, 因此docker比虚拟机要轻很多, 与...

2019-11-30 10:55:34 120

原创 C++多线程的实现

在C++模式线面, 要实现多线程并发, 提升性能, 并不是一件很容易的事情。 难点不是如何划分出多个线程, 而是如何确认哪些内存是线程间公用的, 需要避免冲突, 另一个方面, 如何做到线程间同步。线程私有数据在一个线程里面, 线程ID和堆栈上的数据, 以及信号集等是线程私有的, 我们还可以通过一些函数指定线程的私有数据, 比如pthread_setspecific。线程之间通信线程之间的通...

2019-11-16 20:00:54 1866

原创 分布式文件系统

存储是分布式系统中很重要的一个方面, 常见的存储有包含了3种类型:类型特点常见程序结构化存储数据的表结构固定关系型数据库, 例如MySQL半结构化存储表结构不固定非关系型数据库, MongoDB等分布式文件系统存储BLOB类型数据, 例如图片,视频等文件形式GFS, HDFS等本文主要介绍分布式文件系统的分类以及主要特征。元数据存储方式根据...

2019-08-25 18:37:31 271

原创 LINUX文件系统概要

在LINUX系统下, 一切皆是文件。所有的读写, 包含块设备, 字符设备,socket, 管道等的操作, 都被设计为对文件的IO操作。文件系统的位置在LINUX系统下, 所有的文件及设备都是通过文件系统来操作的, 文件系统在整个系统中处于核心的地位。VFS架构LINUX能够支持多种文件系统, 比如, XFS,EXT3,EXT4以及GlusterFS等等, 它们对外的使用方式是一样的, 它...

2019-07-30 10:56:17 185

原创 一点总结

最近一直在看厦门的一些机会, 有一点感慨记录一下。认清楚一线城市与二三线的差异我们不得不承认, 目前国内的IT环境, 主要的大公司还集中在北上广深, 一些基础架构以及很底层的工作, 都集中在一线城市。 二三线城市比较多的是应用以及某个大公司的分部,负责前端的开发。在这样的情况下, Java大行其道, 我想大概是因为Java使用了大量的框架, 而这些框架需要挺久的时间才能够熟悉吧。知识的深度与...

2019-07-20 17:46:34 167

原创 Golang 线上常见问题记录

Golang语言本身自带了垃圾回收机制, 理解其实现的原理, 能够帮助我们理解和写出高效的代码。

2019-06-15 12:57:06 440

原创 MongoDB中并发控制(MVCC)

每当有新的数据写入, 首先是写入内存的缓存, 以及WAL log, 每隔一定的时间60秒或者WAL log文件达到一定的大小, 比如2G, 进行一次checkpoint, 结合checkpoint与WAL log可以做到在意外出现故障的时候, 快速的回复内存状态。cursorCacheevictreconcileblock managerWAL log...

2019-06-09 15:51:37 3582

原创 MongoDB的并行锁机制

zzz

2019-05-12 14:27:02 4455

原创 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 5191

原创 WiredTiger的journal日志实现

journal日志是实现WiredTiger持久化的关键, 所有的插入、更新操作, 都会在journal里面写入一条日志, 并且在服务器意外退出的时候, 通过checkpoint和该checkpoint之后的日志, 能够迅速的回复服务器的状态。在Wiredtiger里面, 通过log来表示journal相关的实现, 接下来, 我们看下是如何实现的。WT_CONNECTION_IMPL中log相...

2019-05-02 17:44:39 1601

原创 WiredTiger hazard指针

在WiredTiger里面, 采用Hazard pointers来管理一个内存页是否可以被Evict, 本文分析下其实现过程。Hazard pointersHazard pointers是在多线程环境下实现资源无锁访问的一种方法, 它采用内存换时间的方法:...

2019-04-30 19:17:53 698

原创 Golang下基于XORM的mysql使用

最近工作中发现, 同样的一个数据库, 不同语言开发的模块, Golang模块在数据库域名对应的底层数据库发生切换, 能够自动连接,但是Java的不会, 为什么会有这样的差异哪?Golang的连接池Java的连接池...

2019-03-03 13:33:19 3959

原创 MongoDB sharding 之 MoveChunk的实现过程

在分片集群模式下, 有一个Balancer的类,它启动一个名字为Balancer的后台线程, 用来保证不同分片之间chunk数的均匀。 每一个Mongos都有自己的Balancer, 不同的Balancer之间通过分布式锁来进行控制, 保证某个一时间只有一个Balancer在工作。先看一下Balancer的定义:class Balancer : public BackgroundJob {p...

2019-03-02 21:57:04 1709 1

原创 MongoDB 分片sharding概述

当MongoDB由于存储的数据越来越多, 由于性能原因, 或者单个主机资源限制, 垂直扩容没有办法进一步的时候, 我们就需要开始考虑水平扩容了。与垂直扩容不同的是, 水平扩容不需要新添加的机器有多么强大的功能,它的设计理念是将业务数据尽可能平均的划分成一段一段的, 每一段分布在一台机器上, 这样, 当系统需要进一步扩容的时候,只需要添加机器, 将现有数据的一部分迁移到新添加的机器上, 旧的系统就...

2019-02-24 07:48:18 824

原创 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 2173

原创 MongoDB副本集的节点状态转化

mongodb的副本集可以实现自动主从切换的过程,

2019-02-17 09:08:16 1626

原创 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 1987 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 14052 3

原创 MongoDB 单文档原子操作的实现

transaction的支持在 MongoDB 里面是逐渐进行的, 从3.2版本开始支持单文档的原子操作, 这是后续的多文档原子操作, 以及4.0 的副本集的事务, 以及后续的计划推出的4.2的分片的事务操作的基础。本文着重描述一下单文档的原子操作。原子性: 就是一个操作要么成功, 要么失败。具体来说, 就是一个插入、更新或者删除操作, 应该只有commit或者rollback两种结果中的一种。...

2019-01-12 20:18:17 1736

原创 MongoDB更新同步的oplog位置

在MongoDB中, 副本集节点之间为了保持一致性, 需要通过oplog的同步与回放来进行。MongoDB采用的是节点向源节点主动拉取的方式, 从源节点拉取oplog, 目的节点需要及时通知其他节点它的最新的同步到的时间点。如上图所示, 2个Secondary从Primary上面拉取oplog,每当secondary的时间点发生改变, 会调用replSetUpdatePosition来告诉在...

2018-12-30 13:33:43 3023 1

原创 golang http使用踩过的坑与应对

golang对http进行了很好的封装, 使我们在开发基于http服务的时候, 十分的方便, 但是良好的封装, 很容易是的我们忽略掉它们底层的实现细节。 如下是我踩过的一些坑, 以及相应的解决方法。调用http服务正确的实践如下:resp, err := http.Get("http://example.com/")if err != nil { // han...

2018-12-15 09:56:02 7093

原创 LevelDB compact 过程

为了使得LevelDB有更好的读性能,

2018-11-18 16:54:45 920

原创 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 144

原创 BloomFilter(布隆滤波器)原理与使用

BloomFilter在NoSql、大数据的去重、判断数据是否存在等领域有着广泛的应用。 它是一种空间效率极高的概率型算法和数据结构,用于判断一个元素是否在集合中(类似Hashset), 其核心一个很长的二进制向量和一系列hash函数。常见应用场景:Google著名的分布式数据库Bigtable以及Hbase使用了布隆过滤器来查找不存在的行或列,以及减少磁盘查找的IO次数;文档存储检查系统...

2018-10-03 13:44:38 3275

原创 Skiplist 的原理与使用

在LevelDB的MemTable里, 使用Skiplist来存储和查询内存中的数据

2018-09-28 11:33:34 2067

原创 LevelDB的实现框架

LevelDB是一个由Google提供的K-V型的存储引擎, 具有非常高的写入性能, 目前很多的存储系统底层都会用到LevelDB及其基础上的RocksDB。LevelDB的特征所有的key和value是任意的字符数组;按照key的排序来存储数值;使用者可以定制比较函数, 来覆盖默认的比较函数;基本的操作是:Put(key,value), Get(key), Delete(key);...

2018-09-26 13:21:00 534

UNIX环境高级编程(中文第三版)_

经典的书籍

2017-07-15

write solid code

这本书就不用介绍了八,用C语言的人没有学过这本书就是自己的一大遗憾

2009-04-19

数据结构算法的demo软件

关于数据结构的演示程序,可以更加直观的学习数据结构

2009-04-19

LINUX学习经典书籍

学习LINUX比备的资料,linux脚本的编写,非常好的东西

2009-04-19

友益文书破解版

该软件能够帮助我们将html、txt等文件生成电子书籍,便于查看

2008-03-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除