小结:

1、A file descriptor is considered ready if it is possible to perform the corresponding I/O operation (e.g., read(2)) without blocking.

UNIX网络编程卷1:套接字联网API(第3版)

第一部分 简介和TCP/IP

第一章 简介

接受客户连接,发送应答。

#include "unp.h"
#include <time.h>
// o O
int main(int argc,char ** argv) {
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks; listenfd=Socket(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(13); Bind(listenfd,(SA *)&servaddr,sizeof(servaddr)); Listen(listenfd,LISTENQ);
for(;;) {
connfd=Accept(listenfd,(SA *) NULL,NULL);
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24\r\n",ctime(&ticks));
Write(connfd,buff,strlen(buff));
Close(connfd);
}
}

  

通常情况下,服务器进程在accept调用中被投入睡眠,等待某个客户连接的到达并被内核接受。
TCP连接使用三路握手(three-way handshake)来建立连接。握手完毕accept返回,其返回值是
一个称为已连接描述符(connected descriptor)的新描述符( 本例中为connfd) 。该描述符用于与新近连接的
那个客户通信。accept为每个连接到本服务器的客户返回一个新的描述符。

第6章  I/O 复用:select和poll函数

Unix可用的5种 I/O模型

1、阻塞式 I/O

2、非阻塞式 I/O

3、 I/O(select和poll函数)

4、信号驱动式 I/O(SIGIO)

5、异步 I/O(POSIX的aio_系列函数)

【select和poll  是同步 I/O】

【内核态 用户态】

一个输入操作通常包含2个阶段:

1、等待数据准备好

2、从内核向进程复制数据

对于一个套接字的输入操作

1、等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区;

2、把数据从内核缓冲区复制到应用进程缓冲区。

Multiplexing - Wikipedia https://en.wikipedia.org/wiki/Multiplexing

In computingI/O multiplexing can also be used to refer to the concept of processing multiple input/output events from a single event loop, with system calls like poll[1] and select (Unix).[2]

select(2): synchronous I/O multiplexing - Linux man page https://linux.die.net/man/2/select

Week11-Select.pdf http://www.cs.toronto.edu/~krueger/csc209h/f05/lectures/Week11-Select.pdf

lecture-concurrency-processes.pdf http://www.cs.jhu.edu/~phi/csf/slides/lecture-concurrency-processes.pdf

Multithreaded applications

If a file descriptor being monitored by select() is closed in another thread, the result is unspecified. On some UNIX systems, select() unblocks and returns, with an indication that the file descriptor is ready (a subsequent I/O operation will likely fail with an error, unless another the file descriptor reopened between the time select() returned and the I/O operations was performed). On Linux (and some other systems), closing the file descriptor in another thread has no effect on select(). In summary, any application that relies on a particular behavior in this scenario must be considered buggy.
Main web server loop:
while (1) {
int clientfd = Accept(serverfd, NULL, NULL);
if (clientfd < 0) { fatal("Error accepting client connection"); }
server_chat_with_client(clientfd, webroot);
close(clientfd);
}

  

Do you see any limitations of this design?
The server can only communicate with one client at a time

Data race 20
A data race is a (potential) bug where two concurrently-executing
paths access a shared variable, and at least one path writes to
the variable
• Paths ‘‘race’’ to access shared data, outcome depends on
which one ‘‘wins’’
Data race is a special case of a race condition, a situation where
an execution outcome depends on unpredictable event sequencing
A data race can cause data invariants to be violated (e.g.,
‘‘g num procs accurately reflects the number of processes running’’)
Solution: synchronization
• Implement a protocol to avoid uncontrolled access to shared data

I/O multiplexing main loop 33
Pseudo-code:
create server socket, add to active fd set
while (1) {
wait for fd to become ready (select or poll)
if server socket ready
  accept a connection, add it to set
for fd in client connections
   if fd is ready for reading, read and update connection state
   if fs is ready for writing, write and update connection state
}

Coroutines
One way to reduce the complexity of I/O multiplexing is to implement
communication with clients using coroutines

Coroutines are, essentially, a lightweight way of implementing threads
• But with runtime cost closer to function call overhead

Each client connection is implemented as a coroutine
When a client file descriptor finds that a client fd is ready for
reading or writing, it yields to the client coroutine

The client coroutine does the read or write (which won’t block),
updates state, and then yields back to the server control loop

Example: Nonblocking I/O and select() https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzab6/xnonblock.htm

Using poll() instead of select() https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzab6/poll.htm

I/O 复用 multiplexing data race 同步 coroutine 协程的更多相关文章

  1. Coroutine(协程)模式与线程

    概念 协程(Coroutine)这个概念最早是Melvin Conway在1963年提出的,是并发运算中的概念,指两个子过程通过相互协作完成某个任务,用它可以实现协作式多任务,协程(coroutine ...

  2. 消息/事件, 同步/异步/协程, 并发/并行 协程与状态机 ——从python asyncio引发的集中学习

    我比较笨,只看用await asyncio.sleep(x)实现的例子,看再多,也还是不会. 已经在unity3d里用过coroutine了,也知道是“你执行一下,主动让出权限:我执行一下,主动让出权 ...

  3. Kotlin Coroutine(协程): 二、初识协程

    @ 目录 前言 一.初识协程 1.runBlocking: 阻塞协程 2.launch: 创建协程 3.Job 4.coroutineScope 5.协程取消 6.协程超时 7.async 并行任务 ...

  4. Kotlin Coroutine(协程): 一、样例

    @ 目录 前言 一.直接上例子 1.延时任务. 2.异步任务 3.并行任务: 4.定时任务: 总结 前言 你还在用 Hanlder + Message? 或者 AsyncTask? 你还在用 Rxja ...

  5. Android中的Coroutine协程原理详解

    前言 协程是一个并发方案.也是一种思想. 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高.但是面对计算密集型的任务不如多线程并行运算效率高. 不同的语言对于协程都有不同的实 ...

  6. coroutine协程

    如果你接触过lua这种小巧的脚本语言,你就会经常接触到一个叫做协程的神奇概念.大多数脚本语言都有对协程不同程度的支持.但是大多编译语言,如C/C++,根本就不知道这样的东西存在.当然也很多人研究如何在 ...

  7. [Unity-22] Coroutine协程浅析

    1.概念解释 协程并非一个独立的线程.在Unity中.全部的语句都是在一个线程中运行的,也就是说.Unity是单线程的(详细的能够參见http://blog.csdn.net/alexander_xf ...

  8. Coroutine 协程

    https://en.wikipedia.org/wiki/Coroutine Coroutines are computer program components that generalize s ...

  9. 利用swoole coroutine协程实现redis异步操作

    <?php #注意:如果不开启兼容模式,会遇到这样的现象,用swoole协程的方法访问常规方法添加到redis中的数据,可能访问不到(直接返回NULL)!这可能是两者采用了不同的技术标准所致! ...

随机推荐

  1. 容器编排系统K8s之ConfigMap、Secret资源

    前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...

  2. 认识ollydbg

    四个区域:汇编区:虚拟地址,机器码,汇编指令,注释: 寄存器区:寄存器,数据: 数据区, 栈. 这是上面按钮的作用 热键: Ctrl+F2 - 重启程序. Alt+F2 - 关闭被调试程序. F3 - ...

  3. 如何将离线计算业务的成本降低65%——弹性容器服务EKS「竞价实例」上线

    在容器化的应用场景中,大数据计算是其中很大并且业务应用在逐渐增加的一个热门领域,包括越来越多的人工智能企业,都在使用容器技术来支持业务中的大量计算任务.降低成本.提升资源利用率也是当前这部分用户非常期 ...

  4. 基于Opencv的简单图像处理

    实验环境 本实验均在笔记本电脑完成,电脑的配置如表1所示: 系统 Windows 10 家庭版 处理器 英特尔 Core i5-6200 @ 2.30GHz 双核 主板 宏碁 Zoro_SL 内存 1 ...

  5. JavaDailyReports10_13

    今天完成了课堂测试二的内容要求,开阔了编程的思路,学到了很多程序设计思想,为以后的学习提供了很多帮助. 明天开始继续完善四则运算的程序,并且开始JavaWeb的学习!

  6. orcl数据库自定义函数--金额小写转大写

    很多时候在打印票据的时候需要用到大写,ireport无法转换,只能先在查询语句里面进行转换,首先定义好函数,之后再调用函数 CREATE OR REPLACE Function MoneyToChin ...

  7. 强化学习 1 --- 马尔科夫决策过程详解(MDP)

    强化学习 --- 马尔科夫决策过程(MDP) 1.强化学习介绍 ​ 强化学习任务通常使用马尔可夫决策过程(Markov Decision Process,简称MDP)来描述,具体而言:机器处在一个环境 ...

  8. SalesForce学习——权限管理

    Salesforce 对于权限的管理是非常严谨的并且支持不同维度的权限控制.常用的有简档.权限集.角色层级机构.组织范围. 简档:Profiles是Salesforce为每个用户指定的标准配置文件,在 ...

  9. Android stdio使用时遇到的一些问题

    (1)android stdio加载布局时 Exception raised during rendering: com/android/util/PropertiesMap             ...

  10. SSM框架整合模板

    SSM框架整合--MAVEN依赖 spring方面(包含了springmvc): spring-webmvc:spring与mvc的整合依赖,主要包括spring的核心包和springmvc需要的包 ...