文件描述符

python 并发编程之异步IO

匿名 (未验证) 提交于 2019-12-02 22:51:30
关于异步的一些基本了解请 参考这篇文章 , 或者 内核态和用户态 由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,操作系统划分出两个权限等级:用户态和内核态。 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。 用户态:当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。 五种 IO 模型中, IO 复用的技术较为成熟,因此使用也比较广泛。而最为理想的是异步 IO,整个过程没有阻塞,而且有通知。 IO 多路复用模型有三种:select poll epoll,它们的性能是层层递增。 2.1 select sokect 是通过一个 select() 系统调用来监视多个文件描述符,当 select() 返回后,该数组中就绪的文件描述符便会被该内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 select 的优点是支持跨平台,缺点在于单个进程能够监视的文件描述符的数量存在最大限制。 另外 select() 所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量 TCP 连接处于非活跃状态,但调用 select() 会对所有 socket 进行一次线性扫描,所以这也浪费了一定的开销。 文件描述符 fd

管道及I/O重定向

匿名 (未验证) 提交于 2019-12-02 21:59:42
管道符"|":前一个命令的输出,作为后一个命令的输入 命令1 | 命令2 | 命令3 | ... # 输出"hello,world."并将小写转换为大写 [root@localhost ~]# echo "hello,world." | tr 'a-z' 'A-Z' HELLO,WORLD. # 显示passwd文件中按:分割的每行第一个部分并排序并将小写转换为大写 [root@localhost ~]# cut -d: -f1 /etc/passwd | sort | tr 'a-z' 'A-Z' ADM APACHE BIN DAEMON DBUS FEDORA 简单的解释就是捕捉一个文件, 命令, 程序, 脚本, 或者甚至是脚本中的代码块的输出, 然后将这些输出作为输入发送到另一个文件, 命令, 程序, 或脚本中。 执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。 进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。 习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。

Linux编程之Epoll高并发

匿名 (未验证) 提交于 2019-12-02 21:59:42
网络上所有资料都说epoll是高并发、单线程、IO重叠服用的首选架构,比select和poll性能都要好,特别是在有大量不活跃连接的情况下。具体原理就不阐述了,下面说说使用。 具有有三个函数: #include <sys/epoll.h> 1、int epoll_create ( int size ); size是epoll要监视的fd的规模。 2、int epoll_ctl ( int epfd, int op, int fd, struct epoll_event *event ); (1)epfd:epoll_create的返回值。 (3)fd:要操作的文件描述符(socket) struct epoll_event { }; events:描述事件类型。events可以是以下几个宏的集合: EPOLLOUT:表示对应的文件描述符可以写; EPOLLERR:表示对应的文件描述符发生错误; EPOLLHUP:表示对应的文件描述符被挂断; EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。 data成员:其中data.fd常用来装要操作的fd。 typedef union epoll_data { 3、int epoll_wait ( int epfd, struct

Linux ulimit命令详解

匿名 (未验证) 提交于 2019-12-02 21:59:42
ulimit 是一个计算机命令,用于shell启动进程所占用的资源,可用于修改系统资源限制 命令常用参数 -H 设置硬资源限制. -S 设置软资源限制. -a 显示当前所有的资源限制. -c size:设置core文件的最大值.单位:blocks -d size:设置数据段的最大值.单位:kbytes -f size:设置创建文件的最大值.单位:blocks -l size:设置在内存中锁定进程的最大值.单位:kbytes -m size:设置可以使用的常驻内存的最大值.单位:kbytes -n size:设置内核可以同时打开的文件描述符的最大值.单位:n -p size:设置管道缓冲区的最大值.单位:kbytes -s size:设置堆栈的最大值.单位:kbytes -t size:设置CPU使用时间的最大上限.单位:seconds -v size:设置虚拟内存的最大值.单位:kbytes -u <程序数目>  用户最多可开启的程序数目 文件: /etc/security/limits.conf 常用的命令展示 1.查看最大的标示符 ulimit -n 2.调整文件描述符 ulimit -SHn 65535 临时修改 S:soft limit H:Hard limit 3.推荐控制文件描述符大小==> 更改: <domain> <type> <item> <value> echo

Linux Epoll介绍和程序实例

匿名 (未验证) 提交于 2019-12-02 21:59:42
1. Epoll是何方神圣? 其实在Linux下设计并发网络程序,向来不缺少方法,比如典型的Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及select模型和poll模型,那为何还要再引入Epoll这个东东呢?那还是有得说说的… 如果不摆出来其他模型的缺点,怎么能对比出Epoll的优点呢。 2.1 PPC/TPC模型 这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我。只是PPC是为它开了一个进程,而TPC开了一个线程。可是别烦我是有代价的,它要时间和空间啊,连接多了之后,那么多的进程/线程切换,这开销就上来了;因此这类模型能接受的最大连接数都不会高,一般在几百个左右。 2.2 select模型 2.3 poll模型 基本上效率和select是相同的,select缺点的2和3它都没有改掉。 3. Epoll的提升 把其他模型逐个批判了一下,再来看看Epoll的改进之处吧,其实把select的缺点反过来那就是Epoll的优点了。 4. Epoll为什么高效 Epoll的高效和其数据结构的设计是密不可分的,这个下面就会提到。 首先回忆一下select模型,当有I/O事件到来时,select通知应用程序有事件到了快去处理,而应用程序必须轮询所有的FD集合,测试每个FD是否有事件发生

Linux 伪终端(pty)

