当前位置: 首页 > news >正文

网站怎么做防盗制作一个网站平台吗

网站怎么做防盗,制作一个网站平台吗,佛山网上房地产官网,单位网站建设费用什么会计科目目录 IO基本概念五种IO模型钓鱼人例子五种IO模型高级IO重要概念同步通信 VS 异步通信阻塞 VS 非阻塞其他高级IO阻塞IO非阻塞IO IO基本概念 I/O#xff08;input/output#xff09;也就是输入和输出#xff0c;在著名的冯诺依曼体系结构当中#xff0c;将数据从输入设备拷贝… 目录 IO基本概念五种IO模型钓鱼人例子五种IO模型高级IO重要概念同步通信 VS 异步通信阻塞 VS 非阻塞其他高级IO阻塞IO非阻塞IO IO基本概念 I/Oinput/output也就是输入和输出在著名的冯诺依曼体系结构当中将数据从输入设备拷贝到内存就叫做输入将数据从内存拷贝到输出设备就叫做输出。 对文件进行的读写操作本质就是一种IO文件IO对应的外设就是磁盘。对网络进行的读写操作本质也是一种IO网络IO对应的外设就是网卡。 IO存在最主要的问题就是效率问题IO的效率极为低下的我们以读取数据为例 当我们read/recv的时候如果底层缓冲区中没有数据read/recv就会阻塞等待当我们read/recv的时候如果底层缓冲区中有数据read/recv就会进行拷贝在学习TCP的时候我们知道read/recv等一系列接口本质就是拷贝函数。 由此我们就可以知道IO的本质就是等待 数据拷贝只要缓冲区中没有数据read/recv就会一直阻塞等待直到缓冲区中出现数据然后进行拷贝所以说read/recv就会花费大量时间在等这一操作上面这就是一种低效的IO模式。 我们如果想要解决这个问题就需要让等的比重降低这样IO的效率就提高了接下来我们以钓鱼人的例子来理解一下IO模型。 五种IO模型 钓鱼人例子 IO的过程其实跟钓鱼是非常相似的IO中等的过程其实就相当于钓鱼等待鱼上钩的过程而拷贝到过程就相当于把鱼从水里装进桶里的过程。 我们来看下面这五个人的钓鱼方式 张三1根鱼竿将鱼钩扔进水里以后就一直盯着浮标一动不动不理会外界的任何动静直到鱼上钩李四1根鱼竿将鱼钩扔进水里以后可以干其他的事情定期观察浮标的动静如果鱼上钩就将鱼钓上来没有就继续干其他事情王五1根鱼竿但是在鱼竿上绑了一个铃铛将鱼钩扔进水里以后可以干其他的事情铃铛一响就知道鱼上钩了将鱼钓上来赵六100根鱼竿将100根鱼竿都放置好然后定期观察着100根鱼竿的状态如果某个鱼竿有鱼上钩就将鱼钓上来田七田七是一个领导带了一个司机此时田七也想钓鱼但是他要回公司开会所以他拿来一根鱼竿让自己的司机去钓鱼让司机把桶装满了给他打电话来接他。 张三李四和王五钓鱼的效率一样吗 张三李四和王五钓鱼的效率钓鱼的效率本质上是一样的因为他们都是拿着一根鱼竿在等待鱼上钩鱼咬钩的概率是一样的。 他们只不过是等待鱼上钩的方式不一样张三是死等李四是定期检查浮标王五则是通过铃铛的提示来判断鱼是否上钩。 谁的效率更高 显而易见赵六的效率是最高的因为赵六有100根鱼竿上鱼的概率是最大的单位时间内赵六鱼上钩的效率远远大于张三李四和王五。 因为赵六减少了等待的概率发生增加了拷贝的时间所以效率是最高的。 如何看待田七钓鱼方式 田七是将钓鱼这件事交给自己的司机去做了自己就可以去干其他事情了他并不关心司机是怎么钓鱼的司机可以采用张三李四王五和赵六中的任意一种方式田七只关心最后将桶装满了没。 田七并没有参与钓鱼的过程他将钓鱼的任务安排给了司机在司机钓鱼期间他可以做任何事情如果将钓鱼看作是一种IO的话那田七的这种钓鱼方式就叫做异步IO。 而对于张三、李四、王五、赵六来说他们都需要自己等鱼上钩当鱼上钩后又需要自己把鱼从河里钓上来对应到IO当中就是需要自己进行数据的拷贝因此他们四个人的钓鱼方式都叫做同步IO。 五种IO模型 这五个人的钓鱼方式对应了五种IO模型 张三这种死等方式叫做阻塞IO李四这种定时检测的方式叫做非阻塞IO王五这种通过设置铃铛得知事件是否就绪的方式就是信号驱动IO王五这种一次等待多个鱼竿上有鱼的钓鱼方式就是IO多路转接田七这种让别人帮自己钓鱼的钓鱼方式就是异步IO。 阻塞IO 阻塞IO就是在内核将数据准备好之前系统调用会一直等待。 图示如下 所有的套接字默认的都是阻塞方式 recvform读取数据时由于底层的某些数据还没有准备就绪此时就需要等待数据就绪当数据就绪后就会将数据从内核拷贝到应用空间最终 recvform函数返回成功recvform函数在等待过程中本质上还是操作系统将该进程或者线程设置为某种非R状态将其放入等待队列之中而用户所看见的就是进程或者是线程阻塞住了当数据就绪后操作系统就将等待的进程或线程唤醒进而将数据从内核拷贝到应用空间 非阻塞IO 非阻塞IO就是如果内核还未将数据准备好系统调用仍然会直接返回并且返回EWOULDBLOCK错误码。 图示如下 非阻塞IO往往需要程序员以循环的方式反复尝试读写文件描述符这个过程称为轮询这对CPU来说是较大的浪费一般只有特定场景下才使用。 调用recvform函数时如果底层数据没有准备好此时就不会等待数据就绪而是直接返回EWOULDBLOCK错误码如果一直没有数据就绪就会一直返回EWOULDBLOCK错误码直到底层数据就绪将数据拷贝到应用程序每次recvform函数读取数据是就算底层数据没有成功依然会立马返回在用户看来进程或线程就没有被阻塞住我们就称之为非阻塞IO 阻塞IO与非阻塞IO的最大区别就在于阻塞IO是操作系统识别到数据就绪后唤醒进程或线程而非阻塞IO是用户一直进行检测直到数据准备就绪。 信号驱动IO 信号驱动IO就是当内核将数据准备好的时候使用SIGIO信号通知应用程序进行IO操作。 图示如下 当底层数据就绪的时候会向当前进程或线程递交SIGIO信号因此可以通过signal或sigaction函数将SIGIO的信号处理程序自定义为需要进行的IO操作当底层数据就绪时就会自动执行对应的IO操作。 调用recvform函数从套接字上读取数据时可以将该操作定义为SIGIO的信号处理程序当底层数据就绪时操作系统就会递交SIGIO信号此时就会自动执行我们定义的信号处理程序进程将数据从内核拷贝到用户空间信号的产生是异步的但信号驱动IO是同步IO的一种。信号在任何时刻都可能产生但信号驱动IO是同步IO的一种因为当底层数据就绪时当前进程或线程需要停下正在做的事情转而进行数据的拷贝操作因此当前进程或线程仍然需要参与IO过程。 IO多路转接 IO多路转接也叫做IO多路复用能够同时等待多个文件描述符的就绪状态。 IO的过程实际上是“等 拷贝的过程” 调用recvform函数之后数据未就绪就等数据就绪了以后就进行数据的拷贝但是尽管recvform可以实现“等这一操作”但是一次只能等待一个文件描述符效率太低了所以系统为我们提供了select/epoll/poll三组接口这些接口的核心工作就是“等”我们可以将所有“等”的工作都交给这些多路转接接口因为这些多路转接接口是一次“等”多个文件描述符的因此能够将“等”的时间进行重叠当数据就绪后再调用对应的recvfrom等函数进行数据的拷贝此时这些函数就能够直接进行拷贝而不需要进行“等”操作了。 异步IO 异步IO就是由内核在数据拷贝完成时通知应用程序。 图示如下 进行异步IO需要调用一些异步IO的接口异步IO接口调用后会立马返回因为异步IO不需要你进行“等”和“拷贝”的操作这两个动作都由操作系统来完成你要做的只是发起IO当IO完成后操作系统会通知应用程序因此进行异步IO的进程或线程并不参与IO的所有细节。 高级IO重要概念 同步通信 VS 异步通信 同步和异步关注的是消息通信机制。 所谓同步就是在发出一个调用时在没有得到结果之前该调用就不返回但是一旦调用返回就得到返回值了换句话说就是由调用者主动等待这个调用的结果。异步则是相反调用在发出之后这个调用就直接返回了所有没有返回结果换句话说当一个异步过程调用发出后调用者不会立刻得到结果而是在调用发出后被调用者通过状态、通知来通知调用者或通过回调函数处理这个调用。 为什么非阻塞IO在没有得到结果之前就返回了 IO分为“等”和拷贝”两步当数据没有准备就绪的时候recvform调用进行非阻塞IO时就会直接返回但是此时返回的并不是一个完整的IO过程而是一个错误的返回因此该进程或线程后续还需要继续调用recvfrom轮询检测数据是否就绪当数据就绪后最后再把数据从内核拷贝到用户空间这才是一次完整的IO过程。 因此在进行非阻塞IO时在没有得到结果之前虽然这个调用会返回但后续还需要继续进行轮询检测因此可以理解成调用还没有返回而只有当某次轮询检测到数据就绪并且完成数据拷贝后才认为该调用返回了。 同步通信 VS 同步与互斥 在多进程与多线程里面有同步与互斥的概念IO中也存在同步的概念但是这两个同步是完全不相干的。 多进程与多线程下同步是指在保证数据安全的前提下让进程或线程按照某种特定的方式访问临界资源从而有效的避免了饥饿问题讨论的是线程/进程间的工作关系而同步IO指的是进程/线程与操作系统之间的关系谈论的是进程/线程是否需要主动参与IO过程。 阻塞 VS 非阻塞 阻塞和非阻塞关注的是程序在等待调用结果消息、返回值时的状态。 阻塞调用是指调用结果返回之前当前线程会被挂起调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前该调用不会阻塞当前线程。 其他高级IO 非阻塞IO记录锁系统V流机制I/O多路转接也叫I/O多路复用readv和writev函数以及存储映射IOmmap这些统称为高级IO。 阻塞IO 我们可以用read函数从标准输入当中读取数据为例 #include iostream #include unistd.hint main() {char buffer[1024];while (true){ssize_t s read(0, buffer, sizeof(buffer) - 1);if (s 0){buffer[s] 0;std::cout echo# buffer std::endl;}else{std::cout read error std::endl;}}return 0; }程序运行以后我们会发现如果我们不进行数据的输入操作程序就会一直阻塞住根本原因就是底层数据没有就绪read函数在阻塞式等待。 当我们输入数据以后此时read函数就会检测到底层的数据已经就绪了就会将缓冲区中的数据拷贝到我们的buffer数组中并且将读取到的数据输出到显示器上面最后我们就看到了我们输入的字符串。 非阻塞IO 打开文件时默认都是以阻塞的方式打开的如果要以非阻塞的方式打开某个文件需要在使用open函数打开文件时携带O_NONBLOCK或O_NDELAY选项此时就能够以非阻塞的方式打开文件。 我们一般用统一的方式来进行非阻塞设置就是fcntl函数。 fcntl函数 fcntl函数的原型如下 int fcntl(int fd, int cmd, ... /* arg */ );参数说明 fd已经打开的文件描述符。cmd需要进行的操作。…可变参数传入的cmd值不同后面追加的参数也不同。 fcntl函数常用的5种功能与其对应的cmd取值如下 复制一个现有的描述符cmdF_DUPFD。获得/设置文件描述符标记cmdF_GETFD或F_SETFD。获得/设置文件状态标记cmdF_GETFL或F_SETFL。获得/设置异步I/O所有权cmdF_GETOWN或F_SETOWN。获得/设置记录锁cmdF_GETLKF_SETLK或F_SETLKW。 返回值说明 如果函数调用成功则返回值取决于具体进行的操作。如果函数调用失败则返回-1同时错误码会被设置。 实现函数SetNoBlock 基于fcntl, 我们实现一个SetNoBlock函数将文件描述符设置为非阻塞。 bool SetNoBlock(int fd) {// 在底层获取fd对应文件描述符的标志位int fl fcntl(fd, F_GETFL);if (fl 0)return false;// 设置非阻塞IOfcntl(fd, F_SETFL, fl | O_NONBLOCK);return true; }此时我们在以非阻塞轮询方式读取标准输入。 #include iostream #include unistd.h #include fcntl.h #include cstringbool SetNoBlock(int fd) {// 在底层获取fd对应文件描述符的标志位int fl fcntl(fd, F_GETFL);if (fl 0)return false;// 设置非阻塞IOfcntl(fd, F_SETFL, fl | O_NONBLOCK);return true; } int main() {SetNoBlock(0);char buffer[1024];while (true){sleep(1);ssize_t s read(0, buffer, sizeof(buffer) - 1);if (s 0){buffer[s] 0;std::cout echo# buffer std::endl;}else{std::cout read error errno: errno errstring: strerror(errno) std::endl;if (errno EWOULDBLOCK || errno EAGAIN){std::cout 当前0号fd数据未就绪,请再试一次 std::endl;continue;}else if (errno EINTR){std::cout 当前IO信号可能被中断,请再试一次 std::endl;continue;}}}return 0; }需要注意的是调用read函数以后如果底层数据没有就绪就会立马返回一个错误信息但是此时我们是需要对返回的的错误信息进行甄别的我们需要知道是真的出错了还是只是底层数据没有就绪。如果错误码的值是EAGAIN或EWOULDBLOCK说明本次调用read函数出错是因为底层数据还没有就绪因此后续还应该继续调用read函数进行轮询检测数据是否就绪当数据继续时再进行数据的读取。 此外调用read函数在读取到数据之前可能会被其他信号中断此时read函数也会以出错的形式返回此时的错误码会被设置为EINTR此时应该重新执行read函数进行数据的读取。 程序运行以后底层数据如果没有就绪此时read函数就会轮询进行检测 一旦我们进行了输入操作此时read函数就会在轮询检测时检测到紧接着立马将数据读取到从内核拷贝到我们传入的buffer数组当中并且将读取到的数据输出到显示器上面然后继续进行轮询检测。
http://www.hkea.cn/news/14350112/

