首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文快速了解进程、线程与协程

一般shell操作,进程获取信号进行处理,一共有64种信号,shell输入 kill -l 可查阅 7.套接(socket) 套接(有的时候被译为插座)也是一种进程间通信机制,与其他通信机制不同的是...相对于共享内存可以多对多的读取与写入,套接只能一对一。此外由于序列化等操作占用大量资源,相对于共享内存,套接更适合传输少量数据。...套接:可用于不同机器之间的进程间通信。 线程间的通信方式 锁(Lock) 锁机制包括互斥锁、条件变量、读写锁。 互斥锁提供了以排他方式防止数据结构被并发修改的方法。...能够让协程事件未发生之前挂起,等待事件发生后被调度并处理,从而有效让出CPU时间。 能够消息附带相应的数据。...而进入阻塞可以看成是一个主动的行为(eg.进程I/O,进程等待I/O设备完成,进程主动进入阻塞状态,I/O完成,进程被激活) 挂起态可以分为下面两种: 阻塞挂起状态:进程在外存(磁盘)并等待某个事件的出现

13.9K61
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    day02 真正的高并发还得看IO多路复用

    所以上面虽然有个while死循环,但在getReadyIOFd被阻塞了,getReadyIOFd底层也是个系统调用(具体实现我们后面会讲到),没有可读写套接线程并不会占用CPU。...IO多路复用的实现模型大家多少听过一些,我们先比较下常见的select和epoll select select简单理解就是拿一个数组保存连接套接,调用select,会将整个数组拷贝到内核空间中,如果当前数组没有可读写套接...新获取到一个套接字后,将该套接添加到wq,等到套接读写,操作系统会将该套接从wq转到rdlist,然后线程直接处理rdlist套接即可,不需要再遍历全部监听的套接了。...所以我们需要在第一次读通过循环read的方式把套接的数据全读出来。...在前面,我们使用epoll实现了一个线程管理多个套接,当某个套接读写事件,epoll_wait调用返回,告诉我们哪些套接能读,但并不会告诉我们某个套接上有多少数据可读。

    1K132

    爱奇艺网络协程编写高并发应用实践

    ⽹络读写事件注册到事件引擎;      • 当套接满⾜可读或可写条件,事件引擎设置套接对应的事件状态并返回给调⽤者;      • 调⽤者根据套接的事件状态分别『回调』对应的处理过程;   ...,操作系统负责将多个线程任务唤⼊唤出;      上下⽂切换: 当操作系统需要将某个线程挂起,会将该线程 CPU 寄存器的栈指针、状态等保存⾄该线程的内存栈;当操作系统需要唤醒某个被挂起的线程...:      每⼀个⽹络连接绑定⼀个套接字句柄,该套接绑定⼀个协程;      当对⽹络套接进⾏读或写发生阻塞,将该套接添加⾄ IO 调度协程的事件引擎并设置读写事件,然后将该协程挂起;这样所有处于读写等待状态的...⽹络协程都被挂起,且与之关联的⽹络套接均由 IO 调度协程的事件引擎统⼀监控管理;      当某些⽹络套接满⾜可读或可写条件,IO 调度协程的事件引擎返回这些套接的状态,IO 调度协程找到与这些套接绑定的协程对象...⾏合并处理,主要是因为 libfiber 的调度过程是单线程模式的,如果想要在多线程调度器合并中间态的事件操作则要难很多:多线程调度过程,当套接所绑定的协程因IO 可读被唤醒,假设不取消该套接的读事件

    65920

    爱奇艺网络协程编写高并发应用实践

    ; • 当套接满⾜可读或可写条件,事件引擎设置套接对应的事件状态并返回给调⽤者; • 调⽤者根据套接的事件状态分别『回调』对应的处理过程; • 对于⼤部分基于 TCP 的⽹络应⽤,数据的读写往往不是...,操作系统负责将多个线程任务唤⼊唤出; 上下⽂切换: 当操作系统需要将某个线程挂起,会将该线程 CPU 寄存器的栈指针、状态等保存⾄该线程的内存栈;当操作系统需要唤醒某个被挂起的线程(重新放置...在网络协程库,内部有一个缺省的IO调度协程,其负责处理与网络IO相关的协程调度过程,故称之为IO调度协程: 每⼀个⽹络连接绑定⼀个套接字句柄,该套接绑定⼀个协程; 当对⽹络套接进⾏读或写发生阻塞...,将该套接添加⾄ IO 调度协程的事件引擎并设置读写事件,然后将该协程挂起;这样所有处于读写等待状态的⽹络协程都被挂起,且与之关联的⽹络套接均由 IO 调度协程的事件引擎统⼀监控管理; 当某些⽹络套接满...⾜可读或可写条件,IO 调度协程的事件引擎返回这些套接的状态,IO 调度协程找到与这些套接绑定的协程对象,然后将这些协程追加至协程调度队列,使其依次运⾏; IO 事件协程内部本身是由系统事件引擎

    82510

    关于IO与并发

    首先来看下可读事件与可写事件: 当如下任一情况发生,会产生套接的可读事件: 该套接的接收缓冲区的数据字节数大于等于套接接收缓冲区低水位标记的大小; 该套接的读半部关闭(也就是收到了FIN),...对这样的套接的读操作将返回0(也就是返回EOF); 该套接是一个监听套接且已完成的连接数不为0; 该套接有错误待处理,对这样的套接的读操作将返回-1。...当如下任一情况发生,会产生套接的可写事件: 该套接的发送缓冲区的可用空间字节数大于等于套接发送缓冲区低水位标记的大小; 该套接的写半部关闭,继续写会产生SIGPIPE信号; 非阻塞模式下,connect...返回之后,该套接连接成功或失败; 该套接有错误待处理,对这样的套接的写操作将返回-1。...因为实际情况,我们往往不止一种事件处理器,因此这里将事件处理器接口和实现分开,与C++、Java这些高级语言中的多态类似。

    57830

    网络编程socket

    AF_INET下,以元组(host,port)的形式表示地址。 sk.listen(backlog)   开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。      ...sk.connect_ex(address)   同上,只不过会有返回值,连接成功返回 0 ,连接失败时候返回编码,例如:10061 sk.close()   关闭套接 sk.recv(bufsize...其中data是包含接收数据的字符串,address是发送数据的套接地址。 sk.send(string[,flag])   将string的数据发送到连接的套接。...sk.sendall(string[,flag])   将string的数据发送到连接的套接,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。      ...一般,超时期应该在刚创建套接设置,因为它们可能用于连接的操作(如 client 连接最多等待5s ) sk.getpeername()   返回连接套接的远程地址。

    87630

    脑残式网络编程入门(二):我们在读写Socket,究竟在读写什么?

    《脑残式网络编程入门(二):我们在读写Socket,究竟在读写什么?》...(本文) 4、Socket读写的简单过程理解 当客户端和服务器使用TCP协议进行通信,客户端封装一个请求对象req,将请求对象req序列化成字节数组,然后通过套接socket将字节数组发送到服务器,...互联网技术服务行业工作多年的经验告诉我,如果你对底层机制不了解,你就会不明白为什么套接socket的读写会出现各种奇奇乖乖的问题,为什么有时会阻塞,有时又不阻塞,有时候还报错,为什么会有粘包半包问题...我们平时用到的套接其实只是一个引用(一个对象ID),这个套接对象实际上是放在操作系统内核。...当我们对客户端的socket写入字节数组(序列化后的请求消息对象req),是将字节数组拷贝到内核区套接对象的write buffer,内核网络模块会有单独的线程负责不停地将write buffer

    1.2K22

    014:Redis线程IO模型

    Redis 单线程为什么还能这么快? 因为它所有的数据都在内存,所有的运算都是内存级别的运算。...非阻塞 IO 套接对象上提供了一个选项 Non_Blocking,当这个选项打开读写方 法不会阻塞,而是能读多少读多少,能写多少写多少。...能读多少取决于内核为套接分配的读缓冲区内部的数据字节数,能写多少取决于内核为套接分配的写缓冲区的空闲空间字节数。读方法和写方法都会通过返回值来告知程序实际读写了多少字节。...每个客户端套接 socket 都有对应的读写文件描述符。...Redis 的定时任务会记录在一个称为最小堆的数据结构。这个堆,最快要执行的任 务排在堆的最上方。每个循环周期,Redis 都会将最小堆里面已经到点的任务立即进行处理。

    51020

    深入理解Java多线程的volatile关键Java 的 volatile关键对可见性的保证Java 的 volatile关键保证可见性之前的所做的事情Volatile有时候也是不够的什么

    Java 的 volatile关键对可见性的保证 Java 的 volatile关键保证可见性之前的所做的事情 为什么volatile关键有时候也不是足够的 什么时候volatile足够了...volatile关键对效率的影响 Java关键用于将一个变量标记为“存储在内存的变量”。...实际上,从java5开始,volatile关键就不仅仅是保证volatile变量从主存读写,笔者会在后面详细讨论这个问题。...counter = 0; } ** 将一个变量声明为volatile就可以保证写操作,其他线程对这个变量的可见性 ** Java 的 volatile关键保证可见性之前的所做的事情 从java5...volatile关键对效率的影响 读写一个volatile变量的时候,会导致变量直接在主存读写,显然,直接从主存读写速度要比从cache来得慢。

    44430

    如此浅显易懂的零拷贝

    这样能在一些场景显著提高性能,因为避免了Java堆和Native堆来回复制数据 ——《深入理解Java虚拟机》 我们可用 NIO 的缓冲区(Buffer)来使用直接内存,不幸的是直接内存只支持...零拷贝 为什么使用直接内存就能如此提高读写性能?因为使用了零拷贝技术。...CPU将数据从套接缓冲区拷贝到网卡缓冲区 CPU完成拷贝,write()返回从内核态切换回用户态 综上: 读过程有2次状态切换、2次CPU拷贝 写过程有2次状态切换、2次CPU拷贝 传统模式下,CPU...2.6.3 sendFile + DMA收集 sendFile将内核空间缓冲区数据的描述信息拷贝到套接缓冲区 DMA控制器根据套接缓冲区的描述信息,将数据从内核缓冲区直接拷贝到网卡 可以减少一次...Netty这样高性能网络通信框架,也是经常读写的,所以其底层也涉及到了零拷贝技术 缺点: 读过程要将数据拷贝到用户缓冲区我们才能进行修改的,而缺失这一环(直接拷贝到套接缓冲区或网卡)那么我们就不能对数据进行修改

    54220

    Java面试——开源框架知识

    初始化同步器的最大限制值,然后每接受一个套接就将计数器变量+1,每关闭一个套接,将计数器变量-1,如此一来,一旦技术变量值>最大限制值,则AQS机制将接受线程阻塞,而停止对套接的接受。...直到某些套接字处理完,关闭后重新唤起接受线程往下接受套接。...主要任务有3个任务:处理套接并响应客户端,连接数计数器减1,关闭套接。...▶ maxProcessors与minProcessors: Java中线程是程序运行时的路径,是一个程序与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。...♧ 依赖注入(DI):Spring 使用 Java Bean对象的Set方法或者带参数的构造方法为我们创建所需对象将其属性自动设置所需要的值的过程就是依赖注入的基本思想。

    71920

    python资源库——socket网络编

    SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。...AF_INET下,以元组(host,port)的形式表示地址。 sk.listen(backlog) 开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。...其中data是包含接收数据的字符串,address是发送数据的套接地址。 sk.send(string[,flag]) 将string的数据发送到连接的套接。...sk.sendall(string[,flag]) 将string的数据发送到连接的套接,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...bufsize值为1024,最多只能接受1024个字节,那么如果client端发送的数据包特别大,超过了指定的bufsize的值,超过的不分会留在内核缓冲区,下次调用recv的时候会继续读剩余的字节

    89710

    如此浅显易懂的零拷贝

    这样能在一些场景显著提高性能,因为避免了Java堆和Native堆来回复制数据 ——《深入理解Java虚拟机》 我们可用 NIO 的缓冲区(Buffer)来使用直接内存,不幸的是直接内存只支持...零拷贝 为什么使用直接内存就能如此提高读写性能?因为使用了零拷贝技术。...CPU将数据从套接缓冲区拷贝到网卡缓冲区 CPU完成拷贝,write()返回从内核态切换回用户态 综上: 读过程有2次状态切换、2次CPU拷贝 写过程有2次状态切换、2次CPU拷贝 传统模式下,CPU...(总计两次状态切换,2次DMA拷贝,1次CPU拷贝) image.png 2.6.3 sendFile + DMA收集 sendFile将内核空间缓冲区数据的描述信息拷贝到套接缓冲区 DMA控制器根据套接缓冲区的描述信息...Netty这样高性能网络通信框架,也是经常读写的,所以其底层也涉及到了零拷贝技术 缺点: 读过程要将数据拷贝到用户缓冲区我们才能进行修改的,而缺失这一环(直接拷贝到套接缓冲区或网卡)那么我们就不能对数据进行修改

    25420

    socket阻塞与非阻塞,同步与异步IO模型

    ,当数据就绪后在读写的时候必须阻塞(区别就绪与读写二个阶段,同步的读写必须阻塞),异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写也不阻塞。...套接应用程序,当调用recv()函数,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。      ...阻塞模式套接的不足表现为,大量建立好的套接字线程之间进行通信比较困难。...当使用socket()函数和WSASocket()函数创建套接,默认都是阻塞的。创建套接之后,通过调用ioctlsocket()函数,将该套接设置为非阻塞模式。...当调用该函数套接会自动地设置为非阻塞方式。   由于使用非阻塞套接调用函数,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    3.2K10

    socket阻塞与非阻塞,同步与异步、IO模型

    套接应用程序,当调用recv()函数,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。...阻塞模式套接的不足表现为,大量建立好的套接字线程之间进行通信比较困难。...返回,该函数返回一个错误代码。图所示,一个非阻塞模式套接多次调用recv()函数的过程。前三次调用recv()函数,内核数据还没有准备好。...当使用socket()函数和WSASocket()函数创建套接,默认都是阻塞的。创建套接之后,通过调用ioctlsocket()函数,将该套接设置为非阻塞模式。...当调用该函数套接会自动地设置为非阻塞方式。 由于使用非阻塞套接调用函数,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    2.7K30

    socket阻塞与非阻塞,同步与异步、IO模型

    ,这可以使进程在数据读写也不阻塞。...套接应用程序,当调用recv()函数,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。...阻塞模式套接的不足表现为,大量建立好的套接字线程之间进行通信比较困难。...当使用socket()函数和WSASocket()函数创建套接,默认都是阻塞的。创建套接之后,通过调用ioctlsocket()函数,将该套接设置为非阻塞模式。...当调用该函数套接会自动地设置为非阻塞方式。   由于使用非阻塞套接调用函数,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    2K20

    实现基于TCP的服务端客户端

    服务端套接创建过程 第一步:调用socket函数创建套接 //成功返回文件表述符,失败返回-1 int socket(int __domain, int __type, int __protocol...(Type):是指套接的传输方式 面向连接的套接(SOCK_STREAM) 传输过程数据不会消失 按序传输数据 传输的数据不存在数据边界(Boundary):调用了三次write传递了100节,...客户端的IP地址和端口号调用connect函数由内核自动分配,无需调用标记的bind函数进行分配。 ?...当然,此时服务器端调用accept函数进入了阻塞状态,直到客户端调用connect函数为止。 TCP套接的I/O缓冲 ?...I/O缓冲在每个TCP套接单独存在; I/O缓冲在创建套接自动生成; 即使关闭套接也会继续传递输出缓冲遗留的数据; 关闭套接将丢失输入缓冲的数据; 编写 echosrv.c #include

    1.2K40

    面试系列之-Redis高性能io模型

    socket模型,不同操作调用后会返回不同的套接类型;socket()方法会返回主动套接,然后调用listen() 方法,将主动套接转化为监听套接,此时可以监听来自客户端的连接请求。...最后调用accept()方法接收到达的客户端连接,并返回已连接套接; 针对监听套接,可以设置非阻塞模式:当 Redis 调用 accept() 但一直未有连接请求到达,Redis线程可以返回处理其他操作...但是要注意的是,调用 accept(),已经存在监听套接了; 虽然 Redis线程可以不用继续等待,但是总得有机制继续监听套接上等待后续连接请求,并在有请求通知 Redis;类似的也可以针对已连接套接设置非阻塞模式...流,就是我们经常听到的select/epoll机制;简单来说Redis只运行单线程的情况下,该机制允许内核,同时存在多个监听套接和已连接套接;内核会一直监听这些套接上的连接请求或数据请求。...epoll 监控的事件已经发送的事件; epoll也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪,调用回调函数,把就绪fd放入就绪链表,并唤醒epoll_wait

    31410

    Java

    既然有了字节流,为什么还要有字符流? 问题本质想问:不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节流操作和字符流操作呢?... Java 7 引入了 NIO 的改进版 NIO 2,它是异步非阻塞的 IO 模型。...对于 NIO 来说,我们的业务线程是 IO 操作准备好,得到通知,接着就由这个线程自行进行 IO 操作,IO 操作本身是同步的。 阻塞式I/O模型:默认情况下,所有套接都是阻塞的。怎么理解?...对于一个套接上的输入操作,第一步通常涉及等待数据从网络到达。当所有等待分组到达,它被复制到内核的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。...非阻塞式I/O:以下这句话很重要:进程把一个套接设置成非阻塞是通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成,不要把进程投入睡眠,而是返回一个错误。

    88510
    领券