匿名 (未验证) 提交于 2019-12-02 21:56:30
通过《 Linux 终端(TTY) 》一文我们了解到:我们常说的终端分为终端 tty1-6 和伪终端。使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vSphere console 等虚拟化方案,其它情况下使用的都是伪终端。本文将介绍伪终端的基本概念。本文中演示部分使用的环境为 ubuntu 18.04。 伪终端 伪终端(pseudo terminal,有时也被称为 pty)是指伪终端 master 和伪终端 slave 这一对字符设备。其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。伪终端由终端模拟器提供,终端模拟器是一个运行在用户态的应用程序。 Master 端是更接近用户显示器、键盘的一端,slave 端是在虚拟终端上运行的 CLI(Command Line Interface,命令行接口)程序。Linux 的伪终端驱动程序,会把 master 端(如键盘)写入的数据转发给 slave 端供程序输入,把程序写入 slave 端的数据转发给 master 端供(显示器驱动等)读取。请参考下面的示意图(此图来自互联网): 我们打开的终端桌面程序,比如 GNOME Terminal,其实是一种终端模拟软件。当终端模拟软件运行时,它通过打开 /dev/ptmx

20分钟了解Epoll + 聊天室实战

匿名 (未验证) 提交于 2019-12-02 21:56:30
我们知道,计算机的硬件资源由操作系统管理、调度,我们的应用程序运行在操作系统之上,我们的程序运行需要访问计算机上的资源(如读取文件,接收网络请求),操作系统有内核空间和用户空间之分,所以数据读取,先由内核读取数据到内核缓冲区,然后才会从操作系统的内核空间拷贝到用户空间,这个就是缓存I/O,又被称作标准I/O。 几种常见的IO模式:阻塞I/O、非阻塞I/O、I/O多路复用 1、阻塞I/O 用户进程向内核发起I/O系统调用,内核去准备所需的数据,直到数据都准备好了(需要一段时间)返回给用户进程,在这期间,用户进程一直处于阻塞状态,拿到所需数据,才会继续向下执行。 2、非阻塞I/O 用户进程向内核发起I/O系统调用,内核发现数据还没准备好,立即返回error,用户进程拿到error,可以再次向内核发起请求,直到获取所需数据 3、I/O多路复用 下面详细介绍 定义:I/O multiplexing allows us to simultaneously monitor multiple file descriptors to see if I/O is possible on any of them. 传统的阻塞I/O模型可以满足大部分的应用程序使用场景,但有的时候,一些应用程序会 ͬʱ 需要如下特性: 检查文件I/O是否已经ready,如果没有,不阻塞,直接返回 同时监视多个文件描述符

epoll使用详解

匿名 (未验证) 提交于 2019-12-02 21:53:52
Ŀ¼ epoll介绍 Epoll的优点: 1、支持一个进程打开大数目的socket描述符(FD) 2、IO效率不随FD数目增加而线性下降 3、支持边缘触发模式 4、使用mmap加速内核与用户空间的消息传递。 epoll的系统调用 epoll_create epoll_ctl epoll_wait epoll示例程序 epoll的行为与poll(2)相似,监视多个有IO事件的文件描述符。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。 epoll_create(2) 创建一个新的epoll实例,并返回一个引用该实例的文件描述符 epoll_ctl(2) 创建epoll实例后,注册对感兴趣的文件描述符。当前注册在epoll实例上的文件描述符集被称为epoll集合。 epoll_wait(2) 等待I/O事件,如果当前没有事件可用,则阻塞调用线程。 水平触发 和 边沿触发 epoll事件分布接口既可以表现为边缘触发(ET),也可以表现为水平触发(LT)。这两种机制的区别 可以这样描述。假设有这种情况发生: 表示管道(rfd)的读侧的文件描述符在epoll实例上注册。

PostgreSQL使用安装

隐身守侯 提交于 2019-12-02 14:52:41
PostgreSQL使用安装 一. 安装 ubuntu安装: # 安装客户端 sudo apt-get install postgresql-client # 安装服务器 sudo apt-get install postgresql # 安装图形界面 sudo apt-get install pgadmin3 安装后默认生成一个名为postgres的数据库和一个名为postgres的数据库用户。这里需要注意的是,同时还生成了一个名为postgres的Linux系统用户。 二. 登录 # 先切换到postgres用户 sudo su postgres 以下命令相当于系统用户postgres以同名数据库用户的身份 psql 完整登录命令 psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432 上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。 三. 授权其他用户 授权其他用户登录: # 新建系统用户 sudo adduser superpika # 进入控制台 psql 先改下命令: \password postgres 创建用户,和新建系统用户一样: CREATE USER superpika WITH PASSWORD 'password'; 新建数据库并授权: CREATE DATABASE

epoll(2) 使用及源码分析的引子

别来无恙 提交于 2019-12-02 12:30:11
epoll(2) 使用及源码分析的引子 本文代码取自内核版本 4.17 epoll(2) - I/O 事件通知设施。 epoll 是内核在2.6版本后实现的,是对 select(2)/poll(2) 更高效的改进,同时它自身也是一种文件,不恰当的比方可以看作 eventfd + poll。 多路复用也是一直在改进的,经历的几个阶段 select(2) - 只能关注 1024 个文件描述符,并且范围固定在 0 - 1023,每次函数调用都需要把所有关注的数据复制进内核空间,再对所有的描述符集合进行遍历判断。 poll(2) - 改进 select(2) 前面两个缺点,可以自定义关注的描述符,数量也不受限制(不超过系统的限制),每次调用同样需要复制所有的事件进内核空间,全部遍历。 epoll(2) - 不需要每次调用时所有关注的文件描述符进行内核-用户空间的复制,而是直接将所有的文件描述符和事件常驻内核空间,同时也不需要每次遍历所有文件描述符。 提供的系统调用 #include <sys/epoll.h> typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll