当前位置: 首页 > Linux

linuxIO学习笔记(不断更新报错)

时间:2023-04-06 03:24:21 Linux

linux学习笔记1.linux的缓存IO机制在权限方面,内核拥有非常高的权限,可以访问所有底层硬件。用户(进程)的权限比较低,这样做的目的是保护内核的安全。在内存空间方面,操作系统将内存分为两部分,一部分给内核(称为内核空间),一部分给用户(进程)(称为用户空间),两者绝对互不干扰.(windows蓝屏的原因:硬件驱动与系统不兼容,驱动代码运行在系统内核空间,如果出错会影响系统内核,进而导致系统崩溃,以及机器会死机,QQ死机不会导致机器死机,因为QQ是运行在用户空间的),所以内核的数据和用户的数据是不共享的。如果内核要将任务(数据)交给用户(进程),就会有数据拷贝的过??程。代码获取硬盘文件中数据的进程(IO的一次性访问):用户(进程)对硬件(硬盘)没有权限,需要申请系统调用的权限(API)通过内核。内核创建页缓存(pagecache),将用户需要的数据从硬盘中一点一点读入页缓存中。当所有数据准备好后,一次性交给用户进程(这是由于缓存未命中,如果命中缓存,则直接返回),所以我们的代码也读取了数据,(例如PHP的file_get_contents()的一个文件读取过程)。写的过程就是把上面的过程倒过来。远程客户端的数据接收是一样的,只是读取的起点和写入的终点不同。另外,无论代码(用户进程)从哪里读取数据,无论是远程客户端数据还是硬盘数据,都必须通过中间人(内核)读取(因为没有硬件权限)。于是就有了一个关于如何接收数据的问题:如何解决多个客户端同时发送的数据接收问题(经典的C10k并发)。于是推导出五种IO网络模型:阻塞I/O(阻塞IO)非阻塞I/O(非阻塞IO)I/O多路复用(IOmultiplexing)套接字可读写事件(待整理)信号驱动I/O(signaldrivenIO)asynchronousI/O(asynchronousIO)以及基于这5种IO模型,衍生出很多服务器模型(IO设计模式),比如多进程/线程模型,leader/follower,Reactor,Proactor2。服务器模型历史第一阶段:早期的服务器模型是一个while死循环,接收一个连接,处理连接任务,返回处理结果。整个过程是阻塞的,运行过程中无法处理新的连接。第二阶段:多进程/线程模型,也就是经典的“connectionperprocess/thread”,一个进程或线程对应一个connection。这样,有多少个进程或线程,就可以处理多少个连接请求。到目前为止:第二阶段的优化。多进程/线程有很多缺点,比如资源复制,线程创建和销毁的开销(leader/follower模型,线程池中空闲线程的使用),进程数上限的问题或者threads(限制连接请求数),单线程还可以进一步细化(reactor模型,redis底层采用这种模型)等。下面详细记下3.leader-follower多线程模型线程的三种状态:1.Leader,mission:等待事件任务;特点:永远只有一个领导者;状态:等待。2.processing,mission:处理任务ing;状态:正在运行。3.Follower,任务:接收leader的通知,尝试抢占锁,尝试成为leader。状态:闲置。线程状态转换1.当leader等待事件任务时,释放唯一的锁,通知follower去抢锁(也可能是FIFO等其他形式选择leader或其他策略)。确认一个follower成为leader后,将自己变成一个处理任务。2.processing处理完任务后,变成follower,加入等待队列。优点:普通的多线程模型,当主线程收到IO事件后,会创建一个新的子线程,将要处理的任务数据复制到新的子线程中,让它解决问题,而主线程继续等待请求。子线程处理完任务后,会退出线程并销毁资源。1.没有频繁创建和销毁子线程的开销2.线程之间没有数据拷贝4.Reactor模型5.线程池,mysql线程池阅读参考:维基百科名称解释http://rango.swoole.com/archi...