- 博客(327)
- 资源 (1)
- 收藏
- 关注
原创 【C++11新特性】| 并发编程
C++11中提供std::thread创建线程执行线程任务,不再需要使用繁琐的pthread_xxx;它可以阻塞一个线程或者个线程,直到有线程通知或者超时才会唤醒正在阻塞的线程,条件变量需要和锁配合使用;原子操作:多线程中最小的不可并行化的操作,故在多线程下,只有一个线程对其进行操作(不会出现例外);【atomic_flag】:该类型为无锁的,可以用该类型来实现一个自旋锁;当进入到lock的当前作用域时自动上锁,离开当前作用域时自动释放锁;可以动态的释放锁资源,防止线程由于编码失误导致一直持有锁;
2023-01-30 09:56:08 2680 1
原创 【shell教程】| 简介及基本使用案例
常见的shellecho $SHELL # 查看当前使用的shell变量名 = 变量值 # 格式,注意=不能有空格变量定义规则可由字母、数字、下划线组成,不能数字开头;等号两侧不能有空格;默认为字符串类型,不能数值计算;若有空格,则需要使用或;格式Action;] } #[注意]:需要在调用前声明;函数返回值只能通过$?来获取。
2023-01-20 10:46:37 1873
原创 【Centos】服务管理、解/压缩、磁盘、进程管理相关命令
查看详细的设备挂载情况,显示文件系统信息;:显示进程的所属用户;:显示进程的PID;
2023-01-07 09:56:57 1224
原创 【git版本控制】| git版本控制操作命令(全)
为了让不同系统上的开发者能够协同工作。有一个单一的集中管理的服务器,保存所有的修订版本。而协同工作的人们都得通过客户端连接到这台服务器,获取最新的文件或者提交更新;存在的问题服务器出现问题,客户机无法更新到最新版本;需要网络环境,单机无法实现版本控制;客户机无法直接进行联系;
2023-01-04 23:14:59 693
原创 【C++编程调试秘籍】| 总结归纳要点
当使用一个函数来获取一个指针时,可能会出现的潜在错误,避免对象的所有权不明确等原因,让函数返回一个智能指针;比较有实质性的做法可能就是在析构中对类中资源的释放,但该做法可能交给智能指针去处理并不需要交给我们手动处理;当我们试图解引用NULL指针时,将会导致程序崩溃,为此以下提供一种不删除它所指向对象的半智能指针;如:打开一个文件不存在或没有权限,或访问链接不可用等,为运行时错误;的情况,则会返回错误的信息;该类型的指针销毁时刻为最后消亡的那个对它进行删除;为此,我们需要输出错误信息:输出错误的。
2023-01-03 11:42:54 694
原创 【内核的设计与实现笔记】| 【03】系统调用
在用户空间进程和硬件设备间添加的中间层;主要是为了让应用程序受限(保护设备的安全性)的访问硬件设备;提供公共的接口,让每个进程都能够使用;是用户空间访问内核的唯一合法手段,其他可通过异常或陷入;
2022-11-14 22:31:09 302
原创 【复习整理归纳】| C++面经(内存管理)
5.1 只能在堆上方法:将析构函数设置为私有;原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象;5.2 只能在栈上方法:将new 和 delete 重载为私有;原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象。将 new 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象。
2022-11-05 10:22:09 1026
原创 算法【树】| 红黑树总结
红黑树是一棵近似平衡二叉搜索树,其中序遍历单调不减,并且能确保任何一个结点的左右子树的高度差小于两倍;恢复红黑树的性质需要少量的颜色变更和不超过三次树旋转(对于插入操作是两次);
2022-10-28 21:43:53 533
原创 【复习整理归纳】| C++面经(面向对象)
①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。什么情况下会调用拷贝构造函数用一个类初始化另一个类,会产生临时对象,把对象拷贝给临时对象,函数执行完先析构局部变量,在析构临时对象;函数的参数时类对象时;函数返回值时局部对象;
2022-10-19 10:57:49 503
原创 【复习整理归纳】| C++面经(函数相关)
跟踪调用栈是通过CPU中叫做栈指针stack pointer的寄存器来完成的(注意这里的指针不是C语言中的指针,这里的指针指的是寄存器);,对于库代码只需将程序中所用的函数提取即可。且将源代码中的库代码与目标形成计算机可识别的二进制机器代码即可执行程序;因为该代码只是存储编译器翻译的源代码,并不是一个完整的程序;,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联;如果 inline 函数有多个返回点,将其转变为 inline 函数代码块。的其他函数都会自动隐式地当成内联函数。
2022-10-19 10:50:09 327
原创 【程序员的自我修养】|【02】编译链接过程、目标文件解析
【注意】:以下情况下static变量一个在.data段一个在.bss段;,可能是一段子程序的起始地址,也可以是变量的起始地址;【段的标志位】:该段在进程虚拟地址空间中的属性;【如何将二进制文件作为目标文件中的一个段】保存段表中字符串常量;
2022-10-16 22:36:51 855
原创 【C++模块实现】| 【11】封装Ipv4、Ipv6、unix网络地址
【代码】【C++模块实现】| 【11】封装Ipv4、Ipv6、unix网络地址。
2022-10-11 12:38:38 952 1
原创 【复习整理归纳】| C++面经(基础概念、线程、进程)
①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。只能在堆上方法:将析构函数设置为私有;原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象;只能在栈上方法:将new 和 delete 重载为私有;
2022-10-10 23:51:18 895
原创 【复习整理归纳】| C++面经(STL及项目)
run函数内部创建idle协程用来执行idle以及一个执行协程,会先去任务队列中获取任务,获取到任务后通知执行,如果没有任务可取,则陷入idle中;起初采用将虚表扩大,让此处容纳所需的this指针,此时表中每一个slot不在是一个指针,而是一个集合体,内含offset以及函数地址;【Servlet】:为基类,提供名字来区分不同的服务器,其中继承的子类需要实现handle对请求做出相应的处理,设置响应信息;stop函数,首先判断停止条件是否满足,若不满足,则还有任务没有执行完毕,则提醒一下协程,有任务进来;
2022-10-10 23:50:46 1329
原创 【复习整理归纳】| C++面经(网络相关)
而TCP协议可以将多个数据包—起发送并接收(前提是接收方缓冲区剩余大小要能接收这多个数据),即接收方不保证一次只接收一条信息,所以TCP才存在粘包问题。没有句柄就绪,则会阻塞应用程序;【往返时间RTT】:从发送方发送数据开始,到发送方收到接收方的确认(接收方收到数据后立即发送确认)总共经历的时延;,合并成一个大的数据块,这样会导致接收方难以分辨原来数据包,故Nagle算法可能会导致发送方出现粘包问题。分组重复:发送的数据迟迟没有被接收到,重新发送后,原先的数据也被接收到了;)来获取接收方的IP地址;
2022-10-10 23:50:16 580
原创 【Linux多线程服务端编程】| 【09】Buffer类的设计与使用
具体代码:https://gitee.com/jaibuti/log_server.git。适用vector其中的capcity减少了内存分配的次数,内存以指数增长;提供prependable,可让程序能以很低的代价在数据前添加几个字节;可优化,我们使用resize,会将内存进行初始化,但我们并不需要;【前方添加prepend】
2022-10-10 21:36:18 1019
原创 【Linux多线程服务端编程】| 【07】TCP网络编程实例文件传输
【代码】【Linux多线程服务端编程】| 【07】TCP网络编程实例文件传输。
2022-10-08 00:19:55 1305
原创 【Linux多线程服务端编程】| 【06】TCP网络编程及五个应用示例
socket编程时,使用并不难,但容易忽略问题,出现错误,因此封装后以此来降低开发难度;
2022-10-07 11:00:25 697
原创 【C++模块实现】| 【10】定时器的实现
一般用于做定时任务,设置几秒钟后执行某个函数;获取当前时间,计算时间间隔;时区转换与日期计算;定时操作;
2022-10-06 23:22:36 3442
原创 【Linux多线程服务端编程】| 【05】高效的多线程日志
【C++模块实现】| 【01】日志系统实现【日志类型】【诊断日志】:log4j、logback、log4cxx、log4cpp等;【交易日志】:数据库的write-ahead log、文件系统的journaling等,通过回放日志可逐步恢复每一次修改后的状态;【日志功能】:日志通常用来故障诊断和追踪、性能分析等;对于关键线程,需要记录:收到每条内部消息的id等;收到的每条外部消息的全文;收到的每条消息的全文,每条消息都有全局唯一的id;关键内部状态的变更,等;【日志库】
2022-09-28 14:55:25 913
原创 【Linux多线程服务端编程】| 【04】C++多线程系统编程精要
从某个TCP连接A收到req,程序处理它需要一定时间,为了避免阻塞,程序需记住发来的req,在某个线程池中处理;但处理req时,客户端断开连接,而另一个客户端连接B;函数,则修改的变量必须为sig_atomic_t类型,从而优化了内存访问;【FD_CLOEXEC】:让exec时,进程自动关闭这个文件描述符;:每个磁盘配一个线程,把所有对此磁盘IO都挪到同一个线程;【O_NONBLOCK】:开启非阻塞,文件描述符默认为阻塞;的情况下,全局数据可能被其他线程修改,导致后续可能出现。同步IO:阻塞与非阻塞;
2022-09-27 20:00:51 982
原创 【Linux多线程服务端编程】| 【03】多线程服务器的适用场合和常用编程模型
【例2 计算密集型】:多线程分担负载,若我们要左一个求解Sudoku的服务,这个服务程序在9981端口接受请求,输入一行81个数字,输出为填好后的81个数字(1~9)若无解,输出NO\r\n;【例2】:memcached客户端,若我们用memcached来保存用户最后的发帖时间,则每次响应用户发帖的请求时,程序要去设置一下memcached里的值,若这里用同步IO,则会增加延迟;【例1】:日志,在多线程服务器程序中,日志很重要,仅考虑log file;在一次请求响应中,可能要写多条日志信息,而若用。
2022-09-26 19:45:38 966
原创 【内核的设计与实现笔记】| 【02】进程的创建与销毁及调度
当一个文本编辑器和视频编码程序,CFS发送文比视运行的时间片短的多,但要求满足公平调度,在文投入运行时,会立刻抢占视;当一个进程被跟踪时,它的临时父亲设定为调试进程,若父进程退出,则系统为它和它的所有兄弟进程重新找一个父进程;:同一程序中的线程共享内存地址,内核没有线程概念,被视为一个与其他进程共享资源的进程,都拥有独自的task_struct;若没有可运行进程,CFS调度器便选择idle;:进程大多时间来提交或等待I/O请求,经常处于可运行状态,但只运行一小会,更多的时间在等待而被阻塞;
2022-09-25 11:35:48 521 1
原创 【内核的设计与实现笔记】| 【01】初步了解内核
内核编程时不能访问C库和标准C头文件;必须使用CNU C;缺乏类似用户空间的内存保护机制;难以执行浮点运算;每个进程只有一个很小的定长堆栈;需要注意同步和并发因为内核支持异步中断、抢占和SMP;注意移植性;【无libc库和标准头文件】内核不能连接C库,但大部分函数在内核都进行实现;【GNU】gcc是多种GNU编译器的集合,可编译内核及系统上的C程序;【GNU中的区别】1.内联函数:C99及GNU支持,函数会在调用位置展开,减少函数调用以及返回带来的开销;
2022-09-25 11:21:06 497
原创 【Linux多线程服务端编程】| 【02】线程同步精要
而调用threadFunc线程先调用Request::~Request(#6)在调用Inventory::remove(#5);主要解决读多写少的场景,当一个函数在读取时,我们对列表进行写入或删除操作可能会引起不必要的麻烦,所以在写入时,我们应该在拷贝一个副本在副本上进行操作;若在等待某个事件要发生,一般采用select等或条件或线程池、倒计时、队列,而不是使用sleep;最常用,保存临界区,任何时刻最多只能由一个线程在此mutex划出的临界区内活动;若需要等待某条件成立,则需要使用条件变量;
2022-09-25 09:46:58 460
原创 【Linux多线程服务端编程】| 【01】线程安全的对象生命期管理笔记
【死锁】:若L62中的update调用register_或unregister,若mutex_是不可重入,则会死锁;】:若销毁,则无法访问,无法获取对象状态,也可能在源地址上创建新的对象;【空悬指针】:当两个指针指向同一个对象,不同线程将其中一个对象销毁,而另外一个就成了空悬指针;解释:弱该对象还活着,即调用它的成员函数,否则忽略之,利用weak_ptr;【shared_ptr】:当对象最后一个时,进行析构或reset会被销毁;通过继承该基类,来确保上述的问题,即在bind中,传入的this还存活着;
2022-09-22 21:40:34 824
原创 【C++】| 简易实现一个ini配置文件解析器
ini文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式;- 后缀名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt";
2022-08-11 22:53:16 529
原创 【C++模块实现】| 【09】线程模块及线程池的实现
=======》Linux中的线程、互斥量、信号量的基本使用《=================》线程、线程同步、线程安全《========
2022-08-05 15:38:02 543
原创 【C++模块实现】| 【08】循环覆盖写内存缓冲区(日志中多线程记录)
循环缓冲区(也称为环形缓冲区)是固定大小的缓冲区,工作原理就像内存是连续的且可循环的一样;-在生成和使用内存时,不需将原来的数据全部重新清理掉,只要调整head/tail指针即可;-当添加数据时,head指针前进。当使用数据时,tail指针向前移动;-当到达缓冲区的尾部时,指针又回到缓冲区的起始位置;...
2022-08-01 17:27:24 1009
原创 【C++模块实现】| 【07】对于互斥、自旋锁、条件变量、信号量简介及封装
=======》互斥量、信号量、条件变量的基本使用及参考代码《=======
2022-08-01 15:29:26 901
原创 【C++模块实现】| 【06】日志模块添加循环覆盖写文件功能
========》以下全部代码查看《========【C++模块实现】| 【01】日志系统实现【C++模块实现】| 【02】日志系统优化【C++模块实现】| 【03】文件管理模块【C++模块实现】| 【04】配置模块【C++模块实现】| 【05】日志模块增加配置模块的功能2、遇到的问题2.1 日志文件大小的限制没有达到预期的要求2.2 yamlstring3、测试测试循环覆盖写文件测试代码参考文章=========》Log4j2 RollingFileAppender《==
2022-07-29 16:01:26 1666 2
原创 【C++模块实现】| 【05】日志模块增加配置模块的功能
确保在加载yaml文件时能够进行转换,对该类型进行特化;publicYAMLLoad(v);if(!stdendl;"");++x){if(!stdendl;continue;}stdif(!stdendl;continue;stdendl;continue;}};publicstdYAMLNoden;UNKNOW){}if(!YAML
2022-07-28 17:04:02 552
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人