自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 Golang:实时消息交互系统

Message channel是接收客户端的消息,Message goroutine阻塞监听channel,一旦有消息,就遍历OnlineMap去通过user channel广播给在线用户。—Message channel:server用来广播的channel,如果收到一个消息,先将消息写道该channel中,该channel再将消息转发给特定user的channel或者广播给所有user的channel,每个user就会将自己channel中收到的消息发给客户端。新用户名不能存在,如果存在提示。

2025-03-08 18:49:36 1096 1

原创 GOPATH和Go Modules模式

--独立依赖管理‌:每个项目拥有独立的go.mod文件,记录依赖名称、版本及哈希值(go.sum)-保证项目的完整性,支持项目存放于任意路径‌。---依赖重定向,如果以前的包要更新或弃用使用新的。-‌--版本冲突‌:缺乏版本控制,依赖更新可能导致全局影响‌。---初始化模块‌:go mod init <module-name>创建go.mod文件‌。-‌--本地依赖处理‌:通过replace指令可临时替换远程依赖为本地路径,便于调试‌。-‌--依赖冗余‌:所有项目共用同一依赖库,易造成pkg目录臃肿‌。

2025-03-06 21:23:57 551

原创 Golang语法特性总结

struct类的定义//声明一种行的数据类型,是Int的一个别名//传递book的一个副本//传递指向Book结构体的指针—类的封装和方法的调用//go语言中的类实际上是通过结构体来绑定方法//方法名、类名如果首字母大写,其它包也可以访问Ad intLevel int//当前括号表示该方法绑定到了Hero结构体,this表示调用对象,谁调用该方法this就指哪个对象//this是当前调用对象的一个副本//此时this就是指向当前对象的指针,就可以修改了//创建一个对象。

2025-03-05 00:02:14 749 2

原创 Golang语言特性

代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。代表项目:go-kit、micro、monzo bank的typhon、bilibili等。3、所有Excepiton都用Error来处理(比较有争议)。4、对C的降级处理,并非无缝,没有C降级到asm那么完美(硬件、序列化问题)最终生成的可执行程序是一个静态的二进制文本文件。代表项目:tidb、influxdb、cockroachdb等。1、包管理,大部分包都在github上。

2025-03-02 15:05:34 419

原创 Linux:应用层协议

HTTP:通过Http协议从服务器拿下来对应的“资源”,凡是在网络中看到的都是资源,所有的资源都可以看作资源文件,放在服务器的磁盘上,浏览器请求时会在Linux服务器的磁盘上寻找。而我们把浏览器自动保存用户名密码的行为叫做cookie技术,这些信息保存在cookie文件,cookie文件分为文件级别和内存级别,浏览器本身是一个进程,当关闭浏览器(进程退出)还不需要登陆仍然保存,这就是文件级别,并不随着进程退出。自定义协议:定义一个结构化的对象,一定是x op y,op的取值,exitcode的规定。

2025-03-02 13:43:16 843

原创 网络编程套接字

在操作系统内部维护了基于端口号做key值得哈希表,value对应的就是PCB得地址,就可以把数据交付给该进程,找到他得文件描述符表,找到文件对象,将数据拷贝到文件的缓冲区中,然后用户用读文件的方式将数据读入。进程间通信需要让不同的进程看到同一份资源—网络。它会受当前会话用户登录和注销的影响,所以要让它自成会话,自成进程组,和终端设备无关,这就叫做守护进程。4.使用进程池,提前用父进程创建好的很多子进程,后续父进程打开文件描述符时并不能共享给其它子进程,得使用域间套接的方式传递给另一个进程,但它十分不方便。

2025-02-14 17:30:16 849

原创 Windows:UDP客户端

【代码】Windows:UDP客户端。

2025-02-12 21:24:21 89

原创 Linux: 网络基础

当一台主机跨网络给另一台主机发信息时,会先根据IP地址查找对应的MAC地址(通过ARP协议或路由表),并在每跨一个网段时更改源MAC地址和目的MAC地址以适应新的网络段和传输路径(在该段局域网/网段中查找下一个路由/目标主机根据MAC地址)。b.局域网通信的原理:每一台主机都有网卡,每一张网卡都有自己的地址,这个地址称之为mac地址,48位的二进制数据可以按照16位进行解释,一串字符用来标识网卡的唯一性,被写进网卡里。能够表示一张唯一的网卡,表现在局域网(主机间可以直接通信不用路由器转换)中。

