- 博客(161)
- 收藏
- 关注
转载 redis 网络模型全面解密
导言在目前的技术选型中,Redis 俨然已经成为了系统高性能缓存方案的事实标准,因此现在 Redis 也成为了后端开发的基本技能树之一,Redis 的底层原理也顺理成章地成为了必须学习的知识。Redis 从本质上来讲是一个网络服务器,而对于一个网络服务器来说,网络模型是它的精华,搞懂了一个网络服务器的网络模型,你也就搞懂了它的本质。本文通过层层递进的方式,介绍了 Redis 网络模型的版本变更历程,剖析了其从单线程进化到多线程的工作原理,此外,还一并分析并解答了 Redis 的网络模型的很多抉择背后的
2022-02-27 09:42:03 1081
原创 分布式幂等系统的设计
分布式幂等性系统设计一、幂等系统的应用场景在微服务架构下,由于分布式天然特性的时序问题, 以及网络的不可靠性(机器、机架、机房故障, 电缆被挖断等等), 重复请求很常见, 接口幂等性设计就显得尤为重要。 比如浏览器/客户端多次提交、微服务间超时重试、消息重复消费等。 以订单流程为例的幂等性场景:一个订单创建接口,第一次调用超时了,然后调用方重试了一次在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次当这笔订单开始支付,在支付请求发出之后,在服务端发生了扣钱操作,接口响应超时
2022-02-06 17:53:29 1715
原创 数据安全防护方案
数据安全防护方案一、开发平台的接口校验在开放平台或者网关中,经常会见到appKey,appSecret和accessToken,这是用来对openApi访问的一种授权机制。一般分为调用方应用和发布方API,发布了API以后,是用来调用的。如果想调用API的话,需要创建一个调用方应用,同时会颁发一对appKey以及appSecret,前者是公开的,这就是你的唯一身份认证的,后者是密钥,一般不会公开,后续会用于加签,而且一般情况下也会支持重置。同时你这个应用可能需要购买申请想调用的API,当然也有免费的,其
2022-02-06 00:28:38 7971
原创 延迟队列的方案设计
延迟队列的实现方案一、应用场景什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。延时队列在项目中的应用场景是比较多的,尤其像电商类平台:1、订单成功后,在30分钟内没有支付,自动取消订单2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等5、公司的会议预定系统,在会议预定成功后,会在会
2022-02-04 19:16:08 3054
原创 分布式ID生成方案
分布式ID生成方案在业务系统中很多场景下需要生成不重复的 ID,比如订单编号、支付流水单号、优惠券编号等都需要使用到。在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID
2022-01-28 23:18:39 4288 1
原创 linux 文件系统
Linux 文件系统之问1、机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的?2、touch一个新的空文件占用磁盘空间吗? 占用的话占用多少?3、新建一个空目录占用磁盘空间吗?占用多少?和新建一个文件相比,哪个占用的更大?4、你知道文件名是记录在磁盘的什么地方吗?5、文件名最长多长?受什么制约?6、文件名太长了会影响系统性能吗?为什么会产生影响?7、一个目录下最多能建立多少个文件?8、新建一个内容大小1k的文件,实际会占用多大的磁盘空间?9、向操作系统发起读取
2022-01-09 11:04:11 293
原创 golang的 data race 分析
golang的data race一、名词解析1、data race: Any race is a bug定义: ①多个线程(协程)对于同一个变量、②同时地、③进行读/写操作、并且④至少有一个线程进行写操作。(也就是说,如果所有线程都是只进行读操作,那么将不构成数据争用)后果: 如果发生了数据争用,读取该变量时得到的值将变得不可知(根据内存模型),使得该多线程程序的运行结果将完全不可预测,有一定可能会导致直接崩溃。如何防止: 对于有可能被多个线程同时访问的变量使用排他访问控制,具体方法包括使用
2021-12-25 11:39:20 3058 1
原创 golang 多返回值和channel的底层原理
golang 返回值和c的底层区别1、栈帧栈帧结构的两端由两个指针来指定。寄存器ebp通常用做帧指针(frame pointer),而esp则用作栈指针(stack pointer)。在函数执行过程中,栈指针esp会随着数据的入栈和出栈而移动,因此函数中对大部分数据的访问都基于帧指针ebp进行。esp和ebp: esp是栈指针,是cpu机制决定的,push、pop指令会自动调整esp的值;ebp只是存取某时刻的esp,这个时刻就是进入一个函数内后,cpu会将esp的值赋给ebp,此时就可以通过ebp
2021-08-03 23:33:56 1572
原创 字符串匹配算法和应用
KMP算法KMP: KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。1、常规匹配和kmp匹配常规匹配: 从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。kmp匹配: 既然不匹配位
2021-08-02 19:55:37 1046
转载 mysql 数据多表join
0 索引JOIN语句的执行顺序INNER/LEFT/RIGHT/FULL JOIN的区别ON和WHERE的区别1 概述一个完整的SQL语句中会被拆分成多个子句,子句的执行过程中会产生虚拟表(vt),但是结果只返回最后一张虚拟表。从这个思路出发,我们试着理解一下JOIN查询的执行过程并解答一些常见的问题。如果之前对不同JOIN的执行结果没有概念,可以结合这篇文章往下看2 JOIN的执行顺序以下是JOIN查询的通用结构SELECT <row_list> FROM &.
2021-07-29 11:18:05 5324
原创 堆栈相关应用算法
栈的压入、弹出序列题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)算法思想: 将第一个序列数据先压栈,如果最上面的数据与第二个需要弹出的数据相同,进行判断下一个栈顶数据是否为需要弹出的数据,如果是继续进行这样的判断,如果不是就跳出循环将第一个序
2021-06-27 16:32:35 621
原创 最大的子矩阵问题
1、全为1的最大的子矩阵在一个二维0 1矩阵中找到全为1的最大正方形,返回其边长。输入:1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0输出:2思路:动态规划,构造一个等大小的dp[n][m]矩阵,dp[i][j]表示以matrix[i][j]为右下角的全1正方形的边长。初始化dp[i][0]和dp[0][j]分别为matrix[i][0]和matrix[0][j],因为以边缘这一行一列中的点为右下角的全1正方形边长只有0和1两种情况,分别由他们本身是0还是1
2021-06-18 10:13:18 1144 1
原创 大数相加和大数相乘
1、大数相加int或者long类型的数据往往满足不了数据容量的要求,这时需要用到数组或者字符串进行操作。考虑到数据的位数并不是一个确定的值,运用string来处理可以简化思维。在进行运算之前,需要明确下面几点要求:1.将两组数据中位数大的放在前面,方便后面处理;2.字符转数字,减去‘0’;数字转字符加上‘0’;3.进位考虑4.最高位时进位判断string BigPlus(string num1,string num2){ //默认使得num1位数大于num2,方便后续运算。 if
2021-06-17 12:21:46 395 1
原创 数据库分组排序和优化策略
数据库分组排序和优化策略1、分组排序查询每个部门的最高平均工资select deptno,avg(sal) from emp group by deptno order by avg(sal) limit 0,1;查询到平均工资大于2000的部门的名称,并且显示部门的平均工资:select [department_name],avg([salary]) from [tablename] group by [department_name] having avg([salary]) >200
2021-06-16 22:58:57 773
原创 链表交换、排序、相加
链表交换和排序1、给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例: 给定 1->2->3->4, 你应该返回 2->1->4->3.说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 1 class Solution { 2 public: 3 ListNode* swapPairs(ListNode* head) { 4 ListNode *dummy = n
2021-06-16 10:20:35 996
原创 kafka的选举和负载均衡策略
kafka的选举和负载均衡策略1、kafka Controller leader:主broker的选举主broker的作用:Controller Broker的主要职责有很多,主要是一些管理行为,主要包括以下几个方面:创建、删除主题,增加分区并分配leader分区集群Broker管理(新增 Broker、Broker 主动关闭、Broker 故障)preferred leader选举分区重分配主broker的选举流程:Kafka的Leader选举是通过在zookeeper上创建/contr
2021-06-12 21:05:00 1241 2
原创 VMA与page fault
一、 红黑树与VMA红黑树的应用:广泛用于 C++ 的 STL 中,set 和 map 是用红黑树实现的;Linux 的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;IO 多路复用的 epoll 采用红黑树组织管理 sockfd,以支持快速的增删改查;Nginx 中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;Java 的 Tre
2021-05-12 20:34:32 696
原创 Kafka性能保证和延时队列实现原理
数据不丢不漏、不重不错一、不丢(生产写入消息不丢失)数据组织形式: 首先,从数据组织形式来说,kafka有三层形式,kafka有多个主题(topic),每个主题有多个分区,分区分为主分区和副本分区,每个分区又有多条消息。而每个分区可以分布到不同的节点broker上,这样一来,从服务端来说,分区可以实现高伸缩性,以及负载均衡,动态调节的能力。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ciunydj-1618802401938)(C:\Users\darrendy.
2021-04-19 11:22:25 5205 1
原创 mysql的锁机制和mvcc
一、mysql 常见锁在多节点部署或者多线程执行时,同一个时间可能有多个线程更新相同数据,产生冲突,这就是并发问题。这样的情况下会出现以下问题:更新丢失:一个事务更新数据后,被另一个更新数据的事务覆盖。脏读:一个事务读取另一个事物为提交的数据,即为脏读。其次还有幻读,针对并发引入并发控制机制,即加锁。加锁的目的是在同一个时间只有一个事务在更新数据,通过锁独占数据的修改权。1、乐观锁:使用版本标识来确定读到的数据与提交时的数据是否一致。在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号,
2021-04-09 00:04:57 1195
原创 ES 的聚合机制和模糊匹配
一、 Elasticsearch对于大数据量(上亿量级)的聚合如何实现?Elasticsearch 提供的首个近似聚合是cardinality 度量。它提供一个字段的基数,即该字段的distinct或者unique值的数目。它是基于HLL算法的。HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到基数。其特点是:可配置的精度,用来控制内存的使用(更精确 = 更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。无论数千还是数十亿
2021-04-05 15:49:03 3954
原创 ES 的分页搜索和相关性评分机制
一、ES 搜索分页机制1.1 分页查询ES在作为数据库查询时,少不了使用ES的分页功能。由于ES是一个分布式的文档存储系统,生产环境中,通常使用的是ES集群对应用提供搜索服务,在集群中,一个索引的数据会被分布在不同的shard上,而不同的分片又会被分布在不同的节点上,搜索某一个索引中的数据时,如果涉及到分页操作,ES就会将不同节点上被搜索的索引对应的数据取出来,作为一个全局的结果集,然后对这个全局结果集使用相关度分数排序,并按照分页的参数取出特定页码上的数据,最后返回。Elasticsearch分页搜索
2021-04-04 22:29:23 1289
原创 ES 底层原理
一、分布式节点1、client 客户端节点(协调节点)当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。大多数情况下不需要专用的协调节点,协调节点的功能可以由主节点或数据节点来完成,中小型集群中,专门的协调节点的并没有专用的数据节点必要。主要功能:负责任务分发和结果汇聚
2021-04-03 17:18:24 4982
原创 ES 基本原理
ElasticSearch原理一、ES的适用场景1、ES的主要应用分为两大类:搜索类(带上聚合),考虑事务性,频繁更新,与现有数据库进行同步,通过ES进行查询聚合。日志类,包括日志收集,指标性收集,通过beats等工具收集到kafka等Q中,通过logstash进行转换,输送到ES中,然后通过Kibana进行展示。MySQL作为开源关系型数据库,应用范围非常广泛,非常适合于结构化数据存储和查询。在数据查询场景下,默认返回所有满足匹配条件的记录;如果业务数据为结构化数据,同时不需要特别关注排名和
2021-04-03 16:56:06 10551
原创 RPC框架的网络线程模型
一、RPC的网络IO模型1、连接独占线程或进程: 在这个模型中,线程/进程处理来自绑定连接的消息,在连接断开前不退也不做其他事情。当连接数逐渐增多时,线程/进程占用的资源和上下文切换成本会越来越大,性能很差,这就是C10K问题的来源。这种方法常见于早期的web server,现在很少使用。2、单线程reactor: 以libevent, libev等event-loop库为典型。这个模型一般由一个event dispatcher等待各类事件,待事件发生后原地调用对应的event handler,全部调用
2021-03-21 18:58:35 1045
原创 RPC框架的连接模型
一、RPC的客户端连接模型1、连接成本: 使用TCP协议时,会在客户端和服务器之间建立一条虚拟的信道,这条虚拟信道就是指连接,而建议这条连接需要3次握手,拆毁这条连接需要4次挥手,可见,我们建立这条连接是有成本的,这个成本就是效率成本,简单点 说就是时间成本,你要想发送一段数据,必须先3次握手(来往3个包),然后才能发送数据,发送完了,你需要4次挥手(来往4个包)来断开这个连接。 其二,CPU资源成本,三次握手和4次挥手和发送数据都是从网卡里发送出去和接收的,还有其余的设备,比如防火墙,路由器等等,站在操
2021-03-21 18:54:01 1741
原创 长连接的watch机制实现
前言:对于于HTTP协议来说,服务端给一次响应后整个请求就结束了,这是HTTP请求最大的特点,也是由于这个特点,HTTP请求无法做到的是服务端向客户端主动推送数据。但由于HTTP协议的广泛应用,很多时候确实又想使用HTTP协议去实现实时的数据获取,这种时候应当怎么办呢?下面首先介绍几种基于HTTP协议的实时数据获取方法。一、连接TCP连接中四个要素组合体的唯一性:客户端的IP、客户端的port、服务器端的IP、服务器端的port。1、长连接: 长连接是指的TCP连接,而不是HTTP连接。从HTTP1.
2021-03-18 20:29:32 1856
原创 分布式一致算法
一、拜占庭将军问题拜占庭将军问题: 拜占庭派多支军队去围攻一个敌人,将军不确定军队中是否有叛徒,叛徒可能擅自变更进攻决定。至少一半以上的军队同时进攻才可以取胜。在这种状态下,拜占庭将军们能否找到一种分布式的协议来让他们能够远程协商,从而就进攻问题达成一致?这就是著名的拜占庭将军问题。二、Paxos算法:背景:在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序,还有网络分区)等情况。Paxos算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地
2021-03-16 10:16:13 194
原创 分布式事务和分布式锁
一、分布式事务1.1 背景传统事务ACID是基于单数据库的本地事务,仅支持单机事务,并不支持跨库事务。但随着微服务架构的普及,业务的分库分表导致一个大型业务系统往往由若干个子系统构成,这些子系统又拥有各自独立的数据库。往往一个业务流程需要由多个子系统共同完成,而且这些操作可能需要在一个事务中完成,这种事务即为“分布式事务”。当更新内容同时分布在不同库中,不可避免会带来跨库事务问题。跨分片事务也是分布式事务,没有简单的方案,一般可使用"XA协议"和"两阶段提交"处理。分布式事务能最大限度保证了数据库操作的
2021-03-14 23:46:59 3944 2
原创 mysql的分库分表和表关系建立
一、mysql主备延时如何解决?主备延迟的来源: 产生主备延迟的根本原因是备库上消费 binlog 的速度赶不上主库产生 binlog 的速度1.备库所在机器的性能要比主库所在的机器性能差,主从库之间的网络延迟。2.备库的压力大。主库既然提供了写能力,那么备库可以提供一些读能力。或者一些运营后台需要的分析语句,不能影响正常业务,所以只能在备库上跑。结果就是,备库上的查询耗费了大量的CPU资源,影响了同步速度,造成主备延迟。处理方案提高从库的机器性能。一主多从。除了备库外,可以多接几个从库,my
2021-03-13 17:02:13 973 2
原创 mysql 高可用架构分析
前言1、在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面:如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务。一、主从架构1.1 一主一从:mysql 配置为主从模式,从库是主库的 backup,同一时间设置其中一台为主服务器,提供
2021-03-11 14:21:39 643 1
原创 mysql 日志和同步方式
一、日志1、redo log:InnoDB存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。redo log在事务没有提交前,每一个修改操作都会记录变更后的数据,redolog是工作在物理层,它的作用主要是为了减少磁盘开销。因为磁盘操作是极为耗时的,因此,不可能每次对数据的更改都直接写入磁盘。redolog的作用就是缓存起来这些数据改动(缓存到磁盘),等缓存到达一定的数量后再统一写磁盘。为防止在发生故障的时间点,尚有脏页未写入磁盘,在重启
2021-03-07 21:13:37 1421 3
原创 K8S 剖析API对象类型
K8S API对象类型一、metav1.TypeMeta, 对象的类型元数据信息。1.1、类型成员定义了资源类型和api版本。type TypeMeta struct { Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"` APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"`}
2021-01-26 16:13:37 1894
原创 Golang chan的任务分发和优雅退出
一、利用chan实现并发协程优雅的退出1、使用一个专门的退出通道,接收退出的信号。 当启动了多个worker工作协程时,只要main()执行关闭退出通道,每一个worker都会都到信号,进而关闭。func worker(stopCh <-chan struct{}) { go func() { defer fmt.Println("worker exit") // Using stop channel explicit exit for {
2021-01-25 12:54:07 2899
原创 K8S中Golang的编程技巧
一、K8S层级函数接口风格:函数的链式调用k8s对象有层级关系的逻辑,一般一个接口有一个同名(首字母小写)的实现对象。函数返回接口不返回具体的类型主要是更关心对象需对外暴露的接口不关心对象的内部构造。函数调用形式为链式调用。// 创建pod informerpodInformer := informerFactory.Core().V1().Pods().Informer()//内部接口// 代码源自client-go/informers/factory.gofunc (f *sharedIn
2021-01-24 00:11:54 946
原创 golang 闭包函数的应用技巧
一、有名函数和匿名函数函数变量类型初始值为nil。函数字面量类型的语法表达格式是 func (InputTypeList) OutputTypeList//无参函数func fun() { }var f func()//无入参无返回值的函数对象声明,初始值为nilf = fun//有参函数type FT func(int)func Fa(int){}func Test(FT){}Test(Fa) //pass function as parameter“有名函数”和“匿名函数(
2021-01-21 23:18:04 1627
原创 K8S的资源回收策略
1、ownreference:一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner 的 Dependent。每个 Dependent 对象具有一个指向其所属对象的 metadata.ownerReferences 字段。当创建一个 ReplicaSet 时,Kubernetes 自动设置 ReplicaSet 中每个 Pod 的 ownerReference 字段值。apiVersion:
2021-01-20 20:08:34 3343 2
原创 K8S Informer机制分析
K8S Informer机制分析一、总体组件介绍Reflector: 通过 Kubernetes API 监控 Kubernetes 的资源类型 采用 List/Watch 机制, 可以 Watch 任何资源包括 CRD 添加 object 对象到 DeltaFIFO 队列,然后 Informer 会从队列里面取数据进行处理。Reflector 会和 apiServer 建立长连接,并使用 ListAndWatch 方法获取并监听某一个资源的变化。List 方法将会获取某个资源的所有实例,Watch
2021-01-20 18:39:00 1805 1
原创 Golang 单元测试框架的使用
一、使用gomonkey stub(打桩)在测试包中创建一个模拟方法,用于替换生成代码中的方法。1、stub函数gomonkey.ApplyFunc(target,double)其中target是被mock的目标函数,double是用户重写的函数。注意点:重写的函数要和原函数入参和出参保持一致,否则会报错。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kBbERSS-1610705120202)(C:\Users\darrendyang\Desktop\mock1.
2021-01-15 18:05:51 3632
原创 linux 内存分配
内存管理一、malloc的底层实现Malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。当用户申请内存时,直接从堆区分配一块合适的空闲块。Malloc采用隐式链表结构将堆区分成连续的、大小不一的块,包含已分配块和未分配块;同时malloc采用显示链表结构来管理所有的空闲块,即使用一个双向链表将空闲块连接起来,每一个空闲块记录了一个连续的、未分配的地址。当进行内存分配时,Malloc
2021-01-11 15:58:06 1256
原创 浅析page cache
一、进程的文件寻址内核维护的3个数据结构。进程级的文件描述符表、 系统级的打开文件描述符表、文件系统的i-node表(1)每个进程都有一个进程表,表中记录了文件描述符和对应的文件表指针。表项中包含的内容如下a.文件描述符 fd。b.指向一个进程文件表项的指针。(2)内核为进程打开文件维持一张进程级的文件描述符表。每个文件表项包含:a.文件描述符及打开方式b.系统打开文件表索引(3)内核为所有进程打开文件维持一张系统级的文件描述符表。每个文件表项包含:a.文件状态标志(读、
2021-01-05 15:58:38 1373
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人