- 博客(83)
- 收藏
- 关注
原创 C++11 并发支持库上
thread库中分有两个重量级嘉宾,一个是;一个是joindetachmoveget_idyieldsleep_fort.join()thread类。
2026-05-25 16:43:49
303
原创 多路复用I/O之Epoll
多个进程 / 线程,同时阻塞在同一个 epoll 的epoll_wait上;当一个 IO 事件就绪时,内核会唤醒所有等待的进程 / 线程;但最终只有一个进程能处理这个事件,其余进程白醒一场,重新休眠。这种无效唤醒、浪费 CPU 资源的现象,就是epoll 惊群。
2026-05-23 18:32:28
323
原创 select和poll
在实际工程中,就比如之前的搭建一个简单聊天室,其至少需要面对同时处理键盘外设上以及网络中的数据。如果采用阻塞IO的话,一方调用read就会引起另一方的阻塞导致无法快速处理响应。虽然可以使用多线程/进程的方式,但开销太大。假如使用非阻塞轮询式IO,那么CPU就会有一端较长的时间处于轮询询问状态,且CPU一直处于较高的工作水平,且就算只有一个链接活跃也常常需要轮询整个队列。其余的几种IO模型也不尽人意,故创建了select函数来解决问题。
2026-05-20 10:59:46
351
原创 五种IO模型
1. 阻塞 I/O —— “张三”拿一根鱼竿去钓鱼。他把鱼竿甩进水里,然后。鱼没上钩时,他什么都不做,就干等着。浮漂终于沉下去了,他赶紧提竿、把鱼从钩上摘下来、放进鱼篓,然后再甩竿,继续盯着。:张三的整个时间都花在“等鱼”和“摘鱼”上,干不了任何别的事。2. 非阻塞 I/O —— “李四”也想钓鱼。他把鱼竿甩出去,然后,立刻跑回岸上玩手机。但每隔几秒钟,他就跑回鱼竿旁看一眼浮漂——没动静,就又跑回去玩;有动静了,就提竿、摘鱼、放鱼篓。:李四能做点别的事,但要(轮询)。
2026-05-18 16:54:21
355
原创 NAT、代理服务、内网穿透
NAT是解决当下IPv4地址不足的总要手段之一,其核心作用就是将局域网中的本地地址与公网上的IP地址建立起映射关系。NAT并非路由器的默认功能,路由器要想进行NAT必须先经过提前配置。一般来说,NAT转化通常出现在,即数据包从私有网络(内网)进入公共网络(外网)的出口路由器或网关上。
2026-05-18 16:24:20
362
原创 数据链路层
在之前的网络层中,数据间的通信除了需要知道源地址和目的地址IP外,在经过每一个节点时都需要寻找下一个节点或目的设备。由于这些节点和目的设备都位于各自的局域网中,数据每到达一个局域网,就必须获得下一跳节点的MAC地址。为了解决的情况,ARP协议诞生了。但在了解ARP协议之前,我们需要先了解数据是怎么在局域网中传输的。这些都是在数据链路层执行的。
2026-05-16 19:02:22
366
原创 HTTP协议
HTTP(超文本传输协议)是一种用于传输网页、图片、视频等资源的(可传输任意类型数据)、(报文格式直观)、(每个请求独立,服务器不记忆用户信息,但可通过Cookie等机制模拟状态)、(提高效率),以及(默认未加密,但HTTPS通过TLS加密保障安全)。
2026-04-25 17:55:41
445
原创 序列化与反序列化
/ 自定义协议部分// 序列化采用 x oper y 的形式// 请求报文public:// 序列化// 反序列化// "_data_x _oper _data_y" -> 结构化if (!// 应答报文public:if (!public:// 结果int _code;
2026-04-25 15:45:42
339
原创 Socket--TCP
相比于UDP,TCP以字节流为传输模式,面向连接且更为可靠。就像打电话一样:当确定有TCP通讯即将发生时,。这三个函数详情可见之前的文章,或者ai,找资料。
2026-04-15 19:35:01
106
1
原创 Socket编程准备
在互联网中,(如多网卡、虚拟机、内外网 IP 共存),但在同一网络范围内,每个 IP 地址通常是唯一的。当我们使用软件客户端时,服务端要与客户端进程通信,本质上是通过来定位通信端点。
2026-04-10 20:35:18
389
原创 Linux--网络基础
我们可以将敲一声铃铛规定为字母a,两声为字母b……以此类推,我们就可以建立起一套通话规则进行人与人之间的交流,这种规定就可以看成协议。当互联网出现,人与人之间的交流可以通过手中的机器实现时,就必定会出现一套针对市场上所有机器的协议。只有这样,机器之间的交流才会变得规范,可行。
2026-04-07 16:57:54
438
原创 Linux线程互斥
我们可以看到抢的票最后抢到负数票,这明显与我们的预期不同。可是代码逻辑看起来并没有问题啊。在Linux系统中,线程中的数据需要从内存中拿到CPU的eax寄存器中修改保存,在上面的场景下,多个线程共同竞争CPU资源,这就容易导致ticket变量刚放到eax中还没有进行运算,另一个线程就强到CPU。
2026-03-28 11:32:43
371
原创 Linux线程控制
创建代价更低:创建新线程的代价比创建新进程小得多,系统开销显著更低。线程上下文切换效率更高:与进程切换相比,线程切换需要操作系统完成的工作更少。核心区别在于线程切换时虚拟内存空间保持不变,而进程切换会更换虚拟地址空间;切换过程中均需要保存恢复寄存器内容,且不会像进程切换那样刷新 TLB(快表),不会导致内存访问效率大幅下降,同时也能减少对硬件缓存的扰乱,避免缓存失效带来的性能损耗。在 CPU 中存在 cache 硬件用于存储频繁使用的数据或指令,当进程切换时,cache 中的缓冲全部失效,需要清空重新载入;
2026-03-22 18:06:42
393
原创 Linux线程基本概念
进程统管运行起来的程序,也就是PCB+代码数据的结构,在OS视角来看,进程是承担系统资源分配的实体。一个进程中可能存在多个main入口,这多个main入口都能调动资源形成各自相对独立的“小进程”,在Linux中,这种“小进程”被称为,也就是。线程是OS调度的基本单位。Linux在设计的时候,工程师发现进程与线程之间很相似,就认为没有必要为线程单独创建一个数据结构,转而是,这也导致。,我们之前学习的进程大多数内部只有一个执行分支,是进程中较为特殊的一种。但。Linux系统中,执行流就是轻量级进程。
2026-03-21 12:11:50
352
原创 Linux信号产生
信号在日常中很常见,最常见的就像红绿灯。红绿灯亮起的时候路人行车都会接受到信号,继而采取相对应的措施。在Linux中,也会有类似于红绿灯这类的信号。当进程捕捉到信号的时候,进程就会采取相应的行动。Linux中有62个信号。注意32、33号信号没有。
2026-03-15 17:51:55
353
1
原创 命名管道和共享内存
stat() 是 Linux/Unix 系统中获取文件 / 目录元信息的核心系统调用,它能读取文件系统中文件的类型、权限、大小、修改时间等属性 —— 对于 FIFO 文件,stat() 是验证其类型、确认是否为合法 FIFO 的关键工具。shmat() 是共享内存的核心映射函数—— 它将内核中已创建的共享内存段(由 shmget() 生成)映射到当前进程的虚拟地址空间,让进程能像操作普通内存一样直接读写共享内存(零拷贝核心)。正是因为这个特性,共享内存的通信效率是所有 IPC 中最高的。
2026-03-14 11:27:45
368
原创 进程间通信
就像现实中的人一样,各进程之间一定会出现需要信息交换的场景(如数据传输,资源共享等),这就是进程间通信。进程间通信有许多种方法,管道是其中之一。虽然管道在进程间通信中的地位不高,但依旧能帮助我们学习进程间通信原理。管道是内核级结构,之前使用的 | 指令就是管道。
2026-03-07 17:22:40
374
原创 动静态库的链接与加载
静态链接的过程是把代码拷贝到程序中,这里就不存在加载的过程。上图是code.c文件编译成.o文件后的汇编代码,我们可以看到,在code.o中,run函数并没有被call到code中(相对偏移码量为00 00 00 00)。文件在编译成.o 文件时的核心操作是单文件独立处理,也就是把文件翻译成机器码,同时记录当前文件调用的外部函数,但不会指明谁会调用当前文件内的函数。
2026-03-05 18:23:41
356
原创 磁盘与文件系统
块组描述符表用于逐一描述每个块组的关键信息,包括该块组的块位图、inode 位图、inode 表的磁盘起始块号,以及块组内空闲块数、空闲 inode 数、已用目录项数等状态信息。如果要删除文件,只需清除目录中该文件的文件名 - inode 映射,将文件对应的 inode 在 inode 位图中标记为空闲(即注销 inode),同时通过块位图回收文件占用的数据块,被释放的 inode 与数据块空间即可被后续文件重新使用。因为文件都是存储在块中的,每个文件的属信息也是如此。
2026-02-12 15:07:15
573
原创 Linux文件操作--IO
缓冲区(Buffer) 是内核分配的一块内存区域,核心作用是临时存储待写入硬件 / 从硬件读出的数据,解决进程 / 内核与硬件设备之间的速度不匹配问题,同时减少对硬件的直接频繁操作、实现数据异步传输。首先要明白调用系统调用进行读写是有代价的--时间代价。在语言层面会对系统调用做封装,但如果仍然是发起一次请求就执行一次系统调用就会造成耗时过高的问题。为了解决这个问题,缓冲区就被设计出来。
2026-02-04 16:29:30
628
原创 进程替换与自主Shell
Linux下常见的6种进程替换函数如上,此类函数统一以exec形式开头所以也能被称为exec函数,头文件都为。:表示参数采⽤列表:参数用数组:有p自动搜索环境变量 PATH:表示自己维护环境变量。
2026-01-30 22:35:17
681
原创 进程控制
在前面所讲的基础上我们能更加清晰的认识到——fork之后,子进程会拷贝父进程的代码、数据初始化,但父子进程依旧保持相互独立,当其中一方发生w操作时会被操作系统监视到并给子进程开辟新的物理空间,同时操作发出一方的w权限也会被正式赋予(写时拷贝)。fork之后返回一个pid_t类型的值,当fork失败时返回-1,成功时给父进程返回大于0的子进程pid值,给子进程返回0。当然了,父子进程在CPU上的使用情况还是需要看调度队列。
2025-11-17 16:11:34
862
原创 算法学习--离散化
1、离散化解决的是数据范围太大而数据个数不多的情况,其通过类似哈希的映射方式缩小检索范围减少时间复杂度2、离散化作为一种思想,常常会跟其它算法结合使用,在这个情况下离散化就有点象个“辅助”,离散化的具体实现方式很大程度上受到其合作的算法影响。3、离散化需要进行排序(方便用下标作为映射值)和去重(避免索引浪费,保证 “一个数据一个位置”)
2025-11-16 23:46:58
884
原创 虚拟地址空间
1、每个进程都有其自己的一套虚拟地址和页表2、fork之后父子进程共享一套代码和数据是因为发生类似浅拷贝的操作3、进程之间虽然可能共用一套代码和数据结构,但由于虚拟地址+页表的存在使得其数据可以被存储在不同的物理空间中,确保了进程之间的独立性。4(补充)、数据在物理空间上的存储可以是不那么规律的,毕竟其通过页表与虚拟地址产生映射关系。
2025-11-15 21:24:52
1348
原创 算法学习--快速幂
但是,总的来说其快速幂的思想并没有发生改变,依旧是依靠运算式中某一数(自己找)的二进制中的01表示相关的权值,当其具备目前权值时计入当前的自运算结果。毕竟,快速幂的本质是 “二进制拆分 + 分步累积”嘛。
2025-11-14 21:15:01
785
原创 算法学习--二分
二分算法适用于:1、求特定值的范围 2、求最值 3、求最大的最小值/最小的最大值(二分答案)适用条件:1、有序集合(可能需要额外寻找、处理) 2、具备可二分性注意事项:二分出来的答案需要检查是否符合要求。重点步骤:1、边界处理 2、判断方式(特别在二分答案中) 3、检查结果是否符合题目要求。
2025-11-13 13:29:33
828
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