2025-02-04 02:13:10 915

原创 Linux:多线程[2] 线程控制

hpp里面既包括方法的声明也包括方法的定义,在使用时只要包括它即可。class context//上下文,当成一个大号的结构体——解决this指针的问题public:public:context(){}~context(){}public://C++的函数对象public:Thread(func_t func,void *args,int number)//构造函数,初始化func和用number线程name//c99支持。

2025-01-26 17:04:37 1012

原创 Linux:信号递达[3]

如果在main中和在handler中,main函数正在执行当前方法,该方法又被handler调用,如果出问题了该方法/函数就被称为不可重入函数(参考insert),如果不会出现问题就是可重入函数。父进程可以自 定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程 终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。如果一个子进程退出了,会变成僵尸状态等待父进程回收。子进程死亡时会向父进程发送SIGCHLD信号告诉父进程自己死了,但父进程往往会忽略。

2025-01-25 10:05:35 350

原创 Linux:多线程 [1]概念理解

"hello bfr"这个字符串存储在虚拟地址空间的代码区中,令str指向它之后当要修改*str时,也就是修改代码区中"hello bfr"位置的值,再将它通过页表映射成物理内存时再根据页表中的RWX权限判断出这块内存是只读的没有写权限,就会硬件报错 段错误,操作系统识别硬件报错转化成信号发送给进程,进程就会终止。如何看待地址空间和页表:1.地址空间是进程能看到的资源窗口2.页表决定,进程真正拥有资源的情况3.合理的对地址空间+页表进行资源划分,我们就可以对一个进程的所有资源进行分类。虚拟地址以 10

2025-01-24 15:52:32 959

原创 Linux:信号的保存[2]

有一些寄存器corrector当前正在运行进程的PCB(task_struct),CPU中也有一些寄存器指向页表的起始地址,集成MMU内存单元也能完成虚拟地址向物理内存的转化,CR3寄存器:表征当前进程的状态(为0:内核态,为3:用户态)。每一个进程都有自己的地址空间(用户空间独占),内核空间(被映射到了每一个进程的3~4G空间中),进程要访问OS的接口,其实只需要在自己的地址上进行跳转就可以了。信号产生的时候,不会被立即处理,而是在合适的时候,暂存在pending位图,内核态返回用户态的时候,进行处理。

2025-01-23 17:29:33 943

原创 暑期实习准备:C语言(持续更新)

static修饰局部变量改变它的生命周期,让静态局部变量出了作用域仍旧存在,到程序结束,生命周期才结束,static修饰改变的是它的存储持续性,它的作用域仍旧是局部的。-const修饰的常量:const关键字用于声明一个变量为常量,该变量在初始化之后就不能被修改,在程序编译时确定其值,增加程序的稳定性和安全性,它可以用来修饰基本数据类型的变量,也可以用来修饰指针。函数也可以链式访问,一个函数作为另一个函数的参数printf("%d",printf("%d",printf("%d", 43)));

2025-01-22 21:21:12 459

原创 Linux:信号产生 [1]

发送信号的本质其实就是修改PCB属性中的信号位图位数改变,PCB是内核操作系统维护的数据结构,所以OS才有权修改PCB,无论未来我们学习多少种发送信号的方式,本质上都是操作系统操作系统向目标进程发送的信号,OS要提供发送信号的相关系统调用。如果一个信号要发送给进程,而进程要保存,那么应该保存在哪里?用比特位的位置表示普通信号的标号,比特位的内容表示是否收到该信号,收到信号由0置1。-收到信号不一定会引起进程退出,进程没退出就可能再次被调度,CPU内部的寄存器只有一份,但是寄存器中的内容属于进程的上下文,

2025-01-21 17:27:29 687

原创 Linux:System V - 信号量

公共资源被分为很多部分,定义信号量,当进程访问前先预订资源sem--,之后可以访问这部分公共资源;所有进程要访问公共资源之前,要先申请信号量,先申请信号量必须让这些进程要先看到信号量(信号量本身也是公共资源),信号量怎么保护自己的安全?—因为需要通信,想让进程间实现协同,又因为进程具有独立性,所以得让它们看见同一份资源,这样又会有数据不一致的问题。资源(内存、文件、网络等)是要被使用的,如何被进程使用呢?一定是该进程有对应的代码来访问资源的,而访问临界资源的代码称为临界区,不访问的代码称为非临界区。

2025-01-16 22:45:24 255

原创 Linux:System V - 共享内存

key作为共享内存结构的一个属性struct shm,在创建共享内存时就传参设置key值,获取共享内存时就是查找key值匹配的struct shm。这块在物理内存上申请的这段空间称为共享内存,让进程和共享内存关联起来的行为叫做挂接,取消进程和内存的映射关系叫做去关联。内核级的标定和上层的标定;通过修改页表,创建的共享内存和当前进程关联起来,在虚拟地址空间中找到一个没有被使用的空间,建立映射关系之后把它的起始地址返回,返回值就是共享内存空间在虚拟内存的起始地址。共享内存的生命周期是随操作系统的,不随进程;

2025-01-16 18:34:10 952

原创 Linux:进程间通信

进程具有独立性,进程要通信-信息数据交互,就会打破进程独立性的特征,成本不会低。为了同时保证进程的独立性完成数据通信,操作系统需要直接或间接给通信双方的进程提供“内存空间”。要通信的进程,必须看到同一份公共资源!不同类型的资源是由操作系统中不同的模块所提供的。数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

2025-01-15 22:38:46 920

原创 Linux:动态库和静态库

a程序在编译链接的时候把库的代码链接(拷贝)到可执行程序中。程序运行时将不再需要静态库。.so程序在运行时才去链接动态库的代码,在编译时把程序运行需要的函数的地址拷贝到可执行文件中。

2025-01-13 18:14:58 897 1

原创 Linux:进程控制

Makefile怎么同时形成多个可执行文件(默认只形成一个且是第一个)调用系统指令/程序调用我们自己写的可执行程序。(可以调用其它后端语言:C++/C/python/shell)

2025-01-12 16:43:07 616

原创 Linux:进程概念

一个运行起来(加载到内存)的程序---进程。同一时期有很多磁盘上的程序要加载到内存上。操作系统要对这些进程进行管理,引入PCB的概念进行对进程的描述---进程控制块struct task_struct{进程属性},进程ID、属性、状态、优先级、数据......。当程序加载到内存里,系统给每一个进程匹配一个进程控制块,操作系统遍历链表(存储单元为进程控制块),将死亡状态的进程清除,将优先级高的进程加载到CPU---对进程的管理转化成了对链表的增删查。管理的理念---先描述再组织。

2024-12-26 16:30:34 1056

原创 Linux下调试工具:gdb

--逐语句 s(step),进入到函数内;---跳转到代码的某行 until 某行,如果是无意义的符号会向下。---gcc默认行为:默认是动态链接的、默认是release版本。---跳到下一个断点 c(continue),运行至下一个断点处。---去掉断点 d 1,去掉第一个断点(在断点列表中的序号)---开始调试-逐断点 r(run),运行在断点处停下。---查看断点 info b,显示打过段断点的所有行。---vim默认行为:默认打开的时候是命令模式。---逐过程 n(next),不进入函数内。

2024-12-15 18:13:08 297

原创 Linux:Git

如果Linux没有安装Git :sudo apt install git ,当你首次安装Git时,会提示你进行配置用户名和邮箱。本质上就是将.git里面的内容同步到gitee上去,也就是上传本地内容!凡是在这个文件内部的后缀,对应的文件,不会被上传到gitee上!所谓的git仓库,本质就是一个目录,.git文件里面的内容。

2024-12-13 17:59:52 381

原创 Linux项目自动化构建工具---make/Makefile

--所以,注意先有的mycode.c源文件,再有的可执行文件mycode;当mycode去找依赖文件mycode.o时发现它并不存在,向下递归寻找依赖文件mycode.s依旧不存在...知道找到mycode.c发现它存在,执行依赖方法gcc -E mycode.c -o mycode.i,向上递归.......当内容变化时属性时间往往会随之变化,而文件是经常被访问的,如果时间更改的太频繁对系统增加负担,Linux新内核对访问时间做出修改,访问一定次数后才会更改访问时间。--目标文件/要形成的可执行文件。

