
Linux
文章平均质量分 77
狱典司
异步但IO!
展开
-
mmap(内存映射)、sendfile() 与零拷贝技术
对于一个IO操作而言,都是通过CPU发出对应的指令来完成的,但是相比于CPU来说,IO的速度太慢了,CPU有大量时间处于等待IO的状态,因此就产生了DMA直接内存访问技术,本质上来说DMA就是一块主板上独立的芯片,通过它来进行内存和IO设备的数据传输,从而减少了CPU的等待时间,但是不论是谁来拷贝,频繁的拷贝耗时也是对性能的影响。一次简单的传统IO过程,发生了4次用户态和内核态的上下文切换,这在高并发场景下无疑会对性能产生极大的影响。原创 2023-01-07 11:42:11 · 2226 阅读 · 0 评论 -
共享内存原理与使用
不同进程之间共享的内存通常为同一段物理内存。就好比,我要和人solo(通信),我创建了一个房间(共享内存),这个房间就有了房间号(共享内存的ID),是个人都能进这个房间,根本没法通信,所以我们要设置房间密码。第一,和创建进程类似,进程被创建的时候,会被分配一个pid来标识这个进程的唯一性,同时也方便OS管理这些进程,因此共享内存在被创建的时候,会被分配一个“ID”来标识唯一性。第二,共享内存可以允许存在多个,为了区分这些共享内存,我们上面引入了“ID”的概念,但是要如何让两个进程连上同一个共享内存呢?原创 2023-01-07 11:33:47 · 1636 阅读 · 0 评论 -
进程间的8种通信方式
无名管道( pipe )、高级管道(popen)、有名管道(named pipe)、消息队列( message queue )、信号量( semophore ) 、信号 ( sinal ) 、共享内存( shared memory ) 、套接字( socket )。进程的亲缘关系通常是指父子进程关系。将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。原创 2023-01-07 11:26:59 · 2147 阅读 · 0 评论 -
虚拟地址空间相关知识网络(段页存储 -- MMU -- 虚拟地址 -- 内核区 -- 用户区)
段页式存储 ----> 逻辑地址到物理地址映射(MMU) ----> 进程地址空间(用户地址空间和PCB)-----> 缺页中断和缺页请求原创 2023-01-07 11:24:25 · 1511 阅读 · 0 评论 -
select、poll、epoll的简要对比
select的几大缺点:(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大(3)select支持的文件描述符数量太小了,默认是1024select 为什么是1024?—— 两个10241,select中存放文件描述符的数组大小FD_SETSIZE为10242,进程的文件描述符上限默认是1024,正是因为这个原因,select设计时才把数组大小设计为1024。原创 2023-01-07 11:14:11 · 897 阅读 · 0 评论 -
一台Linux机器上最多能建立多少个TCP连接?
但是就目前的TCP协议来说,显然这是不可能的,首先,不会有一台机器可以占用所有的ip,其次需要考虑机器是否能正常的打开2^16个端口,以及机器是否支持那么多的打开文件,最最最重要的是,机器能否有那么大的内存和CPU资源来维护这些TCP连接。ip(ipv4)数量的理论最大值,受限于ip的位数 ---- ip长度为32位,那么极限最优条件下(但没有这个可能)单机可以拥有2^32个ip地址,但这样就把世界上所有的ip都用光了。假如是4GB的内存,那么大约可接受的TCP连接数量是100万左右。.........原创 2022-08-12 21:40:21 · 1707 阅读 · 0 评论 -
浅记对于select多路IO网络模型性能调优和BUG解决方案
前些日子接手了一个老项目,是一个网络收发的linux socket程序,接收各地设备发来的数据,进行解码 – 处理数据 – 存数据 – 发数据的工作;项目代码业务逻辑处理没有问题,问题在于该代码运行一阵子之后就收不到数据了,但是进程仍然在跑,且用top命令查看cpu占用率极高,严重影响了云服务器的性能,分析之后,记录调优和debug的心得:这个程序采用了跨平台的多路IO转接函数 —— ,由于select函数设计的比较早,遗留了针对小规模多路IO的性能低下的问题,解决办法是通过用户代码逻辑添加一个额外的数组(原创 2022-06-12 19:45:07 · 434 阅读 · 0 评论 -
浅记线程池模型中多个线程对同个fd接收缓冲区读取争夺的方案
最近在复习实现和思考线程池的时候发现了一个问题:概括说就是 线程池+多路IO(epoll ET)+ 非阻塞轮询处理数据的场景下,同个fd(socket)高频率接收数据,可能导致线程池中多个线程争夺读取该fd接收缓冲区的情况,怎么处理?思考后得到如下的解决方案:............原创 2022-06-12 19:14:24 · 795 阅读 · 3 评论 -
Epoll 反应堆模型核心原理及代码讲解
epoll反应堆模型的三个要素:epoll ET模式非阻塞轮询处理结构体中联合体中的指针 – 实现回调机制socket、bind、listen – epoll_create 创建监听 红黑树 – 返回 epfdepoll_ctl() 向红黑树上添加一个listenfd(监听socket)while(1) {【可选】每轮迭代监测100个连接,若存在超时连接(沉积用户)则主动关闭; 监听 --> 对应监听fd有事件产生 --> 返回监听满足结构集 (即结构体数组);判断返回数组元素 :}原创 2022-06-08 19:23:25 · 834 阅读 · 0 评论 -
Epoll 原理及应用 && ET模式与LT模式
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。目前epell是linux大规模并发网络程序中的热门首选模型。epoll除了提供select/poll那种IO事件的电平触原创 2022-06-08 19:17:57 · 593 阅读 · 0 评论 -
简单封装一个linux socket服务端的listenfd初始化函数
简单封装一个linux socket服务端的listenfd初始化函数,方便快速调用:initlistensocket()参数说明 —— 服务器开启的监听端口 —— listen()函数的连接队列容量(两队列总容量) —— 置1则listenfd设为非阻塞,置0则默认阻塞initlistensocket()返回值暂时未做出错处理,initlistensocket()函数返回socket()函数的返回值,成功调用的情况下返回监听文件描述符......原创 2022-06-08 15:33:10 · 381 阅读 · 0 评论 -
可扩/减容线程池C语言原理讲解及代码实现
客户端相当于生产者,服务端相当于消费者。线程池相比较于传统的多线程模型,每次创建线程和销毁线程的开销是可以被节省的。故放弃每来一个请求就创建一个线程的机制,采用一次性批量产生线程的方式。所谓线程“池”,这个池是一个虚拟的概念,指的是产生的线程被保存在的可访问地址。当没有任务时,线程池里的线程都阻塞()在的条件变量上;当有客户端发来了任务/请求,server需要去唤醒池中的线程:被唤醒的线程从任务队列中取出任务并完成处理后,重新回到线程池中等待任务,即等待被唤醒。多路IO转接处理的是客户端怎么去和服务器建立原创 2022-06-05 20:40:18 · 939 阅读 · 0 评论 -
C语言用read封装/实现一个readline函数,读取文件一行 or 最后一行
#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <string.h>#include <fcntl.h>/* 读取fd的一行内容 */ssize_t readline(int fd, char *buf, ssize_t maxlen){ ssize_t count = 0; memset(原创 2022-04-05 22:19:29 · 3752 阅读 · 0 评论 -
Linux Shell脚本 && Linux C程序 获取指定的范围内 or 系统可用端口
这里写目录标题Linux Shell脚本 && Linux C程序 获取指定的范围内 or 系统可用端口一、源代码及其运行1. Linux C程序getPort.c源码运行示例2. 脚本文件 getPort.sh源码运行示例二、bash命令说明1. netstat命令2. awk命令3. wc 命令4. shuf命令Linux Shell脚本 && Linux C程序 获取指定的范围内 or 系统可用端口一、源代码及其运行1. Linux C程序getPort.c源码原创 2022-03-14 19:20:31 · 772 阅读 · 0 评论 -
Linux 查看 && 修改端口范围限制
1.显示当前临时端口的范围:sysctl net.ipv4.ip_local_port_range或 cat /proc/sys/net/ipv4/ip_local_port_range一般情形下:linux临时端口号范围是(32768,61000)2.暂时性修改临时端口的范围:#echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range或者 sudo sysctl -w net.ipv4.ip_local_port_range转载 2022-03-14 16:24:43 · 10596 阅读 · 0 评论 -
Linux C程序获取本机可用IP地址 && Linux C程序获取system()函数的标准输出到char *缓冲中
Linux C程序获取本机可用IP地址 &&Linux C程序获取system()函数的标准输出到char *缓冲中方法一:使用pipe匿名管道思路:fork一个子进程,并创建一个匿名管道,在子进程中执行shell命令,并将其标准输出dup到匿名管道的输入端,父进程从管道 中读取,即可获得shell命令的输出。char * get_ipaddr(){ int fd[2]; pipe(fd); int pid = fork();原创 2022-03-12 23:13:02 · 5154 阅读 · 0 评论 -
Ubuntu18.04下基于apache2部署Zend Framework 3 MVC框架【含BUG/问题解决】)
这部分的内容相关资料有一些旧了,存在一些版本问题,我把我遇到的问题统一整理到这篇博客中,供参考。更多的安装方式参考Zend Framework的官方资源:Zend Framework (github.com)下面是安装步骤:1.安装Apache2和PHP$ sudo apt-get update$ sudo apt-get upgrade$ sudo apt-get install apache2 $ sudo apt-get install mysql-server mysql-cli.原创 2022-02-03 21:45:51 · 791 阅读 · 0 评论 -
5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)
文章目录一、计算C语言的数据表示与处理计算C语言的基本运算操作内存表和符号表类型转换函数类型的分析指令复合指令句法函数函数激活(Activation Record)函数激活定义函数激活存储内容二、并发多道程序设计和分时Unix分时:存储的保存和加载中断(interrupt)时钟中断( Clock Interrupt )系统调用(system call)进程切换(上下文切换)分时的实现应用层并发三、程序、进程和线程什么是程序?什么是进程?进程的状态有哪些?其转换关系是怎么样的?进程什么时候开始产生/运行?什么原创 2022-01-07 22:05:08 · 4757 阅读 · 0 评论 -
用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)
用Unix / C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架前言服务器端源码客户端源码自定义库 helper.c 和 helper.hhelper.chelper.hMakefile文件使用前言由于作者本人最近在忙期末复习(KPI压力,害),目前暂时不对该代码的各类结构体、函数单独拎出来做分析了,这项工作等到这个月考完试之后在完成!代码的大部分内容都有比较详细的注释,这一个月内如果有读者有看不懂源码的地方可以在评论区提问,我看到会回复!如有误也欢迎批评指正!这个基于线程池和epol原创 2021-12-09 12:30:56 · 2095 阅读 · 1 评论 -
监控文件描述符的六种方式(进程监控、select、poll、非阻塞轮询I/O、异步I/O、线程监控)
监控文件描述的六种方式方法1:用进程来监控文件描述符方法2 :使用select来监视文件描述符select函数代码示例使用poll来监视文件描述符poll函数代码示例阻塞型读操作会使调用程序一直阻塞到输入可用为止。当进程要从多个源端接收输人时这样的阻塞会引起一些问题,因为进程无法知道下一个输入是由哪个文件描述符产生的。因为服务器需要从多个客户机接收输入,所以多文件描述符问题通常都出现在客户机-服务器结构的编程中。下面列出了POSIX中六种常见的监视多个文件描述符的输入的方法。1.每个文件描述符都由一个原创 2021-11-09 17:16:34 · 3830 阅读 · 0 评论 -
Unix系统编程 信号部分学习笔记
《Unix系统编程》Unix信号学习笔记一、 基础概念二、 信号的产生三、对信号掩码和信号集进行操作四、捕捉与忽略信号 —— sigaction五、等待信号 —— pause、sigsuspend和sigwait六、信号处理:错误和异步信号安全七、用siglongjmp和sigsetjmp进行程序控制一、 基础概念信号是对事件(小事件)相关进程的软件层面通知;有发出者和接收者(都是进程)–> 进程间通信信号实际类型:int信号的产生、递送、挂起:产生:导致信号发生的事件递送:传原创 2021-11-05 19:02:30 · 707 阅读 · 0 评论 -
linux之ps命令详解(查看进程结果)
ps命令为我们提供了一次性的查看进程结果,它所提供的查看结果不是动态连续的;如果想对进程时间监控,应该用top工具1.命令参数:a 显示所有进程-a 显示同一终端下的所有程序-A 显示所有进程c 显示进程的真实名称-N 反向选择-e 等于“-A”e 显示环境变量f 显示程序间的关系-H 显示树状结构r 显示当前终端的进程T 显示当前终端的所有程序u 指定用户的所有进程-au 显示较详细的资讯-aux 显示所有包含其他使用者的行程-C<命令> 列出指定转载 2021-11-05 16:06:58 · 7119 阅读 · 0 评论 -
用图片带你串起进程列表、进程控制块、inode节点、文件描述符列表、文件实体、文件系统等知识
万文长篇,深入浅出地从进程讲起,用最简单明了的图片带你串起进程列表、进程控制块、inode节点、文件描述符列表、文件实体、文件系统等知识(深度好文,建议收藏)前言总览一、进程、线程1.1 什么是程序?1.2 什么是进程?1.3 什么是线程?二、进程列表2.1 PCB —— 进程控制块2.2 小程序 —— 查看进程列表三、进程实体3.1 用户地址空间(VM)3.2 进程实体与PCB、VM、PL的关系:3.3 联系线程列表四、通过进程联系文件系统4.1 文件系统对文件的管理系统(打开)文件表4.2 文件描述符原创 2021-10-11 23:01:16 · 1539 阅读 · 3 评论 -
详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别
文章目录一、库的概念Windows的库Linux的库二、动态库和静态库的区别1. 载入顺序不同2. 大小与共享的差异3. 库函数调用的差异三、静态库的创建和使用1. 创建静态库的步骤:(一)、ar命令的使用方法(二)、生成静态库的实例2. 调用静态库的测试程序(一)调用静态库的测试程序:test.c(二)编译使用了库函数的程序四、动态库的创建和使用1. 动态库的创建2. 动态库的使用3. 通过调用系统函数来使用动态链接库的实例关于gcc的使用方法可以参考下方链接博客:Linux下详解gcc编译过程(原创 2021-09-25 18:26:50 · 15770 阅读 · 0 评论 -
Linux下详解gcc编译过程(含代码示例)&& gcc使用教程
文章目录准备: test.c1. 编译过程1.1 预处理(Pre-Processing)1.2 汇编(Assembling)1.3 编译(Compiling)* gcc -c1.4 链接(Linking)2. 简化过程 —— gcc3. gcc常用选项总结准备: test.c在正式开始之前,若是想要通过一个代码(.c文件)来熟悉gcc的编译流程,可以在你的测试目录下使用如下代码:// 文件名:test.c 1 #include <stdio.h> 2 #includ原创 2021-09-25 17:38:02 · 33354 阅读 · 4 评论 -
如何用C/C++写一个Linux文件系统模拟器
用C/C++写一个Linux文件系统模拟器1. 程序演示1. 登录--login2. 切换目录--- cd3. 展示文件列表---ls4. 查看物理块使用情况以及物理块存储内容 — df5. cd命令的延伸 :6. 查看当前目录名和父目录名 —— now7. 创建文件—— touch8. 打开文件 —— open9. 查看当前活动文件 —— ASL10. 写文件操作 —— write11. 读文件的全部内容 —— cat12. head -num 读取文件头num行13. tail -num 读原创 2021-09-07 18:55:40 · 3249 阅读 · 9 评论 -
CentOS 7如何安装 libbsd-dev && 编译apue.3e时出错处理(以便使用Unix环境高级编程中的apue.h库)
1. 首先需要下载源代码压缩包:UNIX高级环境编程的源代码 – src.3e.tar.gz2. 在CentOS-7下解压源代码文件tar -zxv -f src.3e.tar.gz -C /usr/include/3. 转到解压后的apue.3e/目录下进行make编译:make4. 进行编译后报错信息为:gcc -ansi -I…/include -Wall -DLINUX -D_GNU_SOURCE barrier.c -o barrier -L…/lib -lapue -原创 2021-09-06 20:56:45 · 2022 阅读 · 0 评论 -
保姆级swap分区详解!手把手带你创建swap分区(两种方式,建议收藏)涉及fdisk、gdisk、df、parted、partprobe、mkswap、swapon、free、dd、od等命令
Swap分区的详解 && 创建什么是swap分区?方法一:使用物理分区创建Swap分区1. 利用fdisk / gdisk在磁盘上划出一个分区1.1 lsblk —— 查看本机的磁盘分区基本情况1.2 df 命令 —— 查看磁盘空间利用率1.3 parted命令 —— 列出磁盘的分区表类型与分区信息1.4 fdisk / gdisk命令 —— 磁盘管理1.5 partprobe —— 更新Linux内核分区表信息2. 创建swap格式2.1 mkswap命令 —— 格式化Swap分区2.2原创 2021-07-16 23:43:53 · 20510 阅读 · 4 评论 -
Linux常用文件压缩/解压命令格式大全(tar、gzip、bzip2、zip、compress、cpio、compress、dd)建议收藏
Linux常用文件压缩/解压命令格式大全1. tar2. gzip3. bzip24. zip5. compress6. cpio7.dd1. tar打包备份后的文件包缀:.tar作用:用来对系统上的文件作备份与恢复,可以将系统上多个文件组构成一个tar文件备份到磁盘内或写入到一般的文件(文件名为*.tar)上,也可以将文件从一个tar文件解回到原来的系统中。说明:仅能将一个目录下的所有文件变成一个文件,不具备压缩功能,因此,一般都会将tar与gzip或bzip2一同使用。t原创 2021-07-10 15:22:30 · 3705 阅读 · 0 评论 -
Linux中以@结尾的文件
进入/bin目录原创 2021-07-10 14:20:07 · 1807 阅读 · 0 评论 -
一文带你捋清 Linux根目录下常见文件目录(etc/ dev/ var/ bin/ sbin/ lib/ proc/ tmp/等)建议收藏
目录说明binbin是binary的缩写,是UNIX类操作系统中根目录的标准子目录,包含可执行的程序(即准备运行的程序),以便达到启动(即启动)和修复系统的最小功能。打开 bin目录我们发现。这里面有我们常用的很多命令:cat、mv、cp、su、等。所以这里面存放着使用者最经常使用的命令。·/bin是系统默认的路径,它是系统发出命令时搜索相应程序的目录列表。这意味着,只要在命令行中输入文件名,然后按下Enter键,就可以运行/bin中的对应的可执行文件(即,可运行程序)从而达到我们执行...原创 2021-07-10 14:02:44 · 2183 阅读 · 1 评论