文件描述符

老虎集团【4面】

旧巷老猫 提交于 2019-12-04 20:47:52
1. 主键索引与非主键索引区别? https://www.cnblogs.com/heishuichenzhou/p/10813463.html 非主键索引查找数据,根据条件,查找到对应的主键ID,然后根据主键ID去索引表里面找对应的数据 2. redis主从同步原理(问了3次) 全量和增量同步 全量: Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。 具体步骤如下: 1)从服务器连接主服务器,发送PSYNC命令; 2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令; 增量: 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。 断线之后的命令,如何同步? redis2.8之前, 全量同步,效率低 之后,增量同步, 需要关注以下几个点: 如何记录断线后的命令? 1.主从都会记录复制的偏移量(记录上次复制到哪里了

libevent笔记2:Hello_World

断了今生、忘了曾经 提交于 2019-12-04 12:04:46
本篇通过libevent提供的Hello_World demo简单介绍基于libevent的TCP服务器的实现 listener listener是libevent提供的一种监听本地端口的数据结构,在有客户端的连接到来时调用给定的回调函数。 bufferevent 上一篇 中的event是不带缓存区的,读写直接在文件描述符所指向的对象(上一节中是有名管道)上进行。bufferent则是带缓冲区的event,对bufferevnet的读写操作不会直接作用在I/O上,而是对输入或输出缓存区操作。对bufferevent的读操作会从文件描述符相应的输入缓存区读数据;而写操作会将数据写进文件描述符相应的输出缓存区。 Hello_World 以下是官网提供的demo #include <string.h> #include <errno.h> #include <stdio.h> #include <signal.h> #ifndef _WIN32 #include <netinet/in.h> # ifdef _XOPEN_SOURCE_EXTENDED # include <arpa/inet.h> # endif #include <sys/socket.h> #endif #include <event2/bufferevent.h> #include <event2/buffer

通过 ulimit 改善系统性能

非 Y 不嫁゛ 提交于 2019-12-04 03:39:51
概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响,并以具体的例子来详细地阐述它在限制资源使用方面的影响。 ulimit 的功能和用法 ulimit 功能简述 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。 而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。 ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小

通过 ulimit 改善系统性能

谁说胖子不能爱 提交于 2019-12-04 03:39:39
本文介绍了 ulimit 内键指令的主要功能以及用于改善系统性能的 ulimit 使用方法。通过这篇文章,读者不仅可以了解 ulimit 所起的作用,并且可以学会如何更好地通过 ulimit 限制资源的使用来改善系统性能。 概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响,并以具体的例子来详细地阐述它在限制资源使用方面的影响。 回页首 ulimit 的功能和用法 ulimit 功能简述 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。 而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件

详解Linux服务器最大tcp连接数

房东的猫 提交于 2019-12-03 18:54:58
网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少? 如何标识一个TCP连接 在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。 client最大tcp连接数 client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。 server最大tcp连接数 server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的

Linux之恢复误删除文件

断了今生、忘了曾经 提交于 2019-12-03 18:37:57
前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug,呵呵。 那么如果真的删除了不该删除的文件,比如数据库、日志或执行文件,咋办呢? 模拟场景 1.删除 误删除服务器目录/root/selenium/Spider下的MySql.Data.dll文件: rm -f /root/selenium/Spider/MySql.Data.dll ll /root/selenium/Spider/MySql.Data.dll ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory 2.恢复 (1)使用 lsof 命令查看当前是否有进程打开 /root/selenium/Spider/MySql.Data.dll文件: lsof | grep /root/selenium/Spider/MySql.Data.dll 从上面可以看出,当前文件状态为已删除(deleted)。 (2)查看是否存在恢复数据: /proc/13067/fd:进程操作的文件描述符目录。 86:文件描述符。 cat /proc/13067/fd/86 (3)使用I/O重定向恢复文件 cat /proc/23778/fd/86

epoll反应堆