2024-12-12 21:03:00 696

原创 Linux:gcc/g++编译器的使用

1.预处理:宏替换 \ 展开头文件 \ 去注释 \ 条件编译,生成.i文件2.编译,检查语法错误,生成 .s文件3.汇编:将编译后的汇编文件翻译成二进制目标文件,生成.o文件4.链接:生成可执行文件a.out。

2024-12-11 22:10:08 976

原创 算法专题一:双指针

一般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近;对撞指针的终止条件一般是两个指针相遇或者错开(left == right 或 left > right),也可能在循环内部找到结果直接跳出循环。又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。这种方法对于处理环形链表或数组非常有用。其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使用快慢指针的思想。

2024-12-10 18:53:04 842

原创 C++:多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为,比如student继承了person,person对象买票全价,student买票半价。那么在继承中要构成多态有两个条件--- 必须通过基类的指针或者引用调用虚函数。---被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。--- 重载:在同一定义域,两个(或多个)函数之间函数名相同,参数列表不同构成函数重载。--- 重写:在基类和派生类中,虚函数的函数名、参数列表、返回值相同、函数内容不同构成重写。

2024-12-10 18:52:02 704

原创 linux常见指令

代表Linux文件系统的根目录,是整个文件系统的起点,是目录的最高点。在根目录下的root目录即 /root/是专门为root用户创建的文件,存储着root用户的一些文件和配置信息,/root/就是root用户的工作路径或称为家目录;而对于其它用户,设存在其它用户A:在根目录下的home目录即 /home/下存储了以A的用户名命名的A的家目录 /home/A/;=文件内容(数据)+文件的属性(元数据)。(24) tar -czf my.tgc 要压的目录/文件,将压缩的文件/目录打包压缩。

2024-12-10 18:50:30 613

原创 Linux:权限

该公共目录的拥有者和所属组都是root,对其他用户也开放rwx的权限,以便它们在该公共目录下创建管理自身的临时文件,这些文件的权限都是各用户自身管理,如果没有自身没有开放权限别人就不能rwx,但是删掉一个文件操作和文件本身权限无关,和该文件所在的目录权限有关。yum是一个Linux下提供的一个软件管家/应用商店,可以通过yum进行搜索安装或卸载对应的软件,yum会自动在系统中搜索对应的下载路径,去社区自身提供的服务器中。R:目录的R权限,在该目录中,能不能显示目录内容,所包含的文件或目录。

2024-12-10 18:49:58 732

原创 Linux:Vim

同一个Linux系统每一个用户虽然用的是同一个vim的程序,但是大家用的是不同的vim配置,每一个用户,在自己的家目录下,都有一个属于自己的配置文件!---文本编辑:文本行的大小写切换shift+~、批量化替换 R、替换光标所在的一个字符 n r (esc退出)、向前删除 nx、向后删除nX(x\X也是支持剪切粘贴的)---光标定位:行左^、行右$、底部G、顶部gg、跳转到某行n G、左h 下j 上k 右l、w、b。---命令模式的意义:vim是一个没有鼠标时期产生的工具。各种命令能够提升我们的编辑效率。

2024-12-10 18:49:18 332

原创 C++:异常

容易造成混乱,可以通过throw派生类,catch基类--Exception来规范异常处理:你可以自己抛自己的异常,但是必须继承这个基类,但是外层捕获基类就可以。//4.C++的异常语言可以抛任意类型的异常,如果项目中没有做很好的规范管理,会非常混乱,所以一般需要定义出继承体系的异常规范。---a.需要注意的是,在C++语法中,throw语句抛出的异常是用户自定义的,可以是任意类型。---b. try语句检测到异常,交给catch语句来捕获处理,是会调用最近的catch语句。//1.异常会导致执行流乱跳。

2024-11-30 21:10:03 488

原创 C++:哈希-->unordered_map/unordered_set

第一种是按照插入节点的顺序迭代器遍历,要实现这种遍历方式,就要对上面的哈希表结构进行改变,首先节点必须多包涵一个指向上一个插入节点的指针和指向下一个插入节点的指针,再每次插入新节点时进行链接需要保留上一个节点,在删除某一个节点时,需要它插入前的一个节点指向它插入后的那个节点,增设这些操作过于复杂,我们实现的是第二种遍历方式--按照hash表的顺序遍历,每当某个桶有值时就遍历这个桶。---查找:将查找的key与表的大小取余找到它的地址,遍历该地址悬挂的节点,找到则返回该结点,找不到返回空指针。

