1. 内核中提高I/O性能的新方法epoll

epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调 用:epoll_create(2), epoll_ctl(2), epoll_wait(2)。当然,这不是2.6内核才有的,它是在 2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44)
Linux2.6 内核epoll介绍:
先介绍2本书《The Linux Networking Architecture--Design and Implementation of Network Protocols in the Linux Kernel》,以2.4内核讲解Linux TCP/IP实现,相当不错.作为一个现实世界中的实现,很多时候你必须作很多权衡,这时候参考一个久经考验的系统更有实际意义。举个例子linux内 核中sk_buff结构为了追求速度和安全,牺牲了部分内存,所以在发送TCP包的时候,无论应用层数据多大,sk_buff最小也有272的字节.其实对于socket应用层程序来说,另外一本书《UNIX Network Programming Volume 1》意义更大一点.2003年的时候,这本书出了最新的第3版本,不过主要还是修订第2版本。其中第6章《I/O Multiplexing》是最重要的。Stevens给出了网络IO的基本模型。在这里最重要的莫过于select模型和Asynchronous I/O模型.从理论上说,AIO(异步I/O)似乎是最高效的,你的IO操作可以立即返回,然后等待os告诉你IO操作完成。但是一直以来,如何实现就没有一个完美的方案。最著名的windows完成端口实现的AIO,实际上也是内部用线程池实现的罢了,最后的结果是IO有个线程池,你应用也需要一个线程池...... 很多文档其实已经指出了这带来的线程context-switch带来的代价。在linux 平台上,关于网络AIO一直是改动最多的地方,2.4的年代就有很多AIO内核patch,最著名的应该算是SGI那个。但是一直到2.6内核发布,网络模块的AIO一直没有进入稳定内核版本(大部分都是使用用户线程模拟方法,在使用了NPTL的linux上面其实和windows的完成端口基本上差不多了)。2.6内核所支持的AIO特指磁盘的AIO---支持io_submit(),io_getevents()以及对Direct IO的支持(就是绕过VFS系统buffer直接写硬盘,对于流服务器在内存平稳性上有相当帮助)。所以,剩下的select模型基本上就是我们在linux上面的唯一选择,其实,如果加上no-block socket的配置,可以完成一个"伪"AIO的实现,只不过推动力在于你而不是os而已。不过传统的select/poll函数有着一些无法忍受的缺点,所以改进一直是2.4-2.5开发版本内核的任务,包括/dev/poll,realtime signal等等。最终,Davide Libenzi开发的epoll进入2.6内核成为正式的解决方案

2. selected 缺陷

首先,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在我用的2.6.15-25-386内核中,该值是1024,搜索内核源代码得到:
include/linux/posix_types.h:
#define __FD_SETSIZE         1024
也就是说,如果想要同时检测1025个句柄的可读状态是不可能用select实现的。或者同时检测1025个句柄的可写状态也是不可能的。其次,内核中实现 select是用轮询方法,即每次检测都会遍历所有FD_SET中的句柄,显然,select函数执行时间与FD_SET中的句柄个数有一个比例关系,即 select要检测的句柄数越多就会越费时。当然,在前文中我并没有提及poll方法,事实上用select的朋友一定也试过poll,我个人觉得 select和poll大同小异,个人偏好于用select而已。

3. epoll的优点

(1) 支持一个进程打开大数目的socket描述符(FD)

    select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显 然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的 Apache方案),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完 美的方案。不过 epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左 右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。
(2) IO 效率不随FD数目增加而线性下降
传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是"活跃"的, 但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题,它只会对"活跃"的socket进行 操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数,其他idle状态socket则不会,在这点上,epoll实现了一个"伪"AIO,因为这时候推动力在os内核。在一些 benchmark中,如果所有的socket基本上都是活跃的---比如一个高速LAN环境,epoll并不比select/poll有什么效率,相反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN环境,epoll的效率就远在select/poll之上了。
(3)使用mmap加速内核 与用户空间的消息传递。
这点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就 很重要,在这点上,epoll是通过内核与用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定不会忘记手工 mmap这一步的。
(4)内核微调
这一点其实不算epoll的优点了,而是整个linux平台的优点。也许你可以怀疑 linux平台,但是你无法回避linux平台赋予你微调内核的能力。比如,内核TCP/IP协议栈使用内存池管理sk_buff结构,那么可以在运行时期动态调整这个内存pool(skb_head_pool)的大小--- 通过echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函数的第2个参数(TCP完成3次握手 的数据包队列长度),也可以根据你平台内存大小动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本身大小却很小的特殊系统上尝试最新的NAPI网卡驱动架构。

