面试之linux

linux五种网络IO模型:阻塞型IO,非阻塞性IO,IO多路复用,信号驱动IO和异步IO,网络IO的本质就是socket的读取

  • 阻塞io:应用程序一直询问内核是否可以进行io操作
  • 非阻塞io就是systemcall发起IO操作之后,一直主动询问内核可以执行io操作了吗,在询问之后这个任务期间可以做其他操作
  • io多路复用就是有select等函数帮我们监听是否可以进行io操作了,可以同时监听多个任务的io操作,高并发采用这种方式
  • 信号驱动io也是同步,只是通过回调或者信号的方式,被动知道了什么时候可以io操作了
  • 异步io就是发起systemcall之后,继续执行下个任务,通过回调的方式,直接获取io执行成功或者失败的结果,不用应用程序自己执行io操作
  • 所以高并发都是采用这种模式,而不是采用多任务加上阻塞的方式,因为那样比较消耗资源
  • 具体内容可见:linux中的IO模型和这个
  • select,poll和epoll
    • select==>时间复杂度O(n)
      • 无差别轮询所有IO流,找出能读出数据,或者写入数据的流,对他们进行操作。
    • poll==>时间复杂度O(n)
      • poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.
    • epoll==>时间复杂度O(1)
      • epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1)

网路IO与磁盘IO

  • 网络IO与磁盘IO

进程线程协程

  • 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。
  • 线程可以说是轻量级进程,一个进程至少有一个线程,线程之间共享资源,线程是调度和分配的基本单位。
  • 进程是拥有系统资源独立单位,而线程没有,进程切换消耗资源较大
  • 协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源(因为资源调度的基本单位是线程,协程依附于线程)。    更多可见这里

          

 

你可能感兴趣的:(面试之linux)