IO多路复用之select、poll、epoll版本一

文章目录 * 1 select * 1.1 poll * 1.2 epoll * 2 python select实现 * 3 python epoll实现 * 4 selectors模块 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。 select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。 另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线

IO模式介绍

select、pool、epool异步IO 概念说明 在进行解释之前,首先要说明几个概念: • 用户空间和内核空间 • 进程切换 • 进程的阻塞 • 缓存I/O 用户空间和内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)位4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保护用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两个部分,一部分为内核空间,一部分作为用户空间。针对linux操作系统而言,将最高的1G字节供内核使用,成为内核空间,而将较低的3G字节供个进程使用,称为用户空间。 进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并回复以前挂起的某个进程的执行。这种行为称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。 • 从一个进程的运行到另一个进程的运行,这个过程经过下面这些变化: 1. 保存处理机上下文,包括程序

事件驱动与异步IO

事件驱动与异步IO 通常,我们写服务器处理模型的时候,有以下几种模型: 1. 每收到一个请求,创建一个新的进程,来处理该请求 2. 每收到一个请求,创建一个新的线程,来处理该请求 3. 每收到一个请求,放入一个时间列表,让主进程通过非阻塞I/O方式来处理请求 以上几种方式各有优缺点: 1. 第一种方法中,由于创建新的进程开销比较大,会导致服务器性能比较差,但是实现比较简单 2. 第二种方式,由于要设计成线程的同步,有可能会棉铃死锁等问题。 3. 第三种方式中,在写应用程序代码时,逻辑比前两种都复杂。 综合考虑各方面因素,一般普遍认为第三种方式是大多网络服务器采用的方式 事件驱动模型 在UI编程中,常常要对鼠标点击进行响应,对于获取鼠标点击有一下办法: 1. 创建一个线程,该线程一直循环检测是否有鼠标点击,但是这个方式有一下缺点: – cpu资源浪费,可能鼠标的点击频率相当小,但是扫描进程还是会一直循环检测,这回造成很多的CPU资源浪费。 – 如果是阻塞的,在等待鼠标点击的时候,如果用户想通过按键盘来实现,程序会阻塞等待鼠标点击,不会识别键盘的按键

协程

文章目录 * 1 1 协程 * * 1.0.1 1.1协程的概念 * 1.0.2 1.2 协程的优缺点 * 2 2 Python中如何实现协程 * * 2.0.1 2.1 yield实现协程 * 2.0.2 2.2 greenlet实现协程 * 2.0.3 2.3 gevent 实现协程 1 协程 1.1协程的概念   协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。(其实并没有说明白~)   我觉得单说协程,比较抽象,

线程通信与进程通信的区别

线程通信与进程通信的区别 每个进程有自己的地址空间。两个进程中的地址即使值相同,实际指向的位置也不同。进程间通信一般通过操作系统的公共区进行。 同一进程中的线程因属同一地址空间,可直接通信。 不仅是系统内部独立运行的实体,而且是独立竞争资源的实体。 线程也被称为轻权进程,同一进程的线程共享全局变量和内存,使得线程之间共享数据很容易也很方便,但会带来某些共享数据的互斥问题。 许对程序为了提高效率也都是用了线程来编写。 父子进程的派生是非常昂贵的,而且父子进程的通讯需要ipc或者其他方法来实现,比较麻烦。而线程的创建就花费少得多,并且同一进程内的线程共享全局存储区,所以通讯方便。 线程的缺点也是由它的优点造成的,主要是同步,异步和互斥的问题,值得在使用的时候小心设计。 只有进程间需要通信,同一进程的线程share地址空间,没有通信的必要,但要做好同步/互斥mutex,保护共享的全局变量。线程拥有自己的栈。同步/互斥是原语primitives. 而进程间通信无论是信号,管道pipe还是共享内存都是由操作系统保证的,是系统调用. 线程间通信:由于多线程共享地址空

进程与线程的区别和联系

文章目录 * 1 进程概念 * 2 线程概念 * 3 进程和线程的关系 * 4 线程与进程的比较 进程概念   进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。 在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。 线程概念   线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产

zookeeper集群搭建

系统:centos6.5 IP:172.30.0.38 172.30.0.39 172.30.0.40 JDK:1.8 Zookeeper: 3.5.4 文章目录 * 1 1、JDK环境安装(略) * 2 2、Zookeeper安装 * 2.1 2.1 三台服务器上传安装包(所有服务器操作一样) * 2.2 2.2 配置一下环境变量(此步骤的目的是:每次启动服务就不需要定位到Zookeeper的bin目录了) * 2.3 2.3 配置zookeeper 配置文件

nginx 日志切割

Web 访问日志 (access_log) 记录了所有外部客户端对Web服务器的访问行为,包含了客户端IP,访问日期,访问的URL资源,服务器返回的HTTP状态码等重要信息。 一条典型的Web访问日志如下: 112.97.37.90 - - [14/Sep/2013:14:37:39 +0800] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; Lenovo A326 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko)

centos 使用parted挂载2T以上的硬盘

交互式parted分区命令 1:选择要分区的盘 parted /dev/sdb 2:格式化分区 mklabel gpt 3:分区 mkpart primary 0% 100% 4:打印分区结果 print 5:退出 q 6:格式化 mkfs.xfs /dev/sdb1 格式化分区为xfs文件系统格式(速度很快),也可以格式化为 mkfs.ext3 mkfs.ext4等 7:创建需要挂在的目录 mkdir /data1 8:挂载 mount /dev/sdb1 /data1 非交互式parted分区命令 格式化分区 [root@localhost]# parted

新增硬盘系统不能自动进行识别。

文章目录 * 1 查看适配器 * 2 重新扫描总线 * 3 dmesg * 4 查看新增硬盘 * 5 分区 查看适配器 由于不知道新增硬盘挂载的位置,可以先查看现有硬盘挂载的适配器。 [root@localhost ~]# ls -l /sys/block/sda lrwxrwxrwx. 1 root root 0 Jun 15 11:47 /sys/block/sda -> ../devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/