4. epoll的工作模式

令人高兴的是,2.6内核的epoll比其2.5开发版本的/dev/epoll简洁了许多,所以,大部分情况下,强大的东西往往是简单的。唯一有点麻烦 是epoll有2种工作方式:LT和ET。
LT(level triggered)是缺省的工作方式:并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.
ET (edge-triggered)是高速工作方式:只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致 了一个EWOULDBLOCK错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once)。

epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用,具体用法请参考http://www.xmailserver.org/linux-patches/nio-improve.html ,在http://www.kegel.com/rn/也有一个完整的例子,大家一看就知道如何使用了Leader/follower模式线程 pool实现,以及和epoll的配合。

5. epoll的使用方法

epoll的接口非常简单,一共就三个函数:

(1)  int  epoll_create(int size);
创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。
(2)  int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事件注册函数,它不同与select()是在监听事件时(epoll使用epoll_wait监听)告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:

EPOLL_CTL_ADD:注册新的fd到epfd中;

EPOLL_CTL_MOD:修改已经注册的fd的监听事件;

EPOLL_CTL_DEL:从epfd中删除一个fd;

第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;

struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events可以是以下几个宏的集合:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
(3) int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
等待事件的产生,类似于select()调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个 maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。

6. 应用实例

服务端

#include <iostream>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
using namespace std;
#define MAXLINE 5
#define OPEN_MAX 100
#define LISTENQ 20
#define SERV_PORT 5000
#define INFTIM 1000
void setnonblocking(int sock)//将套接字设置为非阻塞
{
int opts;
opts=fcntl(sock,F_GETFL);
if(opts<0)
{
perror("fcntl(sock,GETFL)");
exit(1);
}
opts = opts|O_NONBLOCK;
if(fcntl(sock,F_SETFL,opts)<0)
{
perror("fcntl(sock,SETFL,opts)");
exit(1);
}
}
int main(int argc, char* argv[])
{
int i, maxi, listenfd, connfd, sockfd,epfd,nfds, portnumber;
ssize_t n;
char line[MAXLINE];
socklen_t clilen;
if ( 2 == argc )
{
if( (portnumber = atoi(argv[1])) < 0 )
{
fprintf(stderr,"Usage:%s portnumber/a/n",argv[0]);
return 1;
}
}
else
{
fprintf(stderr,"Usage:%s portnumber/a/n",argv[0]);
return 1;
}
struct epoll_event ev,events[20]; //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
epfd=epoll_create(256); //生成用于处理accept的epoll专用的文件描述符
struct sockaddr_in clientaddr;
struct sockaddr_in serveraddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
setnonblocking(listenfd); //把socket设置为非阻塞方式
ev.data.fd=listenfd; //设置与要处理的事件相关的文件描述符
ev.events=EPOLLIN|EPOLLET;  //设置要处理的事件类型    

    epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev); //注册epoll事件
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
char *local_addr="127.0.0.1";
inet_aton(local_addr,&(serveraddr.sin_addr)); 
serveraddr.sin_port=htons(portnumber);
bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));
listen(listenfd, LISTENQ);
maxi = 0;
for ( ; ; ) {
nfds=epoll_wait(epfd,events,20,500); //等待epoll事件的发生
for(i=0;i<nfds;++i) //处理所发生的所有事件
{
if(events[i].data.fd==listenfd)//如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口,建立新的连接。
{
connfd = accept(listenfd,(sockaddr *)&clientaddr, &clilen);
if(connfd<0){
perror("connfd<0");
exit(1);
}
char *str = inet_ntoa(clientaddr.sin_addr);
cout << "accapt a connection from " << str << endl;
ev.data.fd=connfd; //设置用于读操作的文件描述符
ev.events=EPOLLIN|EPOLLET; //设置用于注测的读操作事件
epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev); //注册ev
}
else if(events[i].events&EPOLLIN)//如果是已经连接的用户,并且收到数据,那么进行读入。
{
cout << "EPOLLIN" << endl;
if ( (sockfd = events[i].data.fd) < 0)
continue;
if ( (n = read(sockfd, line, MAXLINE)) < 0) {
if (errno == ECONNRESET) {
close(sockfd);
events[i].data.fd = -1;
} else
std::cout<<"readline error"<<std::endl;
} else if (n == 0) {
close(sockfd);
events[i].data.fd = -1;
}
line[n] = '/0';
cout << "read " << line << endl;
ev.data.fd=sockfd;  //设置用于写操作的文件描述符
ev.events=EPOLLOUT|EPOLLET; //设置用于注测的写操作事件
epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev); //修改sockfd上要处理的事件为EPOLLOUT
}
else if(events[i].events&EPOLLOUT) // 如果有数据发送
{
sockfd = events[i].data.fd;
write(sockfd, line, n);
ev.data.fd=sockfd; //设置用于读操作的文件描述符
ev.events=EPOLLIN|EPOLLET; //设置用于注测的读操作事件
epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);  //修改sockfd上要处理的事件为EPOLIN
}
}
}
return 0;
}

