- 博客(31)
- 收藏
- 关注
原创 Linux网络基础(协议 TCP/IP 网络传输基本流程 IP VS Mac Socket编程UDP)
一开始时,计算机都相互独立,只能通过软盘,才能把数据交给另一台计算机后面因为效率原因,就有了服务器,都从服务区上拿数据美国一开始有贝尔实验室、麻省理工实验室…一开始实验室各搞各的,所以局域网有很多种类的以太网、令牌网…新技术的产生,一定产生了新设备(芯片技术应用到笔记本,就叫做计算机;用到汽车上,就叫做智能汽车),所以计算机的发展,肯定伴随着新的设备(比如网络通信,得有网线)1994年中国进入互联网,不仅让腾讯阿里发展很好,华为和其它通信的公司也发展起来。
2025-02-26 19:37:14
993
原创 多线程(线程控制 封装线程 线程互斥 线程同步 生产消费模型 信号量)
文章目录一.背景知识再谈地址空间二.线程pthread_create为什么线程的调度成本更低?线程的优点线程的缺点线程与进程的区别共享每个线程独一份三.线程控制线程的创建与等待等待线程pthread_join线程创建的传参arg线程创建的返回值与等待线程的参数retval创建多个线程新线程如何终止线程的分离四.浅谈C++11下的线程五.再谈tid线程的局部存储六.封装线程七.线程互斥认识锁与接口RAII风格锁原理角度理解锁锁是如何实现上锁解锁八.线程同步条件变量&&接口认识条件变量使用接口生
2024-12-16 11:03:50
660
原创 进程信号(信号产生 信号保存 信号捕捉 可重入函数 volatile SIGCHLD信号)
如果不想执行上述的默认动作,让进程执行我们自己设计的信号处理方式,就是自定义处理。用到函数调用:signal对信号的自定义捕捉,我们只要捕捉一次,后续一直有效先看现象:对2号信号进行捕捉int main()//对信号的自定义捕捉,我们只要捕捉一次,后续一直有效sleep(1);return 0;发现发送二号信号,会被捕捉。发送三号信号,会终止进程。如果一直不产生2号信号,handler方法一直不会被调用。return 0。
2024-11-04 19:52:38
826
原创 进程间通信(命名管道 共享内存)
假设A进程在物理内存中创建一段内存空间,然后在A进程的地址空间中的共享区申请一片空间,再把虚拟地址与共享内存的映射关系填入页表。所以磁盘中有个特殊文件,在内存中写入不会刷新到磁盘,让两个进程在内存中通信,该文件叫做命名管道。说明对于读端而言,如果我们打开文件,但还没有写端,就会阻塞在open调用中,直到对方打开。2.AB进程通信,CD进程也要通信,所以共享进程在系统中可以存在很多份,且功能也不一样。写入的时候,管道的大小依旧为0。perms是共享内存的权限:如果创建的时候,加上权限,perms的值会更改。
2024-11-03 20:33:06
608
原创 进程间通信(匿名管道 pipe 创建管道及分配任务代码)
管道的4种状态:1.如果管道内部是空的 && write的wfd(写端)没有关闭,读取条件不具备,读进程会被阻塞,等待读取的条件具备。2.如果管道被写满 && read的rfd(读端)不读且没有关闭,写进程会被阻塞(管道被写满–>写条件不具备),等待写条件具备。3.管道一直在读 && write的wfd(写端)关闭了,读端read返回值==0,表示读到了文件结尾。4.read的rfd(读端)直接关闭 && write的wfd(写端)一直在进行写入。
2024-10-07 15:59:01
724
原创 文件系统(软硬链接 动静态库 动态库加载的过程)
故事:你在学校的宿舍比如是513的2号床(物理地址),学号是111(虚拟地址),线下找你肯定是拿着宿舍的地址找你,校方线上查看档案肯定是拿着学号找。总结动态库加载的过程:可执行程序先加载内存中,运行到需要调用库的地方,如果库不在,就缺页中断,根据路径找到库加载进来,通过映射得到我的库的起始地址,库的地址+偏移量找到方法(函数)。只有物理地址是无法使用的,需要mm_struct中的栈和堆之间开辟一段空间(因为物理内存中已经有库了,所以开辟多少空间的大小也是确定的)填入库的虚拟地址,然后与页表建立映射关系。
2024-09-23 16:13:51
959
原创 文件系统(磁盘 磁盘文件 inode)
然后在inode Bitmap找位图,从低向高找,看哪个为0,给我们分配的新的偏移量+新分配的inode编号就是新的inode,根据新的inode号在inode Table里把属性一写。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。inode编号是以分区为单位分配的,一个分区的inode号是不能重复的。我们平时访问时都用的文件名。
2024-09-10 16:37:45
1057
原创 文件系统(文件描述符fd 重定向原理 缓冲区 stderr)
这三个常量,必须指定一个且只能指定一个O_RDONLY只读O_WRONLY只写O_RDWR读写O_CREAT若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_TRUNC清空后写入O_APPEND追加写。
2024-09-07 20:01:42
701
原创 进程终止(exit && _exit) 进程等待(wait && waitpid) 进程替换(execv)
return -1;运行之后,输出是-1。不知道是因为除0的原因导致结果为-1还是相除本身结果是-1说明光靠打印结果(数字),是看不清涵义。//自定义枚举常量enumDiv_Zero,Mod_Zero,return -1;elseint main()这样就知道是因为什么退出了,退出码为1,说明除零了我们不适合面对数字,更适合直观的语言,所以再写一个接口//自定义枚举常量enumDiv_Zero,
2024-08-28 21:48:48
699
原创 命令行参数和环境变量
export [环境变量名]=[环境变量的内容]当然,这个环境变量也是内存级的,写在bash中的,真想让其生效应该在配置文件改取消环境变量unset [环境变量名]
2024-08-11 18:01:15
722
原创 Linux进程 (冯诺依曼体结构 管理 PCB 进程状态 僵尸进程 孤儿进程 运行阻塞挂起状态 进程优先级)
冯诺依曼体系结构,PCB,僵尸进程,孤儿进程,运行阻塞挂起状态
2024-08-01 15:51:03
754
原创 Linux编译器-gcc/g++使用 make/makefile最基础的功能 Linux调试器-gdb的使用
引例:从零开始写代码,假设设计一个printf函数,设计好了大半个月过去了,效率比较低,所以语言设计者把一些公共的方法抽取出来,放进自己的标准库。提高可移植性,比如直接把二进制代码从这个A机器到B机器,跨平台性提高,不依赖动态库,不用做过多的环境监测。查看静态库的指令(mytest-static是形成test.c静态库的名称,名字随便取)查看画横线的文件,没形成C语言库之前就是C语言的源代码,被顶级程序员打包成库。引例:同样一种软件,有社区版,专业版,免费版。gcc默认形成的可执行程序,默认采用动态链接。
2024-06-21 14:32:40
2078
原创 Linux编辑器 vim使用 (解决普通用户无法进行sudo提权问题)
但是再次进入的时候会发现还是这个界面:是因为这个文件里面可能有别的用户保存的数据,所以vim在自己被删掉或者异常崩溃的时候,他就会默认在当前目录下形成一份临时文件,这个临时文件就是为了方便我们恢复。然后按住j可以批量化选中,也可以按住shift + g = G全部选中,也可以n + j(n为行数)用过VS的都知道,拥有着编辑器编译器调试.编写C+++,C,python等的功能。先ctrl + v ,用hjkl进行选择,然后包含//,按d删了即可。E一下就可以,但是每次进来就会着这种提示,很烦,怎么办?
2024-06-13 12:14:49
960
原创 Linux 软件包管理器 yum
yum会根据/etc/yum.repos.d/该路径下面的配置文件,来构建自己的下载链接,(根据OS版本,根据你要下载的软件),yum帮助我们下载,安装。Linux中的安装包是有依赖关系的(比如下载游戏的时候有各种文件,文件之间的关系)–yum就是解决安装包之间的关系。所以,重点来了:一个系统的开发者,肯定知道为什么大家都选择这个系统,所以才努力维护更好,让大家都选择我。假设一个系统的出现,就只有一个系统,没个讨论,没个官网,有个bug,找谁去?ubuntu,centos等底层用的都是一样的源代码。
2024-06-11 21:20:15
701
原创 多态(C++)
引例:下面代码会输出多少,在x86的环境下class Basepublic:private:int _b = 1;是12实例化一个对象,通过调试看以下有个指针,叫做虚函数表指针,简称虚表指针(只要有虚函数就有这个)以下面这串代码为例class Basepublic:private:int _b = 1;return 0;通过调试我们可以看出这个东西是用来实现多态的。
2024-05-16 17:06:44
548
原创 继承(C++)
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用引例:学生老师都有名字年龄,如果分别分装到别的类就显得冗余,就有了继承例子代码:父类成员,继承到派生类以后,访问权限是什么呢?
2024-05-09 21:56:41
842
原创 模板(C++)
这里类模板不能推演实例化了,只能显示实例化,因为没有传参的问题,所以无法推演类型,只能自己指定,并且str1与str2两个类不是同一个类。答案是完全不一样的,因为浮点型和整型的存储方式都不一样,交换方式肯定不一样。其中typename是关键字,也可以拿class代替,T是名字,取啥都行。下面调用模板的方式不可取:两个类型不同,却用的同一个T类型,有歧义。根据每次交换类型的不同,函数就不同很麻烦,所以祖师爷发明了模板。2.有现成的,但是不够匹配的,有模板,就会选择自己实例化模板。1.有现成,吃现成的(匹配)
2024-03-30 16:59:28
433
原创 new/delete(C++)
new在创建自定义类型时,开空间+构造函数public:,_val(val){}//创建不带哨兵位的//哨兵位,但是是局部变量,出了域会自动销毁printf("一次输入%d个节点的值:", n);i < n;相比较C语言简洁很多,而且不用手动检查,new失败了以后会抛异常int n = 0;while (1)//这里是1024字节 = 1KBn++;
2024-03-28 12:22:00
634
原创 类与对象(C++)
/类体:由成员函数和成员变量组成//这里分号要注意class为类定义的关键字,ClassName为类的名字,{}中为类的主体这里说以下类体的命名习惯:引例:这里初始化赋值的时候year=year不知道哪个是哪个class Dateint year;所以在成员变量前面加个_就更好区分(C++语法里面没有规定,只是个人习惯)class Dateint _year;然后运行的时候你就会发现调用不动函数。
2024-03-16 20:23:07
1647
1
原创 C++入门
命名空间的使用方法有三种:int main()return 0;2.使用using将命名空间中某个成员引入using N::b;3.使用using namespace 命名空间名称 引入int main()return 0;
2024-02-18 17:16:42
1800
1
原创 快速排序三种常见的方法与非递归的形式
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法其基本思想为:任取待排序元素序列中的某元素作为基准值(key),按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值(key),右子序列中所有元素均大于基准值(key),然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。快排时间不够,所以会超出时间限制,知道写没写对即可。
2024-01-18 20:10:58
387
1
原创 直接插入排序和希尔排序
基本思想是:先选定一个整数(设为grap),把待排序文件中所有元素分成grap个组,所有距离为grap的元素分在同一组内,并对每一组内的元素进行排序。然后,再取一个比grap小的整数,重复上述分组和排序的工作。步骤:插入第i个元素的时候,从i-1开始依次向左边比较,直到出现比第i个元素小的停止,假设该元素是第j个,那么第i个元素进行。当grap==1的时候很接近有序,所以直接插入就很快,在下面做了速度对比。代码如下:(技巧:先写一次排序的,然后再写多次排序)画个图:(用相同颜色链接的线就为同一组)
2023-12-24 21:09:36
384
1
原创 C语言中多个三目操作符如何运算
我是在这一道题上看到一个解的方案感觉挺有趣:给的解是:运用了三个三目操作符。来让我们回想一下三目操作符:先说结论:?: 从左往右运算?:跟相近的相关。
2023-10-25 20:37:00
878
1
原创 分支if和switch的应用
如果出现了switch后面的表达值与case都不匹配时,程序不会报错,C语言程序会认为这个不是错误,程序会往下走。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。每个if()后面的语句都加上了{},这样就会执行{}里面的语句,如果不加上就只能执行一条语句,并且不好辨识。以上都是个人的认知分支的所有思路,后期如果有其它知识点会添加。如果if中的表达式不成立时,会返回0让分支不再执行。可见直接跳出了swith的语句,实现了分支功能。
2023-07-22 11:42:19
78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人