- 博客(41)
- 收藏
- 关注
原创 vector的日常使用
在编程题中,遇到输入要求多行数据时,之前是采用二维数组保存数组,但是空间的开辟总是未知的,或多或少也不合适。数组的越界问题会导致程序的奔溃,而且数组的动态性不好。vector内存的特点是可变大小的,尾部插入删除元素的效率还是很高的。顺便一提,迭代器的失效问题:在向容器添加元素后:如果是vector或string,插入元素且存储空间被重新分配,则指向容器的迭代器、指针和引用都会失效;...
2018-09-08 12:15:20
313
原创 main函数前后做了什么
__start: : init stack; init heap; open stdin; open stdout; open stderr; : push argv; push argc; call _main; (调用 main) : destory heap; ...
2018-09-04 17:33:13
1204
原创 golang结构体偷懒初始化
运行一段程序,警告:service/mysqlconfig.go:63::error: golang.guazi-corp.com/tools/ksql-runner/model.CreatingMysqlMongodbRecord composite literal uses unkeyed fields (vet)其中,composite literal uses unkeyed f...
2018-08-22 14:38:21
14493
原创 Go Stack Trace
package mainimport "fmt"type trace struct{}func main() { slice := make([]string, 2, 4) var t trace t.Example(slice, "hello", 10)}func (t *trace) Example(sli...
2018-07-13 09:44:18
376
原创 并发
Go语言的并发是是指goroutine运行时是相互独立的,能让某个函数独立于其他函数运行。并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。Go的并发同步模型来自通信顺序进程(Communicating Sequential Processes,CSP)的范型。CSP是一种消息传递...
2018-07-11 17:44:44
773
原创 go的随机性
go执行的随机性和闭包谁也不知道最后执行之后打印的结果是什么样,但是A:均是10 B:从0-9顺序不定。 第一个go func中i是外部for的一个变量,地址不变化。遍历完成后,最终i=10。 故go func执行时,i的值始终是10。 第二个go func中i是函数参数,与外部for中的i完全是两个变量。 尾部(i)将发生值拷贝,go func内部指向值拷贝地址。func main() { ...
2018-07-11 11:38:31
381
原创 内存管理之slab分配器
STL中的空间配置器采用一、二级配置器进行内存管理,当配置区块 在一级配置器中,allocate()直接使用malloc(),deallocate()直接使用free(),对于内存不足的情况,模拟C++的set_new_handler()机制; 在二级配置器中,首先会维护16个自由链表(free lists),负责16种小型区块的次配置能力;如果内存不足,转调一级配置器中的set_...
2018-06-20 20:57:29
873
原创 Linux内存管理
1.页 Linux的内核把物理页作为内存管理的基本单位。而视窗操作系统中的基本单位是进程和线程,与Linux的不同。 内存管理单元(MMU):管理内存并把虚拟地址转换为物理地址的硬件。MMU通常以页为单位来管理系统中的页表。当然,页的大小在不同的体系结构下是不同的0.32位一般支持4KB的页,而64位支持8KB的页。 Linux内核中用struct page结构体类型表示系统中的...
2018-06-20 16:15:32
301
原创 epoll源码剖析
(主要基于Linux-2.6.11.12版本进行分析。)1. 主要数据结构struct eventpoll { /* Protect the this structure access */ rwlock_t lock; /* * This semaphore is used to ensure that files are not removed * while epoll is...
2018-06-09 21:11:34
761
1
原创 poll源码剖析
Poll系统调用,是在指定时间内轮询一定数量的文件描述符,以测试是否有就绪者。函数原型:int poll (struct poddfd *fds, nfds_t nfds, int timeout); · fds参数是一个pollfd结构类型的数组,指定所有感兴趣的文件描述符上发生的可读,可写和异常等事件。· nfds参数指定被监听事件集合fds的大小。 typede...
2018-06-09 16:09:05
1590
原创 Linux内核同步方法——互斥锁
互斥锁“互斥体(互斥)”指的是任何可以睡眠的强制互斥锁,比如计数是1的信号量。 也就是说,互斥体是一种互斥信号。 互斥在内核中对应数据结构互斥,其行为和使用计数为1的信号量类似,因为是直接调用的信号量的操作接口,实现更高效,而且使用限制更强。也就是一个简化版的信号量,因为不需要管理任何使用计数。#define MUTEX_DEFAULT 0x0typedef struct sema...
2018-06-08 16:30:23
1295
原创 Linux内核同步方法——自旋锁(spin lock)
自旋锁 Linux的的内核最常见的锁是自旋锁。自旋锁最多只能被一个可执行线程持有。如果一个执行线程试图获得一个被已经持有(争用)的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用要是锁未被争用,请求锁的执行线程就可以立即得到它,继续执行。 在任意时间,自旋锁都可以防止多于一个的执行线程同时进入临界区。同一个锁可以用在多个位置,例如,对于给定数据的所有访问都可以得到保护和同步。...
2018-06-08 16:20:37
31382
2
原创 Linux内核同步方法——读写锁
读 - 写自旋锁 一个或多个任务可以并发地持有读者锁;相反,用于写的锁最多只能被一个写任务持有,而且此时不能有并发地读操作。 读/写锁也叫做共享/排斥锁,或者并发/排斥锁,因为这种锁对读者而言是共享地,对写者以排斥形式获取地。基本数据结构 在内核代码中,读-写自旋锁用rwlock_t类型表示,typedef struct { /** * 这个锁标志与自旋锁不一样,自旋锁的lo...
2018-06-08 13:49:15
5234
原创 Linux内核同步方法——信号量
信号量 Linux中的信号量是一种睡眠锁。 如果有一个 任务试图获得一个不可用(已经被占用)的信号量是,信号量将会将其推进一个等待队列,然后让其睡眠。这时处理器能重获自由,从而去执行其他代码。当持有的信号量可用(被释放)后,处于等待队列的哪个任务将被唤醒,并获得该信号量。 举个门和钥匙的例子,当某个人到了门前,拿到钥匙,然后进入房间。最大的差异在于,当另一个人来到门前,但无法得到...
2018-06-03 16:48:49
3723
1
原创 64位Linux下的地址映射
IA32-e模式下地址映射之前写过,32位Linux虚拟地址映射,讨论了在CPU 80386下的虚拟地址映射。看过博主的《Linux内核在x86_64 CPU中地址映射》,对32位和64位下地址映射的区别做了一些总结。---------------------------------------------------------------------------1. x86_64CPU中逻辑地...
2018-06-02 17:57:54
9562
原创 select系统调用源码分析
select系统调用主要对select调用过程进行一些总结,后边也会跟着poll和epoll的一系列分析。对于分析select的源码版本是2.6.11.12。select系统调用的用途是:在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常等事件。1. select系统调用的原型如下:#include <sys/select.h>int select( int nfds,...
2018-05-18 21:34:25
1122
1
转载 字符串匹配之KMP
KMP算法学习了数据结构之后,对KMP算法一直不是特别深入理解,在《大话数据结构》中,连续大量的篇幅叙述,读起来特别费劲。直到同学推荐,读了阮一峰博主的文章之后,才对 KMP算法真正理解,写的特别好,自己就在这里做个小总结。http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorit...
2018-04-30 14:49:58
191
原创 事务
主要整理总结关于事务以及事务处理技术,数据库恢复以及并发控制所带来的问题。事务:一系列数据库操作,是数据库应用程序的基本逻辑单元。 事务是恢复和并发控制的基本单位。在关系型数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。对于事务和程序的区别主要在于:一个程序中包含多个事务。定义事务的语句一般有三条:BEGIN TRANSACTION; ...
2018-04-04 15:01:42
1058
原创 关系型与非关系型数据库
以下主要对关系型数据库和非关系型数据库进行了比较。 参考《数据库系统概论》,《深入浅出MySQL》 以及博客https://blog.youkuaiyun.com/lijinqi1987/article/details/51823506关系型数据库:书中的解释是:在实体以及实体间的联系用关系来表示,在一个给定的应用领域中,所有关系的集合构成一个关系数据库。关系数据库的值是这些关系模式的某一...
2018-04-03 21:52:42
272
原创 MySQL索引
索引1. 什么是索引创建在表上,是对数据库表中一列或多列的值进行排序的结构。 用于快速查询数据库表中的特定记录,可提高查询速度。 不同的存储引擎定义了每个表的最大索引数和最大索引长度。所有存储引擎对每个表至少支持 16个索引,总索引长度至少256字节。 2.分类2.1 聚簇索引和非聚簇索引聚簇索引数据的物理存放顺序和索引顺序是一致的; ...
2018-04-02 21:27:45
218
原创 MySQL日志
MySQL日志记录MySQL数据库运行期间的日常操作、客户端连接情况、SQL语句的执行情况和错误信息的文件。当数据库遭到意外损害时,可通过日志文件来查询出错原因,可通过日志文件进行数据恢复。例如,一个名为huang的用户登录到MySQL服务器。日志中就会记录这个用户的登录时间、执行的操作等,如果出现异常,异常信息也会被记录到日志文件中。 MySQL日志分为4种,分别是二进制日志、...
2018-03-19 15:45:48
661
原创 C/S 与B/S 模型的联系与区别
客户/服务器模型(C/S)特点:非对等相互作用,即客户与服务器处于不平等的地位。表现在:服务器用有客户所不具备的硬件和软件资源以及运算能力,服务器提供服务,客户请求服务。 客户端与服务器的数量关系多个客户进程同时访问一个服务器进程(n:1)一个客户进程同时访问多个服务器提供的服务(1:n ).客户端与服务器的位置关系客户和服务器运行在同一台机器上———应用...
2018-03-17 15:33:14
19625
原创 单例模式SingleTon
单例模式一个类只生成一个对象(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例)通过定义一个private的构造函数,避免被其他类new出来一个对象,不可以被实例化。 1.单例模式的懒加载 (第一次运行到此处,加载到内存)class Singleton{private: static Singleton* mySingleton;publ...
2018-03-15 16:18:53
154
原创 进程间通信之管道,消息队列,共享内存
管道从一个进程连接数据流到另一个进程时,使用管道(pipe)。通常是把一个进程的输出通过管道连接到另一个进程的输入。管道是半双工的,数据只能单向。管道可分为有名管道和无名管道,有名管道:可以在任意进程进行;无名管道/匿名管道:只能在父子进程间通用 (亲缘关系的进程).先看一下进程管道#include &lt;stdio.h&gt;FILE *popen(const...
2018-03-12 14:37:37
608
原创 零拷贝操作
零拷贝在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝。接下来,将介绍三个与零拷贝操作相关的函数,sendfile函数,splice函数和tee函数首先,sendfile函数#include 《sys/sendfile.h>ssize_t sendfile(int out_fd, int in_fd, of...
2018-03-06 11:03:50
552
原创 TCP粘包问题
TCP粘包TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 1.出现原因这里提一下保护消息边界和流,保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。 而面向流则是指无保护消息保护边界的,如果...
2018-03-05 20:52:27
169
原创 详解TCP状态转移图
TCP连接是面向连接,可靠的数据流服务。根据TCP状态转移过程图,可进行一步一步分析。 一般而言,TCP连接是由客户端发起,并通过三次握手建立连接(特殊情况是所谓同时打开)的。 TCP关闭过程相对复杂一些,可能是客户端执行主动关闭;也可能是服务器执行主动关闭,比如服务器程序被中断而强制关闭连接;还可能是同时关闭(比较少见)。首先我们来看一下TCP连接的连接和关闭。...
2018-02-27 15:27:24
2492
原创 I/O复用——select/poll/epoll区别
I/O复用能使程序能同时监听多个文件描述。1.select 在一段指定时间内,监听用户感兴趣文件描述符上的可读,可写和异常等事件。 函数原型:int select(int nfds, struct fd_set *readfds, struct fd_set *writefds, struct fd_set *execptfd...
2018-02-04 23:33:56
265
原创 线程池
池一组资源的集合。为了提高服务器性能,以空间换时间,即“浪费”服务器的硬件资源,以换取其运行效率。静态资源分配方式:资源在服务器启动之初就被完全创建好并初始化。 对于预期应该分配多少资源,有两种方案:分配“足够多”的资源,即针对每个可能的客户连接都分配必要的资源,但会导致资源的浪费;预先分配一定的资源,此后发现资源不够用,就再动态分配一些加入池中。池可以看作是服务器管理系统
2018-02-01 22:26:54
199
原创 异或运算符
异或表示当两个数的二进制表示,进行异或运算时,当前位的二进制相同为0,不同为1.表示为:0 ^ 0 = 01 ^ 0 = 10 ^ 1 = 11 ^ 1 = 0特点:0异或任何数,是任何数;1异或任何数,任何数取反;任何一个数字异或自己都等于0面试题:一个整型数组中除了两个数字之外,其他的数字都出现了两次。试找出这两个只出现一次的数字。《剑指offer》
2018-01-25 21:48:31
3898
原创 STL 空间配置器 allocator<一>
STL的操作对象(所有的数值)都存放在容器之中,而容器则需要配置空间以置放资料。最近在看侯捷的《STL源码剖析》,所以做了笔记。为什么不说allocator是内存配置器而说他是空间配置器呢?因为空间不一定是内存,空间也可以是磁盘或其他辅助存储介质。一般意义上理解: - 对象构造的分解: 对象内存开辟allocator | 对象构造 construct - 对象析构的分解:
2017-12-23 21:32:07
245
原创 广义表
广义表顾名思义,广义表是线性表的一种。一般记作LS = (a1,a2,…,an),其中a1可以是是单个元素,也可以是广义表,分别是原子和子表。
2017-12-06 22:07:58
834
原创 sizeof与strlen的区别
sizeof与strlen区别:sizeof操作符的结果类型是size_t, 它在头文件中的typedef是unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。sizeof是运算符,而strlen是函数。
2017-11-28 21:24:05
179
原创 i++和++i的那些陷阱坑
int i=0; printf("%d,%d,%d,%d\n",i++,--i,++i,i--); 输出结果会是什么??
2017-11-15 21:02:08
1034
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人