展开

关键词

Linux编程(和非IO)

Linux设备驱动中的和非I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。 非应用程序通常使用select系统调用查询是否可以对设备进行无的访问最终会引发设备驱动中 poll 函数执行。 =1); //串口上没有输入则返回,所以循环读取 printf("%c/n",buf); 操作常常用等待队列来实现,而非操作用轮询的方式来实现。 非I/O的操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被调用。 return mask; } 三、总结 与非操作: 定义并初始化等待对列头; 定义并初始化等待队列; 把等待队列添加到等待队列头 设置进程状态(TASK_INTERRUPTIBLE(可以被信号打断

1.7K20

Linux编程(的概念)

今天来上一堂语文课,大家跟我念:兹z武u,zu。丝s饿e,se。看还有哪个家伙读成zusai的,还有谁不会念? 你还真的点开链接啦? 今天真的是一趟语文课,就教会大家正确念这两个字的姿势,看: 兹z武u,zu。 丝s饿e,se。 。 好吧,再来一点营养。是啥意思呢? 就是水管堵住了!扭开水龙头没有水出来。 这个道理跟Linux下读取慢速设备(主要指管道和套接字)数据的情形非常相似,例如当我们在读取一个管道时,如果管道里面没有数据,那么我们什么都读不出来,于是就进入了所谓的“”状态了,说白了就是使得当前进程或者线程睡眠了的意思 那么再进一步,什么时候会呢?下面的表格简单描述了这些清空: ? 其中,读者指的是对管道文件拥有读权限的进程或线程(注意不是正在读),写者指的是对管道文件拥有写权限的进程或线程(注意不是正在写)。 除此之外,其实open()函数也会发生,比如用只读或者只写open一个管道文件的时候。因为一根只有出口或者只有入口的水管,是无法使用的呀!其实就是生活常识。嘿嘿!

