- 博客(18)
- 收藏
- 关注
原创 go网络编程
网络编程Socket API因为高级语言大多都屏蔽了底层网络编程的细节和复杂性,所以为了真正了解到一些,语言的网络库的本质,先来学习一下 基本的socket api, 这里不介绍 unix域socket,socket_row,datagram_socket,重点关注steam_socketTCP socket的API调用流程大概是这样的 socket(server) socket(client) socket(2)
2020-10-15 15:56:28
506
1
原创 Golang系列 - gorountine栈管理
在学习go的过程中发现 gorountine的栈管理方式 和 传统的c/c++语言有所不同。所以本文通过整理网上资料进行学习总结。栈的作用 首先,栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是后入先出(LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行推入(push) 和弹出(pop) 操作。...
2019-06-20 15:09:35
781
原创 深入理解go语言channel
channel 是 Go 语言中的一个非常重要的特性,这篇文章来深入了解一下 channel。1. CSP 要想理解 channel 要先知道 CSP 模型。CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由Tony Hoare于 1977 年提出。简单...
2019-04-23 11:28:00
2207
1
原创 linux TCP发送过程源码分析
linux TCP发送过程源码分析——socket层内核版本:3.15.2 Socket数据结构关系发送流程图 以下是send()、sendto()、sendmsg()和sendmmsg()的发送流程图,这四个函数除了在系统调用层面上有些差别,在Socket层和TCP层的实现都是相同的。 应用层 应用层可以使用以下Socket函数来发送数据:...
2018-12-29 16:55:48
1382
1
原创 跳表
跳表概念是基于有序链表的扩展,提取出链表中关键节点作为索引的多层链表,以空间换时间提高查找性能。性质由很多层结构组成,level是通过一定的概率随机产生的。每一层都是一个有序的链表,默认是升序最底层(Level 1)的链表包含所有元素。如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现。每个节点包含两个指针,一个指向同一链表中的下一个元素,一个...
2018-12-17 20:03:32
136
原创 epoll源码剖析
epoll的实现主要依赖于一个虚拟文件系统:eventpollfs。epoll是个module,module的入口eventpoll_init,通过eventpoll_init初始化。在初始化的过程中,eventpollfs create两个slub分别是:epitem和eppoll_entry。 epoll使用过程中有几个基本的函数分别是epoll_create,epoll_c
2017-05-25 15:45:25
465
原创 Linux中listen函数的backlog参数含义
如果你熟悉linux网络编程,那么对listen系统调用一定不会陌生,listen系统调用使一个socket变为一个passive socket。那什么是passive socket呢?就是一个可以用来接收连接,可以在其上调用accept调用的一个socket。调用listen会使socket从CLOSE状态转移到LISTEN状态。因为socket默认创建的是一个主动的socket,所以要作为服务器
2017-05-20 13:29:57
1341
原创 c/c++中const、static的区别
说起const、static、以及#define大家都知道,我一直以为我也是知道的,直达面试时被问到#define定义一个常量和const定义一个常量有什么不同,const定义的变量的储存位置,以及c与c++中static和const的时候。我发现当想说清楚这几个问题时,我发现自己对const和#define以及static中有些问题还是很模糊,我想这可能就是某位高手说的:“当你可以向别人清楚的解释
2017-05-17 16:52:50
486
原创 vector深入剖析
vectorvector的数据安排以及操作方式,与array非常的相似(这里的array是C和C++语言本身就有的,而不是在C11中引进在STL的std::array)。array是静态空间,一旦配置了就不能改变。vector是动态空间,随着元素的增加,它的内部机制会自行的扩充空间以容纳新元素。vector的构造 (1)vector<int>intVect;观察内存可以看到生成一个带有0个元素的v
2017-05-07 13:57:26
432
原创 僵尸进程
僵尸进程 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程而会变成孤儿进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程……僵尸进程的危
2017-05-06 19:31:27
445
原创 深入理解 I/O 概念
I/O空间—–I/O端口和I/O内存 首先上图,如下:外设中的寄存器被称为I/O端口,外设中的内存被称为I/O内存。二者合起来统称为I/O空间。 设备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以寄存器的形式出现。外设寄存器称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式,可以把 CPU分成两大类。 一类CPU(如M
2017-05-01 18:16:41
756
原创 详解kmalloc、vmalloc
IA-32环境下的Linux对用户进程分配4G的虚拟地址空间,低3G是用户独立的空间,高1G是内核空间。用户空间的动态内存分配用malloc,而在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc。释放内存用的是kfree,vfree,或free_pages. kmalloc函数返回的是虚拟地址(线性地址). kmalloc – 内核分配内存void *
2017-04-29 18:37:26
2597
1
原创 Linux的slab分配器
最近一直在看Linux的内存管理,其中在物理内存中Linux对页面的管理引入了伙伴系统和slab。通过学习发现slab其实是一个为了解决伙伴系统的内部碎片和内核对内存初始化性能提升的一种机制。slab小对象分配思想 伙伴关系也好、slab技术也好,从内存管理理论角度而言目的基本是一致的,它们都是为了防止“碎片”,不过碎片又分为外部碎片和内部碎片之说,所谓内部碎片是说系统为了满足一小段内存区(连续)
2017-04-28 17:51:17
334
原创 Linux内存管理
内存管理是一个比较大的概念,大家可能在各个地方都会遇到,无论语言中的内存管理、操作系统中的内存管理、数据结构中的内存管理。虽说它们都是对于内存的管理,但是唯独不同的是它们前面的定语不同以及立场不同。比如说数据结构中的内存管理主要关注的是内存管理的方式以及方法,它说关注的并不是内存,它并不管这个内存是物理的还是虚拟的还是堆内存什么的。总的来说它并不在乎对象是什么,而在乎的是管理上的方法。而操作系统中的
2017-04-22 20:05:01
484
原创 中断
中断是一种电信号,由硬件设备产生,并直接送入中断控制器(也就是后面说的PIC 如 8259A)的输入引脚上(中断控制器是一个简单的电子芯片),然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知操作系统已经产生中断。这样,操作系统就可以对这个中断进行适当的处理。
2017-03-27 14:15:50
575
原创 进程与线程
首先要说的是进程是比线程概念出现的时间早,进程这个概念是伴随着操作系统而生的 ,而线程是在随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。因此在80年代,出现了能独立运行的基本单位——线程于是由于后者概念的提出就让人们对于进程和线程的区别有
2017-03-05 15:48:36
425
原创 操作系统-真象还原的一点心得
当人按下笔记本开机键时.cpu的cs寄存器(基址)跟ip(偏移量)寄存器加电.被强制初始化为(jmp xxx:xxx) 跳转到bios所在的地址. 接着bios开机自检(这个不需要了解,只需了解最后跳转到0x7c00处即可.对于写kernel的人来说也是透明的.除非你是写bios的).它将自动从0盘1扇区加载mbr(主引导程序,512字节必须是以0x55,0xaa结尾.
2017-03-03 19:39:35
2913
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人