。_饼干妹妹 提交于 2019-12-03 15:05:40
1 /* 2 * epoll基于非阻塞I/O事件驱动 3 */ 4 #include <stdio.h> 5 #include <sys/socket.h> 6 #include <sys/epoll.h> 7 #include <arpa/inet.h> 8 #include <fcntl.h> 9 #include <unistd.h> 10 #include <errno.h> 11 #include <string.h> 12 #include <stdlib.h> 13 #include <time.h> 14 15 #define MAX_EVENTS 1024 //监听上限数 16 #define BUFLEN 4096 17 #define SERV_PORT 8080 18 19 void recvdata(int fd, int events, void *arg); 20 void senddata(int fd, int events, void *arg); 21 22 /* 描述就绪文件描述符相关信息 */ 23 24 struct myevent_s { 25 int fd; //要监听的文件描述符 26 int events; //对应的监听事件 27 void *arg; //泛型参数 28 void (*call_back)(int fd,

网络编程技术-----6、I/O复用实现并发服务器

落花浮王杯 提交于 2019-12-03 07:09:06
网络编程技术-----6、I/O复用实现并发服务器 一、实验要求 服务器:     服务器等待接收客户的连接请求,一旦连接成功则显示客户地址,接着接收客户端的名称并显示;然后接收来自该客户的字符串,对接收的字符串按分组进行加密(分组长度为个人学号,密钥为个人序号,分组不够补0),再将加密后的字符发回客户端;之后继续等待接收该客户的信息,直到客户关闭连接,服务器将每个连接的用户所发来的所有数据存储起来,当连接终止后,服务器将显示客户的名字及相应的所有数据。要求服务器具有同时处理多个客户请求的能力。 客户端:     客户首先与相应的服务器建立连接;接着接收用户输入的客户端名称,并将其发送给服务器;然后继续接收用户输入的字符,再将字符串发送给服务器,同时接收服务器发回的加密后的字符串并显示。之后,继续等待用户输入字符串,指导用户输入的是quit,则关闭连接并退出。 二、实验环境 OS:kali 计算机语言:C 编译器:gcc IDE:VsCode 三、I/O复用涉及到的函数 **FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。** **FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。** *

聊聊IO多路复用之select、poll、epoll详解

血红的双手。 提交于 2019-12-03 01:44:39
#0 系列目录# 聊聊远程通信 Java远程通讯技术及原理分析 聊聊Socket、TCP/IP、HTTP、FTP及网络编程 RMI原理及实现 RPC原理及实现 轻量级分布式 RPC 框架 使用 RMI + ZooKeeper 实现远程调用框架 深入浅出SOA思想 微服务、SOA 和 API对比与分析 聊聊同步、异步、阻塞与非阻塞 聊聊Linux 五种IO模型 聊聊IO多路复用之select、poll、epoll详解 聊聊C10K问题及解决方案 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。 与多进程和多线程技术相比, I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程 ,也不必维护这些进程/线程,从而大大减小了系统的开销。 目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll ,I/O多路复用就是 通过一种机制

3-文件描述符和标准文件

匿名 (未验证) 提交于 2019-12-03 00:34:01
标准文件描述符图如下: read函数读取数字100的例子 #include <stdio.h> #include <unistd.h> int main ( void ) { int ret = 0 ; char buf [ 30 ] = { 0 }; //ret = scanf("%s", buf); //通过read函数从键盘读取数据 ret = read ( 0 , ( void *) buf , 30 ); if (- 1 == ret ) { //perror("scanf fail"); perror ( "read fail" ); return - 1 ; } printf ( "buf = %s\n" , buf ); int num = 0 ; //由于buf中的100是字符数据,想要得到数字100,就必须将buf中的每个字符'1','0','0'进行转换成对应的数字1,0,0,的ASCII码值 num = ( buf [ 0 ] - '0' )* 100 + ( buf [ 1 ] - '0' )* 10 + ( buf [ 2 ] - '0' ); printf ( "num = %d\n" , num ); return 0 ; } 示例1 #include <unistd.h> int main ( void ) { int value = 65 ; /