
Linux
文章平均质量分 91
邓富民
你要像欣赏花一样,欣赏你自己
展开
-
【读者写者问题与读写锁】
第一个读者进来时,会先申请计数器的锁,并判断计数器资源是否== 0,如果为0,表明我是第一个读者,我会把写者锁申请走,这样当写者想要申请锁来写时,就要阻塞等待锁就绪,相当于防止写者进来了,这样就完成了读者和写者的互斥。由于读者之间是并发关系,所以,reader_count是把计数器,是为了统计访问临界资源的读者的个数。当读者读完离开时,会申请计数器的锁,进行计数器的- -,并判断,当前在访问临界资源的读者是否为0,如果为0,就会释放写者锁,让写者能进来写。而读者和读者之间,不会带走数据!原创 2025-04-07 14:53:48 · 626 阅读 · 0 评论 -
【HTTPS协议】
第一组(非对称加密):用于校验证书是否被篡改。服务器持有CA证书,客户端持有CA机构的公钥(操作系统包含了可信任的CA认证机构并持有对应的公钥),客户端会对服务器发来的CA证书进行认证,保证证书合法性,其实就是让客户端信任服务器是合法的,同时也保证了服务器的公钥是合法的。第二组(非对称加密):用于协商生成的对称密钥。客户端通过信任后的服务器公钥加密,将客户端本地生成的对称密钥加密后传输给服务器,服务器用自己的私钥解密,得到对称密钥。第三组(对称加密):双方都持有对称密钥,此后使用对称加密进行通信。原创 2025-04-04 17:30:25 · 568 阅读 · 0 评论 -
【线程安全的单例模式和STL是否是线程安全/智能指针是否是线程安全】
这样解决了线程并发问题,但是这样假如有大量线程同时进入该函数时,会并发竞争锁,会造成性能低下,极端情况下可能出现卡顿现象。举个饿汉模式的例子:洗碗,一个人吃碗饭之后,他马上洗碗,下次吃饭的时候就可以直接拿起碗吃饭了。懒汉模式是:一个人吃完饭之后,他先不洗碗,下次吃饭的时候再洗碗,这就是懒汉模式。正确的应该是:如果没有实例化T对象,先申请锁对T对象new一个出来。因为不管有没有实例化T对象,都会进行锁竞争,这是不太合理的。这样实现懒汉模式的单例模式,解决了线程安全+性能低下的问题。下面用代码实现懒汉模式。原创 2025-03-24 19:51:56 · 274 阅读 · 0 评论 -
【Linux】线程
在一个程序里的一条执行路线,就叫做线程。比如一个函数从执行入口开始往后执行,这条执行路线就叫做线程。线程在进程内部运行,本质是在进程地址空间内运行。原创 2024-11-18 15:13:22 · 750 阅读 · 0 评论 -
【Linux】高级IO——五种IO方式,select,poll,epoll
什么是IO?IO = 等 + 拷贝。select的优点:1.select具有可监控的最大文件描述符(一个位图,位图大小有限)2.select每次返回,都会将没有就绪的文件描述符清空,只保留就绪的文件描述符。所以下次调用select前,还需要重新设置要关心的文件描述符。(内核层)3.怎么保存我要关心的文件描述符呢?那就用到一个辅助数组了,在链接就绪时,将该accept_fd保存到辅助数组中。(应用层)select的缺点:select的优点也同时是缺点。原创 2024-06-14 20:45:42 · 1224 阅读 · 0 评论 -
《TCP协议》
TCP原创 2024-03-24 15:09:47 · 140 阅读 · 0 评论 -
《HTTPS协议》
HTTPS协议是HTTP协议在应用层的基础上,加上一层加密层形成的协议。• 数据摘要,其基本原理是利⽤单向散列函数(Hash函数)对信息进行运算,⽣成⼀串固定长度的数字摘要。数字摘要并不是⼀种加密机制,但可以⽤来判断数据有没有被窜改。• 摘要常见算法:有MD5、SHA1、SHA256、SHA512等,算法把⽆限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率⾮常低)原创 2024-03-09 15:16:36 · 648 阅读 · 1 评论 -
【Linux】浅谈信号量
tips:system V 是一套标准,共享内存,信号量,消息队列属于system V。原创 2023-12-08 17:33:53 · 1058 阅读 · 2 评论 -
【Linux】信号的保存和捕捉
在我们向进程发送信号时,假如发送二号信号,此时进程收到信号后,首先将pending表中的2号位置由0置1,意味着先将2号信号保存起来,进程会在合适的时间处理。当这个2号信号被递达,也就是被处理时,在调用handler方法中的2号位置对应的处理方法前,将pending表中的2号位置就由1置空0,且会将block表中的2号位置由0置1,这就意味这当进程在处理2号信号时,再发送2号信号过来时,pending表中的2号位置一定是由0置1的,因为一定是等上一个2号信号处理完成后,再处理这个2号信号。原创 2023-12-06 11:08:20 · 1629 阅读 · 19 评论 -
【Linux】信号概念和信号的产生
以日常为例,信号弹,上下课铃声,动物求偶行为,红绿灯等等。这些都是信号。我们怎么认识信号?从小开始,父母教的,老师教我们识别这些信号。在信号产生后,可能我并不会马上处理该信号,但我记得有这个信号。所以必须在未来某个时间窗口内处理该信号。比如:在宿舍点外卖的行为,外卖员打电话,我当时在打游戏,电话一挂,推高地去了,然后游戏打完后,我再下去拿外卖。这个就是典型的信号收到之后,没有马上处理,而是再未来某个时间窗口内处理。1.进程必须具备识别和处理信号的能力。原创 2023-12-01 15:07:14 · 1047 阅读 · 2 评论 -
【Linux】匿名管道+进程池
在父进程创建子进程时,子进程会继承父进程的struct files_struct,所以在创建第二个子进程时,由于它继承了父进程的信息,导致第二个子进程有能力去修改父进程与第一个子进程进行通信的管道文件。该文件描述对象结构体中包含一个fd_array,文件描述符表,这个文件描述符表存储的是对应打开的文件的文件描述对象的地址。默认打开的三个文件中,stdin,stdout,stderr对应的分别是键盘文件,显示器文件,显示器文件,占用了fd_array文件描述符表中的0,1,2下标。原创 2023-11-24 15:18:51 · 929 阅读 · 1 评论 -
【Linux】共享内存
如果共享内存申请成功,返回的是shmid,其实这个返回值就像是文件fd,创建一个文件,返回该文件在文件数组fd_array中的下标。如果申请的是4097字节,操作系统会给一块4096*2字节大小的共享内存,但是能够使用的只有4097字节,剩下的空间给了也不能用。同时,进程b也通过页表映射,将共享区的起始地址映射到自己的虚拟地址空间中,两个进程就能看到同一份资源,从而能实现通信!所以,共享内存一定有对应的描述该共享内存的对象,保存共享内存及其周边的各种属性和信息。2.共享内存是所有进程间通信中,速度最快的!原创 2023-11-23 20:09:23 · 1372 阅读 · 0 评论 -
【Linux】重定向|重新理解Linux下一切皆文件
理解重定向之前:先理解一个叫做文件描述符的具体操作。文件描述符,也是在上篇文章提到的,在描述进程属性的PCB对象中存在着一个的指针,该指针指向一个指针数组,指针数组的每一个指针又指向对应的文件。这个文件描述符,就是该指针数组的下标!打开一个文件时,会在指针数组中找最近的一个空位置,存储该文件的地址。返回的文件描述符就是这个位置的下标。24 }26 }原创 2023-11-17 21:24:14 · 800 阅读 · 8 评论 -
【Linux】进程替换|exec系列函数
这篇文章重点讲解exec系列函数。原创 2023-11-15 10:51:30 · 502 阅读 · 0 评论 -
【Linux】进程等待
38 }3942 {44 }4547 }48 }上面代码的意思是:先创建一个子进程,父子进程同时跑5s,前5s都处在阻塞状态,即S状态。中间5秒子进程退出,等待父进程来回收,此时子进程变成僵尸状态,即Z状态。原创 2023-11-13 16:16:21 · 385 阅读 · 17 评论 -
【Linux】进程控制
进程退出时,一般而言只有父进程关心子进程的退出情况。在Linux中,操作系统最关心的是一个进程的代码运行完毕后,为什么结果不正确?而不关心结果为什么正确。操作系统也是如此。一个进程正常运行结束后,结果正确时的退出码为0;使用命令查看最近一个运行成功的程序的退出码。为了更正确理解上面那句话,这里修改代码,直接return 12;此时上一个程序运行退出码为12,再一次:结果变成了0,因为上一次运行成功的进程是命令成功运行了。一个程序运行结果正确/不正确,是以退出码来判断的。errno是c语言提供的一个原创 2023-11-09 10:30:00 · 292 阅读 · 13 评论 -
【Linux】进程地址空间
在硬件级别,有32根地址总线,每一根地址总线都只代表0/1,CPU和内存实际上是有32根地址总线连接起来的。地址排列组合有2^32种地址。而每种地址对应CPU读取一个字节的话,就得出了内存有4GB的结论。如何理解地址空间上的区域划分?举一个简单的例子,上小学时,可能是两人同桌,假如小胖和小美做同桌,而小胖又比较喜欢动手动脚,所以给小花造成了困扰,小花一怒之下暴打小胖,并跟他说:我要划一条三八线,你以后不准越界!!自此,区域划分就出来了!!int start;int end;原创 2023-11-07 15:33:14 · 362 阅读 · 11 评论 -
【Linux】基础IO之文件操作(文件fd)——针对被打开的文件
1.文件 = 内容 + 属性2.文件分为打开的文件和未打开的文件1)打开的文件:进程打开的。本质上是研究进程和文件的关系。文件被打开,就必须先加载到内存中。一个进程可以打开多个文件,操作系统要对这些文件进行管理,就要先描述,再组织。在内核中,操作系统要管理好这些文件,就必须有这个文件的对象,包含很多的文件属性。2)未打开的文件有很多,操作系统要将这些文件存储好,本质上就是对这些文件进行增删查改的操作!未打开的文件,在磁盘上放着。本文章目标:针对被打开的文件,进行各种深入剖析。原创 2023-11-02 19:34:55 · 838 阅读 · 11 评论 -
【Linux】环境变量
举个简单的例子说明:46 {911 {12 printf("你是root用户,你可以做任何事情\n");13 }1415 else16 {17 printf("你是普通用户,你受权限约束\n");18 }1921 }getenv函数是获取对应字符串的环境变量,比如上文,通过getenv(“USER”),获取到当前USER的环境变量,从而判断当前用户是谁。原创 2023-10-26 10:01:54 · 393 阅读 · 0 评论 -
【Linux】进程优先级|进程并发概念|在vim中批量化注释
这篇文章继续上篇内容讲解进程的优先级。优先级就是对于资源的访问,谁先谁后的问题!本文章详细介绍了优先级,并发等概念,还有CPU与寄存器与进程的一些联系。原创 2023-10-23 21:50:06 · 639 阅读 · 1 评论 -
【Linux】进程状态|僵尸进程|孤儿进程
本文章讲述了进程的几个基本状态:运行状态,阻塞状态(深度睡眠状态和浅度睡眠状态),挂起状态,僵尸状态等。以及两个比较重要的进程:僵尸进程和孤儿进程。到目前为止,所具备的知识还无法解决僵尸进程和孤儿进程的问题,到后面会解决。进程状态切换的本质是一个进程的PCB从一个队列被放到另一个队列中排队。本文到这里就结束啦。原创 2023-08-25 22:12:41 · 680 阅读 · 1 评论 -
【Linux】make/makefile自动化构建工具
本文章讲解Linux下的自动化构建工具:make/makefile以下是本篇文章正文内容1.make是一条指令2.makefile是一个当前目录下的文件今天讲解了Linux的自动化构建工具。原创 2023-08-18 18:05:08 · 386 阅读 · 1 评论 -
【Linux】进程的基本属性|父子进程关系
本篇文章继上文的进程概念后,现在对进程概念有了一定的理解。前面说过,操作系统管理进程实际上是管理描述进程的PCB对象,而PCB对象是一堆进程属性的集合,那么进程都有哪些属性?本篇文章会详细写出来。1.本篇文章讲述了进程的最基本的属性:进程的PID和PPID,PID是每个进程独有的标识序号,PPID是该进程的父进程的标识序号。2.通过fork函数创建出来子进程。原创 2023-08-16 17:00:38 · 1706 阅读 · 39 评论 -
【Linux】深入理解进程概念
本篇文章继上一篇的冯诺依曼体系结构和操作系统这两个软硬件的概念之后,开始讲解Linux下三座大山之一的进程。因为进程概念虽然不是很多,但比较难以理解,因为它离我们日常生活比较远,比较抽象,本文章以最平易近人的语言和生活中我们都熟悉的例子对进程进行剖析,希望这篇文章能进一步帮助你理解进程的概念,吃透Linux的其中一座大山。废话不多说,我们现在开始。本篇文章重点在于理解进程的概念就可以了,进程的相关内容比较多且难以理解,从进程概念入手是最合适的,后面会持续更新如何创建进程,进程的状态。原创 2023-08-08 18:00:00 · 1554 阅读 · 34 评论 -
【Linux】冯诺伊曼体系结构|操作系统概念理解
本文进入Linux较为晦涩的概念——冯诺依曼体系结构和操作系统的理解。冯诺依曼体系结构是我们日常计算机都遵守的一个整体架构,计算机有很多硬件,比如硬盘,内存条,cpu等等。这些硬件通过冯诺依曼体系结构组装起来就是一台计算机。这张图体现的就是冯诺依曼体系结构整体概览。我们知道,银行里面有大量资金,如果银行不将这些资金储存并封闭起来,这些资金对任何一个普通人来说无疑是巨大的诱惑。此时这个银行就像是操作系统,里面有各种数据,可是操作系统,不相信任何用户!操作系统为了保证数据安全,会把自己封闭起来。原创 2023-08-06 11:35:13 · 3053 阅读 · 109 评论 -
【Linux】从0到1实现一个进度条小程序
本文讲解如何从0到1实现一个进度条小程序。今天的文章讲了如何在Linux上实现一个进度条小程序,做这个进度条小程序的核心是理解’\r’和’\n’两个转义字符,以及缓冲区的概念,理解之后,实现起来就不难啦。原创 2023-08-03 21:23:04 · 3178 阅读 · 36 评论 -
【Linux】认识Linux下的编译器gcc/g++ | 认识动静态库
前言tips: 关于前两篇文章所提到的sudo指令一、gcc/g++编译器的认识和使用tips1.预处理2. 编译3.汇编4.链接关于预编译,编译,汇编阶段的指令记忆方法二、gcc/g++指令汇总三、认识动静态库1.库的认知库的命名规则静态库安装方法2.什么是动静态库3.动静态库优缺点4.链接方式总结原创 2023-06-04 15:34:01 · 1194 阅读 · 56 评论 -
【Linux】软件包管理器/编辑器/yum是应用商店?/vim编辑器什么?
Linux软件安装关于Linux的软件生态1.Linux软件包管理器:yum到底是什么关于yum指令:关于yum源2. rzsz指令1. Linux编辑器——vim编辑器vim编辑器的三种主要模式vim编辑器命令模式常用快捷键:vim操作总结:总结原创 2023-05-28 21:03:29 · 2596 阅读 · 2 评论 -
【Linux】下的权限管理/关于root用户和普通用户的区别/不同用户的访问权限有什么不同?/到底什么是粘滞位?
前言1.Linux下用户的分类sudo指令1.1文件访问者的分类(人)2.文件类型和访问权限(事物属性)2.1Linux下的文件类型2.2 文件的权限属性(角色/身份)chmod指令和chown指令/权限的修改tips:拥有者和所属组能干的一些事umask指令和权限值的关系普通文件和目录文件的rwx功能3.到底什么是粘滞位?总结原创 2023-05-26 20:57:41 · 9207 阅读 · 49 评论 -
【Linux基本指令(3)】几十条指令快速入手Linux/到底什么是日志?/指令的运行原理到底是什么?
13.head指令14.tail指令15.时间相关指令到底什么是日志?时间戳16.cal指令17.find指令(非常重要)18.grep指令19.zip/unzip指令20.tar指令(非常重要)21.bc指令22.uname指令23.几个重要的热键24.关机指令其他扩展命令shell 命令及其运行原理命令行解释器(shell)存在的意义总结原创 2023-05-24 21:58:57 · 2902 阅读 · 46 评论 -
【Linux基本指令(2)】几十条指令快速入手Linux/深入理解什么是指令
Tips:7.man指令(重要):echo指令和输出重定向,追加重定向,输入重定向8、cp指令(重要)9.mv指令(重要)10.cat指令11.more指令12.less指令(重要)什么是管道指令?到底什么是指令?总结原创 2023-05-22 16:17:26 · 2657 阅读 · 39 评论 -
如何建立Linux与git的连接?
如何建立Linux与git的连接?原创 2023-04-26 00:10:11 · 1699 阅读 · 20 评论 -
【Linux基本指令(1)】几十条基本指令快速入手Linux
Linux基本指令和权限(1)原创 2023-04-25 23:35:29 · 1816 阅读 · 20 评论