
linux系统
文章平均质量分 96
敲上瘾
热爱生活,热爱学习,热爱世界
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
企业开发工具git的使用:从入门到高效团队协作
本文介绍了Git的基本概念、安装、本地仓库的创建与配置,以及工作区、暂存区和版本库的区分。详细讲解了版本回退、撤销修改、删除文件等操作,并深入探讨了分支管理,包括分支的创建、切换、合并、删除及冲突解决。此外,还介绍了远程操作,如远程仓库的创建与克隆,分布式版本控制的理解,以及多人协作的两种模式(单分支与多分支)。最后,文章总结了系统开发环境和Git分支设计规范,强调了不同分支在开发、测试、预发布和生产环境中的作用。通过本文,读者可以全面掌握Git的核心功能及其在团队协作中的应用。原创 2025-05-19 09:02:46 · 2520 阅读 · 101 评论 -
Linux权限
linux中的用户有两种,root用户(超级管理员)和普通用户,root的权限是最高的。而普通用户的权限比较低,在做某些操作时需要使用sudo命令来短暂提权。但是并不是任何用户都能够提权,如果任何用户都能提权那么root和普通用户就没有权限区分的意义了,而要能够使用sudo提权这个普通用户必须在root的“白名单”里。原创 2024-11-01 09:40:43 · 1231 阅读 · 78 评论 -
Linux开发工具——make/Makefile
Makefile是一种自动化构建工具,make是一条指令,Makefile是一个文件,当我们创建名为Makefile的文件后在Makefile中按照一定的规则制定一些命令。然后我们在命令行输入make命令后会自动执行Makefile文件中的指令。原创 2024-11-06 09:02:19 · 1338 阅读 · 65 评论 -
操作系统的理解
要理解这个结构,我们需要就盯着数据流动这条线来分析,很容易发现CPU是只与存储器打交道,而不与输入输出设备直接接触,这里存储器起到一个交通枢纽的作用。那么为什么会有这种结构呢,为什么不是“输入”—>“CPU处理”—>“输出”呢?原创 2024-11-22 09:16:19 · 853 阅读 · 76 评论 -
虚拟地址空间与物理内存(Linux系统)
在虚拟内存与物理内存之间存在着一个媒介,它就是页表,起到一个交通枢纽的作用,它实际上是一个映射关系,把虚拟内存上的值通过页表映射得到对应的物理内存。当然页表的作用不止于此,它还起到权限管理的作用,即每个地址都用自己的rwx权限,对野指针、空指针等进行访问,就是在页表这里被拦截的。原创 2024-11-27 09:28:32 · 1898 阅读 · 85 评论 -
深入理解进程的退出、等待与替换(Linux系统)
进程等待指的是父进程等待子进程结束。在子进程结束后它的pcb不会立马释放,而是进入僵尸状态,让父进程回收。当然如果父进程永远不来回收,那么子进程pcb就永远得不到释放,从而内存泄漏。而父进程在等待子进程退出这个过程就叫作进程等待。原创 2024-12-07 09:53:23 · 1312 阅读 · 53 评论 -
自制shell命令行解释器,深入理解Linux系统命令行实现原理
环境变量表需要我们在程序启动时就将它导入, 当然程序启动后环境变量默认是父进程的,所以我们可以重新开辟空间把原环境变量的数据拷贝过来,然后再把environ更新为新的地址。具体实现请参考下文源码。原创 2024-12-09 09:13:31 · 1349 阅读 · 74 评论 -
深入理解Linux系统内存中文件结构以及缓冲区,模拟实现c语言库文件接口
当语言层缓冲区刷新之后,数据并不会马上写入磁盘,而是放到了系统的缓冲区,系统缓冲区的作用是减少磁盘的随机读写,增加顺序读写从而提高读写效率。因为读写到一起的都是相关性强的数据,等再次被读的时候就可以一起被读出来。原创 2025-01-20 09:25:31 · 1694 阅读 · 37 评论 -
动静态库的制作与使用(Linux操作系统)
首先准备好需要做成库的源文件与头文件,如下示例:注意:在制作库方法过程中不能有main函数。如果代码使用c语言进行写的,执行以下语句把所有.c文件进行编译得到了.o文件。gcc -c *.c使用ar指令把所有.o文件链接成静态库,如下:-r(replace):此选项表示在插入文件到库时,若遇到同名的成员,则进行替换。它确保了库中的文件是最新的。-c(create):这个选项用于创建一个新的库文件。如果指定的库文件已经存在,它并不会被覆盖,而是会报错提示文件已存在。原创 2025-01-23 10:15:58 · 1106 阅读 · 49 评论 -
进程池的制作(linux进程间通信,匿名管道... ...)
在程序使用内存的时候,比如vector扩容机制,会提前给你开辟一块空间供你使用,尽管现在用不到,相当于做一下预备。因为只是一个小测试,代码写的并不严谨(没有检查调用是否成功,没有关闭文件,没有进程等待)大家不用太在意,能说明问题就行。,但它与一般的文件还是有些区别,文件都是储存到磁盘上的,而进程之间通信用的文件并不需要把它储存到磁盘上,它只是作为一个传输介质。那么进程池也同样,给父进程提前开辟一些子进程,提供父进程使用。,顾名思义就是没有名字,也不需要名字,因为子进程能够继承下来父进程开辟的管道资源。原创 2025-01-27 09:00:33 · 1437 阅读 · 32 评论 -
命名管道——进程间通信
管道文件,自带同步机制。如上代码示例,如果写端和读端执行速度不一样,快的一端会迁就于慢的一端,最后实现同步。原创 2025-03-03 11:18:21 · 1133 阅读 · 61 评论 -
共享内存通信效率碾压管道?System V IPC原理与性能实测
共享内存是通过在物理内存上开辟一块空间,然后让需要通信的进程都映射到这一块空间,这样就使它们看到同一块资源了。 共享内存通信是双向的,也就是说一个进程可以即读又写,而且使用起来就和c语言申请的malloc差不多。这种通信方式存在着数据安全问题,会在下文细说。 创建共享内存使用shmget函数,它的作用是创建或获取共享内存段的系统调用。 对于shmget用起来还是挺简单的,但是要把它的各种参数的设定都理解还是很困难的,接下来我会进行详细讲解。 问题2很原创 2025-03-12 10:08:08 · 1036 阅读 · 72 评论 -
操作系统的心脏节拍:CPU中断如何驱动内核运转?
当以上程序执行到scanf时,如果我们不输入信息,程序会一直阻塞在这里。那程序如何知道我们已经完成输入了呢?而且我们输入的信息在外设上,程序又是如何知道何时将其载入内存的呢?这其实是由外设就绪后通知给CPU,再由CPU通知给操作系统,然后由操作系统调用最后通知给前台程序。具体细节如下:每个中断都有自己的编号,即中断号,在中断控制器中会有寄存器来记录已就绪的中断号。一旦有外设就绪,它的中断号将被存入寄存器,然后由中断控制器通知CPU。原创 2025-03-18 10:42:08 · 1338 阅读 · 60 评论 -
Linux信号的诞生与归宿:内核如何管理信号的生成、阻塞和递达?
在我们运行程序时通常会用Ctrl+c来使程序退出,这其实是向前台程序发送2号信号。除此之外还有Ctrl+\,表示发送3号信号,同样是让程序退出,2号信号与3号信号的区别将在下文核心转储部分详细讲解。原创 2025-03-21 09:41:06 · 17763 阅读 · 81 评论 -
定长内存池原理及实现
所谓“池化技术”,就是,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较⼤的开销,不如提前申请好了,这样使⽤时就会变得⾮常快捷,⼤⼤提⾼程序运⾏效率。在计算机中,有很多使⽤“池”这种技术的地⽅,除了。以服务器上的线程池为例,它的主要思想是:先启动若⼲数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程⼜进⼊睡眠状态。原创 2025-03-25 10:48:33 · 1143 阅读 · 67 评论 -
线程池的封装(c/c++)
池化技术所谓“池化技术”,就是,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较⼤的开销,不如提前申请好了,这样使⽤时就会变得⾮常快捷,⼤⼤提⾼程序运⾏效率。:复用已创建的线程,减少线程创建销毁的开销。:任务到达时可以直接执行,无需等待线程创建。:统一分配、调优和监控线程。原创 2025-04-17 12:28:23 · 1983 阅读 · 67 评论 -
Linux多线程编程的艺术:封装线程、锁、条件变量和信号量的工程实践
pthread_create函数要求传入一个void *(*start_routine) (void *)类型的函数指针,但为了可以让用户更灵活的使用,我们可以在这里进行一下封装。也就是说希望用户想传什么类型的函数指针都行,那么可以单独设计这样一个函数,如下:原创 2025-03-31 10:28:30 · 1235 阅读 · 51 评论 -
多线程编程实战:基于阻塞队列与环形队列的生产者消费者模型详解
⽣产者消费者模式是通过⼀个容器来解决⽣产者和消费者的强耦合问题。⽣产者和消费者彼此之间不直接通讯,⽽通过阻塞队列来进⾏通讯,所以⽣产者⽣产完数据之后不⽤等待消费者处理,直接扔给阻塞队列,消费者不找⽣产者要数据,⽽是直接从阻塞队列⾥取,阻塞队列就相当于⼀个缓冲区,平衡了⽣产者和消费者的处理能⼒。这个阻塞队列就是⽤来给⽣产者和消费者解耦的。原创 2025-04-01 10:11:15 · 1239 阅读 · 25 评论 -
高并发内存池(一):项目介绍和ThreadCache(线程缓存)实现
在多线程环境下进行内存申请本质上属于对公共资源的访问,高并发场景下对内存分配锁的竞争会异常激烈,这将严重拖慢程序运行效率。此外,频繁的系统级内存申请不仅会产生额外开销,还可能引发内存碎片问题。传统的malloc内存分配机制由于这些固有缺陷,已难以满足现代高性能开发中对内存管理效率的需求。原创 2025-03-28 10:04:43 · 1668 阅读 · 68 评论 -
高并发内存池(二):CentralCache(中心缓存)的实现
本文将要讲解的高并发内存池,它的原型是Google的⼀个开源项⽬tcmalloc,全称Thread-Caching Malloc,近一个月我将以学习为目的来模拟实现一个精简版的高并发内存池,并对核心技术分块进行精细剖析,分享在专栏《高并发内存池》里,期待小伙伴们的热情支持与关注!上期讲了Thread Cache的实现,但并未对在Central Cache中如何申请内存进行讲解。接下来让我们会对Central Cache的结构和如何在Central Cache中申请内存进行学习和代码实现。原创 2025-04-02 10:09:05 · 13267 阅读 · 78 评论 -
高并发内存池(三):PageCache(页缓存)的实现
⻚缓存是在central cache缓存上⾯的⼀层缓存,存储的内存是以⻚为单位存储及分配的,central cache没有内存对象时,从page cache分配出⼀定数量的page,并切割成定⻓⼤⼩的⼩块内存,分配给central cache。当⼀个span的⼏个跨度⻚的对象都回收以后,page cache会回收central cache满⾜条件的span对象,并且合并相邻的⻚,组成更⼤的⻚,缓解内存碎⽚的问题。原创 2025-04-10 08:27:18 · 1499 阅读 · 85 评论 -
高并发内存池(四):内存释放原理与实现
不能粗鲁地把内存块连接到一个随便找的span,这样的话,属于不同页的内存块就混乱在一起,后面的PageCache就没法玩了!页号成为了它们之间的脐带,内存块地址除以8KB就是它所在的页,而一个span的信息中也能找到它管理着哪些页,只需要做一个页号到span的映射(即哈希表)就能解决问题。页级别的内存管理是在PageCache,我们把哈希映射在PageCache层创建和维护。原创 2025-04-16 08:08:59 · 1322 阅读 · 59 评论 -
高并发内存池(五):性能测试与性能优化
未处理超过256KB的大内存申请。前期测试覆盖不足,导致多线程场景下隐藏了一些bug。本文将修复这些问题,并实现三个目标:增加大块内存分配逻辑替换系统自带的malloc通过性能测试定位优化瓶颈。原创 2025-04-30 10:09:10 · 1882 阅读 · 70 评论 -
高并发内存池(完整版):支撑百万级并发的幕后英雄
Thread-Caching Malloc,即线程缓存的malloc,实现了⾼效的多线程内存管理,⽤于替代系统的内存分配相关的函数(malloc、free)。在多线程环境下进行内存申请本质上属于对公共资源的访问,高并发场景下对内存分配锁的竞争会异常激烈,这将严重拖慢程序运行效率。此外,频繁的系统级内存申请不仅会产生额外开销,还可能引发内存碎片问题。传统的malloc内存分配机制由于这些固有缺陷,已难以满足现代高性能开发中对内存管理效率的需求。原创 2025-05-06 10:54:58 · 1010 阅读 · 49 评论