每天,枝上的杨柳寥寥无几。天下无香草。每日一句除非你有勇气离开海岸,否则你无法游向新的视野。除非你有离开岸边的勇气,否则你永远不会游到彼岸。IO的概念就是在主存和外部设备(硬盘、终端和网络等)之间拷贝数据的过程。IO是操作系统的底层功能实现,底层是通过I/O指令完成的。以下是Unix下可用的5种I/O模型1.BlockingI/O:BlockingIO2。非阻塞I/O:非阻塞IO3。I/O多路复用(Select、pollepoll):IO多路复用4。SignaldrivenTypeI/O(SIGIO):信号驱动IO5。AsynchronousI/O(posixaio系列函数):asynchronousIOBlockingIO在Linux中,所有的sockets默认都是Blocking的,一个典型的读操作过程大概是这样的:1.通常涉及等待网络数据到达。当所有等待的数据到达时,将其复制到内核中的一个缓冲区中2.将数据从内核缓冲区中复制到应用程序缓冲区中当用户进程调用recvfrom系统调用时,内核开始第一个IOPhase1:准备数据。对于网络IO,很多时候一开始数据还没有到达(比如还没有收到完整的UDP包)。这时内核会等待足够的数据到达。在用户进程端,整个进程都会被阻塞。当内核等到数据准备好后,会将内核中的数据拷贝到用户内存中,然后内核返回结果,用户进程释放block状态,重新开始运行。因此,BlockingIO的特点是在非阻塞I/OLinux下,IO执行的两个阶段都是阻塞的,可以设置socket使其成为非阻塞的。当对非阻塞套接字进行操作时,流程如下:从图中可以看出,当用户进程发出读操作时,如果内核中的数据还没有准备好,那么它不会阻塞用户进程,但立即返回错误。从用户进程的角度来看,它发起读操作后,不需要等待,而是立即得到结果。当用户进程判断结果为错误时,就知道数据没有准备好,可以再次发送读操作。一旦内核中的数据准备好,再次收到用户进程的系统调用,就立即将数据拷贝到用户内存中,然后返回。因此,用户进程第一阶段不阻塞,需要不断主动询问内核数据是否就绪;第二阶段仍然总是被阻止。IO多路复用(NIO)select和epoll的优点是单个进程可以同时处理多个网络链路的IO。IO多路复用的本质和同步阻塞是一样的,只是使用了新的Select系统调用,由内核负责请求进程应该做的循环操作。看起来不仅是非阻塞IO,系统调用开销也比较多,但是因为支持多路IO,也算是提高了效率,也就是一个可以监控多个。它的基本原理是select和epoll函数会不断轮询所有负责的socket,当某个socket有数据到达时通知用户进程。它的流程是这样的:当用户线程调用select时,整个进程会被阻塞,同时内核会监听select负责的所有socket。当任何套接字中的数据准备就绪时,select将返回。这时用户进程会调用read操作将数据内核拷贝给用户进程。首先开启socket的信号驱动IO功能,通过sigaction(signalhandler)系统调用安装一个信号处理函数,函数调用会立即返回,当前进程没有阻塞,继续工作;当数据报就绪时,内核为进程产生一个SIGIO信号,然后可以在信号处理函数中调用recvfrom读取数据报,通知主循环数据准备好可以处理了;也可以直接通知主循环让它读取数据报;(其实就是一个要读取的通知和一个要处理的通知),基本不用。异步IO(AIO)多线程多进程模型虽然解决了并发问题,但是系统不能无限增加线程数。因为系统中切换线程的开销是恒定的,一旦线程数过多,就会耗费CPU时间。在线程切换中,实际运行代码的时间会减少,导致性能严重下降。既然我们要解决的问题是CPU的高速执行能力与IO设备的慢速不匹配,那么多线程和多处理只是为了解决这个问题。解决问题的一种方法。另一种解决IO问题的方法是异步IO。当代码需要执行一个耗时的IO操作时,只发出IO指令,不等待IO结果,再执行其他代码。一段时间后,当IO返回结果是的,我们调用aio_read函数通知CPU处理,将描述符、缓冲区指针、缓冲区大小、文件偏移量传递给内核,告诉内核如何通知我们在整个操作完成时。函数调用后,立即返回,不会被阻塞另一方面:从内核的角度来说,当它收到一个aio_read时,它会立即返回,所以不会为用户进程产生阻塞,然后kernel会等待数据准备完成,然后将数据copy到User内存中(copy由kernel完成),当一切完成后,kernel会向user进程发送信号或者执行下一个thread-based回调函数完成IO处理过程,告诉他读操作应该安静完成。最近,我的心总是不安分,想必是被世俗的诱惑所困。我想,如果远方的相符先生来到我的“美芝堂”,我们盘膝品茶,或看他画梅花,纸上的梅花仿佛雪中绽放,若是如此,那应该是怎样的墨梅图呢?昨夜梦中,只见相府戴着黑色小圆框眼镜,背着一个黄色的大包??,急匆匆赶往江南。又是梅花的日子吗?面试题HJ2计算一个字符出现的次数题目链接https://www.nowcoder.com/practice/a35ce98431874e3a820dbe4b2d0508b1题目描述写一个程序,接受一个由字母、数字和空格组成的字符串和一个字符,然后输出输入该字符在字符串中出现的次数。(不区分大小写字母)数据范围:1\len\le1000\1≤n≤1000示例示例1:输入:ABCabcA输出:2问题解决方法一:模拟算法importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Strings=sc.nextLine().toLowerCase();Stringinx=sc.nextLine().toLowerCase();intcnt=0;对于(inti=0;i
