- 博客(176)
- 资源 (2)
- 收藏
- 关注

原创 8. Linux/Unix进程控制
8.1 引言 包括创建新进程,执行程序和终止。还将介绍进程属性中的各种ID——实际、有效和保存的用户ID和组ID.8.2 进程标识/进程ID#include <unistd.h>pid_t getpid(void);//获取进程IDpid_t getppid(void);//获取父进程IDpid_t getuid(void);//获取进程的实际用户IDpid_t geteuid(void);//获取进程的有效用户IDpid_t getgid(void);//获取进程的组ID
2021-10-29 22:00:42
333

原创 5. 标准I/O库
5.1 引言 第三章中的I/O函数都是围绕文件描述符,而标准I/O库是针对流(stream)进行的,当使用标准I/Ok库打开或创建一个文件时,我们以使一个流与一个文件关联。 当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针。该对象通常是一个结构体,包含了用于实际IO的文件描述符、指向用于流缓冲区的指针、缓冲区的长度、当前在缓冲区的字符数以及出错标志等。 为了引用一个流,需将FILE指针作为参数传递给每个标准IO函数。5.2...
2021-10-22 20:23:43
147

原创 用C++简单写的线程池
测试用例在后面:参考地址Thread.h/*Datetime:2020/8/21By LiuZhenguang*/#ifndef _THREADPOOL__H#define _THREADPOOL__H#include <vector>#include <iostream>#include <mutex>#include <thread>#include <deque>#include <condition_v
2020-09-04 15:25:25
186
1

原创 #pragma和ifndef的区别
首先#pragma once是编译器相关的,有的编译器支持,有的编译器不支持1、#ifndef的方式依赖于宏名字不能冲突,所以这可以保证同一个文件不会被包含多次,也能保证多份拷贝的文件不会被同时包含;缺点就是如果不同内容头文件的宏名不小心“撞车”,编译器则只能包含其中一个;2、#pragma once则由编译器提供保证:同一个文件不会被编译多次。注意这里所说的“同一个文件”是指物理上的一个文件;缺点就是,某个头文件有多份拷贝,本方法不能保证他们不被重复包含。3、综上,#ifndef 保证宏名不重复
2020-08-25 21:50:49
366

