- 博客(45)
- 收藏
- 关注
原创 《人月神话》浅读一下吧(上)
焦油坑是作者用来形容大型系统开发的一个概念。史前时代,恐龙、猛犸象、剑齿虎这些大型食肉动物碰到焦油坑也是没有办法挣脱的,而且越用力就越容易被沉入坑底。而在项目中好像没有任何一个单独的问题会导致困难,每个问题都能获得解决,但是当他们相互纠缠和累计在一起的时候,团队的行动就会变得越来越慢。
2023-01-13 19:03:03
1542
5
原创 I/0多路转接之select
I/0多路转接之select系统提供select函数来实现多路复用输入/输出模型:是一个整数数组,更严格的来说是一个“位图”,使用位图中对应的位来表示要监视的文件描述符:8.select_tcp头文件my_select.hpp:main.cpp:...
2022-06-20 09:50:53
318
1
原创 计算机网络基础(下)
计算机网络基础(下)什么是ip地址?每个网段中都有一个网络号和一个主机号CIDR方式精确化划分子网:什么是路由查找?什么是路由表?数据链路层:以太网:以太网帧格式:ARP协议:ARP数据报格式:DNS协议:TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系.NAT协议:地址转换协议NAPT:动态NAT重载总结:IO的过程是在内核当中的过程,input&out
2022-06-16 17:21:32
529
原创 网络基础(中)
网络基础(中)请求:响应:http协议目前有4个版本,其中1.0和1.1版本在互联网上被广泛使用,2.0版本目前应用很少,是下一代的http协议:http1.X 存在的问题问题:三次握手:四次挥手(双方都有可能作为主动断开方):为什么不是两次和四次握手?为什么需要四次挥手?为什么最后一次ACK要等待2MSL?确认应答机制:超时重传机制:滑动窗口机制:如何动态维护拥塞窗口大小呢?TCP当中的计时器:创建一个TCP的socket, 同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区;...
2022-06-15 17:23:46
418
原创 socket编程(上)
socket编程(上)我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?主机字节序和网络字节序的互相转换UDP:TCP:流程:为什么要创建套接字?为什么要绑定地址信息?创建套接字:绑定接口:发送接口:接收接口:通用数据结构:代码:...
2022-06-12 10:50:20
159
原创 计算机网络基础(上)
计算机网络基础(上)OSI七层模型:TCP/IP五层模型:一般而言:为什么需要网络协议分层?同一个网段内的两台主机进行文件传输.跨网段的主机的文件传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器数据封装过程:数据分用过程:先来看看什么是端口?五元组信息:...
2022-06-11 16:10:23
456
原创 C++之多态
C++之多态文章目录1.多态概念2.分类3.动态多态实现条件4.虚函数1.虚函数的重写2.虚函数重写的两个例外3.C++11 override 和 final4.重载、重写、重定义的对比5.抽象类6.多态原理7.虚函数表1.多态概念通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。例如:买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。2.分类静态多态:程序在编译期间已经确定了函数的行为(静态绑定||早绑定)
2022-05-31 16:36:50
254
2
原创 C++之继承
C++之继承文章目录1.继承概念2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元与静态成员6.总结1.继承概念概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。定义格式:继承关系和访问限定符;继承基类成员
2022-05-30 20:43:38
342
原创 Linux多线程(下)
Linux多线程(下)文章目录1.线程池1.应用场景2.原理3.代码实现2.单例模式1.设计模式及分类2.单例模式3.单例模式的两种形式(懒汉/饿汉)3.乐观锁与悲观锁1.概念2.自旋锁与互斥锁的区别3.无锁编程1.线程池什么是线程池?一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的
2022-05-17 09:43:21
337
2
原创 Linux多线程(中)
Linux多线程(中)文章目录1.线程安全2.同步与互斥1.互斥锁2.同步4.死锁1.线程安全什么是线程不安全?多个线程并发执行一段代码时,会导致程序结果的二义性假设有两个线程A,B,有一个CPU,两个线程想同时对全局变量i=10进行加加,如果A从内存中读到i的值后还没有加加,线程就切换了,此时切换成线程B从内存中读到了i并加加为11,B加完后轮到线程A,线程A之前读到的值为10加完后i的值仍然是11;另一种情况则是A加完后B再加,此时的到值就是12。因此产生了结果二义性的问题。下面是一个不
2022-05-10 23:31:03
336
4
原创 Linux多线程(上)
Linux多线程(上)文章目录1.线程概念及优缺点2.线程创建3.线程终止4.线程等待5.线程分离1.线程概念及优缺点线程是一个轻量级进程,准确的定义是:一个进程内部的控制序列一切进程至少都有一个执行进程线程在进程内部运行,本质是在进程的地址空间内运行通过进程地址空间,将进程资源合理分配给每个执行流,就形成了线程执行流共享与独有:独有:在进程虚拟地址空间的共享区当中,调用栈,寄存器,线程ID,errno,信号屏蔽字,调度优先级共享:文件描述符表,用户id,用户组id, 信号处
2022-05-08 09:08:24
278
2
原创 C++之stack和queue
C++之stack和queue文章目录1.stack的介绍和使用2.queue的介绍和使用3.priority_queue的介绍和使用4.容器适配器1.stack的介绍和使用介绍:stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容
2022-04-27 23:18:20
352
11
原创 C++之vector
C++之vector文章目录1.vector介绍2.vector使用及vector模拟实现1.vector的定义:2.vector iterator 的使用3.vector 空间增长问题4.vector增删查改5.vector的扩容机制3.迭代器失效1.什么是迭代器2.为什么迭代器会失效3.哪些操作会导致迭代器失效1.vector介绍vector表示可变大小数组的序列容器采用连续的空间存储元素,并且大小是动态可以改变的。vector使用动态分配数组来存储元素,当插入新元素时,这个数组要分配一
2022-04-15 16:58:23
2492
12
原创 C++string类
C++string类文章目录1.为什么要学习string类?2.标准库中的string类1.string类对象的常见构造2.string类对象的容量操作3. string类对象的访问及遍历操作4.string对象的修改操作5.string类成员函数3.string类的模拟实现(常用)1.实现string类的构造、拷贝构造、赋值运算符重载以及析构函数2.深拷贝1.为什么要学习string类?C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是
2022-04-05 09:25:34
343
11
原创 Linux进程信号
Linux进程信号文章目录1.信号的概念2.信号的产生3.信号的种类4.信号的处理方式5.信号的注册6.信号的注销7.信号的自定义处理方式8.信号的捕捉流程9.信号的阻塞10.扩展1.信号的概念信号是进程之间事件异步通知的一种方式,属于软中断。只是告诉有这样一个信号,但是具体这个信号怎么处理,什么时候处理由进程决定的。所以是软中断2.信号的产生硬件产生:1.ctrl+c:2号信号 SIGINT(键盘当中按下ctrl+c结束一个进程的时候,其实是进程收到了2号信号。2号信号导致了进程的退出
2022-03-31 18:31:11
3132
4
原创 C/C++内存管理与函数模板
C/C++内存管理与函数模板文章目录1.C/C++内存分布2.C语言中动态内存管理方式3.C++内存管理方式4.operator new和operator delete函数5.内存泄漏6.泛型编程7.函数模板1.概念与格式2.函数模板原理:3.函数模板的实例化4.模板参数的匹配规则8.类模板1.类模板的定义格式2.类模板的实例化1.C/C++内存分布由下图来说明栈又叫堆栈,非静态局部变量、函数参数、返回值等,向下增长内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可以用系
2022-03-30 16:37:27
1597
15
原创 Linux进程通信之共享内存与消息队列
Linux进程通信之共享内存与消息队列文章目录1.共享内存的原理2.共享内存的接口3.共享内存代码4.共享内存特性5.消息队列原理6.消息队列接口7.消息队列代码1.共享内存的原理2.共享内存的接口3.共享内存代码4.共享内存特性5.消息队列原理6.消息队列接口7.消息队列代码...
2022-03-29 00:10:05
2260
8
原创 类和对象(下)
类和对象(下)文章目录1.再谈构造函数2.static成员3.友元4.内部类5.再次理解封装1.再谈构造函数构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。真正的初始化,初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。代码:class Date{public: Date(int year, int month, int day) : _year
2022-03-25 17:48:28
401
9
原创 类和对象(中)
类和对象(中)文章目录1.类的6个默认成员函数2.构造函数3.析构函数4.拷贝构造函数5.赋值操作符重载6.实现一个日期类7.const成员1.类的6个默认成员函数任何一个类在我们不写的情况下,都会自动生成下面六个默认成员函数2.构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任
2022-03-24 23:09:10
127
19
原创 C++类和对象(上)
C++类和对象(上)文章目录1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的作用域5.类的实例化6.类的访问限定符及封装7.类的对象大小的计算8.类成员函数的this指针1.面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。类:用来对
2022-03-24 09:01:41
1433
10
原创 进程替换与基础IO
进程替换与基础IO文章目录1.进程程序替换原理2.exec函数簇1.替换函数:2.函数解释3.命名理解4.总结:3.函数之间的区别4.C语言下的文件接口1.fopen2.fwrite3.fread4.fseek5.系统调用的文件接口1.open2.write3.read4.lseek6.文件描述符7.重定向8.静态库与动态库1.动态库2.静态库9.软硬连接的理解1.进程程序替换原理因为父进程创建出来的子进程和父进程拥有相同的代码段,所以,子进程看到的代码和父进程是一样的。当我们想要让子进程执行不同的
2022-03-23 22:20:08
870
11
原创 Linux环境变量与进程虚拟地址空间
环境变量与地址虚拟空间文章目录1.概念2.常见的环境变量与查看当前环境变量方法3.环境变量对应的文件4.修改环境变量5.环境变量的组织方式6.代码获取环境变量1.main函数的参数:2.通过第三方变量environ获取3.通过getenv7.C语言中的程序地址空间图8.虚拟地址9虚拟地址空间1.概念环境变量是指操作系统中用来指定操作系统运行的一些参数,换句话说,操作系统通过环境变量来找到运行时的一些资源例如:链接时帮助连接器找到动态库,执行ls命令时帮助用户找到位置。2.常见的环境变量与查看当
2022-03-23 16:09:03
1904
6
原创 C++入门
C++入门文章目录1.C++关键字2.命名空间3.C++输入输出4.缺省函数5.函数重载6.引用7.内联函数8.auto关键字for循环与指针空值1.C++关键字C++总计63个关键字,C语言32个关键字2.命名空间定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接{},{}里为命名空间的成员//1. 普通的命名空间namespace N1 // N1为命名空间的名称{// 命名空间中的内容,既可以定义变量,也可以定义函数 int a; int Ad
2022-03-22 17:14:49
226
11
原创 Linux僵尸进程与孤儿进程
Linux僵尸进程与孤儿进程文章目录僵尸进程1.概念2.模拟代码3.原因4.危害5.解决方案孤儿进程1.概念2.模拟代码3.原因4.孤儿进程有危害吗僵尸进程1.概念简单来说:子进程先于父进程退出,子进程会变成僵尸进程,进入到Z状态。2.模拟代码创建一个僵尸进程例子 #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { int
2022-03-16 09:26:06
367
10
原创 Linux进程
Linux进程(上)文章目录Linux进程(上)一、概述二、进程的描述三、进程操作四、创建子进程一、概述1.为什么引入进程?由于程序在并发执行(间断性、失去封闭性、不可再现行)时,可能会造成执行结果的不可再现,所以 用“程序”这个概念已无法描述程序的并发执行,所以必须引入新的概念—进程来描述程序的并发执行,并要对进程进行必要的管理,以保证进程在并发执行时结果可再现。**2.概念:**担当分配系统资源(CPU时间,内存)的实体。二、进程的描述1.Linux操作系统下的PCB是: ta
2022-03-13 09:21:32
1380
10
原创 经典八大排序
经典九大排序文章目录经典九大排序排序的种类:直接插入排序希尔排序简单选择排序堆排序冒泡排序快速排序归并排序计数排序基数排序排序的种类:直接插入排序1.该序列第一个元素不用考虑(a1之前不存在子序列),则从第二个元素开始,先把a2的值存在key中,a2>a1则有序不动,a2<a1就把a1往后挪一个,a2放到a1的位置2.key=a3,a1>a3,a1往后挪,a3挪到a2的位置,a2<a3,位置不变3.key=a4,a4依次和a1,a3,a2比较,a2,a3,a1依
2022-02-27 21:34:32
658
12
原创 Linux开发工具实现C/C++编程
Linux开发工具实现C/C++编程文章目录Linux开发工具实现C/C++编程1.软件包管理器:yum如何安装软件如何卸载软件2.编辑器:vim1.常见的三种模式:2.正常模式下的快捷操作3.简单vim配置4.其他3.编译器:gcc/g++4.调试器:gdb1.两种模式:2.进入gdb调试的基础方法5.自动化构建项目:make/Makefile1.介绍:2.makefile的文件格式3.makefile的工作原理4.makefile文件当中的自定义变量和内置变量1.软件包管理器:yum如何安装软件
2022-02-10 22:07:13
8375
25
原创 Linux权限
Linux权限文章目录Linux权限1.Linux下用户分类2.文件访问者的分类1.Linux下用户分类超级用户:可以在linux系统下做任何事情,不受限制,命令提示符为“#”普通用户:在linux下做有限制的事情,命令提示符为“$“命令:su [用户名]例如:要从root用户切换到普通用户user,则使用su user。要从普通用户user切换到root用户则使用suroot (root可以省略),此时系统会提示输入root用户的口令。2.文件访问者的分类...
2022-02-07 23:55:00
212
3
原创 Linux常见基础指令
1.ls指令:语法:ls [选项][指令]功能: 针对目录列出目录下的所有子目录与文件,针对文件列出文件名及其他信息常用选项:
2022-01-28 23:48:12
1266
4
原创 (数据结构)顺序表链表及相关OJ题(C语言实现)
(数据结构)顺序表链表及相关OJ题(C语言实现)1.顺序表的增删查改顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。静态顺序表#define N 8typedef int SLDataType;typedef struct SeqList{ SLDataType array[N]; size_t size;}SeqList;静态顺序表的缺点为长度固定,不灵活。动态顺序表可以动态的分配空间大小,合理使用空间
2022-01-20 11:12:36
684
3
原创 猜大小,关机小程序C语言简单代码练习
猜大小,关机小程序C语言简单代码练习猜大小#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>void Guess(){ //1. 随机数 srand((unsigned long)time(NULL)); //种随机数种子! int x = rand() % 100 + 1;//[1, 100] int g = 0; //死循环直到猜对为止
2021-05-19 19:47:29
256
原创 优先级队列(堆)
优先级队列1、二叉树的顺序存储(数组保存二叉树结构,层序遍历放入数组);已知双亲(parent)下标,左孩子下标(left)=2parent+1,右孩子(right)下标=2parent+2;已知孩子(child)下标,则双亲(parent)下标=(child-1)/2;2、堆(heap)逻辑上是一颗完全二叉树物理上存放在数组中满足任意结点的值都大于其子树中结点的值,叫做大根堆;反之则是小根堆。作用:快速找集合中的最值操作-向下调整前提:左右子树必须是一个堆说明:1、array代
2021-01-31 12:20:45
146
原创 栈和队列
栈和队列栈(先进后出)的实现:1、利用顺序表实现,即使用尾插加尾删的方式实现2、利用链表实现,则头尾皆可顺序表实现栈如下:public class MyStack{ private int[] array=new int[100]; private int size=0; public void push(int v){ array[size++]=v; } public int pop(){ return arr
2021-01-31 00:14:22
76
1
原创 JAVA集合框架
Java集合框架概念:Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理manipulate ,即平时我们俗称的增删查改 CRUD 。1、接口关系说明collection:用来存储管理一组对象objects,这些对
2021-01-25 19:37:22
82
原创 认识Java中的异常与错误
认识Java中的异常与错误常见的有:除以0、数组下标越界、访问null对象1、异常的基本用法try{ 有可能出现异常的语句 ; }[catch (异常类型 异常对象) {} ... ][finally { 异常的出口}]try 代码块中放的是可能出现异常的代码.catch 代码块中放的是出现异常后的处理行为.finally 代码块中的代码用于处理善后工作, 会在最后执行.其中 catch 和 finally 都可以根据情况选择加或者不加一旦 try 中出现异常, 那么 try
2021-01-24 21:59:27
86
原创 JAVA中的String类
JAVA中的String类1、创建字符串方式一:String str=“Hello”;方式二:String str2=new String(“Hello”);方式三:char[] array={‘a’};String str3=new String(array);注意:String为引用类型引用类似于C语言中的指针,只是在栈上开辟了一小块内存空间保存一个地址,但其不能进行各种数字运算,可以将其看作一个标签,一个对象上可以贴一个,若没有,则该对象会被JVM当作垃圾对象回收掉Java数组中
2021-01-24 20:14:16
185
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人