相关文章:

  • 响应式网站 图片处理手机网站用什么后台
  • 却持网站长沙建站模板
  • 腾讯云 wordpress建站注册公司银行开户需要多少钱
  • 房产销售网站开发文档长沙人才招聘网最新招聘2024
  • 西宁网站系统建设公关咨询公司
  • 建立网站的步骤微信开发者模式在哪打开
  • 做网站哪种域名好记音乐网站怎么做
  • 电子商务网站 方案自动化培训网站建设
  • 怎么写网站海外广告投放是干嘛的
  • 中企动力做网站一次性付款永嘉网站制作哪家好
  • wordpress手机管理沈阳免费seo关键词优化排名
  • 优惠券精选网站怎么做网站后台更新文章 前台不显示
  • joomla 2.5:你的网站建设_使用与管理 pdfmvc3网站上传到空间
  • 文山知名网站建设联系电话装修设计装饰公司
  • 新手学做网站从哪里开始做网站需要商标注册吗
  • 广州市官网网站建设哪家好网站开发实训报告参考文献
  • 做网站公司怎样全国十大外贸平台
  • 湘潭网站建设口碑好磐石网络泉州关键词优化
  • 怎么做网站最便宜wap入口
  • 淄博亿泰网站建设推广建设外贸网站注意什么
  • 石家庄网络公司排名企业网站优化面向什么工作
  • 全县网站建设管理工作会议召开美发培训职业学校
  • 买外贸服装去哪个网站河北网站搜索排名优化方案
  • 少主网络建站拼团网站建设
  • 网站正能量大全小制作简单易学
  • 电商类网站开发费用怎么修改网站的源代码
  • 自适应网站推广松江网站建设品划网络
  • 深圳微信网站开发公司网站建设 总体目标
  • 南阳网站运营网站建设评价
  • 主机做网站服务器怎么设置网站上怎么做返回主页链接