自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

youaremyalllove的博客

我是小白菜

  • 博客(92)
  • 收藏
  • 关注

原创 【操作系统内核】线程

线程创建直接重用进程的资源即可,不需要额外维护,线程释放也不需要考虑资源释放的问题线程间数据共享,不需要切内核就可以访问共享数据线程切换要快,进程的切换需要切换进程对应的页表,需要 flush TLB,而刷新TLB后页表项都不会命中LTB,需要去内存查找页表,而线程共享页表。

2023-11-11 15:54:00 329

原创 【操作系统内核】进程

进程的运行,需要考虑这个过程① 文件系统的信息,fs_struct② 打开的文件的信息,mm_struct① vm_area_struct:内存映射,如mmp② 页表:pgd存储页表目录的地址CPU上下文① 指令指针寄存器 (eip/rip): 存储进程的下一条指令② 通用寄存器eax、ebx、ecx、edx、esp、ebp、esi、edi(32位)rax、rbx、rcx、rdx、rsp、rbp、rsi、rdi(64位)③ 段寄存器④ 标志寄存器① 一个用户栈② 一个内核栈。

2023-11-11 15:53:00 179

原创 ceonts实现一个简单回收站

在工作中,很容易通过 rm -rf 命令把重要文件删了,所以需要设置个回收站延后删除。

2023-11-11 15:51:38 178

原创 docker主备节点数据同步

在生产环境中,赋予一个docker操作系统的权限是一件不安全的事,在不具有系统操作权限的情况下,主备机无法通过nfs进行挂载。此时,可借助数据卷进行挂载。tip: 如果是不想重新部署环境,可先将已存的容器打包成镜像,然后根据此镜像创建新容器。

2023-11-11 15:50:40 474

原创 zookeeper入门学习

zk体系化学习

2023-08-03 20:36:39 1383

原创 自动锁重复释放的问题

自动锁的实现,就是在对象析构的时候,销毁线程锁。

2023-06-15 23:33:48 122

原创 kafaka学习

消息持久化:消息队列的数据默认保存一周读写高吞吐量: 通过节点 + 分区的方式实现负载均衡, 把消息写到不同的节点高可用:leader所在节点宕机了,会选取新的leader;数据库:主从复制,主节点宕机,etcd选举新的节点redis:去中心化,每个master节点都有两个副本节点,master节点宕机了,另外两个副本节点会选举一个成为新的master节点。

2023-04-12 21:36:08 758

原创 连接vpn导致win主机无法访问Nat子网

网络连接:到其他公司出差,连了这家公司的网络,同时也连了公司的vbn。本地环境:服务搭建在本机的Nat子网,通过192.168.150.101:8081端口可成功访问。端口映射:win主机设置端口映射(127.0.0.1:18081 => 192.168.150.101:8081)windos访问Nat子网服务:在不开vbn的情况下,win主机输入127.0.0.1:18081可成功访问,但连接到公司的vpn后就访问不了。

2023-03-29 19:51:58 531

原创 ssh_key的原理与应用

git从github上传拉取资源,一般有两种方式:https协议(每次上传代码都需要tocken验证)和ssh协议(配置ssh-key后直接上传)

2023-03-26 15:37:37 718

原创 windows下wsl2安装centos容器

本文的安装流程为:windows开启hyper-v,在hyper-v上安装wsl2,进而安装Ubuntu分发,在Ubuntu分发上安装docker,在docker上安装centos7等容器。

2023-03-21 22:45:34 976

原创 死锁检测组件-设想

现在有三个临界资源和三把锁绑定了,三把锁又分别被三个线程占用。(不用关注临界资源,因为锁和临界资源是绑定的)但现在出现这种情况:线程1去申请获取锁2,线程2申请获取锁3,线程3申请获取锁1,这样就会造成死锁:死锁问题,可转换为有向图的环路检测。

2023-02-17 20:58:55 462

原创 定时器设计

时间有序性各种数据结构的时间复杂度:最小堆:插入O(logn),删除O(logn),过期expire执行O(1)红黑树:插入O(logn),删除O(logn),过期expire执行O(logn)哈希表+链表(时间轮):插入O(1),删除O(1),过期expire平均执行O(1)(最坏为O(n))不同开源框架定时器实现方式不一,如,libuv采用最小堆来实现,nginx采用红黑树实现,linux内核和skynet采用时间轮算法实现等等。

2023-02-17 20:16:53 638

原创 锁与原子操作

