
Linux
文章平均质量分 94
Linux相关知识
iiiii空
千里之行,始于足下。
展开
-
IO多路转接之poll
poll 的优点:IO效率高:因为 poll 服务器可以一次性等待多个套接字就绪,而IO过程 = 等待事件就绪 + 拷贝数据,而 poll 会将多个套接字的等待时间进行重叠,换言之,在单位时间内,poll 服务器等待的比重是比较低的,因此,它的IO效率就高;有适合 poll 的应用场景:当有大量的连接,但只有少量连接是活跃的。因为 poll 服务器是单进程的,因此,对于 poll 服务器的维护成本非常低 (不需要维护过多的执行流),哪怕有非常多的连接,poll 服务器的成本也微乎其微,即节省资源。原创 2024-04-16 18:05:20 · 768 阅读 · 0 评论 -
Linux --- 高级IO
冯诺依曼体系:站在冯诺依曼体系的视角,从输入设备读取数据到存储器,这个过程就是Input;而将存储器的数据写入到输出设备,这个过程就是Output;因此,IO本质上就是访问外设的过程。因为外设相较于内存、cache缓存、寄存器、CPU的速率是比较低的,故IO的效率是比较低的,尤其涉及到网络,效率问题就更加突出。张三的钓鱼方式:阻塞式;李四的钓鱼方式:非阻塞轮询式;王五的钓鱼方式:信号驱动;赵六的钓鱼方式:多路转接 (或多路复用);田七的钓鱼方式:异步IO;这五种方式,我们称之为五种IO模型。原创 2024-04-16 18:05:03 · 682 阅读 · 0 评论 -
Reactor 模式
总结: Reactor服务器是一种常见的网络服务器架构,通常用于处理大量并发连接和请求。事件轮询:Reactor服务器采用了事件驱动的架构模式,其中包括一个主事件循环(Event Loop),负责监听和派发事件;多路复用:Reactor服务器通常使用多路复用技术来监听多个I/O通道的事件。这样可以在单进程中同时处理多个连接,提高服务器的性能和吞吐量;事件处理器:Reactor服务器通过事件处理器来处理不同类型的事件。每个事件处理器通常负责特定类型的事件,例如获取连接、读取数据、发送数据、异常事件等。原创 2024-04-22 23:14:28 · 1151 阅读 · 0 评论 -
IO多路转接之select
nfds:这个参数指定文件描述符集合中所有文件描述符的范围,其值是最大文件描述符值加 1。这是因为 select() 需要知道需要检查的文件描述符的数量范围。除开第一个参数 (nfds) 之外,后四个参数都是输入输出型参数。select 可以同时等待多个文件描述符,等待策略是可以选择的,通过 timeout 这个参数:如果 timeout 为 nullptr, 代表阻塞等待;如果 timeout 是 {0, 0},那么代表非阻塞等待;原创 2024-04-16 18:05:13 · 674 阅读 · 0 评论 -
LT 和 ET 模式
李四此时还有王五的一个快递,但李四就再也不主动联系王五了,这时,张三路过,告诉李四,我这里还有一个王五的快递,你帮我给他送了吧,李四说,行,此时李四就有两个快递了,(快递个数发生变化了),于是李四才联系王五说,有两个快递,下来取,不来我就走了,王五此时还在打决赛圈呢,但王五啥也不管,立刻直接放弃比赛,来到楼下,把剩下的两个快递取走了, 这是李四。李四拿了三个快递,来到了王五的楼下,给王五打电话📞,告诉王五,快递到了,快下来取快递,如果你不下来,我就走了 (只打一次电话,即只通知一次)。原创 2024-04-21 21:20:28 · 694 阅读 · 0 评论 -
IO多路转接之epoll
上面这一整套机制,我们就称之为 epoll 模型。当上层调用 epoll_create 时:体现在内核层上就是,构建红黑树、就绪队列、回调机制;当上层调用 epoll_ctl 时:对这颗红黑树进行操作 (增删改),比如增加,体现在内核就是,增加一个特定文件描述符关心的事件;原创 2024-04-18 21:57:07 · 1028 阅读 · 0 评论 -
如何从本地系统上传文件到远程系统和从远程系统下载文件到本地系统
即 sz proc (必要时,需要指明(相对/绝对)路径),随后,系统会弹出一个窗口,此时我们自己可以指定下载到本地的路径。要在 Linux 系统中使用 lrzsz 工具集,首先需要安装 lrzsz 软件包。安装完成后,你可以使用 rz。补充: 如果是文件夹,需要先将其打包压缩后,在进行下载。确认路径后,出现如下场景,即代表着下载到本地成功。命令从本地系统上传文件到远程系统,使用 sz。至此,我们就可以在远程和本地互相导入文件了。命令从远程系统下载文件到本地系统。我想将它下载到本地,如何下载呢?原创 2024-03-03 17:46:47 · 551 阅读 · 0 评论 -
Linux信号
在日常生活中,有那些信号相关的场景呢?例如:红绿灯、转向灯、闹钟、王者荣耀信号等等;上面都是一些生活中的一些信号;那么问题来了:你为什么可以识别这些信号呢?我们之所以能够识别一个信号,是因为:我们记住了对应场景下的信号 以及 当这个信号产生之后,后续是有 "动作" 需要我们去执行的!由于我们具有识别信号的能力,如果特定信号没有产生,但是我们依旧知道应该如何处理这个信号!原创 2024-01-18 12:17:02 · 1155 阅读 · 0 评论 -
多线程 --- [ 线程池、懒汉引发的线程安全问题、其他常见的锁 ]
pshared参数:PTHREAD_PROCESS_PRIVATE: 表示自旋锁是进程私有的,只能被创建它的进程中的线程使用。PTHREAD_PROCESS_SHARED:表示自旋锁是可跨进程共享的,可以被同一进程中的不同线程或不同进程中的线程使用。原创 2024-03-02 17:14:20 · 800 阅读 · 0 评论 -
多线程 --- 信号量
参数解释:sem_t 是 POSIX 标准中定义的信号量类型。pshared: 值为0时,该信号量将被线程共享;值为非0时,该信号量将被进程共享。value: 表示信号量的初始值。返回值:成功,返回0;失败,返回相应的错误码 (errno)。原创 2024-02-27 23:11:08 · 842 阅读 · 0 评论 -
多线程 --- [ 线程概念,线程控制 ]
答案是:不需要,因为我们说过,在多线程场景下,如果某一个执行流异常崩溃了,那么所有的执行流都会崩溃,因此,在进行线程等待的时候,我们不需要关心线程退出的异常,只要它不出问题,就万事大吉了,总而言之,在进行线程等待时,我们通常不需要特别关心线程退出的异常,只要保证线程能正常退出即可。由于Linux操作系统只提供了轻量级进程的接口,但是对于用户而言,他只能分辨线程和进程,他不懂什么是轻量级进程,因此,这种方案给用户带来了不便,因此考虑到自身操作系统的生态问题,因此它必须通过某种方式为我们提供完整的线程接口!原创 2024-02-05 22:57:32 · 1048 阅读 · 0 评论 -
多线程 --- [ 线程同步, 生产者消费者模型 ]
在生活中,我们应该是,第一次去了解,售货员说没有货,正常情况下,我们应该是加一下售货员的联系方式,让他在有货的情况下及时联系我!例如策略一: 某个执行流申请到了锁资源,进入临界区访问临界资源,当释放锁后,我们规定,这个线程不能立即在申请锁,而应该在等待锁资源的队列中排队 (队列的为尾部),让队列中的下一个线程去获取锁资源,这样我们就一定程度降低了饥饿问题发生的概率,并且我们可以保证让若干个线程按照一定的顺序去申请锁访问临界资源。在被唤醒后,它会重新获取互斥锁,并且认为该条件满足,继续执行后续的操作。原创 2024-02-22 18:31:07 · 1135 阅读 · 0 评论 -
多线程 --- 线程互斥
mutex:指向 pthread_mutex_t 类型的指针,用于指定待初始化的互斥锁对象。这个对象是由调用者分配的内存空间,函数会将该内存空间进行初始化以创建一个互斥锁。attr:指向 pthread_mutex_t 类型的指针,于指定互斥锁的属性。如果为 nullptr,则使用默认的属性,一般我们使用都是 nullptr,默认即可。因为是局部锁,因此,当生命周期结束时,需要我们手动销毁局部锁,以防止资源泄露。原创 2024-02-16 21:25:20 · 1238 阅读 · 0 评论 -
进程间通信
1、匿名管道是用来进行具有血缘关系的进程的进程间通信,常用于父子通信。2、管道实现了进程间协同,提供了访问控制。例如,子进程读取管道数据,父进程向管道写入数据时,如果此时管道没有数据,那么子进程会等待父进程向管道文件写入数据 (子进程会在 read() 系统调用内部阻塞),同理,如果父进程向管道中写入数据时,如果管道已满,父进程会暂停写入,等待子进程读取数据后再继续写入 (父进程会在 write() 系统调用内部阻塞)!这种机制确保了进程间的同步和数据的可靠传输。3、管道提供的是面向字节流的通信服务。原创 2023-12-27 21:49:38 · 1028 阅读 · 0 评论 -
基础IO --- 下
当我这个进程运行起来,且要使用动态库的方法的时候,需要将该动态库加载到物理内存,而加载这个动作是需要加载器帮助的,并且加载动态库的前提是需要知道动态库所在的路径,可是我们只是将动态库的路径告诉了 gcc 编译器,加载器不知道啊!有了上面的这些信息,那么就能够让一个文件的信息可追溯,可管理!静态库的优势在于它的便携性和可独立性,在分发可执行程序时不需要担心共享库版本的兼容性问题,但也因此导致了更大的可执行程序体积,且如果多个可执行程序共用了该静态库,可能导致内存中存在着大量的重复的代码,造成空间浪费!原创 2023-12-16 21:10:39 · 255 阅读 · 0 评论 -
基础IO --- 上
以"w"方式打开文件和以"a"方式打开文件,如果这个文件不存在,那么二者都会创建这个文件;如果这个文件存在,那么前者会先清空文件的内容,在进行写入,并且返回的文件指针指向文件的起始位置,而后者不会清空文件的内容,返回的文件指针指向文件的结束位置,在进行写入!!!可是现在问题又来了,我们说了这么多,这个文件描述符究竟是什么东西呢???它到底代表了什么呢???而在之前的测试过程中,我们发现,文件描述符是从0开始,递增的整数,那么我们会联想到什么呢???数组的下标!!!原创 2023-12-12 17:17:48 · 692 阅读 · 0 评论 -
Linux --- 进程控制
在以前学习C/C++的过程中,为什么我们的main的返回值大多数情况下都是0呢?这个0代表着什么意思呢?答案是:首先,这里的main的返回值并不是只能是0,其次这里的这个整数代表着这个进程的退出码!!!补充:根据C和C++的标准规定:main 函数必须具有返回类型为 int。返回值的作用是向操作系统指示进程的执行状态,通常 0 表示进程正常终止且结果正确,非零值表示进程正常终止且结果错误!!!原创 2023-12-03 19:47:53 · 318 阅读 · 0 评论 -
Linux基础命令
指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。注意:Linux没有回收站,删了就是删了(恢复成本高),使用 rm -rf 一定要谨慎,要知道自己在干什么,删了之后的结果是什么。命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。原创 2023-08-26 21:54:26 · 244 阅读 · 0 评论 -
Linux权限
目录1. shell运行原理2. Linux权限2.1.root用户和普通用户如何互相切换2.2.权限2.3. 权限的修改2.3.1. 如何理解文件的所属组2.3.2 如何表达一个文件的权限:2.3.3. 如何操作2.3.3.1. 更改属性2.3.3.1.1. 方案一(利用ugoa+rwx)2.3.3.1.2. 方案二(八进制方案)2.3.3.1.3. 如果一个文件没有权限是什么样子的呢2.3.3.2. 更改人2.3.3.2.1.原创 2023-08-29 02:23:57 · 165 阅读 · 0 评论 -
Linux工具
版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。版本控制最主要的功能就是追踪文件的变更。即对历史版本进行修改前,会对历史版本进行备份,在对历史版本进行修改,且此时文件的版本号都会增加。版本控制器:git与svn。原创 2023-08-31 21:20:42 · 346 阅读 · 0 评论 -
Linux进程-上
2.认识OS及相关概念3.进程概念4.fork()的理解和使用5.进程状态。原创 2023-07-10 14:23:29 · 386 阅读 · 1 评论 -
Linux进程-下
1. 进程的优先级是什么?PRI (priority) 优先级cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的Linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能为什么?CPU资源太少,本质是分配资源的一种方式怎么查看优先级?ps -alUID :代表执行者的身份PID :代表这个进程的代号PPID。原创 2023-07-12 14:14:25 · 206 阅读 · 1 评论