学习日记-2021-09-20

IO
IO
IO 用户进程-调用系统调用-内核 内核-准备数据(等待数据) 内核-数据拷贝 内核-数据返回-用户
阻塞IO:内核数据未准备好时阻塞用户进程 直到内核返回数据
非阻塞IO:内核数据未准备好返回给用户进程一个error 用户进程轮询数据 直到内核数据准备完成返回OK
有个阻塞点 内核拷贝数据时 用户进程被阻塞
IO多路复用(event driven IO (事件驱动IO)):select接管多个用户进程轮询IO的任务 用户调用select后进入阻塞 等select返回
内核监视所有select负责的socket
与阻塞io不同点:用户线程阻塞在select 阻塞io阻塞在socket io处
select优势:同时处理多个连接 若连接数较少 性能可能不比多线程+阻塞io好(阻塞io系统调用少一个)
异步IO:用户发送给内核请求后可以去做别的事情,不必等数据,内核在数据准备好(已拷贝)后通知用户进程

条件编译
条件编译1
小细节 宏定义不加;
宏定义可用于小函数 省栈(避免频繁入栈出栈 省cpu)性能优 不过不利于调试 可用inline替代
ifndef 防止重复包含头文件的宏
defined 可用于在一条判断语句中声明多个判别条件;#ifdef和#ifndef则仅支持判断一个宏是否定义
#elif不仅仅是检查后面的宏有没有定义,还会检查值。但是#ifdef就只是检查后面的宏是否定义,而不管值为多少
#ifdef 可用于debug打印
条件编译2

NIO
NIO1
NIO2

io:面向流的方式处理数据(单个的字节,字符的移动,流的一次操作一次只能产生或者消费一个字节或者字符即使有缓冲,也需要程序员自己填充和提取缓冲区内容)
nio:面向块的方式处理数据(数据块的移动,一次操作产生或者消费一个数据块,将最耗时的 I/O 操作–填充和提取缓冲区内容操作转移回操作系统)

NIO包引入了四个关键的抽象数据类型

  1. Buffer:它是包含数据且用于读写的线形表结构(字节数组)。其中还提供了一个特殊类用于内存映射文件的I/O操作。一个 Buffer 实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中
  2. Charset:它提供Unicode字符串影射到字节序列以及逆影射的操作(编码及解码器)
  3. Channels:通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象。包含socket,file和pipe三种管道,它实际上是双向交流的通道(与流的不同之处在)
  4. Selector:它将多元异步I/O操作集中到一个或多个线程中

•读取文件操作:(1) 从 FileInputStream 获取Channel, (2) 创建Buffer, (3) 将数据从 Channel 读到 Buffer中.
•写入文件操作:(1)从 FileOutputStream 获取Channel, (2)创建Buffer, (3)将数据从 Channel 写到 Buffer中.
•重设缓冲区操作:在从输入通道读入缓冲区之前,我们调用 clear() 方法。同样,在将缓冲区写入输出通道之前,我们调用 flip() 方法
•检查状态操作: read() 方法返回 -1 是判断文件读取完成的标志
•注意:不需要告诉通道要写入多数据。缓冲区的内部统计机制会跟踪它包含多少数据以及还有多少数据要写入
————————————————
版权声明:本文为CSDN博主「菜鸟腾飞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/drdongshiye/article/details/78521733
出处

传统socket IO:
一个线程管一个连接,线程读不到数据就阻塞,在io阻塞时 线程挂起 造成资源浪费(线程自己的栈内存 cpu线程切换消耗)
NIO:
线程读不到数据返回0 线程不会阻塞
客户端创建连接时 将连接注册到selector

线程池
cpp线程池

epoll复杂度
epoll原理相关
双向链表+红黑数
红黑树存注册监控的fd
双向链表存就绪fd
收到fd数据 中断 将节点加入链表 epoll_wait收到消息 将链表节点数据写入内存 清链表
要再看

计划
NIO没看完 继续学NIO
用一下select poll epoll
看项目
设计模式
linux命令
看看文件相关
ningx
docker
redis
mongodb
reactor
线程池 细节要看 原理之类的 有些没看懂的变量函数 涉及锁 cond是啥?

内存池

技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值