如果有两个线程对i=20进行自增:idx++正常是这样:从内存加载到寄存器 =》 寄存器自增 =》 从寄存器加载到内存但可能是:在线程1切换2时,没问题,在线程2切换线程1时,线程1栈中保存的寄存器的值INC是20,写入内存就是21,而不是22.如果开启O3优化,编译器会将自增转换为原子操作(后面再将)

2023-02-09 22:02:02 338

原创 连接池的设计实现

一个资源满足以下两个条件,就可以考虑使用池化技术如线程池、内存池、mysql与oracle连接池。

2023-02-05 20:46:49 514

原创 epoll设计实现

没有epoll之前,只能做嵌入式。

2023-02-05 16:47:03 430

原创 网络协议栈简单设计(tcp)

接着这篇文章写的TCP相对于Udp,分为两个部分:连接(三次握手、四次挥手)、交互(数据传输)依照tcp包头字段定义就行:注意,tcp协议头不像udp有包长字段,因此TCP在建立连接时,客户端和服务端会协商设置每个报文的最大长度mss,比如send(buff)中buff的数据长度为2k,mss设置为0.5k,那么这个数据将会被切割成4个包进行传输mtu和mss的区别:mtu处于数据链路层,最小传输单元,通过设置为1500,而mss处于传输层tcb服务端收到第一次握手后,需要初始化tcb,将连接加入半连接

2023-02-04 16:49:44 852

原创 网络协议栈简单设计(udp)

操作系统内核中实现了网络协议栈,但今天利用netmap(也可利用dpdk)绕过内核协议栈进行网络数据的收发。

2023-02-03 23:35:44 655

原创 oracle查看表锁并解锁

当在一个应用程序能改动数据库,而其他应用程序都不能改动时,基本就说明表被锁了。

2023-02-02 16:43:18 2325

原创 用户区网络缓冲区

而对于UDP,其内核没有发送缓冲区,,也需要设计用户态发送缓冲区、序列号、确认号、超时重传机制等其次,UDP虽然基于报文传输,没有粘包问题,但还是需要面临内核协议栈接收缓冲区满的问题,因此,也需要设计用户态的接收缓冲区。

2023-01-31 23:18:44 317

原创 基于C讲解协程设计原理

通过C讲解协程原理

2023-01-31 21:30:44 296

原创 posix API与网络协议栈

socket包含两部分:fd、tcb(tcp control block)其中,fd属于文件系统,可在用户态进行操控;而tcb属于内核协议栈。

2023-01-18 20:35:23 693

原创 网络IO与Rector模型

一个master进程fork出多个worker进程,每个进程都有一个reactor,每个worker进程都监听在一个端口上(因为是fork出来的),连接都放在共享内存里,哪个进程拿到了这把锁,谁就accept这个连接,并交由这个进程的reactor处理。IO函数操作IO,分为两种:阻塞和非阻塞IO,阻塞在网络线程,连接的fd阻塞属性决定了IO函数是否阻塞,其具体差异在:io 函数在数据未到达时是否立刻返回,也就是数据准备阶段是否会阻塞。但写操作是一次性,要么全部写入,要么写入失败,不会产生顺序错乱。

2023-01-10 22:54:31 264

原创 websocket的实现

本文的websocket实现基于的代码实现。

2023-01-08 21:51:41 869

原创 基于reactor的http服务器

本文的http服务器基于的代码实现,只实现很简单的接收get请求,并向客户端发送响应的功能。

2023-01-07 22:28:42 786

原创 单线程Reactor模型

Reactor模型只是对select\poll\epoll等网络模型的封装,本文讲解基于epoll实现Reactor模型。

2023-01-07 18:29:46 655

原创 从socket开始讲解网络模式(epoll)

windows采用IOCP网络模型,而linux采用epoll网络模型(Linux得以实现高并发,并被作为服务器首选的重要原因),接下来讲下epoll模型对网络编程高并发的作用。

2022-12-31 20:45:22 613

原创 分布式一致性哈希

假设我有三台服务器A,B,C,我想把数据分别存储到这三台服务器上,于是进行哈希取余操作:hash(key)%3.然而,如果我又增加了一台服务器D,哈希取余就得变成hash(key)%4了,数据就很混乱了。对此,我们对固定值2^32进行取余,并把哈希数组前后两端闭合形成一个圆,将A,B,C三台服务器映射到这个圆上(以字符串:ip:port为key):当我们将数据哈希后,落到圆上某一个点,顺时针方向走,存到遇到的第一个服务器上,当我们新增一个服务器D时,操作仍然不变(A中的部分数据需迁移到D中)

