
Linux 系统部分
文章平均质量分 95
学习Linux的记录
我太想进步了!!
所有默默扎根的日子,都是厚积薄发的过程
展开
-
STL,智能指针和线程安全&&自选锁&&读者写者问题
不是.原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶). 因此 STL 默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全.原创 2025-05-14 14:25:40 · 577 阅读 · 0 评论 -
线程池&&单例模式
单例模式是一种 "经典的, 常用的, 常考的" 设计模式.IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。原创 2025-04-26 22:24:05 · 1229 阅读 · 0 评论 -
Linux 生产者消费者模型
生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以,这个容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个容器实际上就是用来给生产者和消费者解耦的。原创 2025-04-20 14:57:56 · 1022 阅读 · 0 评论 -
Linux 线程互斥
对一个全局变量进行多线程并发 -- / ++ 操作是否是安全的?运行结果显然不符合我们的预期,因为其中出现了剩余票数为负数的情况。为什么无法获得预期结果?--ticket为什么--ticket操作不是一个原子操作?-- 操作并不是原子操作,而是对应三条汇编指令:loadupdatestore我们取出--tickets的汇编代码既然--原创 2025-04-18 23:52:17 · 1057 阅读 · 0 评论 -
Linux 多线程
1. 如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值。2. 如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED。3. 如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数。4. 如果对thread线程的终止状态不感兴趣,可以传NULL给retval参数。用grep。原创 2025-04-10 21:52:51 · 1089 阅读 · 0 评论 -
Linux 下 日志系统搭建全攻略
DEBUG调试级别INFO信息级别WARN警告级别ERROR错误级别FATAL严重错误级别。原创 2025-04-05 19:01:06 · 705 阅读 · 0 评论 -
Linux 进程信号
其中1~31号信号是普通信号,34~64号信号是实时信号,普通信号和实时信号各自都有31个,每个信号都有一个编号和一个宏定义名称,这些宏定义可以在/usr/include/x86_64-linux-gnu/bits/signum-generic.h 中找到,例如其中有定义: #define SIGINT 2信号是如何记录的?实际上,当一个进程接收到某种信号后,该信号是被记录在该进程的进程控制块当中的。原创 2025-04-04 17:06:28 · 1378 阅读 · 9 评论 -
system V 消息队列&&信息量(了解)
msgget函数创建消息队列创建消息队列也需要使用ftok函数生成一个key值,这个key值作为msgget函数的第一个参数。msgget函数的第二个参数,与创建共享内存时使用的shmget函数的第三个参数相同。消息队列创建成功时,msgget函数返回的一个有效的消息队列标识符(用户层标识符),否则,返回-1,错误原因存于error中。shmget有设置大小的参数,而msgget没有消息队列的释放msgctl函数释放消息队列。原创 2025-03-26 16:50:42 · 987 阅读 · 0 评论 -
system V 共享内存
称为IPC键值,并返回这个key。在使用shmget函数获取共享内存时,原创 2025-03-26 08:28:48 · 812 阅读 · 0 评论 -
Linux 进程间通信
进程间通信简称IPC(Interprocess communication),进程间通信就是在不同的进程之间的传播或交换信息管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”例如:统计我们当前使用云服务器上的登录用户个数其中who命令和wc命令都是两个程序,当它们运行起来后就变成了两个进程,who进程通过标准输出将数据打到 “管道” 当中,wc进程再通过标准输入从 ”管道“ 当中读取数据,至此便完成了数据的传输,进而完成数据的进一步加工处理。原创 2025-03-25 23:41:00 · 921 阅读 · 0 评论 -
Linux 动静态库
完成头文件展开,去掉注释,宏替换,条件编译等,最后形成xxx.i文件完成词法分析,语法分析,语义分析,符号汇总等,最终形成xxx.s文件将汇编指令转换成二进制指令,最终形成xxx.o文件将生成的各个xxx.o文件链接例如:用 a.c b.c c.c d.c 以及main.c形成可执行文件,我们需要先得到这些文件的目标文件(二进制文件)a.o b.o c.o d.o 以及main.o,然后将这些目标文件链接起来,最后形成一个可执行文件。原创 2025-03-11 13:07:59 · 932 阅读 · 1 评论 -
Linux 软硬链接
与软连接不同的是,当硬链接的源文件被删除,硬链接文件依旧能正常执行,只是文件的硬链接数减少了一个,因为此时该文件的文件名少了一个,所谓的建立硬链接,本质就是在特定目录的数据块中新增文件名和指向文件名的inode编号的映射关系。命令我们可以看到,硬链接文件的inode编号和源文件是相同的,并且硬链接文件大小与源文件大小也是相同的,特别注意的是,当创建了一个硬链接文件后,该硬链接文件和源文件的硬链接数(引用计数)都变成了2。1. 软连接是一个独立的文件,有独立的inode,而硬链接没有独立的inode。原创 2025-03-07 21:43:56 · 793 阅读 · 0 评论 -
LInux 文件系统
线性存储介质理解文件系统,首先我们必须将磁盘想象成一个线性的存储介质,例如磁带,当磁带被卷起来时,其就像磁盘一样是圆形的,当我们将磁带拉直后,它就是线性的抽象理解磁盘从逻辑结构来看,磁盘是线性的,所以为了更好的理解磁盘,我们将磁盘理解成一个数组所以我们可以根据下标28888反推回它在线性结构的那个区域,然后进行访问一个磁盘有5个盘片,每个盘面有2w给扇区每个盘面50个磁道,每个磁道400个扇区1.确定在那一面28888 / 20000 = 1面(从第0面开始),它在第一面2.在哪一个扇区。原创 2025-03-06 22:41:52 · 1041 阅读 · 0 评论 -
Linux基础IO
当fopen以写入的方式打开一个文件时,若文件不存在,则会自动在当前路径创建该文件,那么这里所说的当前路径指的是什么呢?例如,我们在test_2_26目录下运行可执行程序myproc,那么该可执行程序创建的log.txt文件会出现在test_2_26目录下这里是否能说明的“当前路径”是指当前可执行程序所处的路径这时我们删除刚才可执行程序生成的log.txt先删除测试一下:回退到上级目录,在上级目录下运行该可执行程序。原创 2025-03-01 21:21:53 · 713 阅读 · 0 评论 -
Linux 进程程序替换
子进程刚被创建时与父进程共享代码和数据,但当子进程需要进行进程程序替换的时,也就意味着子进程需要对其数据和代码进行写入操作,这时就需要将父子进程共享的代码和数据进行写时拷贝,此后父子进程的代码和数据也就分离了,因此子进程进行程序替换后不会影响父进程的代码和数据。事实上,只有execve才是真正的系统调用,其他五个函数最终都是调用的execve,所以execve在man手册第2节,而其他五个函数在man手册的第3节,也就是说其他五个函数实际上是对系统调用execve进行了封装,以满足不同用户的不同调用场景。原创 2025-02-21 15:33:02 · 1206 阅读 · 0 评论 -
Linux 进程控制(进程创建,进程等待)
我们都知道main函数是代码的入口,但实际上main函数只是用户级别代码的入口,main函数也是被其他函数调用的,例如在VS2022当中main函数就是被一个名为__tmainCRTStartup的函数所调用,而__tmainCRTStartup函数又是通过加载器被操作系统所调用的,也就是说main函数是间接性被操作系统所调用的。在上述的例子中,当子进程未退出时,父进程都在一直等待子进程的退出,在等待期间,在等待期间父进程没有做任何事情,这种父进程处于阻塞状态下的等待叫做阻塞等待。原创 2025-02-17 17:51:37 · 850 阅读 · 0 评论 -
Linux 进程地址空间
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增 加,我们称之为进程调度O(1)算法!原创 2025-02-14 14:37:30 · 1195 阅读 · 4 评论 -
Linux 环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。原创 2025-02-11 12:48:49 · 1170 阅读 · 0 评论 -
Linux进程概念
当一个进程要退出的时候,在系统层面,该进程的资源并不是立刻被释放,而是要暂时存储一段时间,以供操作系统或是其父进程进行读取,如果该进程的退出信息一直未被读取,则相关数据是不会被释放掉的,一共进程若是正在等待其退出信息被读取,那我们就称这种状态为:僵尸状态(zombie)例如,我们写代码时都在主函数最后返回0。观察代码运行结果,在父进程未退出时,子进程的PPID就是父进程的PID,而当父进程退出后,子进程的PPID就变成了1,即子进程退出后,子进程的PPID就变成了1,即子进程被1号进程领养了。原创 2025-02-09 10:45:57 · 966 阅读 · 0 评论 -
初步认识操作系统(Operator System)
管理者管理被管理者,实际上就是对这个。原创 2025-02-02 10:25:42 · 731 阅读 · 4 评论 -
冯·诺依曼体系结构
所以以上体系结构虽然可以使用,但是还不够完善,于是为了解决输入输出设备和cpu配合使用慢的问题,我们可以通过在它们之间加入存储器也就是内存,提高整个体系的速度,内存的速度比输入输出设备快很多,但是比cpu慢,内存在整个体系结构当中起着缓冲的作用,总的来说还是提高了整个体系的速度。登录qq,qq这款软件加载到内存中,然后中央处理器开始执行qq的代码,我使用输入设备(键盘)将信息放到内存中,然后CPU进行打包计算,计算完成之后将数据放回到内存中,通过输出设备(网卡,显示器)原创 2025-02-01 16:05:18 · 806 阅读 · 5 评论 -
Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.原创 2025-01-28 09:50:51 · 2382 阅读 · 0 评论 -
Shell的运行原理以及Linux中的权限问题
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel? 从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:对比windows GUI,我们操作windows不是直接操作windows内核,而是通过图接口形,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘原创 2025-01-16 17:40:19 · 934 阅读 · 1 评论 -
linux下的入门指令
ls指令这里演示跳几个演示:原创 2024-08-31 00:53:31 · 1376 阅读 · 0 评论