2024-11-26 22:11:11 1030

原创 C++:map/set(二叉树、AVL树、红黑树)

如果是非空树,插入一个新增节点,先将它设置成红色(如果是设成黑一定会破坏规则四导致该路径黑色节点个数比其他多一个),设置成红色也可能会破坏规则3,不能存在连续的红节点,但调整相对容易;将p和u都改为黑,若g为根节点,结束返回;若g不为根,将g变为红(不会破坏该段子树原有的黑节点个数),继续判断,若g的父亲是黑色则结束,如果g的父亲是红色,继续往上处理。这种情况可以推演到类似变换的情况,不一定是新增节点,有可能是新增后调整导致的树的某部分出现这样的情况也可以根据这里的规则进行调整(三角形是子节点或者子树)。

2024-11-26 19:26:44 901

原创 C++:继承

上例中的Person类是父类,也叫做基类;student和teacher作为子类,也称作派生类。派生类通过访问限定符修饰的限定方式对父类进行继承。

2024-11-02 16:14:48 945

原创 C++:stack & queue & priority_queue

利用栈完成中缀表达式转后缀:---操作数输出,不动---将操作符依次入栈,通过比较确定其入栈顺序(1)当栈为空时,操作符直接入栈(2)当栈不为空时,比较和栈顶符号的优先级,若优先级高于栈顶符号则直接入栈;若优先级低于或等于栈顶元素,栈顶元素输出,继续比较新的栈顶元素,直到栈为空或遇到优先级低的将其入栈。

2024-10-27 18:22:52 852

原创 C++:List

vector的缺点:vector进行头插或者中间插入时,付出的代价较大,需要挪动数据;vector在扩容时也要在时间和空间上有所消耗。vector的优点:vector支持[ ]索引随机访问某个下标的值,就支持了多种排序算法、二分查找、堆算法等。list的优点:可以直接进行头插尾插任何位置的插入,不用挪动数据;新增节点就直接开辟一个节点的。list的缺点:不支持随即下标访问,查找时要逐个查找,比较麻烦。

2024-10-19 18:12:51 959 1

原创 C++:vector

但当vector中的元素类型是自定义类型时,以当前的string为例,单纯拷贝空间内容也就是拷贝vector中存的n个string对象,而就是拷贝n个string中的(_str,_capacity,_size);就涉及到了浅拷贝的问题,此时_str指向的空间并没有拷贝,那浅拷贝完之后原空间中的string就会析构,_str指向的空间释放,此时新空间中的string中的_str就会成为野指针,其所指的空间已经释放了,之后再利用该指针对不存在的空间析构或其它操作时程序就崩溃了。

2024-10-15 16:56:11 1060 1

原创 C++:模板

此时的main函数调用swap时此时并不是直接调用函数,模板根据调用的参数推演出函数,这个过程在预编译阶段就发生了,本质是我们写了模板,编译器通过模板推演出类或者函数。----C++在类的对象创建后会自动调用类的构造函数初始化,在进程结束时会调用析构函数销毁。----C++提供了类模板,可以写和类型无关的通用代码,可以存储不同的数据类型。----如果我们想定义存储不同数据类型的栈就要重新定义结构体,操作不便。----C++的封装性使得类外不能随意更改私有的成员变量,更加安全。

2024-09-19 13:18:12 297

原创 C++:内存管理

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。申请一个int内存的 空间,并初始化为3.申请一个大小为3的int类型的数组。指向单个对象的指针直接delete。指向数组多个对象的指针用 delete [ ]。C语言中malloc可以申请空间,那我们为什么还要使用new?

2024-09-17 17:22:57 699

原创 C++:基础知识

C++总计63个关键字,C语言32个关键字。

2024-09-01 18:24:56 589

原创 数据结构:八种排序详解

稳定性:数组中相同值,排完序后可以做到相对顺序不变就是稳定的,相对位置发生变化就不稳定。

2024-08-29 19:00:21 914

空空如也

空空如也

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

TA关注的人

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