Linux系统
文章平均质量分 64
Linux系统的干货知识
爱敲代码的奇点
兴趣编程,热爱编程
展开
-
Ubuntu下Xshell连接腾讯云服务器
1.在腾讯云上买好服务器后,找到控制台,找到自己的服务器重置密码,默认用户名时ubuntu。添加好了之后,就按照上面连接Xshell的方法把用户名改了就行。然后出现一个秘钥接受,直接接受就好了,然后就出现下面。下面就是直接让你设置普通用户的密码了。2.在Xshell连接服务器。useradd 用户名。userdel 用户名。查看当前服务器的用户。原创 2024-11-14 20:34:18 · 287 阅读 · 0 评论 -
【高级IO】epoll的惊群效应
epoll惊群效应主要发生在多进程(或多线程)环境中,当多个进程(或线程)同时阻塞等待同一个事件(如客户端连接请求)时,如果事件发生,就会唤醒所有等待的进程(或线程)。然而,由于事件只能被一个进程(或线程)处理,其他进程(或线程)在获取事件失败后会重新进入休眠状态。这种现象不仅浪费了系统资源,还降低了服务器的性能,被称为惊群效应。原创 2024-10-28 20:26:38 · 279 阅读 · 0 评论 -
【高级IO】IO多路转接之epoll
epoll有2种工作方式水平触发(LT)和边缘触发(ET)水平触发(LT):LT模式是epoll的默认触发模式。在这种模式下,当文件描述符的状态发生变化时,内核会通知用户空间。如果用户空间没有及时处理该事件,内核会继续通知用户空间,直到事件被处理为止。这种模式的优点是编程简单,出错概率较小;缺点是可能会产生多余的通知,降低效率。总结:事件就绪一直通知边缘触发(ET):ET模式是一种高速触发模式,只支持非阻塞socket。在这种模式下,当文件描述符的状态从未就绪变为就绪时,内核会通知用户空间一次。原创 2024-10-28 20:06:04 · 781 阅读 · 0 评论 -
【高级IO】IO多路转接之poll
fds是一个poll函数监听的结构列表. 每一个元素中, 包含了三部分内容: 文件描述符, 监听的事件集合, 返回的事件集合.nfds表示fds数组的长度.timeout表示poll函数的超时时间, 单位是毫秒(ms).返回值小于0, 表示出错;返回值等于0, 表示poll函数等待超时;原创 2024-10-28 10:15:40 · 337 阅读 · 0 评论 -
【高级IO】IO多路转接之select
我们知道IO = 等待 + 拷贝,系统提供select函数来实现多路复用输入/输出模型;select系统调用是用来让我们的程序监视多个文件描述符的状态变化的;程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变,才进行拷贝。select是负责等待文件描述符就绪的,文件描述符就绪了才交给下面拷贝是需要监视的最大的文件描述符值+11.分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合,2.为结构timeval,用来设置select()的等待时间,原创 2024-10-26 00:04:22 · 1070 阅读 · 0 评论 -
【高级IO】非阻塞IO
一个文件描述符, 默认都是阻塞IO,通过fcntl把阻塞文件描述符改为非阻塞传入的cmd的值不同, 后面追加的参数也不相同我们此处只是用第三种功能, 获取/设置文件状态标记, 就可以将一个文件描述符设置为非阻塞.原创 2024-10-25 19:25:57 · 297 阅读 · 0 评论 -
【高级IO】五种IO模型
高效的IO是在单位时间内,等待的比重越小,效率就越高。几乎所有的提高IO效率的策略,本质就是这个原创 2024-10-25 17:36:10 · 528 阅读 · 0 评论 -
【线程】自旋锁和读写锁
以前所讲的是挂起等待锁,申请锁成功继续执行,申请失败挂起等待挂起等待和唤醒是需要时间的,有没有一种锁不会挂起等待呢?那就是自旋锁,申请锁失败它不会挂起,他会轮询,一直让我们的线程申请锁以前用的接口lock就是挂起等待的,而trylock是会立即返回,不会挂起等待,用trylock的时候我们可以用循环来让他轮询一直让我们的线程申请锁然后pthread库也提供了另一种锁的接口是不是发现它也有trylock的版本,是不是有疑问了?原创 2024-09-25 20:38:23 · 467 阅读 · 0 评论 -
【线程】线程安全的单例模式
IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是设计模式。下面把这一篇文章的线程池改为懒汉模式的单例,改动了构造和析构函数,防止构造出第二个对象,多了一个静态的类的指针成员,来获取这个类。第一次调用 GetInstance 的时候, 如果两个线程同时调用, 可能会创建出两份 T 对象的实例.单例模式是一种 "经典的, 常用的, 常考的" 设计模式.原创 2024-09-25 19:40:58 · 588 阅读 · 0 评论 -
【线程】线程的封装
C++提供有线程库,他的底层其实也是用原生线程库封装的。下面直接看看C++提供的线程库的基本使用。下面直接进行封装,看看是怎么封装的。原创 2024-09-25 17:44:03 · 195 阅读 · 0 评论 -
【线程】线程池
线程池是创建出一堆线程,类似于池,创建出线程池,提前创建出一批线程,当有任务的时候,就可以直接交给线程池处理,这样可以很好的提高效率。池化技术,弄一个池,预先弄好资源,当有比如任务来的时候,就交给这个池,就可以很快的处理任务。大家可以拷贝到VS Code下来看。下面利用原生线程库来实现线程池。原创 2024-09-25 16:57:27 · 505 阅读 · 0 评论 -
【线程】POSIX信号量---基于环形队列的生产消费者模型
POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步原创 2024-09-25 15:21:06 · 1042 阅读 · 0 评论 -
【线程】线程的同步---生产消费者模型
理解条件变量和生产者消费者模型原创 2024-09-22 18:51:58 · 1129 阅读 · 0 评论 -
【线程】线程的互斥---互斥锁
多线程执行流共享的资源就叫做临界资源:每个线程内部,访问临界资源的代码,就叫做临界区:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成,没有正在做的概念。原创 2024-09-20 16:33:56 · 698 阅读 · 0 评论 -
【线程】线程的控制
线程的控制:线程的创建,线程的终止,线程的等待,线程的分离,创建多线程原创 2024-09-18 10:10:03 · 1246 阅读 · 0 评论 -
【线程】线程的概念
计算的是在物理内存的偏移量。用10位比特位说明项目录二级页表表项有1024个,用12位是刚刚好符合物理内存划分为很多个块,每个块是4KB,这样算出的偏移量就不会超过这个大小。其实每个页表里还会有一部分来说明权限其他问题的,我们不说一个进程是不会把进程空间全部用完的,也就是说项目录里的表项没有全部填满,对应的二级页表也就没有1024个,这样页表用的空间就没有那么大int a =10;原创 2024-09-15 11:18:48 · 884 阅读 · 0 评论 -
【信号】SIGCHLD信号--了解
事实上,由于UNIX 的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调用sigaction(也可以用signal)将SIGCHLD的处理动作置为SIG_IGN,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。系统默认17号信号的处理动作是忽略动作和用户用sigaction函数自定义的忽略 通常是没有区别的,但这是一个特例。,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在。原创 2024-09-13 16:05:09 · 297 阅读 · 0 评论 -
volatile关键字
当进行循环判断以及逻辑反运算时,都需要运算器计算,要被加载到CPU中,优化导致flag变量优化到了CPU的寄存器中,因为优化导致内存不可见,CPU不会从内存读数据,你修改的flag为1,在内存里修改的,对于CPU是不可见的,CPU就认识寄存器中flag,所以就一直死循环。有些编译器在release下,是会对代码自动优化的,而g++编译器是不会自动优化,要带选项。在优化条件下, flag变量可能被直接优化到CPU内的寄存器中。往下翻,-O选项,编译器优化选项,数字代表优化级别。发现进程不会退出了,为什么呢?原创 2024-09-13 15:11:54 · 240 阅读 · 0 评论 -
可重入函数
main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的 时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换到sighandler函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的两步都做完之后从sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续 往下执行,先前做第一步之后被打断,现在继续做完第二步。2.调用了标准I/O库函数。原创 2024-09-13 11:38:47 · 227 阅读 · 0 评论 -
main函数的三个参数
main函数有三个参数原创 2024-04-04 20:12:51 · 262 阅读 · 0 评论 -
【进程间通信】共享内存
共享内存是内存的一部分,进程间通过共享内存通信首先申请共享内存,然后再把共享内存挂接到自己的进程地址空间(虚拟地址)的共享区,返回首地址。原创 2024-09-04 17:41:20 · 213 阅读 · 0 评论 -
【基础IO】文件重定向的原理
总的来说,stdout是打印常规信息,stderr是打印错误信息,都是向显示器打印,只是信息不同,和文件描述符不同。我们发现,本来应该输出到显示器上的内容,输出到了文件 myfile 当中,其中,fd=1。假如我们要把常规信息放在一个文件,错误信息放一个文件,怎么做?当你把1号关闭,那么新打开的文件的描述符是1了,而不是3了。它们都是显示器文件,一个是1号,一个是2号,有什么区别呢?stdout是标准输出,stderr是标准错误。运行一下,发现没在屏幕上,在文件中。可以利用dup2来完成重定向。原创 2024-08-23 20:12:41 · 348 阅读 · 0 评论 -
【基础IO】软硬链接
上面我们发现,建立的软链接文件的inode编号和指向文件不同,而建立的硬链接文件inode编号没变,为什么呢?ln -s 指向的文件 软连接文件。ln 原来文件 硬连接文件。为什么不能给目录创建硬链接?原创 2024-08-27 16:32:36 · 129 阅读 · 0 评论 -
【进程】进程的替换
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以。进程替换不仅可以替换为系统程序,还可以替换自己写的程序,也就是说C++的程序经过替换可以替换成其他语音的程序。e可以理解为环境的意思,就是说这个函数可以传递环境变量。p代表path,就是已经知道环境变量了,会自动搜索路径。,从新程序的启动例程开始执行。当进程调用一种exec函数时,该进程的。l可以理解为list,表示参数使用列表。,所以调用exec前后该进程的id并。exec系列函数有6个。原创 2024-08-22 09:57:22 · 204 阅读 · 0 评论 -
【信号】信号的产生
就是数组,内容是某个中断号对应方法的地址,CPU拿到中断号,就找到对应的方法,OS就会知道,OS就会实现对应的方法,假如是读取键盘的方法,那么OS就会从键盘读取数据到键盘缓冲区里。我们生活中的红绿灯,闹钟,外面电话等等这些都是信号,我们是怎么认识这些信号的,我们认识这些信号,并且知道这些信号的处理方法,对于进程来说,也会认识相应的信号。给进程设置一个闹钟,时间一到闹钟就响,就会向进程发送14号信号,进程退出,返回值是闹钟的剩余时间,可以不用管。,信号本来是有默认动作的,用了这个函数可以自定义信号的动作。原创 2024-09-08 20:49:57 · 938 阅读 · 0 评论 -
【进程间通信】命名管道
匿名管道是具有血缘关系的进程才能使用,如果是没有任何关系的进程,就用进行通信。命名管道是具有名字的管道文件,也是一种内存级文件,不用刷新到磁盘问题:如果两个不同的进程打开同一个文件,在内核里,操作系统会打开多少个文件呢?1个那么这两个进程怎么知道是同一个文件呢?通过同一路径下的同一个文件=路径+文件名(具有 唯一性)命名管道的原理和匿名管道一样的,打开同一个文件,一个读,一个写。原创 2024-09-04 10:57:51 · 351 阅读 · 0 评论 -
【信号】信号的保存
实际执行信号的处理动作称为信号从产生到递达之间的状态,称为。进程可以选择(Block )某个信号。被阻塞的信号产生时将保持在,直到进程对此信号的阻塞,才执行递达的动作.,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。进程在接收到信号之后,可能不处理,那么信号就会保存,等到合适的时候再进行处理,一般这个信号会保存在一张位图里,这个,比特位的0和1代表信号比特位的位置代表,所谓保存信号就是修改这张位图的内容,OS是进程的管理者,它才有资格修改这张位图的内容。原创 2024-09-12 19:53:07 · 950 阅读 · 0 评论 -
【进程间通信】管道应用场景---简易进程池
【代码】【进程间通信】管道应用场景---简易进程池。原创 2024-09-01 20:47:20 · 252 阅读 · 0 评论 -
【进程间通信】匿名管道
管道的四种情况可以写代码自己看看。原创 2024-09-01 17:36:15 · 298 阅读 · 0 评论 -
Linux服务器选择和购买--学生
有腾讯云,阿里云,华为云。原创 2024-02-29 11:34:17 · 238 阅读 · 0 评论 -
【基础IO】用户级缓冲区
到了fork之后,创建子进程,本来数据是父子进程共享的,但是程序退出,要把缓冲区的内容刷新出去,发生。,这样就生成了两份,write是系统接口,不会进入缓冲区,也就不会有两份。在FILE这个结构体中除了有文件描述符,还定义有缓冲区。当我们重定向到文件里面,刷新策略就变成了。简单模拟实现一个缓冲区的代码,供我们理解。这个缓冲区在哪里呢?原创 2024-08-24 10:13:53 · 211 阅读 · 0 评论 -
Linux权限问题
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。假设默认权限是mask,则实际创建的出来的文件权限是: mask &~umask。说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。这好像不太科学啊, 我张三创建的一个文件, 凭什么被你李四可以删掉,就是可以,由于目录的可写权限。可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个。可写权限: 如果目录没有可写权限, 则无法在目录中创建文件,原创 2024-03-05 20:31:00 · 851 阅读 · 0 评论 -
【进程】进程的状态
一个进程退出,但是它的资源还不允许被操作系统释放,处于被检测状态 ,只能由操作系统和父进程释放,所以如果一直不释放会导致内存泄漏,可以用进程等待来进行处理。父进程先退出,子进程后退出,子进程进入Z态,这个子进程就成了孤儿进程,他会被1号init进程领养,也由它回收。当对磁盘进行写入时,突然中断,这时磁盘就在一直等待写入,一直等,这个也叫不可中断睡眠,要自己慢慢等待结束。例如:子进程先退出,父进程还没退出,子进程就进入僵尸状态,父进程可以通过等待来处理子进程。PCB结构体在等待队列中,等待非CPU资源就续。原创 2024-04-04 19:36:52 · 296 阅读 · 0 评论 -
【基础IO】动静态库的制作和使用
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。原创 2024-08-29 15:31:50 · 352 阅读 · 0 评论 -
【信号】信号的处理
在信号递达时就调用这个函数,这称为。原创 2024-09-13 11:17:24 · 1196 阅读 · 0 评论 -
Linux的基本指令
2 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下。功能:查看文件内容,铺满屏幕就没有了,按enter继续向下显示,向下之后不能向上了。能理解就理解,不能就算了,后面学的多了就理解了。5 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义。-v :压缩的过程中显示文件!Linux下的目录是一个多叉树,到每一个文件的路径都是唯一的。原创 2024-02-29 17:46:01 · 1207 阅读 · 0 评论 -
简易日志类制作
当我们写代码的时候,需要打印日志的,就需要一个简易日志类来实现。vsnprintf的使用比较复杂,就按照代码那里那样写吧。第一个函数:打印信息函数 ,利用可变参数列表。日志包括:日志时间,日志等级,日志内容等等。怎么在代码中获取时间呢?warning:报警信息。error:错误信息。fatal:致命信息。debug:调试信息。原创 2024-09-04 15:28:28 · 169 阅读 · 0 评论 -
【进程间通信】System V--消息队列和信号量
里的队列就是数据结构里的队列,A进程通过数据块的形式发送给B进程,B进程也可以通过数据块的形式发送给A进程,这些数据块就在内存中以队列的形式来组织,A,B进程怎么知道哪个是自己的数据块呢?申请资源,本质是对cnt--,P操作,释放资源,本质是cnt++,V操作,申请和释放的PV操作是原子的,原子意思就是要么不做,做就做完,没有正在做的状态,这样的原子性就不会导致上面的问题。当一个执行流申请一个共享资源时,这个计数器就减减,当计数器减到0时,执行流就申请失败临界资源了,计数器资源就是计数器里的资源。原创 2024-09-08 11:48:41 · 437 阅读 · 0 评论 -
【基础IO】文件系统
当我们存入数据时,就是在磁盘的盘面上写0 1的二进制序列来保存信息。这样子就可以知道文件在磁盘的什么位置,怎么找到的了。磁盘是唯一的机械设备,属于外设。原创 2024-08-27 15:35:15 · 140 阅读 · 0 评论