linux
文章平均质量分 94
有关于linux的相关学习路程
一朵猫猫菇
一篇更比六篇强
展开
-
【网络编程】高级IO
下面我们总结一下select服务器的特点:1.select能同时等待的文件描述符是有上限的,改内核只能提高一点上限,并不能完全解决。2.select服务器必须借助第三方数组来维护合法的文件描述符。3.select的大部分参数是输入输出型的,调用select前,要重新设置所有的文件描述符,调用之后,我们还要检查更新所有的文件描述符,这带来的就是遍历的成本。4.select的第一个参数为什么是最大文件描述符+1呢?这是因为在内核层面也需要遍历文件描述符。原创 2023-08-13 16:06:00 · 489 阅读 · 3 评论 -
【网络层+数据链路层】深入理解IP协议和MAC帧协议的基本原理
为什么经常将TCP/IP放在一起呢?这是因为IP层的核心工作就是通过IP地址来定位主机的,具有将一个数据报从A主机跨网络发送到B主机的能力,而TCP所提供的策略使IP层可靠的将一个数据报从A主机跨网络发送到B主机。在复杂的网络环境中确定一个合适的路径。网络层主要负责地址管理和路由选择,例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由),路由器工作在网络层。原创 2023-08-11 15:40:17 · 2904 阅读 · 1 评论 -
【传输层】Tcp协议的原理(二)
为什么TCP这么复杂?因为既保证了可靠性同时又尽可能的提高性能。校验和,序列号(按序到达),确认应答,超时重传,连接管理,流量控制,拥塞控制提高性能:滑动窗口,快速重传,延迟应答,捎带应答基于TCP的应用层协议:当然也包括你自己写TCP程序时自定义的应用层协议。TCP的可靠性是通过各种优秀的机制实现的,重要的保证可靠性的机制有:序列号(按序到达),校验和,确认应答,超时重传,拥塞控制,连接管理,流量控制。提升性能的机制有:滑动窗口,捎带应答,延迟应答,快速重传。原创 2023-08-11 15:39:27 · 363 阅读 · 0 评论 -
【传输层】Udp协议和Tcp协议的原理(一)
前几篇文章都是讲解的应用层的内容,下面我们进入传输层的内容,传输层就是负责数据能够从发送端传输接收端。传输层最典型的协议有两个,一个是UDP协议,一个是TCP协议,在讲解UDP协议之前我们先重新认识一下端口号:端口号标识了一个主机上进行通信的不同应用程序,在网络通信时,用IP值标识一台主机,用port值标识一台主机上不同的进程。原创 2023-08-04 17:22:19 · 595 阅读 · 0 评论 -
【应用层】HTTPS协议详细介绍
HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层,由于HTTP协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况,下面我们详细介绍https是如何解决这些问题的。加密就是把明文(要传输的信息)进行一系列变换,生成密文。解密就是把密文再进行一系列变换,还原成明文。在这个加密和解密的过程中,往往需要一个或多个中间的数据,辅助进行这个过程,这样的数据成为密钥。原创 2023-08-01 22:29:37 · 1004 阅读 · 3 评论 -
【应用层】Http协议总结
http协议内容都是按照文本的方式明文传输的。原创 2023-07-30 17:43:35 · 424 阅读 · 4 评论 -
【应用层】Http协议的学习
HTTP协议(超文本传输协议)和我们上一篇写的网络版计算器中自己定制的协议一样,只不过Http协议是是一个非常好用的协议,所以我们可以直接用现成的不用自己再搞一套了。这篇文章中主要讲解http协议是如何实现的,以及底层的一些原理是什么,在我们手动实现一些原理的时候我们才能对http有更加深刻的认识。原创 2023-07-27 18:20:55 · 451 阅读 · 0 评论 -
【Linux】Tcp协议的通讯流程,浅谈三次握手四次挥手
自定义协议就是定义一个结构化的对象,有了结构化的对象未来客户端和服务端就可以来回进行发送和接收,约定在上面的代码中体现在规定必须是"x op y"这样的格式,这就是约定。注意:没有规定我们网络通信的时候只能有一种协议,实际上我们完全可以将上述代码中规定前面是正文长度替换为协议编码,通过协议编码就可以选择要执行哪种协议了。原创 2023-07-25 17:48:52 · 563 阅读 · 1 评论 -
【Linux】Tcp服务器的三种与客户端通信方法及守护进程化
在上一篇文章中,我们实现了Tcp服务器,但是为了演示多进程和多线程的效果,我们将服务器与客户通通信写成了一下死循环,导致只要有一个用户没有和服务器通信完毕其他用户就都无法和服务器通信,这也体现了单进程面对网络时的一些不足,下面我们用多进程,多线程,线程池来解决这个问题。本篇文章中最重要的是网络知识与系统知识融合在一起,就比如多进程版和多线程版中多进程需要关闭两次文件描述符而多线程只需要一次,要理解这些概念就必须知道进程和线程的概念,所以网络的学习很考验系统的基本功。原创 2023-07-22 09:21:19 · 1239 阅读 · 0 评论 -
【Linux】udp客户端windows版以及Tcp服务器的实现
tcp服务器的实现相较于udp服务器并没有多多少东西,所以只有udp明白了那么简单的tcp服务器还是很好实现的,下一篇才是我们tcp服务器的重点。原创 2023-07-20 21:33:10 · 1118 阅读 · 1 评论 -
【Linux】udp服务器实现大型网络聊天室
根据上一篇文章中对于英汉互译和远程操作的两个小功能大家应该已经学会了,我们的目的是让大家可以深刻的理解udp服务器所需要的接口已经实现的简单步骤,下面我们开始实现网络聊天室。一、udp服务器实现大型网络聊天室。原创 2023-07-18 21:31:48 · 1470 阅读 · 0 评论 -
【Linux】udp服务器实现英汉互译以及远程操作
在上一篇文章中我们详细的讲解了udp服务器的实现步骤,把用到的每一个接口都进行了详细的讲解,而我们在上一篇只是简单的网络通信功能,很多地方还不完善,所以在这一篇文章我们会将上一篇文章用到的代码做修改,写出一个网络版的英汉互译以及一个大型的网络聊天室。原创 2023-07-16 21:52:32 · 514 阅读 · 4 评论 -
【Linux】手把手教你实现udp服务器
上一篇文章中我们讲到了很多的网络名词以及相关知识,下面我们就直接进入udp服务器的实现。一、udp服务器的实现cc=g++.PHONY:allclean:我们通过all就可以创建多个可执行程序了,对于cc这个变量我们设置为g++,以后如果想换其他的编译器就可以直接替换了。public:private://服务器一定要有自己的服务端口号(注意端口号是16位的)//端口号//实际上一款服务器不建议指明一个IPstring _ip;//ip那么我们现在服务器的ip填多少呢?原创 2023-07-11 12:22:24 · 3886 阅读 · 51 评论 -
【Linux】网络基础和网络套接字的概念
上面我们讲了网络基础的概念以及网络套接字的一些概念,这些知识是为了我们下一篇编写UDP服务器而做准备的,由于网络相关的知识都比较抽象,所以还是希望大家可以尽量的去理解网络中各种名词的解释。原创 2023-07-09 20:01:59 · 1385 阅读 · 99 评论 -
【Linux】线程终结篇:线程池以及线程池的实现
什么是线程池呢?线程池一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。线程池的应用场景:1.需要大量的线程来完成任务,且完成任务的时间比较短。WEB服务器完成网页请求这样的务,使用线程池技术是非常合适的。原创 2023-07-05 15:36:26 · 1672 阅读 · 112 评论 -
【Linux】基于环形队列的生产者消费者模型的实现
上一篇文章我们讲了信号量的几个接口和基于环形队列的生产者消费者模型,下面我们就快速来实现。原创 2023-07-03 20:09:37 · 820 阅读 · 104 评论 -
【Linux】生产者消费者模型代码实现和信号量
下面我们实现基于阻塞队列的生产消费模型: 首先我们创建一个头文件用来放阻塞队列的类:这个类也很简单,只需要有一个普通队列,一个记录队列容量的变量,一个互斥锁(保护共享资源的安全),一个条件变量(维护线程的互斥与同步)。类中最重要的两个接口是push和pop,然后构造和析构函数必须要有。下面进入测试文件:在测试文件中,首先我们要有一个阻塞队列对象,然后创建两个线程,一个代表生产者一个代表消费者。然后我们创建这两个线程并且将阻塞队列传进去,这样这两个线程就能看到同一个缓冲区了。最main函数返回前记原创 2023-06-29 19:31:36 · 1723 阅读 · 97 评论 -
【Linux】面试重点:死锁和生产消费模型原理
上一篇的互斥量原理中我们讲解了锁的原理,我们知道每次线程申请锁的时候一旦申请成功这个线程自己就把锁带在自己身上了,这就保证了锁的原子性(因为只有一个锁),而当我们已经申请成功锁了然后再去申请锁会发生什么事呢?下面我们在死锁中回答这个问题。一、死锁死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。上面死锁的概念说一组进程中的各个进程,那么一个锁会引发死锁的问题吗?原创 2023-06-15 20:14:56 · 2114 阅读 · 105 评论 -
【Linux】互斥量原理的实现
为了实现互斥锁操作大多数体系结构都提供了swap或exchange指令该指令的作用是把寄存器和内存单元的数据相交换,由于只有一条指令保证了原子性即使是多处理器平台访问内存的总线周期也有先后一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期。如下图:对于上图中的加锁解锁汇编代码,是谁在执行呢?答案是调用的线程。这里圈出来的汇编代码的意思是:将共享数据交换到自己的私有上下文当中。原创 2023-06-10 19:27:32 · 1022 阅读 · 97 评论 -
【Linux】线程分离和线程互斥
在上一篇文章中我们学习了线程控制,比如创建一个线程,取消一个线程以及等待线程,这篇文章我们讲两个非常重要的概念,一个是线程分离,另一个是线程互斥一、线程分离分离线程默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行操作,否则无法释放资源,从而造成系统泄漏。如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离,如下:sleep(1);原创 2023-06-08 18:43:32 · 1236 阅读 · 88 评论 -
【Linux】多线程概念初讲
什么是线程呢?在一个程序里的一个执行路线就叫做线程(thread更准确的定义是:线程是一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。相信大家都在书上看过线程的概念,书上是这样描述的:线程是一个执行分支,执行粒度比进程更细,调度成本更低。原创 2023-06-06 21:41:57 · 1308 阅读 · 115 评论 -
【Linux】信号的处理
在前两篇linux文章中我们详细的讲解了信号的产生和信号的保存,今天来到最后一个重点信号的处理,对于信号的处理我们会重新引入进程地址空间的知识,并且我们会详细的介绍内核是如何对信号进行捕捉的以及什么是可重入函数。以上就是我们信号处理的所有内容了,对于信号处理这个章节我们需要理解进程地址空间以及内核是如何进行信号捕捉的,下一篇我们发布的linux文章是线程。原创 2023-05-13 20:05:37 · 3231 阅读 · 121 评论 -
【Linux】单机版QQ之管道中的命名管道
命名管道是什么呢?管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件。命名管道可用于同一主机上的任意进程间通信,并且管道通信的本质是通过内核中一块缓冲区(内存)时间数据传输,而命名管道的管道文件只是一个标识符,用于让多个进程能够访问同一块缓冲区,并且管道是半双工通信,是可以选择方向的单向通信。命名管道和匿名有一个相同点,就是他们的本质都是内核中的一块缓冲区。原创 2023-05-05 17:57:10 · 2179 阅读 · 99 评论 -
【Linux】信号的保存
首先我们先引出一个新的概念,叫核心转储。linux系统提供了一种能力,操作系统可以将一个进程在异常的时候将核心代码部分进行核心转储,将内存中进程的相关数据全部dump到磁盘中,一般这个文件会在当前进程的运行目录下,形成core.pid这样的二进制文件。当然如果我们使用的是云服务器的话,这个核心转储功能是默认关闭的,但是我们可以通过命令将这个功能打开:使用命令:ulimit -a 查看当前系统中特定资源对应的上限。原创 2023-05-11 15:17:45 · 3429 阅读 · 109 评论 -
【Linux】进程信号“疑问?坤叫算信号吗?“
信号在我们生活中很常见,下面我们举一举生活中信号的例子:你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解成“在合适的时候去取。原创 2023-05-09 19:00:32 · 2740 阅读 · 149 评论 -
【Linux】如何实现单机版QQ,来看进程间通信之管道
为什么要进行进程间通信呢?因为需要以下这些事:数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。管道读写规则:当没有数据可读时:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。read。原创 2023-05-02 18:47:18 · 2536 阅读 · 113 评论 -
【Linux】进程间通信之共享内存
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据.使用ipcrm -m 命令删除指定共享内存后,是不会直接释放共享内存的,因为共享内存的生命周期是随操作系统的,只有共享内存当前的映射链接数为0才会被删除释放。使用ipcrm -a 可以删除所有进程间通信资源(a代表all也就是全部的意思)ipcrm -m删除共享内存,-q删除消息队列,-s删除信号量。原创 2023-05-06 16:29:41 · 1480 阅读 · 127 评论 -
【linux】:老师问什么是爱情,我说了句:软硬链接和动静态库
上一篇文章的最后我们讲解了文件的inode,那么文件名和inode有什么区别呢?区别就在于linux系统只认inode号,文件的inode属性中,并不存在文件名,而文件名其实是给用户用的。我们以前讲过linux文件目录,那么目录是文件吗?答案是是的,目录也是文件,并且目录也有inode,任何一个文件一定在目录里面,所以目录的内容是什么呢?原创 2023-04-17 19:12:20 · 3263 阅读 · 152 评论 -
【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习
经过我们上一篇对linux系统文件操作的学习想必我们已经会使用系统文件接口了,今天我们就用系统文件接口来封装一个像C语言库那样的文件操作函数的函数来加深我们对文件操作的学习。本篇文章的主要内容是在上一篇文件操作的基础上再次深刻理解系统文件操作,然后我们又大致讲解了磁盘的物理空间是什么样的是如何存储数据的,通过软硬件共同学习我们能知道文件的各个属性在磁盘中是如何存储的,每个分区又有什么块的知识,下一篇文章我们将详细介绍文件的软硬链接。原创 2023-04-13 14:57:37 · 1338 阅读 · 77 评论 -
【linux】:进程控制
了解上一篇文章中的进程地址空间后,我们再来说说进程控制的概念,进程控制我们需要搞清楚三个问题:如何进程终止,如何解决僵尸进程问题以及写时拷贝的问题。原创 2023-03-22 20:04:55 · 1520 阅读 · 64 评论 -
【linux】:进程地址空间
本篇文章接着上一篇文章继续讲解进程,主要讲述了进程在运行过程中是如何在内存中被读取的以及为什么要有虚拟地址的存在,CPU在运行过程中是拿到程序的虚拟地址还是真实的物理内存。本篇文章的重点是如何理解虚拟内存,我们通过画图的方式展示了进程地址空间,并且提到了虚拟内存的三个优点:1.将进程管理和内存管理进行解耦合 2.防止地址随意访问,保护物理内存与其他进程 3.可以让进程以统一的视角,看待自己的代码和数据。原创 2023-03-11 23:51:50 · 1493 阅读 · 76 评论 -
【linux】:进程状态(僵尸进程等)以及环境变量
文章目录前言 一.进程状态 进程的优先级 二.环境变量 总结前言 本篇文章是接着上一篇【linux】:进程概念的后续,对于有基础的同学可以直接看这篇文章,对于初学者来说强烈建议大家从上一篇的概念开始看起,上一篇主要解释了冯诺依曼体系以及操作系统的概念还有在linux系统中进程是什么样的,如何去查看一个进程,如何给一个进程多开一个子进程以及为什么fork()函数可以有两个返回值的问题。一、进程状态为了能更深刻的理解linux中的进程状态,我原创 2023-03-04 21:18:46 · 1884 阅读 · 88 评论 -
【linux】:进程概念
文章目录冯诺依曼体系结构 一:操作系统 二: 进程 总结冯诺依曼体系结构我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。冯诺依曼体系如下图:那么输入设备有哪些呢?如键盘,鼠标,话筒,摄像头,磁盘等。存储器就是我们经常说的内存了。输出设备有网卡,声卡,音响等。cpu含有运算器和控制器等。那么为什么冯诺依曼要有内存呢?直接让输入设备连接cpu到输出设备不是更方便吗,大家看如果是下面这个体系怎么样?原创 2023-02-28 15:39:56 · 4765 阅读 · 72 评论 -
linux常用指令讲解
文章目录前言 一、指令详解 总结前言Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。严格来讲,Linux只是操作系统内核本身,但通常采用“Linux内核”来表达该意思。而Linux则常用来指基于Linux内核的完整操作系统,它包括GUI组件和许多其他实用工具。GNU通用公共许可协议(GNU General Public License原创 2023-01-02 17:27:35 · 2329 阅读 · 1 评论 -
整理了一周近万字讲解linux基础开发工具vim,gdb,gcc,yum等的使用
文章目录前言 一、yum的使用 二、vim的使用 三 . gcc/g++的使用 四 . gdb的使用 总结前言想用linux开发一些软件等必须要会的几种开发工具是必不可少的,在yum vim gcc gdb中指令繁杂的是vim和gdb这两个工具,至于yum和gcc的指令就比较简单了。一、yum的使用yum是linux的软件包管理器,那什么是软件包呢?软件包:在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到原创 2023-01-12 11:41:27 · 1957 阅读 · 1 评论