1.线程/协程/异步

线程想提高效率和io密切相关,程序往往都含有io。CPU上下文切换就是先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。如下左边3个线程交叉运行完:1.DMA过程中cpu一段时间不被线程阻塞。2.DMA进行数据读取时可复用,因为cpu的总线程具有多条线路,所以DMA可充分利用这些线路,最终实现并行读取这些文件。通过以上两点大大提高了cpu利用率。
【Notes】IO
【Notes】IO
【Notes】IO
线程是操作系统级别概念,程序中想要开辟多线程需调用系统底层API才能进行多线程的开辟,在多线程开辟过程中浪费时间,并且在线程运行中上下文切换部分(左边切换多次,右边切换三次)有用户态和内核态转换耗时,所以一部分效率浪费在cpu切换时间点上。所以有了协程:协程是编程语言级别的线程,底层协程不是线程并不告诉操作系统我是新开辟的线程,因而全程处于用户态即协程是用户自定义的线程,协程可大量开辟不用担心用户态和内核态转换,一台机器上几百上千线程可能是极限,但用go语言开辟协程随便几千万,协程有异步(多去多回)的性能,同步(一去一回)的编程方式
【Notes】IO

2.IO多路复用select/poll/epoll

【Notes】IO
select返回后(如下最后5行)再遍历fd集合中5个fd并判断哪一个fd被set置位了,被set的那个有数据将它数据读出来并puts(处理),和上面用程序判断fd有无数据再处理思路一致。rset被内核set置位了需要每次while回来FD_ZERO赋空值再FD_SET将fd赋到rset中
【Notes】IO
system是一个C/C++的库函数,select是系统函数以下是4个缺点
【Notes】IO
如下pollfds数组里有5个pollfd结构体
【Notes】IO
epfd是共享内存不需要用户态切换到内核态,最后只遍历nfds,不需要轮询,时间复杂度为O(1)。epoll解决select的1,2,3,4。redis,nginx,javaNIO(linux)都用的是epoll。多路io复用借助了硬件上优势DMA
【Notes】IO
【Notes】IO
1、SSD与传统磁盘相比,第一是没有机械装置,第二是由磁介质改为了电介质。SSD没有传统磁盘的寻道时间和延迟时间。
2、基于SSD的优化就是解决erase-before-write产生的写入放大的问题。
3、优化原理:a.将sequential logging修改为In-page logging,避免对相同位置的反复擦写。b.通过缓存写入的方式将大量的in-place update随机写入合并为少量顺序写入。c.利用SSD随机读写能力高的特点,减少写增加读,从而达到整体性能的提升。

相关文章: