
Linux
文章平均质量分 94
m0_72940975
在校大学生
展开
-
Reactor网络模式
可以在当前服务器的基础上接入线程池,当recver回调读取完数据并完成报文的切割和反序列化之后,就可以将其构建成一个任务然后放到线程池的任务队列中,然后服务器就可以继续进行事件派发,而不需要将事件耗费到业务处理上面,而放到任务队列当中的任务,则由线程池当中的若干个线程进行处理。下一次Dispatcher在进行事件派发的时候就会帮我们关注该套接字的写事件,当写事件就绪就会执行该套接字对应的EventItem结构中的写回调方法,进而将outbuffer中的响应数据发送给客户端。原创 2023-10-09 16:30:43 · 513 阅读 · 0 评论 -
【Linux】多路转接 -- epoll
struct epoll_event结构当中有两个成员,第一个成员events表示的是需要监听的事件,第二个成员data是一个联合体结构,一般选择使用该结构当中的fd,表示需要监听的文件描述符。epoll_ctl 函数用于向指定的epoll模型中注册事件,它不同于seletct()的一点就是,select在监听事件时告诉内核要监听什么类型的事件,而它是先注册要监听的事件类型。epoll的高性能,是有特定的场景的,如果场景选择不合适,epoll的性能可能适得其反。原创 2023-08-09 09:14:12 · 182 阅读 · 0 评论 -
【Linux】多路转接 -- poll函数
poll函数原型如下:原创 2023-08-07 22:32:50 · 1196 阅读 · 0 评论 -
【Linux】多路转接 -- select函数
多路转接也叫多路复用,是一种用于管理多个IO通道的技术。它能实现同时监听和处理多个IO事件,而不是为每个IO通道创建单独的线程或者进程,多路转接允许在单个进程或线程中同时处理多个IO操作,从而提高程序的性能和效率。本篇文章介绍的select函数,就用于select系统调用的多路转接技术。select函数是系统提供的一个多路转接接口。IO = 等待就绪 + 数据拷贝,而select是只负责等。参数说明:参数timeout的取值:返回值说明:select调用失败,错误码可能被设置为:fd_set 结构与 si原创 2024-07-31 12:20:16 · 1709 阅读 · 0 评论 -
【Linux】五种IO模型
其实,这个钓鱼场景中的各个事务都能与IO当中的相关概念对应起来,比如这里钓鱼的河对应就是内核,这里的每一个人都说进程或者线程,鱼竿对应的就是文件描述符或套接字,装鱼的桶对应的就是用户缓冲区。任何IO的过程,都包含等和拷贝这两个步骤,在实际的应用场景中“等”消耗的时间远比“拷贝”消耗的时间多,因此要让IO变得高效,就要尽可能减少“等”的时间。需要注意的是,这里问的是他们的钓鱼效率是否一样,而不是问他们整体谁做的事更多,如果说整体做事情的量的话,那一定是王五做的最多,李四次之,张三最少。原创 2023-08-04 15:46:50 · 457 阅读 · 0 评论 -
【Linux】线程池
当我们去处理任务时,创建线程去进行处理,然后释放线程资源,在下次再有任务时,再创建线程,这样反反复复效率是比较低的。我们可以发现这五个线程在处理时会呈现一定的顺序性,因为主线程是每秒Push一个任务,这五个线程只会有一个线程获取到该任务,其他线程都会在等待队列中进行等待,当该线程处理完任务后就会因为任务队列为空而排到等待队列的最后,当主线程再次Push一个任务后唤醒等待队列首部的一个线程,这个线程处理完任务后又会排到等待队列的最后,因此这五个队列在处理任务时会呈现一定的顺序性。:一种线程使用模式。原创 2023-07-19 22:46:11 · 159 阅读 · 0 评论 -
【Linux】生产者消费者模型 -- BlockQueue
生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以生产者生产完数据之后不用等待消费者处理,直接将生产的数据放到这个容器中,消费者也不用找生产者要数据,而是直接从这个容器里取数据,这个容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个容器实际上就是用来给生产者和消费者解耦的。其中,所有的生产者和消费者都会竞争式地申请锁,因此生产者和生产者,消费者和生产者,生产者和消费者之间都存在互斥关系。生产者和生产者,消费者和消费者,生产者和消费者,它们之间为什么存在互斥关系?原创 2023-07-17 16:35:04 · 298 阅读 · 0 评论 -
【Linux】线程安全
因为该执行流第一次申请锁的时候是申请成功的,但第二次申请锁的时候,因为该锁已经被申请过了,于是申请失败,导致被挂起知道该锁被释放时才会被唤醒,但是这个锁本来就在自己手上,自己现在处于被挂起的状态根本没有机会释放锁,所以该执行流永远不会被唤醒,此时该执行流也就处于一种死锁的状态。我们在上述简易抢票系统中引入互斥量,每一个线程要进入临界区之前都必须先申请锁,只有申请到锁的线程才可以进入临界区对临界资源进行访问,并且当下出临界区的时候需要进行解锁,这样才能让其余要进入临界区的线程继续竞争锁。原创 2023-07-16 23:54:27 · 269 阅读 · 0 评论 -
【Linux】线程详解
在一个程序里的一个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的控制序列”一切进程都至少有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流进程的创建伴随着进程控制块,进程地址空间以及页表的创建,虚拟地址和物理地址就是通过页表建立映射的。原创 2023-07-15 23:56:35 · 3101 阅读 · 0 评论 -
【Linux】进程信号
当涉及到Linux操作系统中的进程通信和控制时,信号(signal)是一个重要概念,它通常用于在进程之间传递通知和控制信息。信号可以被认为是一种异步通信机制,它允许一个进程向另一个进程发送一个特定的信号,并且接收进程可以采取适当的行动来相应该信号。进程可以发送信号给其他进程,也可以发送信号给自己。原创 2023-07-14 17:06:06 · 1554 阅读 · 0 评论 -
【Linux】进程间通信
根据以上代码,当进程A申请访问共享内存资源时,如果此时sem为1,则进程A申请资源成功,此时将sem减一,然后进程A就可以对共享内存进行一系列操作,但是在进程A访问共享内存时,若是进程B申请访问该共享内存资源,此时sem就为0了,那么此时进程B会被挂起,知道进程A访问共享内存结束后将sem加一,此时才会将进程B唤起,然后进程B再对该共享内存进行访问操作。实际上,管道是生命周期随进程的,而共享内存的生命周期是随内核的,也就是说进程虽然以及退出,但是曾经创建的共享内存不会随着进程的退出而释放。原创 2023-07-12 17:26:47 · 829 阅读 · 0 评论 -
【Linux】动静态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。动静态库的本质就是可执行程序的“半成品”我们知道,程序的编译要经过四个阶段,预处理,编译,汇编,链接。在汇编之后就会生成对应的二进制文件,这个时候它的后缀是为".o",比如test.c文件,在编译之后会生成test.o文件。在汇编之后生成的二进制文件还是不可执行的,要想执行它,必须再经过链接阶段。原创 2023-07-11 20:34:20 · 238 阅读 · 0 评论 -
【Linux】基础IO
这里说是短时间,是因为该文件的inode和数据块已经置为无效,在后续创建其他文件或者是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块分配出去,此时被删除的文件的数据就会被覆盖,也就无法恢复文件了。而删除文件只需要将文件的inode和数据块置为无效,无需真正地删除文件,因此拷贝文件是很慢的,而删除文件是很快的。磁盘就是这个样子,磁盘的两个面都是光的,叫做盘面,且被磁化处理过,磁盘上那个像刀一样的东西叫做磁头,磁头不是只有一个,磁盘的每一个面都有磁头。原创 2023-07-08 22:27:44 · 292 阅读 · 0 评论 -
【Linux】手写一个简易命令行解释器
Linux操作系统中,常用的Shell是bash,bash通常执行命令往往创建一个子进程再进程程序替换为指定的命令去执行(也有不是的情况,后面再说),这样做的好处就是一旦出现问题,由于进程的独立性,只有子进程会出问题,而bash进程不会受到任何影响。上图是Linux云服务器中的命令行解释器,可以看到,我们每次在键入命令时,前面都有一串字符,标识我们的用户,主机,路径等等。每次cd的时候,要创建子进程进行cd,子进程进程cd那么也只会改变子进程的cwd,由于进程具有独立性,它不会影响父进程!原创 2023-07-05 13:48:33 · 1104 阅读 · 0 评论 -
【Linux】进程控制
父进程等待子进程的完成,从而回收子进程的资源,就叫做进程等待。在进程等待期间,或许父进程什么也没做,也或许父进程做了一些其他的事情,这取决了程序员是如何调用的。我们进行进程等待,通常是为了解决子进程的僵尸进程问题。在子进程运行结束之后,父进程需要知道子进程运行的怎样并对子进程进行回收。如果父进程一直不管运行结束的子进程,子进程的资源也就会一直不被回收,这就会造成内存泄漏的问题。原创 2023-07-03 23:35:48 · 378 阅读 · 0 评论 -
【Linux】进程地址空间
操作,操作系统会了保证进程的独立性,就会在内存的另一块区域拷贝一份原有的资源,并改变页表的映射关系,然后把原来的共享数据拷贝到新的空间内,且此时父进程和子进程看到的就不是同一块资源了。大家在自己的虚拟地址内做操作,再将对应的操作映射到指定的物理地址上,从而保证进程的独立性。在运行一段时间之后,在子进程中改变全局变量a的值,但是父进程打印a的值却没改变,但是父子进程中变量a的地址又是相同的。Linux中存在一个写时拷贝的机制,在父进程创建子进程之后,子进程继承父进程的资源,此时父子进程看到的是同一块资源。原创 2023-07-02 11:17:08 · 234 阅读 · 0 评论 -
【Linux】环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数比如在我们编写C/C++代码的时候,在链接的时候,从来不知道我们所练级的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是相关环境变量帮助编译器进行差早环境变量通常具有某些特殊用途,还在系统当中通常具有全局特性再举个例子,系统中自带的指令,它本质上也是提前写好的程序,但是在使用的时候却不需要指定路径,这也是因为环境变量的作用bash是允许定义本地变量的,但定义的也只是本地变量而不是环境变量。我们用env查是查不到的。原创 2023-06-30 12:28:08 · 693 阅读 · 0 评论 -
【Linux】进程优先级
进程优先级是操作系统中用于确定进程执行顺序和资源分配的一个重要概念。每个进程都被赋予一个优先级,优先级教高的进程在竞争资源时更有可能被调度执行。不同的操作系统有不同的进程调度算法和优先级策略,但是一般来说,较高优先级的进程会获得更多的CPU时间片,并在资源分配方面享有更高的优先权。这可以确保重要的任务及时处理,并且可以提高系统的响应性能。原创 2023-06-29 12:13:05 · 529 阅读 · 0 评论 -
【Linux】进程状态
在CPU执行进程时,可能进程要去访问外设,但是外设资源此时被占用着,它要去等待外设就绪,而CPU此时也不再调度这个进程了,这时候这个进程不再处于运行状态,而是处于阻塞状态!**在CPU执行进程时,通过找到进程的PCB,从而找到进程的代码和数据,从而去执行这个进程的方法。这是Linux操作系统中进程状态的定义,通过注释可以看出,运行状态本质是就是一个整数,在进程的PCB中,这个整数是几,就代表这个进程是什么状态。提起操作系统中的进程状态,你脑海里可能有几种概念,比如运行,阻塞,挂起,等待,停止,死亡等。原创 2023-06-29 11:31:28 · 524 阅读 · 0 评论