Linux——IO
✅<1>主页::我的代码爱吃辣
📃<2>知识讲解:Linux——文件系统
☂️<3>开发环境:Centos7
💬<4>前言:是不是只有C/C++有文件操作呢?python,java,php,go ..... 他们都是有文件操作?他们的文件操作一样吗?他们都有文件操作,且根据语言的语法不同,文件操作也是不同的。有没有一种同意的视角,看待所有语言的文件操作呢?
目录
一.回顾C文件IO相关操作
1.C语言文件写入
2.C语言文件读取
3.输出信息到显示器有哪些方法
二.系统文件IO
1.open
2.write
3.close
4.read
三.对比C库与系统调用
四.如何管理文件
1.操作系统如何管理文件
2.进程如何管理文件 ——文件描述符
3.文件描述符的分配规则
三.重定向
1.重定向原理
2.dup2 系统调用
四.理解FILE
一.回顾C文件IO相关操作
1.C语言文件写入
测试代码:
#include <stdio.h>
#include <string.h>
int main()
{FILE *fp = fopen("myfile", "w");if (!fp){printf("fopen error!\n");}const char *msg = "hello Linux!\n";const char *msg2 = "hello C++!\n";int count = 5;while (count--){// 向文件中写入,// 参数1:写入的数据C++// 参数2:写入的字符个数// 参数3:写入的数据元素的个数// 参数4:写入的文件结构体指针fwrite(msg, strlen(msg), 1, fp);}int n = 5;while (n--){// 向文件中写入,// 参数1:写入的文件结构体指针// 参数2:格式化写入fprintf(fp, "[%d]:%s", n, msg2);}fclose(fp);return 0;
}
测试结果:
2.C语言文件读取
#include <stdio.h>
#include <string.h>
int main()
{FILE *fp = fopen("myfile", "r");if (!fp){printf("fopen error!\n");}char buf[1024];const char *msg = "hello bit!\n";while (1){// 注意返回值和参数,此处有坑,仔细查看man手册关于该函数的说明size_t s = fread(buf, 1, strlen(msg), fp);if (s > 0){buf[s] = 0;printf("%s", buf);}if (feof(fp)){break;}}fclose(fp);return 0;
}
3.输出信息到显示器有哪些方法
#include <stdio.h>
#include <string.h>
int main()
{const char *msg = "hello fwrite\n";// 1.fwritefwrite(msg, strlen(msg), 1, stdout);// 2.printfprintf("hello printf\n");// 3.fprintffprintf(stdout, "hello fprintf\n");return 0;
}
C库常见IO接口:
// 1.默认向显示器格式化打印int printf(const char *format, ...);// 2.向指定的文件中格式化输入int fprintf(FILE * stream, const char *format, ...);// 3.向指定的空间中格式化输入int sprintf(char *str, const char *format, ...);// 4.向指定的空间中格式化输入指定个数字符int snprintf(char *str, size_t size, const char *format, ...);
总结:
- C默认会打开三个输入输出流,分别是stdin, stdout, stderr
- 仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针
二.系统文件IO
操作文件,除了上述C接口(当然,C++也有接口,其他语言也有),我们还可以采用系统接口来进行文件访问,先来直接以代码的形式,实现和上面一模一样的代码:
1.open
隆重介绍一个系统调用:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,,就是一种位图结构,flags参数:
- O_RDONLY: 只读打开
- O_WRONLY: 只写打开
- O_RDWR : 读,写打开
- 这三个常量,必须指定一个且只能指定一个
- O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
- O_APPEND: 追加写
返回值:
- 成功:新打开的文件描述符
- 失败:-1
2.write
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
参数介绍:
- fd:要写入的文件描述符。
- buf:要写入的字符串。
- count:写入的个数。
3.close
#include <unistd.h>int close(int fd);
关闭指定的文件描述符的文件。
测试代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{// fd:文件描述符// mufile:打开的文件名// O_WRONLY :写方式 | O_CREAT:没有该文件就创建 | O_APPEND : 追加写入int fd = open("myfile", O_WRONLY | O_CREAT | O_APPEND, 0666);if (fd == -1){perror("open");}int count = 5;char *msge = "hello C++ and Linux\n";while (count--){ssize_t n = write(fd, msge, strlen(msge));if (n == -1){perror("write:");}}close(fd);return 0;
}
测试结果:
4.read
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
参数:
- fd:读取文件的文件描述符
- buf:存储读取出的数据的缓冲区
- count:最大读取个数
返回值:
- 读取成功:返回读取的字节数。
- 读取失败:返回-1.
测试代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{// fd:文件描述符// mufile:打开的文件名// ORDONLY:独方式打开int fd = open("myfile", O_RDONLY);if (fd == -1){perror("open");}char buff[1024];// fd:读取文件的文件描述符// buff:存储读取数据的缓冲区// 1024:最大读取字节数ssize_t n = read(fd, buff, 1024);if (n == -1){perror("write:");}printf(buff);close(fd);return 0;
}
测试结果:
三.对比C库与系统调用
我们真正理解语言层面的文件操作吗?其实我们并不理解,因为这不是语言问题,这是系统问题。
是不是只有C/C++有文件操作呢?python,java,php,go ..... 他们都是有文件操作?他们的文件操作一样吗?他们都有文件操作,且根据语言的语法不同,文件操作也是不同的。有没有一种同意的视角,看待所有语言的文件操作呢?
在认识返回值之前,先来认识一下两个概念: 系统调用 和 库函数:
上面的 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)。
而, open close read write 都属于系统提供的接口,称之为系统调用接口回忆一下我们讲操作系统概念时,画的一张图:
系统调用接口和库函数的关系,一目了然。
所以,可以认为,f#系列的函数,都是对系统调用的封装,方便二次开发。
只要语言层支持了文件操作,那么语言层对下必然封装了系统调用。
四.如何管理文件
1.操作系统如何管理文件
文件=内容+属性。
当一个文件没有被操作时,文件一般会被放在磁盘上。
当我们对一个文件进程操作的时候,文件需要被放进内存,因为冯诺依曼体系的限定!
当我们对文件进程操作的时候,文件需要被load到内存,load的是属性还是内容?至少要有属性被load。
当我们对文件进程操作的时候,文件需要被提前放进内存,操作文件的又不是我们一个,所以OS内部移动同时存在大量被打开的文件。那么操作系统如何管理这些被打开的文件呢?创建对应的结构体进行抽象,和数据机构进行组织。
每一个被打开的文件,都要在OS内部对应文件对象的struct结构体,可以将所有的struct_file结构体用某种数据结构连接起来,在OS内部,对被打开的文件进行管理,就转换成对链表的增删查改。
2.进程如何管理文件 ——文件描述符
文件可以分为两大类,磁盘文件(没有被打开),内存文件(被打开)。
文件被打开,是指文件被以进程为代表的用户让操作系统打开的。
所以之前的文件操作,都是进程与被打开文件之间的关系。在OS的角度,就是PCB与struct_file的关系。
那么进程是如何管理自己打开的文件的呢?
open返回值:
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{// 打开一个文件int fd = open("testfile", O_WRONLY | O_CREAT, 0666);// 打印文件描述符printf("%d\n", fd);return 0;
}
通过对open函数的学习,我们知道了文件描述符就是一个小整数。
这里为什么是3?我们多打开几个文件看看:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{// 打开一个文件int fd = open("testfile", O_WRONLY | O_CREAT, 0666);int fd1 = open("testfile1", O_WRONLY | O_CREAT, 0666);int fd2 = open("testfile2", O_WRONLY | O_CREAT, 0666);int fd3 = open("testfile3", O_WRONLY | O_CREAT, 0666);// 打印文件描述符printf("%d\n", fd);printf("%d\n", fd1);printf("%d\n", fd2);printf("%d\n", fd3);return 0;
}
我们发现打印出的是连续的整数。但是没有还是从3开始的,那么会不会有0,1,2呢?
0 & 1 & 2 :
- Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.
- 0,1,2对应的物理设备一般是:键盘,显示器,显示器
所以输入输出还可以采用如下方式:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main()
{char buf[1024];// 0:标准输入的文件描述符——键盘文件ssize_t s = read(0, buf, sizeof(buf));if (s > 0){buf[s] = 0;// 写入1号文件描述符的文件中——显示器文件// 写入2号文件描述符的文件中——显示器文件write(1, buf, strlen(buf));write(2, buf, strlen(buf));}return 0;
}
而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件,于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要在进程PCB中拿着文件描述符,就可以找到对应的文件。
3.文件描述符的分配规则
测试代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{close(0);int fd = open("testfile", O_WRONLY | O_CREAT, 0666);close(2);int fd1 = open("testfile1", O_WRONLY | O_CREAT, 0666);int fd2 = open("testfile2", O_WRONLY | O_CREAT, 0666);// 打印文件描述符printf("%d\n", fd);printf("%d\n", fd1);printf("%d\n", fd2);return 0;
}
测试结果:
说明:
- 当我们关闭0,2号文件描述符,0,2文件描述符空着,新打开的文件描述符不再从3开始。
- fd: 0 或者 fd 2 可见,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。
三.重定向
1.重定向原理
上述代码如果我们关闭的是1号文件描述符:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{close(0);int fd = open("testfile", O_WRONLY | O_CREAT, 0666);// 如果关闭1号文件描述符close(1);int fd1 = open("testfile1", O_WRONLY | O_CREAT, 0666);int fd2 = open("testfile2", O_WRONLY | O_CREAT, 0666);// 打印文件描述符printf("%d\n", fd);printf("%d\n", fd1);printf("%d\n", fd2);return 0;
}
测试结果:
说明:
- 本应该输出到显示器的内容,却输出到了文件中。这种现象就叫做重定向。
- 常见的重定向有:>, >>, <,输出重定向,追加重定向,输入重定向。
重定向的本质:
说明:
原本输入到显示器的数据输入到了其他文件,仅仅通过更改struct file*fdarray[ ]对应下标的存储的指针。
2.dup2 系统调用
#include <unistd.h>int dup2(int oldfd, int newfd)
说明:
- oldfd:需要重定向的文件描述符。
- newfd:被重定向的文件描述符。
测试代码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{int fd = open("./log", O_CREAT | O_RDWR, 0666);if (fd < 0){perror("open");return 1;}close(1);// 将fd对应的文件,重定向到1号文件描述符dup2(fd, 1);for (;;){char buf[1024] = {0};ssize_t read_size = read(0, buf, sizeof(buf) - 1);if (read_size < 0){perror("read");break;}printf("%s", buf);fflush(stdout);}return 0;
}
测试结果:
printf是C库当中的IO函数,一般往 stdout 中输出,但是stdout底层访问文件的时候,找的还是fd:1, 但此时,fd:1下标所表示内容,已经变成了./log的地址,不再是显示器文件的地址,所以,输出的任何消息都会往文件中写入,进而完成输出重定向。
四.理解FILE
因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的。所以C库当中的FILE结构体内部,必定封装了fd。
测试代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd = open("testfile", O_CREAT | O_WRONLY, 0666);int fd1 = open("testfile1", O_CREAT | O_WRONLY, 0666);printf("%d\n", stdin->_fileno);printf("%d\n", stdout->_fileno);printf("%d\n", stderr->_fileno);printf("%d\n", fd);printf("%d\n", fd1);return 0;
}
测试结果:
看一段代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{const char *msg0 = "hello printf\n";const char *msg2 = "hello write\n";printf("%s", msg0);write(1, msg2, strlen(msg2));fork();return 0;
}
运行结果:
看到这里一切正常,如果我们将输出到显示器的数据,重定向到其他文件中:
我们发现 printf 输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和fork有关!
- 一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲。
- printf fwrite 库函数会自带缓冲区(进度条例子就可以说明),当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。
- 而我们放在缓冲区中的数据,就不会被立即刷新,fork之后。
- 但是进程退出之后,会统一刷新,写入文件当中。
- 但是fork的时候,父子数据会发生写时拷贝,所以当你父进程准备刷新的时候,子进程也就有了同样的一份数据,随即产生两份数据。
- write 没有变化,说明没有所谓的缓冲,而是直接写入文件。
综上:
- printf fwrite 等库函数会自带缓冲区,而 write 系统调用没有带缓冲区。
- 另外,我们这里所说的缓冲区,都是用户级缓冲区。其实为了提升整机性能,OS也会提供相关内核级缓冲区,不过不再我们讨论范围之内。
- 那这个缓冲区谁提供呢? printf fwrite 是库函数, write 是系统调用,库函数在系统调用的“上层”, 是对系统调用的“封装”,但是 write 没有缓冲区,而 printf fwrite 有,足以说明,该缓冲区是二次加上的,又因为是C,所以由C标准库提供。
相关文章:
Linux——IO
✅<1>主页::我的代码爱吃辣 📃<2>知识讲解:Linux——文件系统 ☂️<3>开发环境:Centos7 💬<4>前言:是不是只有C/C有文件操作呢?python,java&…...
svn(乌龟svn)和SVN-VS2022插件(visualsvn) 下载
下载地址: https://www.visualsvn.com/visualsvn/download/...
开源日报 0824 | 构建UI组件和页面的前端工作坊
Storybook 是一个用于构建 UI 组件和页面的前端工作坊,支持多种主流框架,提供丰富的插件,具有可配置性强和扩展性好的特点。 storybookjs/storybook Stars: 79.9k License: MIT Storybook 是一个用于构建 UI 组件和页面的前端工作坊&#x…...
福建三明大型工程机械3D扫描工程零件三维建模逆向抄数-CASAIM中科广电
高精度3D扫描技术已经在大型工件制造领域发挥着重要作用,可以高精度高效率实现全尺寸三维测量,本期,我们要分享的应用是大型工程机械3D扫描案例。 铣轮是深基础施工领域内工法先进、技术复杂程度高、高附加值的地连墙设备,具有成…...
使用香橙派学习 Linux的守护进程
Q:什么是守护进程 A:Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个…...
数据治理-数据仓库和商务智能
数据仓库的作用 减少数据冗余,提高信息一致性,让企业能够利用数据做出更优决策的方法,数据仓库是企业数据管理的核心。 业务驱动因素 运营支持职能、合规需求(历史数据响应)和商务智能活动(主因࿱…...
CH2--x86系统架构概览
2.1 OVERVIEW OF THE SYSTEM-LEVEL ARCHITECTURE 图中的实线箭头表示线性地址,虚线表示段选择器,虚线箭头表示物理地址 2.1.1 Global and Local Descriptor Tables 全局描述符表 (GDT) GDT是一个全局的段描述符表,它存储在系统内存中的一个固…...
Immutable.js API 简介
Immutable-js 这个库的实现是深拷贝还是浅拷贝?immutable 来源immutable.js三大特性: 持久化数据结构结构共享惰性操作 Immutable.js 的几种数据类型 immutable 使用 使用 npm 安装 immutable: 常用API介绍 MapListList.isList() 和 Map.isMa…...
HLSL 入门(一)
HLSL High Level Shader Language 高级着色语言,是Direct3D中用来编写Shader的语言。其语法类似于C语言。 虽然其主要作用是用来编写例如顶点着色器,像素着色器。但本质是对图形并行管线进行编程,因此也能用来编写用于计算的着色器ÿ…...
【Docker】挂载数据卷
一、Docker数据卷说明及操作 在Docker中挂载数据卷是一种将数据持久化保存的方法,以便容器之间或容器与主机之间共享数据。以下是如何在Docker中挂载数据卷的步骤: 1、创建数据卷 首先,您需要创建一个数据卷。可以使用以下命令创建一个数据卷…...
[技术干货]spring 和spring boot区别
Spring 和 Spring Boot 都是 Java 框架,用于构建企业级应用程序。Spring 是一个完整的框架,提供各种功能,包括依赖注入、事务管理、数据访问、Web 开发等。Spring Boot 是一个基于 Spring 的框架,旨在简化 Spring 应用程序的开发和…...
【hudi】数据湖客户端运维工具Hudi-Cli实战
数据湖客户端运维工具Hudi-Cli实战 help hudi:student_mysql_cdc_hudi_fl->help AVAILABLE COMMANDSArchived Commits Commandtrigger archival: trigger archivalshow archived commits: Read commits from archived files and show detailsshow archived commit stats: …...
RK3588 添加ROOT权限
一.ROOT简介 ROOT权限是Linux和Unix系统中的超级管理员用户帐户,该帐户拥有整个系统的最高权利,可以执行几乎所有操作。ROOT就是获取安卓系统中的最高用户权限,以便执行一些需要高权限才能执行的操作(包括卸载系统自带程序、刷机、备份、还原…...
【云原生】k8s-----集群调度
目录 1.k8s的list-watch机制 1.1 list-watc机制简介 1.2 根据list-watch机制,pod的创建流程 2.scheduler的调度策略 2.1 scheduler的调度策略简介 2.2 Scheduler预选策略的算法 2.3 Scheduler优选策略的算法 3. k8s中的标签管理及nodeSelector和nodeName的 调…...
一键集成prometheus监控微服务接口平均响应时长
一、效果展示 二、环境准备 prometheus + grafana环境 参考博文:https://blog.csdn.net/luckywuxn/article/details/129475991 三、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter...
2023/9/13 -- C++/QT
作业: 1> 将之前定义的栈类和队列类都实现成模板类 栈: #include <iostream> #define MAX 40 using namespace std;template <typename T> class Stack{ private:T *data;int top; public:Stack();~Stack();Stack(const Stack &ot…...
mybatis mapper.xml转建表语句
从网上下载了代码,但是发现没有DDL建表语句,只能自己手动创建了,感觉太麻烦,就写了一个工具类 将所有的mapper.xml放入到一个文件夹中,程序会自动读取生成建表语句 依赖的jar <dependency><groupId>org.d…...
封装使用Axios进行前后端交互
Axios是一个强大的HTTP客户端,用于在Vue.js应用中进行前后端数据交互。本文将介绍如何在Vue中使用Axios,并通过一个企业应用场景来演示其实际应用。 Axios简介 公众号:Code程序人生,个人网站:https://creatorblog.cn A…...
SOA、分布式、微服务
SOA: SOA是一种软件设计架构,用于构建分布式系统和应用程序。它将应用程序拆分为一系列松耦合的服务,这些服务通过标准化的接口进行通信,并能够以可编程方式组合和重用。SOA的目标是提高系统的灵活性、可扩展性和可维护性。 特点&…...
json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割
json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割。 import sys import zlib import json import mathKAFKA_MAX_SIZE 1024 * 1024 CONTENT_MIN_MAX_SIZE KAFKA_MAX_SIZE * 0.9def split_data(data):"&q…...
移动端APP测试-如何指定测试策略、测试标准?
制定项目的测试策略是一个重要的步骤,可以帮助测试团队明确测试目标、测试范围、测试方法、测试资源、测试风险等,从而提高测试效率和质量。本篇是一些经验总结,理论分享。并不是绝对正确的,也欢迎大家一起讨论。 文章目录 一、测…...
【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理
文章目录 前言一、对 Redis 主从结构的认识1.1 什么是主从结构1.2 主从结构解决的问题 二、主从结构创建2.1 配置并建立从节点2.2.1 从节点配置文件2.2.2 启动并连接 Redis 主从节点2.2.3 SLAVEOF 命令2.2.4 断开主从关系 2.2 查看主从节点的信息2.2.1 INFO REPLICATION 命令2.…...
CSS 滚动驱动动画 scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis )
scroll-timelinescroll-timeline-name❤️scroll-timeline-axis 解决问题语法 animation-timeline-nameanimation-timeline-axis scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis ) 在 scroll() 的最后我们遇到了因为定位问题导致滚动效果失效的情况, 当…...
9.19号作业
2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…...
Mybatis学习笔记9 动态SQL
Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景: 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…...
element表格 和后台联调
1.配置接口 projectList:/api/goods/xxx,//产品列表2.请求接口(get请求默认参数page) // 产品列表 pageprojectList(params){return axios.get(base.projectList,{params})}3.获取数据 直接放到created里边去了 刷新页面就可以看到 async projectList(page){let res await t…...
基于SSM的智慧城市实验室主页系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
怒赞,阿里P8推荐的Java面试宝典:41个专题PDF(史上最全+面试必备)
《尼恩Java面试宝典》 40岁老架构师 尼恩 经过对大量 Java面试题 的不断梳理、迭代, 编著成5000页的《尼恩Java面试宝典》,致力于体系化, 系统化,形象化 梳理,形成一个大的知识体系,从而帮助大家 进大厂&a…...
线程池各个参数设置说明
1. corePoolSize 核心线程数 看处理业务属于IO密集型还是属于cpu密集型IO密集型: 通常设置为N1,还有一个计算公式:线程数 cpu数*(线程等待时间/线程总的处理时间) 但是由于服务器除了这个服务可能还部署有其他服务,…...
springBoot对接多个mq并且实现延迟队列---未完待续
mq调用流程 创建消息转换器 package com.wd.config;import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import o…...
高端品牌衣服排行榜前十名/免费的seo网站
题库来源:安全生产模拟考试一点通公众号小程序 2021年车工(初级)考试题及车工(初级)复审模拟考试,包含车工(初级)考试题答案和解析及车工(初级)复审模拟考试…...
柳市网站建设公司/网络营销的含义
人民创投区块链 封面图来源 | Pexels 来源 | 网络传播杂志 作者 | 杨东 袁宇 作者单位 | 中国人民大学区块链研究院 重庆市沙坪坝区委网信办 区块链技术是颇具争议的新一代信息技术,原因是在区块链技术的落地应用尚未实现之前,数字货币凸显出不受规制…...
网站关键词收费/关键词推广seo
indices crossvalind(Kfold, N, K): 该命令返回一个对于N个观察样本的K个fold(意为折,有“层”之类的含义,感觉还是英文意思更形象)的标记(indices)。该标记中含有相同(或者近似相同…...
工程信息网站谁做/百度新闻客户端
Introduction 参考链接:2014斯坦福大学机器学习视频 本篇是针对当凭直觉做完一个Baseline以后,如何提高现有的识别率?依然凭直觉有以下几种方法: 1、增加训练数据集 2、挑选出更少的特征 3、增加其他特征 4、增加多项式x1*x2 5、减少…...
做简单的网站/广告联盟自动挂机赚钱
一、字节跳动技术一面(算法) Java 的 16 进制与字符串的相互转换函数JAVA 时间格式化处理将毫秒转化为日期文本的倒序输出判断一个数字是奇数还是偶数用Hibernate 实现分页35 选 7 彩票程序获取 GMT8 时间中文乱码转换小标签Big5 字与 Unicode 的互换取得…...
北京的网站建设公司/网站点击量查询
Magicly:之前翻译了一篇介绍RNN的文章,一直没看到作者写新的介绍LSTM的blog,于是我又找了其他资料学习。本文先介绍一下LSTM,然后用LSTM在金庸、古龙的人名上做了训练,可以生成新的武侠名字,如果有兴趣的&a…...