一缕阳光a
发布了179 篇原创文章 · 获赞 135 · 访问量 32万+

相关文章

  1. 营业执照识别

    市场上最新推出了营业执照识别SDK,对于每一个企业而言,营业执照就如“身份证”一般,是企业的唯一ID,在办理和企业相关的业务中,经常涉及到对企业营业执照信息的录入。因为企业营业执照的文字信息非常多,录入起来费时费力。针对这些问题,我们开发出营业执照 识别产品,只…...

    2022/12/3 10:15:38
  2. Hive DDL DML基本操作

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_43240913/article/details/103308493任务目标 1.了解Hive的基本操作 2.了解Hive的外部表与普通表的区别 相关知识 Hive定…...

    2022/12/3 10:05:24
  3. 《计算方法》上机实验报告(华科软院)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/lee1hong/article/details/1033112961. (25分)计算积分, n=0,1,2,…,20若用下列两种算法(A) (B) 试依据积分In的性质…...

    2022/12/3 10:02:18
  4. 正反向建图——kuangbin最短路专题总结(2)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_37087993/article/details/103291335POJ 3268 Silver Cow Party POJ 1511 Invitation Cards 两道题都是有向图,求源点到…...

    2022/12/3 10:00:47
  5. Javaweb常用单词

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_45527690/article/details/103313842servlet [sɜ:vlet] 小服务程序config 配置configuration [kənˌfɪgjəˈre…...

    2022/12/3 9:59:57
  6. 别再瞎猜了!“携号转网”后谁是赢家?看完这篇便知晓...

    “携号转网”在一年前,似乎对于大多数国人来说,还是个新名词。虽然,早几年前,就已经在多个省份推行了“携号转网”试点。第一批试点启动于2010年11月,选的是天津和海南;随后2014年9月,在江西、湖北、云南开展第二批携号转网试点。截止到2019年9月底,五个省市连原来试验…...

    2022/12/3 9:53:27
  7. 注册器模式

    原文链接:https://www.cnblogs.com/phpworld/p/7443816.html工厂模式和策略模式有两种方式去调用方法,一种是用工厂方法调用,一种是单例调取实例,那实际上这两种都有一个缺点(可能也不应该称为缺点,也可叫不足),有一个比较好的方法就是已经创建好的这个对象,直接去取这…...

    2022/12/3 9:51:54
  8. res下raw和assets的区别

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_43241356/article/details/103291196这两个目录下的文件都会被打包进APK,并且不经过任何的压缩处理。 assets与res…...

    2022/12/3 9:51:04
  9. Pytorch迁移学习

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/sinat_35821976/article/details/103292623目录1. 修改最后一层的网络结构2. 不同网络层设置不同的学习速率3. Demo在使用深…...

    2022/12/3 9:46:01
  10. 剑指offer第14题:链表中倒数第k个结点

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44643195/article/details/103274826题目描述 输入一个链表,输出该链表中倒数第k个结点。 /* public class ListNo…...

    2022/12/3 9:45:20
  11. 万人瞩目!邮储银行12月10日上市,百亿资金齐上阵

    万人瞩目的邮储银行迎来上市时刻,多举措力保股价:控股股东增持不低于25亿元、“绿鞋”资金43亿元、指数基金配置80亿元。邮储银行12月10日上市12月8日晚,邮储银行公告称,公司A股股票将于12月10日在上交所上市交易。该公司A股股本为6712239.52万股,本次上市数量为297399.22…...

    2022/12/3 9:38:46
  12. 4.2万股东想哭!孙公司失控,控股股东50亿债务违约,还能撑多久?

    A股市场真是什么雷都有,见过高管“失联”的,但下属公司“失控”倒是非常罕见。12月5日晚间,一颗“惊雷”降临在A股上市公司中昌数据4.2万名股东的头上。中昌数据当晚公告称,亿美汇金2019年度预审计工作不能正常进行,公司对亿美汇金失去控制。亿美汇金失去控制事项,将会对…...

    2022/12/3 8:56:53
  13. 预判,服不服!

    全天收盘,又再一次接近最高点收盘,这是多头一点不给空头做空的余地。这个收盘跟昨日是类似的。昨天我们说市场强势,但是也有恐高资金,毕竟创业板指数面临新高了,但是今天我们观察到三大指数量能比昨日有所放量,这个放量是什么意思?这个放量意味着昨日或者今天早盘恐高盘…...

    2022/12/3 8:54:47
  14. 上交所副总徐毅林:科创板要吸引更多硬科技企业上市,加大制度供给

    经济观察网 记者 周一帆 12月5日,2019南方财经国际论坛在广州举行。上交所党委委员、副总经理徐毅林当天在做主题演讲时表示,上交所将从建设世界科技强国,实现经济高质量发展的国家战略大局出发,去深刻认识设立科创板并试点注册制在全面深化资本市场改革中的定位和作用,进…...

    2022/12/3 8:50:19
  15. 卫勇:上汽金融板块要赚钱,明年还要做好两件事

    2019年车市、资本市场双寒冬,在12月6日举行的上汽金融2019年论坛上,上汽金融板块各企业纷纷交流一年所得,分享创新管理案例,或进入深度“创新”、精细耕耘时代,或在海外市场发力、助力集团整车销售。“上汽金融板块要齐心协力,紧密围绕主业发展,想办法在这个竞争激烈、残…...

    2022/12/3 7:56:43
  16. 《PaddlePaddle从入门到炼丹》3——卷积神经网络

    文章目录前言训练模型预测图像参考资料 前言 上一章我们通过学习线性回归例子入门了深度学习,同时也熟悉了PaddlePaddle的使用方式,那么我们在本章学习更有趣的知识点卷积神经网络。深度学习之所以那么流行,很大程度上是得益于它在计算机视觉上得到非常好的效果,而在深度学…...

    2022/12/3 6:35:48
  17. 测试发文

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Seabiscuit_/article/details/103305951测试发文测试发文测试发文测试发文测试发文测试发文测试发文测试发文测试发文测试发…...

    2022/12/3 6:17:18
  18. 中标麒麟系统换yum

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/yonggandess/article/details/103257347https://blog.csdn.net/xupengxl/article/details/89946287...

    2022/12/3 5:16:58
  19. JavaScript 18位身份证验证及身份证号码规则

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/l23456789o/article/details/103258869JavaScript 18位身份证验证及身份证号码规则...

    2022/12/3 5:16:56
  20. ArrayList,LinkedList

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/dl674756321/article/details/1032565991. ArrayList基于数组实现,允许空值和重复元素。 当添加元素数量大于数组容量时,…...

    2022/12/3 5:16:44

最新文章

  1. Epoll模型详解

    1. 内核中提高I/O性能的新方法epollepoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调 用:epoll_create(2), epoll_ctl(2), epoll_wait(2)。当然,这不是2.6内核才有的,它是在 2.5.44内核中被引进的(epoll(4) is a new …...

    2022/12/3 10:21:09
  2. 不放弃丨金恪集团福歆医药手势舞致敬逆行英雄

    原标题:不放弃丨金恪集团福歆医药手势舞致敬逆行英雄2020年 一场新冠肺炎疫情突然来袭 从猝不及防到全力阻击 从各自为战到同舟共济 我们见证了太多、参与了许多、感悟了良多 白衣天使,迎着风雨逆行 平凡的英雄,同舟共济在路上 致敬 追逐逆行的人 你们在抗疫战争中冲…...

    2022/12/3 10:21:05
  3. (转载)erlang大会的一天(经典)

    转载:http://timyang.net/category/erlang/本文整理了Erlounge IV Erlang杭州开发者大会现场的记录的Tweets列表,建议先到 http://ecug.org/agenda/ 下载演讲文档,以便理解上下文。Twitter的优势是小之美,整理成一篇大文章比较杂乱,仅希望能给不在现场的读者在阅读演讲稿时…...

    2022/12/3 10:21:01
  4. jdbc的连接

    今天,是我第一次写。感觉学了一段时间,不记录点什么都对不起自己。前两天看了下jdbc的连接,了解了其的连接方式,就记录下来给自己加深印象。可能写的不好也有可能出现问题。jdbc是什么?官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,根本…...

    2022/12/3 10:20:37
  5. 简述static关键字的作用?(备注:在什么条件下使用static修饰局部变量、全局变量、函数)

    static关键字至少有下列n个作用: (1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模…...

    2022/12/3 10:20:15
  6. (十四)、Angular4.0 组件生命周期(钩子)

    一、onChanges属性内容改变时触发(string类型属性被赋予新值)对象中的string类型的值改变时不会触发onChanges 二、DoCheck鼠标点击输入框&#xff0c;属性值变化(包括对象中属性变化)都会触发DoCheck 三、view能够调用子组件内的方法方法一&#xff1a; <app-child #child2…...

    2022/12/3 10:19:58
  7. 武则天和他的男人们

    原标题:武则天和他的男人们我们知道中国古代的皇帝们除了极少数的之外,剩下的都有三宫六院七十二妃,整个皇宫中的女人都是他的。这种现象其实一点也不奇怪,自打父系社会建立开始,(古代)女性的社会等级就比男性低得多,甚至很多时候就完全是财产和玩物。当然,能够享受这…...

    2022/12/3 10:19:23
  8. 即墨残疾人可免费坐市内公交啦,快来看看怎么申领

    原标题:即墨残疾人可免费坐市内公交啦,快来看看怎么申领近日,由即墨市交通运输局、市残联、市财政局联合制定的《即墨市残疾人免费乘坐市内公共汽(电)车管理办法》正式下发。今后,即墨市残疾人可凭琴岛通残疾人专用卡免费乘坐安装琴岛通卡机具的市内公共汽车。 申请范围…...

    2022/12/3 10:19:18
  9. 这舞蹈已经超越人类生理结构极限了!

    原标题:这舞蹈已经超越人类生理结构极限了!责任编辑:...

    2022/12/3 10:18:57
  10. 女孩,请不要爱上一名黑客

    原标题:女孩,请不要爱上一名黑客恋爱黑客注定孤独,黑客注定寂寞! 女孩,请不要爱上一名黑客 当你爱上黑客,就等于你爱上了一个郁闷的人生…… 当他追求你的时候,你会很幸福、很快乐,那个时候他会决得你是他生命中第一重要的,因为那是热恋阶段。 当你和他正式交往以后,…...

    2022/12/3 10:18:29
  11. 线性代数————思维导图(上岸必备)(二次型)

    高数————思维导图(上岸必备)(极限与连续). 高数————思维导图(上岸必备)(微分部分). 高数————思维导图(上岸必备)(积分部分). 高数————思维导图(上岸必备)(级数部分).高数————思维导图(上岸必备)(向量代数与几何部分). 高数————思维导图(上岸…...

    2022/12/3 10:18:17
  12. CSS设置文本样式

    CSS设置文本样式 这里我就列举几个常用的样式,仅供参考 1,设置文本字体: 用font-family属性 Code:注:这里都用到类别选择器 2,设置文字倾斜效果: p{ font-style: italic; } 3,设置文字加粗效果: p{ font-weight: bold; } 4,设置英文字母大小写转换: p{ text-transfo…...

    2022/12/3 10:18:14
  13. 房子什么时候装修最好

    原标题:房子什么时候装修最好很多小白都会有这个疑问:房子什么时候装修最好,因为每个季节气候不同,潮湿度也不一样。对于有房子需要装修的人们来说,这时候要考虑好房子装修的时间。那么一年中哪个月份装修最好呢?什么时候装修最好? 一般来说分一年当中分两个阶段:一是五…...

    2022/12/3 10:18:01
  14. 微信虚拟定位客服

    浏览网站时经常看到有的网站上,侧栏里的有些内容滚动到页面顶端以后就固定在那个位置,不再跟随滚动条而滚动。这种效果叫做“侧栏跟随滚动”。它对于那些不希望被滚动到页面之外的内容是非常有用的。 侧栏跟随滚动的实现方法有很多种,比较常见的有两种,这两种方法在NEOEASE…...

    2022/12/3 10:17:30
  15. 展会进行中!第十六届ReChina亚洲打印展

    原标题:展会进行中!第十六届ReChina亚洲打印展第十六届亚洲打印技术及耗材展览会暨第五届ReChina亚洲3D打印展将于2019年5月22-24日在上海世博展览馆隆重举行,展会进行中,欢迎参加! 展出时间: 5月22日 周三 9:30-17:00 5月23日 周四 9:30-17:00 5月24日 周五 9:30…...

    2022/12/3 10:17:01
  16. GitHub 的中国乱象:刷星、高仿、骂街和版聊

    今天,我们关注一下人称全球最大程序员交友社区的 GitHub。 这两天有朋友问我:你有关注前端圈最近的娱乐大新闻吗?然后扔给我一个网站,名叫前端娱乐圈:点进去看了下,是另一个程序员社区“掘金”的页面。ID 名为“花裤衩”的用户放了一张截图:虽然硅星人自己不是程序员,倒…...

    2022/12/3 10:16:57
  17. 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)

    3.9 TabSpec与TabHostTabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.htmlAndroid 实现tab视图有2种方法,一种是在布局页面中定义<tabhost>标签,另一种就是继承tabactivity.但是我比较喜欢第二种方式,应为如果页面比较复杂的话…...

    2022/12/3 10:16:18
  18. 营业执照识别

    市场上最新推出了营业执照识别SDK,对于每一个企业而言,营业执照就如“身份证”一般,是企业的唯一ID,在办理和企业相关的业务中,经常涉及到对企业营业执照信息的录入。因为企业营业执照的文字信息非常多,录入起来费时费力。针对这些问题,我们开发出营业执照 识别产品,只…...

    2022/12/3 10:15:38
  19. 自动执行Windows批处理任务或者脚本

    计算机>右键>管理创建任务:任务计划程序>创建任务自定义有意义的,自己看得懂的任务名称 添加一个描述,描述下这个任务是做啥的新建触发器可以选择触发的时间,时间到了,就会自动执行任务新建一个操作,操作用来指定一个批处理文件的程序或者脚本:选择你的批处理文…...

    2022/12/3 10:15:06
  20. 全网最新最全flume教程

    flume笔记 flume 的三大核心组件 source(数据源)、 channel(数据缓存介质) 、sink(数据目的地) flume的使用中的两大bug在Windows中编写好flume脚本 不要复制粘贴到 vim界面中,这样极有可能丢失一部分数据(文件头部没有复制上去) 导致错误 **正确姿势 rz 上传 ** 在Windows中编…...

    2022/12/3 10:14:25
  21. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  22. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  23. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  24. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  25. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  26. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  27. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  29. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  30. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  31. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  32. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  33. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  34. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  35. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  36. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  37. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  38. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  39. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  40. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57