随笔分类 -  Linux

Linux 编程,普通操作知识
摘要:最大文件描述符数量 文件描述符是服务器程序的宝贵资源,几乎所有系统调用都是和文件描述符打交道。而系统分配给进程的文件描述符数量有限,因此需要及时关闭那些不用的文件描述符。 Linux对应用程序能打开的最大文件描述符数量,有2个层次限制:用户级限制,系统级限制。 1)用户级限制,是指目标用户运行的所有 阅读全文
posted @ 2022-05-01 20:41 明明1109 阅读(1966) 评论(0) 推荐(0) 编辑
摘要:UID、EUID、GID、EGID 几个常见用户信息概念:UID、EUID、GID、EGID UID:当前进程的真实用户ID; EUID:有效用户ID; 真实组ID:GID; 有效组ID:EGID; 可以通过下面这组函数获取和设置当前进程的用户信息: #include <sys/types.h> # 阅读全文
posted @ 2022-05-01 18:56 明明1109 阅读(454) 评论(0) 推荐(0) 编辑
摘要:tee() 在两个管道文件描述符之间复制数据,也是重要的零拷贝技术之一。tee不消耗数据,因此源文件描述符上的数据仍然可以用于后续的读操作。 tee签名 #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <fcntl.h> s 阅读全文
posted @ 2022-05-01 13:47 明明1109 阅读(303) 评论(0) 推荐(0) 编辑
摘要:splice用于在两个文件描述符之间移动数据,也是一种重要零拷贝技术。 splice声明 #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <fcntl.h> ssize_t splice(int fd_in, loff_t 阅读全文
posted @ 2022-05-01 09:55 明明1109 阅读(1282) 评论(0) 推荐(0) 编辑
摘要:存储映射的基本概念 存储映射(memory map)简称mmap,是直接将实际存储的物理地址映射到进程空间,而不使用read/write函数。这样,可以省去中间繁杂调用过程, 快速对文件进行大量输入输出。 mmap() 用于申请一段内存空间,将一个文件或Posix共享内存区对象映射到进程的地址空间; 阅读全文
posted @ 2022-05-01 01:12 明明1109 阅读(4048) 评论(1) 推荐(0) 编辑
摘要:sendfile() 在2个文件描述符之间传递数据(完全在内核中),避免在内核缓冲区和用户缓冲区之间进行数据拷贝,效率很高。是一种重要的零拷贝技术。 sendfile原理 sendfile()系统调用利用DMA引擎将文件中的数据拷贝到操作系统的内核缓冲区中,然后数据被拷贝到与socket相关的内核缓 阅读全文
posted @ 2022-04-30 20:25 明明1109 阅读(3504) 评论(0) 推荐(1) 编辑
摘要:介绍两种高性能定时器:时间轮和时间堆。 时间轮 基于排序链表的定时器,使用一条链表存放所有定时器(时间复杂度O(n)),因此存在添加定时器效率偏低的问题。当存在需要大量添加定时器场景时,添加定时器可能会严重影响性能。 时间轮可以有效解决这个问题。下图是一个简单时间轮的示意图: 时机轮内,实线指针指向 阅读全文
posted @ 2022-04-30 18:59 明明1109 阅读(598) 评论(0) 推荐(0) 编辑
摘要:fcntl(file control)提供对文件描述符的各种控制操作。另一个常见控制文件描述符的系统调用是ioctl,提供更多控制。 fcntl提供常用属性和行为的控制,是POSIX规定的首选方法。 本文对fcntl常用操作进行一个简要汇总。 fcntl 声明 #include <unistd.h> 阅读全文
posted @ 2022-04-30 18:53 明明1109 阅读(353) 评论(0) 推荐(0) 编辑
摘要:dup() 如何把标志输入(stdin)重定向到一个文件,或者把标志输出(stdout)重定向到一个网络连接(sockfd)? 可以用系统调用dup或dup2。 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd 阅读全文
posted @ 2022-04-30 18:44 明明1109 阅读(1330) 评论(0) 推荐(0) 编辑
摘要:目录TcpConnection回调TcpConnection回调有哪些?回调注册何时调用connectionCallback_?何时调用messageCallback_?何时调用writeCompleteCallback_,highWaterMarkCallback_?上下文数据传递知识点boost 阅读全文
posted @ 2022-04-13 00:28 明明1109 阅读(739) 评论(0) 推荐(0) 编辑
摘要:目录应用层缓冲区Buffer设计Buffer设计思想Buffer要求线程安全Buffer数据结构Buffer的操作基本IO操作自动增长size()和capacity()内部腾挪prependBuffer类的实现构造函数与析构函数读取prependable, readable, writable空间地 阅读全文
posted @ 2022-04-12 17:42 明明1109 阅读(1419) 评论(0) 推荐(0) 编辑
摘要:目录EventLoop的多线程应用多个Reactor模型EventLoopThreadPool 事件循环线程池类EventLoopThreadPool类声明EventLoopThreadPool的构造与析构start() 启动IO线程池分派任务给IO线程的利器:getNextLoop()不常用的ge 阅读全文
posted @ 2022-04-11 00:50 明明1109 阅读(1196) 评论(0) 推荐(0) 编辑
摘要:目录事件驱动与EventLoopEventLoopEventLoop的构造与析构特定线程检查,确保线程安全loop循环添加、更新、删除通道定时任务runInLoop与queueInLoop执行用户任务eventfd与wakeup()唤醒eventfd原理EventLoop使用eventfd唤醒loo 阅读全文
posted @ 2022-04-10 19:53 明明1109 阅读(2459) 评论(6) 推荐(1) 编辑
摘要:目录Signleton测试Singleton知识点 Signleton Signleton<T>使用pthread_once_t,确保T类型对象只初始化一次。 template <typename T> class Signleton : noncopyable { public: static T 阅读全文
posted @ 2022-04-05 15:35 明明1109 阅读(146) 评论(0) 推荐(0) 编辑
摘要:可变函数参数,会用到va_list系列宏,在C中用于定义可变参数列表,包含可变参数信息。 常用的va_list系列宏 包含: va_start(ap, last)宏:初始化可变参数列表; va_arg(ap, type)宏:返回下一个参数; va_copy(dest, src)宏:复制参数列表指针, 阅读全文
posted @ 2022-04-02 20:55 明明1109 阅读(752) 评论(0) 推荐(0) 编辑
摘要:Socket类 Socket类是socket 文件描述符(sock fd)的一个轻量级封装,提供操作底层sock fd的常用方法。采用RTII方式管理sock fd,但本身并不创建sock fd,也不打开它,只负责关闭。 提供的public方法主要包括:获取tcp协议栈信息(tcp_info);绑定 阅读全文
posted @ 2022-03-24 08:45 明明1109 阅读(874) 评论(4) 推荐(2) 编辑
摘要:目录TcpServer接受新连接Acceptor类Acceptor构造与析构Acceptor监听Acceptor接受连接TcpServer类TcpServer的构造与析构TcpConnection类断开Tcp连接断开连接方式Channel与断开连接TcpConnection与断开连接TcpServe 阅读全文
posted @ 2022-03-24 08:32 明明1109 阅读(1991) 评论(7) 推荐(2) 编辑
摘要:目录timerfd简要介绍定时功能相关类Timer类TimerId类TimerQueue类TimerQueue声明TimerQueue构造函数TimerQueue析构TimerQueue重要接口addTimer 添加定时器cancel 取消定时器handleRead处理TimerQueue上所有超时 阅读全文
posted @ 2022-03-13 20:33 明明1109 阅读(1201) 评论(0) 推荐(2) 编辑
摘要:目录Channel 类Channel类声明handleEvent 处理事件handleEventWithGuard 识别事件并回调update 更新通道remove 移除通道参考 Poller的存在,是为了监听事件,但具体监听什么事件呢? 这就需要用到Channel类。一个Channel对象绑定了一 阅读全文
posted @ 2022-03-12 16:54 明明1109 阅读(923) 评论(0) 推荐(1) 编辑
摘要:目录Poller类派生类EPollPoller派生类PollPoller I/O复用使得程序能同时监听多个文件描述符,能有效提高程序性能。Linux下,实现I/O复用的系统调用主要有3个: 1)select(2);2)poll(2);3)epoll(7)。 muduo采用了2)和3),分别用Poll 阅读全文
posted @ 2022-03-12 16:40 明明1109 阅读(665) 评论(0) 推荐(0) 编辑