原创 设计模式15——代理模式(Proxy)
一、动机在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。二、模式定义为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。——《设计模式》GoF三、案例有一个处理函数的基类,process声明为虚函数,然后RealSubject继承基类,并重写虚函数:class ISubject{public: virt
2020-08-11 09:59:49
160

原创 Winndows\C++并发与多线程
并发与多线程一、并发、进程、线程的基本概念1、并发: 两个或者更多独立的任务同时发生:一个程序同时执行多个独立的任务; 以往的计算机是假的并发,采用的是时分复用;这种切换是需要时间开销的 硬件的发展出现了多处理器计算机,能够真正的并行执行多个任务。2、进程 进程就是一个可执行程序运行起来3、线程 每个进程都有一个主线程,一个进程只有一个主线程,当你执行可执行程序,这个主线程就默默启动,实际上是进程中的主线程来执行main函数中的代码。 每创建其他线程,就可以在同一个时刻
2020-08-05 11:15:17
1155

原创 设计模式1——模板方法(template method)
在软件构建过程中,对于某一项项目,他常常有稳定的整体结构,(即程序的整体框架是固定的,但是各个函数的实现细节可能会变化或者多个细节的版本)。或者由于固有的原因而无法和任务的整体结构同时实现。那么问题就来了,如何应对这种多个版本的子函数呢?在传统的结构化软件设计流程如下://程序库开发人员class Library{public: void Step1(){ //... } void Step3(){ //... } void Step5(){ //... }};/
2020-08-05 10:47:28
310
1

原创 标准粒子群C语言程序
//库文件 #include"stdio.h" #include"stdlib.h" #include"time.h" #include"math.h" //随机数定义 #define rdint(i) (rand()%(int)(i)) #define rdft()(float)((double)rdint(16384)/(16383.0)) #define rnd(a,b)(rdint((int)(b)-(int)(a)+1)+(int)(a)) //宏定义 #def.
2020-08-03 11:04:43
323
原创 proc文件系统使用
proc文件系统位于文件系统的根目录下,通常表现为/proc目录。其中文件描述了系统中的各种资源和状态信息。proc文件系统是一个虚拟文件系统,这意味着它并不占用实际的磁盘空间,而是由内核动态生成的内容。
2025-03-25 10:28:17
457
原创 C++17新特性
有用的新特性引入的:(1)可以使用值传递,引用传递或者混合传递来捕获可以的外部对象。(2)可以使用指针或值传递捕获当前对象,但其实都是本对象的指针。的引入捕获,使得可以捕获当前对象的常量副本,相当于是以值捕获的形式捕获了指向的对象,并且赋予属性。3 constexpr新特性3.1 允许lambda中使用C++17允许lambda表达式在constexpr上下文中使用,从而使其可以在编译期求值。4 变量新特性4.1 inline变量它主要解决了多个编译单元之间共享全局变量的链接问题,特别
2025-03-16 14:53:22
637
原创 C++14新特性
/前置声明int main()return 0;auto func(int i) //C++11编译非法newCharacter.cpp:3:16: 错误:‘func’ function uses ‘auto’ type specifier without trailing return typeauto func(int i) //C++11编译非法。
2025-03-15 14:17:59
716
原创 unordered_map底层原理
在C++标准库中,的底层实现通常是基于哈希表,而哈希表的核心结构通常包含一个动态数组(类似于)来存储“桶”(buckets每个桶内可能用链表或红黑树(C++11后某些实现用)处理哈希冲突。
2025-03-13 15:27:56
274
原创 网络字节序和主机字节序
字节序指的是计算机多于一个字节时数据在内存中的存储顺序,例如一个int小端字节序:低字节在低地址(0x12794468, 其中68为低字节),高字节在高地址大端字节序:高字节在低地址,低字节在高地址。将0x12345678。
2025-03-09 10:49:09
424
原创 进程通信——信号
信号(signal)机制是Linux系统中最为古老的进程之间的通信机制。Linux信号也可以称为软中断,是在软件层次上对中断机制的一种模拟。在原理上,与可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,进程不需要通过任何操作等待信号到达。系统中一共定义了64种信号,分为实时信号和非实时信号。前31种信号含义如下:信号传递流程如下:信号返回:一旦信号处理函数执行完毕,程序将会从信号处理函数中返回,程序恢复执行之前的代码。**注:**信号传递不支持排队,当在很短的时间内传递多个相同信号,该信号只会被处理
2025-02-28 16:29:31
989
原创 C++的allactor
/ TODO:为vector写一个内存配置器,当空间大于1000时直接从堆分配内存// 自定义内存配置器public:// 分配内存// 大于1000字节时,使用堆分配。
2025-02-23 17:35:14
275
原创 C++deque双端队列
双端队列(dequeue) 与vector很类似,采用线性表顺序存储结构,且支持随机访问,即可以直接用下标来访问元素。deque采用分块的线性存储结构来存储数据,每块的大小一般为512B,将之称为deque块;所有的deque块使用一个map块进行管理,每个map数据项记录各个deque块的首地址,所以允许较为快速的随机访问;即它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪;
2025-02-23 16:04:12
241
原创 LLM之循环神经网络(RNN)
神经网络,又称人工神经网络,其设计灵感源于人类大脑的运作模式。它由众多被称为“节点”的处理单元构成,这些节点之间相互传递数据,恰似大脑中的神经元传递电脉冲。在机器学习领域,神经网络扮演着关键角色。尤其是在深度学习中,它能够从无标签数据中提取有价值的信息,实现诸如识别照片中未知物品等复杂任务。循环神经网络(RNN)是一种专门设计用于处理顺序数据的神经网络架构。与传统的前馈神经网络不同。RNN 能够通过内部状态来记忆之前输入的信息,从而更好地处理序列数据。
2025-02-15 14:21:53
828
原创 音视频媒体传输协议
RTCP(RTP control Protocol)是与RTP配合使用的协议,与RTP协议不可分割。实时流式协议RTSP(Real-Time Streaming Protocol)现在,对流式存储音频/视频的播放,如YouTube都是采用TCP来传送。缓存的方式在一定程度上消除了时延抖动,但是增加了时延,因为推迟播放了。存储音频/视频不是实时产生的,而是已经录制好的,通常存储在硬盘中。如果是实时观看实况转播,应当首先考虑采用UDP来传送。第三种方式:媒体服务器。
2025-02-09 21:36:45
1119
原创 故障定位手段
(命令样式:./pprof --text ./进程名 heap文件名(这个文件可能会生成很多) > 输出的txt文档名)上图为pprof分析输出的文本图,可通过对上图的内存申请大小进行分析排查,可定位内存泄漏问题,并能定位到源码中的位置。第一个参数是生成的heap的文件名以hicore开头命名、每隔1G写一次dump一次写heap文件。编译时需要添加上-g参数:gcc main.c -o main -g。1、malloc/new申请的内存没有主动释放。查看当前系统是否已开启core文件记录。
2025-01-11 11:17:06
992
原创 std::thread
线程异常退出:如果一个线程因为未捕获的异常或其他非致命错误而退出,通常不会导致整个进程崩溃。其他线程会继续运行,进程仍然保持活动状态。在C++中,std::thread是用来创建线程的。当我们需要向新线程中的函数传递参数时,可以通过多种方式来实现。3.通过lambda表达式传递参数。
2025-01-08 21:12:21
315
转载 http安全加密
数字摘要 又称为 数字指纹,指通过哈希函数对信息进行运算后生成的一串定长字符串,具有很强的唯一性,数字摘要 并不能加密,而是用于快速判断原始内容是否被修改。⭐数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash函数)对信息进行运算生成一串固定长度的数字摘要。数字指纹并不是一种加密机制,但可以用来判断数据有没有被窜改。⭐摘要常见算法:有MD5、SHA1、 SHA256、SHA512等, 算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)
2025-01-01 17:06:30
49
原创 HTTP1、HTTP1.1、http2、http3的区别
我们知道HTTP/1和HTTP/2都是使用TCP协议来传输的,而如果使用HTTPS的话,还需要使用TLS协议进行 安全传输,而使用TLS也需要一个握手过程,这样就需要有两个握手延迟过程。这不同于HTTP/1.1,使用HTTP/1.1时,浏览器为每个域名开启了6个TCP连接,如果其中的1个TCP连接发生了队头阻塞,那么其他的5个连接依然可以继续传 输数。从上图可以看出,HTTP的持久连接可以有效减少TCP建立连接和断开连接的次数,这样的好处是减少了服务器额外的负担,并提升整体HTTP的请求时间。
2025-01-01 14:41:30
1314
原创 线程同步——使用场景区分
如果需要在线程之间传递thread_local变量的值,需要额外的机制或使用InheritableThreadLocal(这是Java中的概念,C++中没有直接对应的实现,但可以通过其他方式模拟)。在并发编程中,原子操作可以用于确保多个线程对共享变量的访问是原子的,从而避免数据竞争和不一致的问题。原子操作可以确保对状态标志的访问是原子的,从而避免不一致的状态。主要用于为每个线程提供独立的变量副本,从而避免线程间的数据竞争和共享问题,适用于需要在多个方法之间共享数据但又不希望使用传递参数的方式的场景。
2025-01-01 11:01:34
834
原创 linux定时器操作
当需要在一个新的线程中执行某个函数来处理定时器事件时使用。这种方式提供了更多的灵活性,因为你可以执行任意复杂的任务,而不受信号处理函数的限制。当需要在定时器到期时触发一个信号,并且希望在信号处理器中执行特定的操作时使用。这是最常见的用法之一,适用于需要实时响应的应用程序。结构体用于指定当定时器到期或其他事件发生时,系统应该如何通知应用程序。成员可以设置为不同的值,以选择不同的通知方式。
2024-12-22 19:52:23
548
转载 线程同步——原子操作
原子操作是一种不可分割的操作,执行过程不会被其他线程打断,意味着多个线程访问同一个资源时,当前仅有一个线程会对资源进行操作。这种特性使得原子操作在保证数据一致性和线程安全方面具有显著优势。多线程编程的核心问题时,如何保证数据的一致性。传统使用锁机制使得线程进入阻塞,存在死锁风险。而原子操作是通过硬件支持,提供了一种轻量级的同步机制,有效避免了上述问题。
2024-12-22 16:13:14
447
原创 Redis2
Redis:开源、免费、非关系型数据库、K-V数据库、内存数据库,支持持久化、事务和备份,集群(支持16个库)等高可用功能。并且性能极高(可以达到100000+的QPS),易扩展,丰富的数据类型,所有操作都是单线程,原子性的。NOSQL:非关系型数据库,数据与数据之间没有关联关系。就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题类型键值(key-value)存储数据库列存储数据库:键仍然存在,但是指向了多个列,HBase (eg:博客平台(标签和文章),日志)
2024-12-14 11:43:28
900
原创 线程同步——C语言
当一个线程试图获取一个已被持有的自旋锁时,它将在循环中等待,而不是进入阻塞状态,消耗处理器时间直到锁变得可用。)是一种非阻塞同步机制,它通过“
2024-12-11 19:58:53
597
原创 MySQL索引优化
按照建的索引的顺序查询,如果建立的是复合索引,则使用时也是按照复合索引的全部元素查询。如果无法使用全部索引字段,则必须从最左开始,不要跳过中间某字段,右侧的索引可以缺失。打开后,执行完SQL语句后,执行SHOW PROFILE查询。如果对复合索引中间使用了范围,则后续的索引就会失效。少用*,只查询必须的字段,完美时只查询索引列,因为。默认情况下,MYSQL没有开启慢查询日志。时不仅访问索引数据区,还会访问DATA数据。默认关闭,需要使用全局变量打开。全表扫描和全索引扫描是不一样的。
2024-11-24 20:27:01
923
原创 IO多路复用
IO多路复用(IO Multiplexing)一种同步IO模型,单个进程/线程可以同时处理多个IO请求。一个进程/线程可以监视多个文件描述符;一旦某个文件描述符就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路是指网络连接,复用指的是同一个进程/线程。
2024-10-23 21:41:23
1179
原创 进程通信——管道
管道是Linux中进程间通信的一种方式,他把一个程序的输出直接连接到另一个程序的输入。匿名管道和命名管道。管道不属于进程的资源,而是和套接字一样,属于操作系统(也就不是fork函数的复制对象)。所以,两个进程通过操作系统提供的内存空间进行通信。无名管道是Linux中管道通信的一种原始方法,如下图所示,它具有如下特点:(1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。(2)它是一个单工的通信模式,具有固定的读端和写端,一边只能读,一边只能写。
2024-10-16 20:49:57
1098
原创 进程通信——消息队列
消息队列称为报文队列也叫做信箱,是linux的一种通信机制这种通信机制传递的数据具有某种结构,而不是简单的字节流。消息队列的本质是内核提供的链表,内核基于这个链表,实现了一个数据结构。内核又基于此提供了从一个进程向另一个进程发送一块数据的方法向消息队列写数据,实际上是向这个数据结构中插入一个新节点;从消息队列读数据,实际上是从这个数据结构中删除一个节点。消息队列也有管道一样的不足,就是每个数据块的最大长度是有限的,系统上全体队列的最大值也有一个上限。
2024-09-01 16:19:39
1267
原创 进程通信——共享内存
不同进程的资源通常是独立的,他们所占用的内存互相独立,不可互相访问。而共享内存允许多个进程访问同一块内存区域,从而实现数据的共享和交换。是一种高效的进程通信方法。在共享内存中,多个进程可以将同一块物理内存,映射到它们各自的虚拟地址中,使它们可以直接读写该内存的内容,而无需通过消息传递等其它通信方式,也就是“完全无需额外的拷贝这种直接的内存访问,使得数据交换更高效。
2024-08-31 16:38:10
1405
nginx入门介绍安装和配置
2024-12-04
MySQL高级架构详解与应用
2024-11-24
第4阶段实战-基于多态的企业职工系统.rar
2020-08-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人