47330
  • 广告
    关闭

    什么是世界上最好的编程语言?丨云托管征文活动

    代金券、腾讯视频VIP、QQ音乐VIP、QB、公仔等奖励等你来拿!

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

    一种理解同步异步,Linux IO 模型,select poll epoll 的方法

    同步(synchronous)/异步(asynchronous),(blocking)/非(non-blocking),IO/非IO/同步IO/异步IO/IO复用(IO Multiplexing 同步/异步与/非的理解 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。用线程执行程序流的过程去理解同步异步,与非 线程执行过程中,产生一个外部调用后,会不会把该线程流“堵”住,会“堵”对应的是,反之为非Linux的五种IO模型 上一节中对同步/异步,/非的描述只能说能够恰好区分它们,如果不是在计算机领域而是生活中,道理也类似。 然而计算机中的某些专业术语又需要放在专门的情景中去看,例如下面将要提到的Linux IO模型,建议理解模型本身,而不是抠同步/异步与的字眼,因为会发现就算是非模型也有的部分,同步IO与异步

    3.5K10

    你真的懂Linux内核中的和异步通知机制吗?

    /非简介 操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足。 而非操作的进程在不能进行设备操作时,并不挂起,它要么放弃,要么不停地查询,直至可以进行操作为止。 /非例程 方式 int fd; int data = 0; fd = open("/dev/xxx_dev", O_RDWR); /* 方式打开 */ ret = read(fd, &data 方式访问设备时,如果设备不可操作,那么进程就会进入休眠状态。等待队列就是来完成进程休眠操作的一种数据结构。 定义并初始化一个等待队列项 DECLARE_WAITQUEUE(name, tsk) name就是等待队列项的名字,tsk表示这个等待队列项属于哪个任务进程,一般设置为current,在 Linux内核中

    15010

    linux源码看socket的和非

    大部分高性能网络框架采用的是非模式。笔者这次就从linux源码的角度来阐述socket(block)和非(non_block)的区别。 一个TCP非client端简单的例子 如果我们要产生一个非的socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM \非状态 我们用fcntl修改socket的\非状态。 timeo) { copied = -EAGAIN; break; } // 这边如果堵到了期望的数据,继续,否则当前进程在sk_wait_data上 if (copied 如下图所示: 后什么时候恢复运行呢 情况1:有对应的网络数据到来 首先我们看下网络分组到来的内核路径,网卡发起中断后调用netif_rx将事件挂入CPU的等待队列,并唤起软中断(soft_irq

    43220

    linux源码看socket的和非

    linux源码看socket的和非 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非模式。 笔者这次就从linux源码的角度来阐述socket(block)和非(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。 一个TCP非client端简单的例子 如果我们要产生一个非的socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM \非状态 我们用fcntl修改socket的\非状态。 后什么时候恢复运行呢 情况1:有对应的网络数据到来 首先我们看下网络分组到来的内核路径,网卡发起中断后调用netif_rx将事件挂入CPU的等待队列,并唤起软中断(soft_irq),再通过linux

    1.1K20

    同步、异步、、非

    调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把调用和同步调用等同起来,实际上他是不同的。 非的概念相对应,指在不能立刻得到结果之前,该函数不会当前线程,而会立刻返回。 对象的模式和函数调用 对象是否处于模式和函数是不是调用有很强的相关性,但是并不是一一对应的。 对象上可以有非的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用函数,就可以避免。而对于非对象,调用特殊的函数也可以进入调用。 /非则是小明的等待方式,或者说 API 调用者的等待方式。 在不同的场景下,同步/异步、/非的四种组合都有应用。

    47350

    同步异步,

    什么是和非 和非是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,方式下读取或者写入函数将一直等待,而非方式下,读取或者写入函数会立即返回一个状态值。 与非:针对函数(程序)运行的方式,在IO未就绪时,是等待就绪还是直接返回(执行别的操作)。 与非的区别: 是程序在调用系统函数IO时,在系统执行系统调用时由CPU通过轮询等方式来实现数据的IO。 非是在程序级别通过轮询/信号/事件的机制,去查看IO数据是否就绪。 可以是或非则一直在等待内核/应用程序把IO数据准备好,非则是直接返回内核/应用程序是否已经准备好数据。 应用程序框架:同步或异步。 IO多路复用,同步,异步,和非 区别 关于异步,同步,与非 解读I/O多路复用技术

    68560

    同步、异步、、非

    与非   应用进程请求I/O操作时,如果数据未准备好,如果请求立即返回就是非,不立即返回就是。简单说就是做一件事如果不能立即获得返回,需要等待,就是,否则就可以理解为非 调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把调用和同步调用等同起来,实际上它们是不同的。 socket接收数据的另外一个函数recv则是一个调用的例子。当socket工作在模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。 非的概念相对应,指在不能立刻得到结果之前,该函数不会当前线程,而会立刻返回。 同步/异步与/非的组合 同步形式: 等待执行结果是一直等待,执行时线程挂起(未对fd 设置O_NONBLOCK 标志位的read/write 操作) 同步非形式:等待执行结果是一直等待,

    49240

    同步 异步

    以调用函数为例, 同步指的是调用方主动查询返回结果,异步是等待被调用方通知查询结果 是等待返回结果的时间内挂起,非是等待返回结果的时间内可以干其他事情. 同步和完全不是一件事,是否同步指的是获取返回结果的方式,是否指的是等待获取结果的时间内是否可以干其他事情

    18020

    和非的实现

    我们可能都已经听过的概念,本文以tcp中的connect系统调用为例子(基于1.12.13内核,新版的原理类似,但是过程就很复杂了,有时间再分析),分析和非是什么并且看他是如何实现的。 sock->state = SS_CONNECTED; // 返回成功 return(0); } 我们看到connect函数首先会调用tcp层的函数发送一个sync包,然后根据socket的属性( ,可以通过setsocketopt设置)做下一步处理,如果是非,那么就比较简单,直接返回给应用层。 这也是非+事件驱动架构中的做法。因为这种架构下通常是单进程的,要避免进程,那么返回后什么时候才能知道连接成功呢? 以上就是进程和非的原理。

    14320

    与非客户端

    与非 是指程序会一直等待该进程或线程完成当前任务期间不做其它事情。而非,是指当前线程在处理一些事情的同时,还可以处理其它的事情,并不需要等待当前事件完成才执行其它事件。 与非客户端 对于请求当中,我们有需要借助一些请求封装的客户端,这里可以分为两大类:式、非式。 在客户端中,这意味着,直到 Web 客户端收到响应之前,线程都将一直被下去。而带来的问题是:每个线程都消耗了一定的内存和 CPU 周期。 如果在并发下,等待结果的请求迟早都会堆积起来。 、非式客户端来测试一下。 式 我们利用 RestTemplate实现式请求: @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate

    11430

    & 非 | 同步 & 异步

    这里讲的都是基于IO的 、非、同步、异步 ---- 一个典型的IO操作包括了两个阶段,数据准备和数据读写。比如说现在要使用 recv 执行一个读操作,数据就绪就是远端是否有数据可读。 当IO工作在状态下的时候,如果数据没有就绪,recv就会当前线程;如果说IO工作在非状态下,会立即返回。 一个同步IO接口的示例: char buf[1024]; int sz = recv(sockfd,buf,1024,0); //:一直在这儿死等 //非:时不时的回来问一下 if(sz>0) 仅被 lio_listio() 函数使用 */ /* Various implementation-internal fields not shown */ }; 陈硕大神说:在处理IO的时候,和非都是同步 ---- 五种IO模型 : 非: 多路IO复用 信号驱动: 这里就完全放飞自我了 异步: ---- Reactor反应堆模型 One loop per thread

    12610

    队列与非队列

    Java提供两种方式来实现式和非式,式使用锁实现,非式使用CAS方式实现。使用队列和非队列的场景还有很多,比较常用的就是我们常说的生产者\消费者模型。 非队列 ConcurrentLinkedQueue——无界非队列 ? ? 队列 Java提供了一个队列的接口——BlockingQueue,在队列的基础上增加可添加元素和可获取元素的方法。 ? ? ,当有入队时则会唤醒的出队操作线程;当队列满时,进行入队操作的线程将被,当有出队时则会唤醒的入队操作线程。 当队列为空(或队列为满)时,消费者(或生产者)线程会进入状态,使用线程的/通知模型,来通知的线程。

    85030

    IO - 同步,异步,,非

    同步(synchronous) IO和异步(asynchronous) IO,(blocking) IO和非(non-blocking)IO分别是什么,到底有什么区别? 本文讨论的背景是Linux环境下的network IO。 blocking IO 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: ? 而在用户进程这边,整个进程会被。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。 does not cause the requesting process to be blocked; 两者的区别就在于synchronous IO做”IO operation”的时候会将process

    29930

    IO - 同步,异步,,非

    同步(synchronous) IO和异步(asynchronous) IO,(blocking) IO和非(non-blocking)IO分别是什么,到底有什么区别? 本文讨论的背景是Linux环境下的network IO。 blocking IO 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: ? 而在用户进程这边,整个进程会被。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。 does not cause the requesting process to be blocked; 两者的区别就在于synchronous IO做”IO operation”的时候会将process

    23010

    同步异步与

    同步异步与 标题有点简单粗暴,直接用了本文要介绍的几个概念。本来想取个高大上一点的标题,但是感觉主题不那么明了。 好,废话不多说,进入正题。 如果你是个研发,同步、异步、、非(还有IO多路复用)这些概念应该不陌生了。但是很多人却没有真正搞懂他们的含义,甚至经常把他们混淆了。 先上几个错误的表达提提神: 非IO模型是异步IO。 那么,如果在IO操作没办法立即完成时,不继续往下执行而是等待其完成,则该操作是的。如果我们不等待,则认为其实非的。 从上面的介绍可以得出: 如果一个IO操作是异步操作,那他一定是非的。但是如果非操作却未必是异步IO操作。 和非关注的是最终结果是否返回了。 非就是:我告诉你我要做什么,如果现在能做,那就做完再返回;如果现在还做不了,你也给我个信儿,跟我说这事儿还做不了。

    610230

    同步、异步与、非

    通常,同步操作是的,而异步操作非,但两对概念也可以交叉组合。 同步与异步是基于消息和通信的概念。 与非的最大区别在于,执行操作后资源是否可用(当然是否也是他们的区别)。操作执行后资源可用,非操作执行后则不一定可用。 例如同步非,执行语句后就可以做别的,但是资源不可用,没有完成通知,因此需要轮询。 异步,执行语句后不能做别的,执行下一条语句时资源已经可用了,有完成通知(异步和同步只差一个通知,基本没有区别)。

    15110

    相关产品

    • TencentOS Server

      TencentOS Server

      腾讯服务器操作系统(TencentOS Server,TS)是腾讯云推出的Linux操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云CVM全规格实例上,包括黑石2.0服务器。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券