- 博客(60)
- 收藏
- 关注
原创 【Linux】TCP原理
对方一定收到了!如果连接不成功?最后一个ACK没有收到怎么办?连接重置RST置1:reset连接重置标志位;收到该标志位的主机,要对异常连接重新释放,重新建立;
2024-11-13 14:43:13
1390
原创 HTTP协议
我们先来看一个简单的http请求,这里用浏览器作为客户端;在http.hpp中要有服务列表,然后对服务有判断是否在服务列表中,将服务插入到服务列表中;这个服务要在main.cpp中实现的话,我们就要调用回调函数;
2024-11-06 10:48:03
882
原创 【c++11】智能指针
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
2024-11-04 23:04:54
488
原创 【c++日常刷题】两个数字的交集、点击消除、最小花费爬楼梯
题目描述:解题思路:通过遍历num1,如果遍历到的元素如果在num2中能找到,则这是num1和num2的公告元素;
2024-11-04 22:32:14
898
原创 【Linux网络】TCP_Socket
传输层协议有连接可靠传输(前提网络要联通,复杂,维护性要更强)面向字节流tcp和udp在创建套接字和绑定部分是一样的;不同的是,tcp在服务端绑定后需要将套接字的状态设置为listen状态,除此之外,在通信前要获取新连接;在客户端也要connect;因为tcp是面向连接的,tcp需要未来不断地能够做到获取连接;
2024-10-31 22:40:28
965
2
原创 【Linux网络】UdpSocket
套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性,端口可以标定进程在主机的唯一性,那么socket通过IP+端口号就可以让两个在全网唯一标定的进程进行通信。
2024-10-30 13:20:28
1099
原创 【Linux】信号量,线程池
POSIX 信号量和 SystemV 信号量作用相同, 都是用于同步操作, 达到无冲突的访问共享资源目的。但 POSIX 可以用于线程间同步。信号量本质就是一个计数器,对公共资源的预定机制;
2024-10-26 21:57:44
946
原创 【Linux】线程互斥与同步,生产消费模型(超详解)
当票只有一张的时候,线程1进入了,判断了大于0了,但是正准备去抢票的时候,线程1 被切换了;此时线程2被唤醒了,因为线程1还没有来到及对num--,所以线程2也进入了,也在正准备抢票的时候被切换了;此时又进入了线程3,线程3和线程1,2一样,也是在num--之前被切换;线程1 被唤醒,num--,票数变成了0;线程a申请到锁:1、寄存器al清零 2、交互寄存器al和锁中的值 3、判断(如果寄存器al中>0,说明申请到了锁,不满足条件,则没有申请到锁);---->同步---->严格的顺序性;
2024-10-23 21:02:52
916
原创 【Linux】线程ID、线程封装(详解)
怎么查看一个线程的ID呢?线程库 NPTL 提供了 pthread_ self 函数, 可以获得线程自身的 ID;不知道的可以看下面文章中的pthread_self()即可;运行结果:pthread_ create 函数会产生一个线程 ID, 存放在第一个参数指向的地址中。该线程 ID 和前面说的线程 ID (LWP)不是一回事。从图中可以很明显的看到LWP不等于TID;给用户提供的线程ID,不是内核中的LWP,而是自己维护的一个唯一值,这个维护是pthread库维护的;
2024-10-23 13:36:42
1339
原创 【Linux】线程基本概念,线程控制
线程(thread)是指在单个进程内,多路并行执行的创建和管理单元;我们期望主线程先退出还是新线程最后退出? ----> 当然是主线程了,那如何保证main thread最后退出呢?join来保证,这时就要用到pthread_join来等待新线程;
2024-10-21 22:18:45
1003
1
原创 【Linux】信号
信号的有OS发出,上面的5种产生情况,都是操作心态发出信号的触发条件;(1)上面所有信号的产生都会需要操作心态的参与,为什么?因为操作系统是进程的管理者,只要操作系统能管理进程。(2)OS是怎么向进程发送信号的?普通信号有31个,剩余的是实时信号,进程PCB中有数据结构,位图(只需要一个整个即可),来记录当前进程是否收到对应位置的信号,OS向进程发送信号时,将对应位置置1即可;signo>=1;cout
2024-10-19 18:16:10
1158
原创 【Linux】system V进程间通信--共享内存,消息队列,信号量
通信的方式有三种:聚焦本地通信的,实现跨主机之间的通信,以及基于文件系统的;下面是System V的通信方式:system V IPC提供的通信方式有三种: 共享内存、消息队列、信号量;并且生命周期是随OS的,而不是随进程的,这是所有System V进程间通信的共性;
2024-10-16 22:15:01
1111
原创 【Linux】进程池
如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,进池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行;这样不会增加操作系统的调度难度,还节省了开关进程的时间,也一定程度上能够实现并发效果。看下图,父进程和子进程之间可以通过管道来交互;如果管道中没有数据,则worker进程就。
2024-10-15 20:10:50
755
原创 【Linux】进程间通信---匿名管道、命名管道(超详解)
我们先来回答下面的几个问题再来正式的进入管道的学习;进程是需要某种协同的,所有如何协同的前提条件是通信-->数据是有类别的-->通知就绪的、单纯的传递数据的、控制相关信息的...a、进程间通信,成本可能会比较高b、进程间通信前提:先让不同进程看到同一份(操作系统)资源(“一份内存”)1、system V2、Posix我们重点讨论system V方式:有三种管道:1、命名管道2、匿名管道。
2024-10-14 17:37:13
1014
原创 【Linux】文件系统和软硬链接
在学习文件系统前我们先来了解一下磁盘。在我们之前的学习中,我们对于文件的操作,都是在文件已经被打开的前提下进行的;被打开的文件 -->找到这个文件 -->磁盘中先找到 -->文件路径+文件名 -->执行文件操作那你们有没有一个疑问?没有被打开的文件是被放到磁盘里的!!磁盘中有磁盘文件,那这个想要知道这个问题的答案,我们先来了解一下磁盘;
2024-10-09 17:43:20
1204
原创 【Linux】自主shell编写
如果学习了常见的Linux命令,exec*函数,环境变量,那你就可以尝试一下写一个简单的shell;下面跟着我的步骤来吧!!🤩🤩。
2024-10-07 20:26:07
632
原创 【Linux 】文件描述符fd、重定向、缓冲区(超详解)
openman 2 openpathname:要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成;常见的参数有:O_RDONLY: 只读打开O_WRONLY: 只写打开O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写mode: mode 只有 当 在 flags 中使用 O_CREAT 时才有效 , 否则被忽略.返回值成功:新打开的文件描述符。
2024-10-06 20:57:01
1416
原创 【Linux】进程替换、命令行参数及环境变量(超详解)
很简单,父进程中exec*函数后的代码无法执行是因为exec*函数的替换,把后续代码给替代了,找不到后续代码;怎么让它可以找到-------->fork创建子进程,在子进程中执行exec*函数,这就是用的我们之前提到的写实拷贝(让子进程自己去替换,父进程的代码和数据不受影响);一开始,子进程完全的父进程的拷贝(页表指向是红色箭头),后面由于exec*函数替换,因为替换的不仅仅是数据,连代码也替换了,这时OS就是进行写时拷贝,把代码和数据都复制了一份(绿色和蓝色箭头的指向);父进程代码和数据仍然存在;
2024-10-03 17:41:13
1206
原创 【Linux】进程控制(进程终止,进程等待)
如果在代码中分别加入exit(1)和_exit(1),我们会发现加exit也就是上面运行结果的第一种,会显示运行结果,但是加_exit不会显示除了hello;WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。如果是代码出现了异常,正如我们使用vs的时候,运行崩溃-------也就对应了OS发现了进程做了不该做的事情,OS杀掉该进程;进程在退出时,如果父进程不管不顾的话,退出进程会出现。:查看进程的退出码,通过退出码的数值来对应我们的进程是否运行成功;
2024-10-02 20:26:38
723
原创 【Linux】进程地址空间
运行结果:根据之前的学习我们已经知道,所以在我们可以理解父子进程中val的值可以不一样,但是我们发现的,这是为什么?从上面的运行结果来看,我们得到的val的地址,因为同一时间内一个物理地址中只能存储一个进程的数据,不同进程的不同数据不可能同时存在于同一个物理内存中;实际上OS会给每个进程创建一个独立的虚拟地址空间,通过页表将虚拟地址空间与物理地址一一对应;用户只能得到虚拟地址空间中的,当我们修改虚拟地址中的数据时,操作系统会先通过页表找到对应的物理内存,然后修改物理内存中的数据。所以。
2024-09-30 15:48:44
620
原创 【Linux】进程的标识符、状态、优先级(超详解)
但是在等待期间,OS内存严重不足(OS是由权限来杀掉进程来释放空间的),这时如果OS看到这个等待的进程,把他杀掉,那么就会造成一个严重的问题:磁盘在读取数据时出来问题,这时它回去找调度它的进程,但是这时候发现进程没有了?已经运行完毕,但是需要维持自己的退出信息,在自己进程的task_struct中会记录自己的退出信息,让父进程来读取,如果父进程没有读取,则该进程会一直存在。fork()---->多个进程----->父子关系------>一般代码会共享,但是数据是各自私有一份的。返回值大于0,则为父进程;
2024-09-26 15:01:57
883
原创 【Linux】Linux项目自动化构建工具--make和makefile
简单解释一下:make:一条命令;makefile/Makefile:一个文件;.PHONY:让目标文件对应的方法,总是被执行! 所以.PHONY可以让依赖方法忽略时间对比;一个简单的Makefile文件就编写完成了;解释一下Makefile文件中的代码:我们要做成一件事情,都必须要有依赖关系+依赖方法;Makefile本质是依赖关系和依赖方法的集合;
2024-09-23 15:39:31
527
原创 【Linux】yum、vim、gcc使用(超详细)
Linux中常见的软件安装方式 --------- 下载&&安装a、yum/aptb、rpm安装包安装c、源码安装。因为我们的vim操作界面过于简单,编写程序时没有基本的首行缩进,自动补齐等Windows编译器都有的功能,使用起来及其不方便;可以在家目录下面的.vimrc文件中配置
2024-09-19 23:19:13
1346
原创 【Linux】权限理解(超详细)
Linux下有两种用户:超级用户(root) 和普通用户;对于root拥有者的文件,在我们当前用户下可以查看,不能修改,但是可以删除,为什么?因为这个文件所处的文件夹的权限本身就属于我们,有w权限,即可以删除这里就要引出一个概念:粘滞位 (chmod o+t file)当一个目录被设置为粘滞位,则该目录只能由:1、超级管理员删除2、该目录的所有者删除3、该文件夹的所有者删除;
2024-09-18 22:10:29
1065
1
原创 【c++进阶】多态
含有纯虚函数的类为抽象类(也叫接口类),抽象类不能实例化出对象;派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。什么是纯虚函数?在虚函数的后面=0,这个函数就是纯虚函数。public:public:public:cout
2024-09-09 10:55:59
730
原创 【c++进阶】继承
继承方式有三种:公有继承,私有继承,保护继承;public:// 姓名// 年龄protected:int _stuid;// 学号如果在主函数中:Person p;Student s;可以观察到:在s对象中既有_stuid成员变量,也有成员变量_name,_age;由此可知:继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。
2024-09-05 16:05:44
838
原创 [STL --stack_queue详解]stack、queue,deque,priority_queue,容器适配器
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
2024-09-02 17:45:38
1036
原创 【STL】string的常用函数用法总结
resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字。符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的。reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,注:在string类中size和length是等效的;以上就是string类的内容!
2024-08-18 12:44:46
1055
原创 【类和对象】成员函数【超详细】
什么是构造函数??以日期类为例: 建立一个对象时,通常最需要立即做的工作是初始化对象,如对数据成员赋初值,如 d1.init(2024, 5, 30);。因为每次创建一个对象都要调用init,比较麻烦,所有构造函数的出现就是简化它;以Date类为例:注意:编译器生成的默认构造函数有什么用??析构函数什么是析构函数??如:运行结果:在代码中我们并没有调用析构函数,但是在显示结果中析构函数被调用了,由此可知析构函数的调用是系统自动执行的。什么是拷贝构造??拷贝构造写法:调
2024-07-21 21:06:20
1013
原创 【小米商城】页面编写笔记(自用)
body标签,默认会有一个边距,造成页面的四边都有白色的间隙,如何去除?不加之前:内容居中文本居中【文本在这个区域居中】.c2{区域居中【自己要有宽度+margin-left:auto;父亲没有高度或者没有宽度,被孩子支撑起来如果存在float,一定要加:a标签是行内标签,行内标签的高度、内外边距,默认无效。
2024-06-10 20:53:50
499
1
原创 【c++入门】this指针
我们知道一个类可以有多个实例化对象,但是这多个实例化对象所调用的成员函数是在公共代码区;Date类中有init()和print()两个函数,但是这两个函数的函数体中并没有关于不同对象的区分,所以d1调用print()时,函数在怎么区分d1对象还是d2对象?------------->隐含的this指针C++编译器给每个““增加了一个,让该指针指向当前对象(),在函数体中所有“”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
2024-05-31 20:01:40
470
原创 【c++入门】函数重载,引用,内联函数,auto
在C++11中,auto是用来自动推导表达式或变量的实际类型的。auto e;无法通过编译,使用auto定义变量时必须对其进行初始化比如:根据上面的例子,我们可知:auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。当然,随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:1. 类型难于拼写2. 含义不明确导致容易出错这里的是一个类型,但是该类型太长了,特别容。
2024-05-30 13:25:20
870
原创 【算法模块】二分查找----图文详解(含代码)
为例:我们要想找到左端点的8的下标,我们就要以划分成两个部分:【5,7,7】和【8,8,10】,第一部分都是小于目标值8的,第二部分都是大于等于目标值的;为例:我们要想找到右端点的8的下标,我们就要以划分成两个部分:【5,7,7,8,8】和【10】,第一部分都是小于等于目标值8的,第二部分都是大于目标值的;按照上面的查找方法,我们不一定非要取中间值,我们可以取1/3区间处的点,也可以取1/4,1/5,1/6......等任意区间,只不过在取中间位置的时候,效率会更快。两种表示方法都可以;
2024-05-21 23:33:24
1211
原创 【动态规划】子序列问题
最长上升子序列,最长公共子序列,不相等:f[i][j]=max(f[i-1][j],f[i][j-1]);如果a[i]和b[j]相等:f[i][j]=f[i-1][j-1]+1;的后面,形成一个更长的上升子序列。因此,我们可以通过遍历。只需要找到比第i个小的最大子序列再加上1 即可;个元素结尾的最长上升子序列的长度,尝试从数组。的第一个元素开始,依次计算。,直到最后一个元素。结尾的最长上升子序列的长度。
2024-05-10 20:05:20
319
原创 【算法刨析】完全背包
01背包对于一个物品只能选择一次,但是完全背包可以选择任意次;01背包中,f[i][j]= max( f[i - 1][j],f[i - 1][j - v[i]] + w[i] );对于f[j]就相当于f[i-1][j]的大小,如果从小到大遍历,那么f[i-1][j]的大小就会发现变化,那么优化后的代码就不满足我们所推导的公式,所以我们要从大到小;
2024-05-09 23:44:47
995
原创 【命名空间详解】c++入门
怎么解决?namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。除此之外,命名空间里面还可以定义函数,结构体;
2024-04-20 20:22:03
382
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人