![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 95
这是Linux的全部知识。
2022horse
慢慢学编程
展开
-
【Linux】线程池
线程过多会带来调度开销,进而影响缓存局部和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。线程池常见的应用场景如下:总结:下面我们实现一个简单的线程池,线程池中提供了一个任务队列,以及若干个线程(多线程)。(2)为什么线程池中需要有互斥锁和条件变量?线程池中的任务队列是会被多个执行流同时访问的临界资源,因此我们需要引入互斥锁对任务队列进行保护。线程池当中的线程要从任务队列里拿任务,前提条件是任务队列中必须要有任务,因此线程池当中的线程在拿任务之前,需要先判断任务队列当中是否有任原创 2024-01-31 11:57:48 · 1265 阅读 · 0 评论 -
【Linux】信号量
此时由于生产者生产的很快,运行代码后一瞬间生产者就将环形队列打满了,此时生产者想要再进行生产,但空间资源已经满了,于是生产者只能在blank_sem的等待队列下进行阻塞等待,直到由消费者消费完一个数据后对blank_sem进行了V操作,生产者才会被唤醒进而继续进行生产。虽然消费者消费的很快,但一开始环形队列当中的数据资源为0,因此消费者只能在data_sem的等待队列下进行阻塞等待,直到生产者生产完一个数据后对data_sem进行了V操作,消费者才会被唤醒进而进行消费。原创 2024-01-31 09:51:02 · 1492 阅读 · 0 评论 -
【Linux】生产者消费者模型
生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以生产者生产完数据之后不用等待消费者处理,直接将生产的数据放到这个容器当中,消费者也不用找生产者要数据,而是直接从这个容器里取数据,这个容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个容器实际上就是用来给生产者和消费者解耦的。我们仍然让生产者生产的快,消费者消费的慢。运行代码后生产者还是一瞬间将阻塞队列打满后进行等待,但此时不是消费者消费一个数据就唤醒生产者线程,而是当阻塞队列当中的数据小于队列容器的一半时,才会唤醒生产者线程进行生产。原创 2024-01-30 11:36:31 · 705 阅读 · 0 评论 -
【Linux】线程安全
当然了,假如我们这个单执行流申请锁申请了两次,第一次是申请成功了,而第二次申请锁的时候该锁已经被申请过了,是申请失败导致被挂起直到该锁被释放时才会被唤醒,但是这个锁本来就在自己手上,自己现在处于被挂起的状态根本没有机会释放锁,所以该执行流将永远不会被唤醒,此时该执行流也就处于一种死锁的状态。在运行等待队列中的进程本质上就是在等待CPU资源,实际上不止是等待CPU资源如此,等待其他资源也是如此,比如锁的资源、磁盘的资源、网卡的资源等等,它们都有各自对应的资源等待队列。原创 2024-01-29 12:25:17 · 1213 阅读 · 0 评论 -
【Linux】多线程
在一个程序里的一个执行路线就叫做线程(thread)。线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。需要明确的是,一个进程的创建实际上伴随着其进程控制块(task_struct)、进程地址空间(mm_struct)以及页表的创建,虚拟地址和物理地址。原创 2024-01-27 11:43:05 · 1008 阅读 · 0 评论 -
【Linux】Linux任务管理与守护进程
有了上述创建守护进程的代码,要模拟实现daemon函数就很容易了,我们只需要设置两个参数nochdir和noclose,当所给nochdir为0时,我们将守护进程的工作目录该为根目录,当所给noclose为0时,我们则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null即可。当我们用Xshell或是终端登录时,本质都是先创建一个bash进程,整体称之为一个会话(所有的命令行的进程都是bash的子进程),所有的命令行启动的任务都是在对应的会话内运行的。,也就意味着该进程已经与终端去关联了。原创 2024-01-26 14:45:08 · 1153 阅读 · 0 评论 -
【Linux】31个普通信号
SIGKILL和SIGSTOP。SIGKILL和SIGSTOP。原创 2024-01-26 10:38:55 · 485 阅读 · 0 评论 -
【Linux】进程信号
执行该信号的默认处理动作。提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。忽略该信号。sudo yum install man - pages // 下载man手册 man 7 signal在云服务器中,核心转储是默认被关掉的,我们可以通过使用ulimit -a命令查看当前资源限制的设定。core文件是0,那么表示核心转储是被关闭的。我们可以通过命令来设置core文件的大小。原创 2024-01-25 18:33:20 · 1235 阅读 · 0 评论 -
【Linux】Linux进程间通信
进程间通信简称IPC(Interprocess communication),进程间通信就是在不同进程之间传播或交换信息。管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”我们可以用who | wc -l的命令看当前使用云服务器上的登录用户个数。who命令用于查看当前云服务器的登录用户(一行显示一个用户),wc -l用于统计当前的行数。原创 2024-01-23 20:37:54 · 1079 阅读 · 0 评论 -
【Linux】动静态库
1、静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。2、动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。3、在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)。原创 2024-01-21 18:39:40 · 1006 阅读 · 1 评论 -
【Linux】基础IO
先说结论:当前路径不是指可执行程序所处的路径,而是指该可执行程序运行成为进程时我们所处的路径。换而言之,是先有进程(进程是可执行程序跑起来形成的!!!)才来的路径。此时我们在进行删除这个.txt文件后再在上一个路径进行跑可执行程序的时候,我们看一下我们的.txt文件在那边进行创建。我们看下面的磁带,是一圈一圈卷起来的,但我们将其拉直伸开,那么不就是一个线性的结构吗,所以,磁盘是一个线性的结构。原创 2024-01-20 17:45:49 · 921 阅读 · 0 评论 -
【Linux】进程控制
当子进程被父进程fork的时候,也就是子进程被创建的时候,此时子进程是共享父进程的代码和数据的,而当子进程进行进程程序替换的时候,也就是意味着子进程被写入了,所以子进程和父进程所共享的代码和数据需要进行写时拷贝了,这就确保了进程的独立性,然后父子进程的代码也就分离了,因此子进程进行程序替换后不会影响父进程的代码和数据。我们从上面的截图中看到,子进程创建完了以后需要退出了,是一个退出信息给父进程,父进程去接收,然后再双双退出,而父进程不能做任何事情,那么我们称之为阻塞状态,也就是阻塞等待。原创 2024-01-18 14:39:36 · 977 阅读 · 0 评论 -
【Linux】环境变量
本地变量不会被子进程继承,只在本bash内部有效。内建命令属于shell执行的一部分,因此执行内建命令不需要创建子进程,也不需要打开程序文件,这样不用操作文件IO,执行效率高,运行快。MYVAL=100接下来有一个奇葩的现象,echo是bash的子进程没毛病,我们不是说本地变量MYVAL不会被子进程继承吗?我们的命令echo后面不是需要创建一个子进程吗?那么我们的echo $MYVAL需不需要创建一个子进程?为什么最终echo运行的时候把本地变量给打印出来了?原创 2023-09-08 22:34:45 · 352 阅读 · 0 评论 -
【Linux】进程概念
讲了那么多概念和PCB,那什么是进程呢?进程 = 对应的代码和数据 + 进程对应的PCB结构体// 进程的全部属性信息 };在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。// 进程的全部属性信息 };task_ struct内容分类标示符: 描述本进程的唯一标示符,用来区别其他进程。状态: 任务状态,退出代码,退出信号等。优先级: 相对于其他进程的优先级。原创 2023-09-07 22:00:18 · 73 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具使用(gdb调试和git的使用)
我们在前面讲完gcc 和 g++的基本使用以后,我们开始讲解gdb和git的使用!原创 2023-06-05 23:53:23 · 154 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具使用(gcc/g++使用)
我们进入gcc/g++章节,下面我们用myfile.c文件进行讲解展示。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?进来一看!原创 2023-06-03 14:28:04 · 341 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具使用(yum和vim)
我们今天重点内容讲了yum的生态环境,这是恒关键的,一个好的环境对于我们程序员和用户来讲是很关键也是很重要的;最重要的是我们今天讲了vim,讲了一些简单的又常用的命令行提示和环境的配置,大家尽量用大佬提供的插件更加好一点,因为插件里面的vim配置更加好。原创 2023-05-21 09:25:40 · 644 阅读 · 1 评论 -
【Linux】权限
权限的概念似乎很简单,就是一个进入和不进入的区别,可是我们想一个很重要的点,难道真的那么简单吗?答案是否定的,因为里面的细节包含的实在是太多了。原创 2023-05-15 21:46:09 · 119 阅读 · 1 评论 -
【Linux】指令(下)
今天的指令内容讲解难度过于大,我们会讲解时间、日历、查找、筛选、压缩等指令,让大家对于指令理解地更加透彻,尤其是最后讲shell命令及其运行原理更加让大家理解好指令的本质。我们学习好Linux的前提是要好好练习指令,经常性地敲指令,把这个指令练熟并且知道这些本质。原创 2023-05-14 19:58:54 · 207 阅读 · 0 评论 -
【Linux】指令(上)
推荐大家使用云服务器+xshell,这样方便我们学习,更加地简单学习,在本节会讲解很细很杂的不同的指令,系统的将每个指令常用的选项进行展示归纳功能,推动大家进入Linux的基础学习。在讲解完基础的指令以后,大家可以动手试一试这些指令,当然,后续还有很多的指令和知识需要设计,需要爬坡了,大家点赞多多!!!原创 2023-04-27 23:03:17 · 295 阅读 · 0 评论