2022-12-30 23:37:42 57

原创 红黑树的应用与实现

和avl树的选择一样的,首先进行节点的上下互换,然后左旋后,下面的节点在左边;右旋后,下面的节点在右边。这五个性质保证了左右子树的高度不超过2倍,如果一颗子树的高度是n,另一棵子树的最大高度最大是2n-1。旋转是基础,因为在插入和删除后的修复,都需要用到旋转操作,这里只进行插入。

2022-12-30 20:48:55 142

原创 异步请求池的实现

【代码】异步请求池的实现。

2022-12-28 22:56:30 319

原创 线程池设计与实现C

创建/关闭线程池、添加任务、线程入口函数(获取并执行任务)

2022-12-25 19:15:30 226

原创 内存池设计基本思路

设计内存池,以减少因频繁调用malloc造成堆中造成的内存碎片。

2022-12-23 19:42:18 173

原创 多进程共享内存

在内存模型中,内核空间的下面有一块空间叫做内存映射段,包括文件映射、匿名映射、动态链接库映射(程序运行时,将动态库加载到内存,并映射到程序的地址空间)。mmap:一种内存映射文件的方法,将内核中的特定部分内存映射到用户级进程中去,相比普通的read/write少一次拷贝,内核直接把文件数据从磁盘拷贝到共享内存就用户就行访问,使得这份数据不需要同时保留在两个页缓冲中;而write需要先从磁盘拷贝到页缓冲,再从页缓冲拷贝到用户进程;所以你会发现文件利用读写函数下载时,内存变少,buff/cache变大。

2022-12-23 17:05:25 334

原创 内存泄漏检测方案

内存泄漏问题

2022-12-23 15:37:05 364

原创 查看系统函数实现

以malloc为例,可以很快找到malloc的头文件定义(/usr/include/stdlib.h),但是,无法找到其源文件。这是因为stdlib.h是GCC编译器提供的接口文件,不同的编译器接口标准不同,也就是说编译器只能触及到接口层。而内存由Linux内核分配,malloc属于系统函数,因此,malloc封装在内核层,以防止我们不小心修改了。在/lib64/下,可以发现有个软连接 libc.so.6 (使用软连接是担心用户误删真正的so文件),可以看到,这个动态链接库里,就有malloc的实现。

2022-12-17 20:45:47 118

原创 vmware虚拟机centos7扩容

从原来的20G扩展到100G:扩展磁盘时可能会遇到需要修复磁盘的情况:// 进入vmware安装目录// 修复, 其中.vmdk文件为虚拟机磁盘文件扩展成功:对分区和文件系统不了解的话,建议先看看鸟哥的Linux私房菜第7章。查看分区情况:lsblk其中:创建新分区:fdisk /dev/sda其中UUID是全局唯一标识符,可以拿来作为挂载或是使用这个设备或文件系统创建物理卷并查看:pvcreate /dev/sda3将增加的分区加入到卷组centos中:vgextend centos /dev/sda3

2022-11-27 22:40:19 1405 1

原创 vscode编译代码

这是由于指针a并没有指向一块具体的地址,无法进行赋值,将。

2022-11-21 19:46:58 240

原创 Nat模拟虚拟机无法ping通桥接模式虚拟机

在vmware中,有两台虚拟机,分别采用桥接模式和Nat模式,但是桥接模式虚拟机无法ping通Nat模式的虚拟机,如图:因此:

2022-11-19 10:22:00 1198

原创 ascii码为1的字符怎么表示

enum中的CFT_DIV和CFT_ENT是无类型的,以CFT_DIV为例子,与char比较是判断该char的ascii码是否为1,但ascii码为1的字符为SOH,怎么输入呢,一种是'\u0001'

2022-11-17 20:00:37 936

原创 vmware中centos虚拟机启动oracle:超出内存

遇到这个问题大多是需修改shmall参数,但如果主机内存较小的话,内存容易被全部占满:可以看到,内存和交换区已经被全部沾满了,因此oracle数据库无法挂载解决:给主机扩容,我是从4G扩容到8G,重启oracle。

2022-09-30 08:49:28 707

原创 【设计模式三】观察者模式

常用的设计模式之一。

2022-09-27 22:09:12 240

空空如也

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

TA关注的人

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