- 博客(133)
- 收藏
- 关注
原创 操作系统常见面试题总结
直接(Direct Memory Access) 技术。可以看到, CPU 不再参与「将数据从磁盘控制器缓冲区搬运到内核空间」的⼯作,这部分⼯作全 程由 DMA 完成。
2025-02-26 19:13:58
825
原创 HTTPS相关面试题
为了保证传输的内容不被篡改,我们需要对内容计算出⼀个「指纹」,然后同内容⼀起传输给对 ⽅。对⽅收到后,先是对内容也计算出⼀个「指纹」,然后跟发送⽅发送的「指纹」做⼀个⽐较,如果 「指纹」相同,说明内容没有被篡改,否则就可以判断出内容被篡改了。那么,在计算机⾥会⽤摘要算法(哈希函数)来计算出内容的哈希值,也就是内容的「指纹」,这 个哈希值是唯⼀的,且⽆法通过哈希值推导出内容。通过哈希算法可以确保内容不会被篡改,
2025-02-15 00:11:57
771
原创 HTTP相关面试题
HTTP 协议(Hyper Text Transfer Protocol),⼜叫做超⽂本传输协议。我们⽤的⽐较多,平时上⽹在浏览器上敲个⽹址就能访问⽹⻚,这⾥⽤到的就是 HTTP 协议。而RPC(Remote Procedure Call),⼜叫做远程过程调⽤。它本⾝并不是⼀个具体的协议,⽽是⼀ 种调⽤⽅式。
2025-02-15 00:11:38
950
原创 后端面试场景题汇总
内存局部性失效1.2.addAll()在美团的时候内部有流水线也就是一个CI/CD的平台,可以帮助我们进行自动化测试。至于单元测试,测试用例的编写,有一个AI生成单元测试的平台,当时部门的规定是单元测试覆盖率要达到80%以上才能通过流水线。类未正确打包或部署,pom.xml使用 mvn dependency:tree查看依赖树,使用 IDE 插件,打开Maven工具窗口,查看依赖树,冲突的依赖会以红色标注。排除冲突的依赖,在pom.xml中,使用排除不需要的依赖版本。强制指定依赖版本,在。
2025-02-10 14:32:20
160
原创 golang网络编程
Socket是BSD UNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。电脑上运行的应用程序通常通过”套接字”向网络发出请求或者应答网络请求。举个例子:TCP就像货到付款的快递,送到家还必须见到你人才算一整套流程。UDP就像某快递快递柜一扔就走管你收到收不到,一般直播用UDP。
2025-01-21 14:29:28
905
2
原创 学习golang语言时遇到的难点语法
Go语言提倡面向接口编程。接口是一个或多个方法签名的集合。任何类型的方法集中只要拥有该接口'对应的全部方法'签名。就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。这称为Structural Typing。所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。当然,该类型还可以有其他方法。接口只有方法声明,没有实现,没有数据字段。接口可以匿名嵌入其他接口,或嵌入到结构中。
2025-01-20 21:59:27
686
原创 操作系统之网络系统
电脑与电脑之间通常都是通话⽹卡、交换机、路由器等⽹络设备连接到⼀起,那由于⽹络设备的异构性,国际标准化组织定义了⼀个七层的OSI⽹络模型,但是这个模型由于⽐较复杂,实际应⽤中并没有采⽤,⽽是采⽤了更为简化的TCP/IP模型,Linux⽹络协议栈就是按照了该模型来实现的。TCP/IP模型主要分为应⽤层、传输层、⽹络层、⽹络接⼝层四层,每⼀层负责的职责都不同,这也是Linux⽹络协议栈主要构成部分。当应⽤程序通过Socket。
2024-12-13 11:02:28
1117
原创 操作系统之设备管理(键盘敲入A字母时,操作系统期间发生了什么)
键盘可以说是我们最常使⽤的输⼊硬件设备了,但身为程序员的你,你知道「那要想知道这个发⽣的过程,我们得先了解了解「操作系统是如何管理多种多样的的输⼊输出设备」的,等了解完这个后,我们再来看看这个问题,你就会发现问题已经被迎刃⽽解了。
2024-12-11 20:18:16
1365
原创 面试中遇到的一些有关进程的问题(有争议版)
32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程 最多只能创建 300 个左右的线程。64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统 的参数或性能限制。那么线程崩溃后,进程是如何崩溃的呢,这背后的机制到底是怎样的,答案是信号。大家想想要干掉一个正在运行的进程是不是经常用 kill -9 pid 这样的命令,这里的 kill 其实就是给 指定 pid 发送终止信号的意思,其中的 9 就是信号。
2024-12-08 20:48:32
899
原创 锁相关的问题(死锁、互斥锁、自旋锁、读写锁、悲观锁、乐观锁)
在多线程编程中,我们为了防⽌多线程竞争共享资源⽽导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。当「写锁」没有被线程持有时,多个线程能够并发地持有读锁,这⼤⼤提⾼了共享资源的访问效率,因为「读锁」是⽤于读取共享资源的场景,所以多个线程同时持有读锁也不会破坏共享资源的数据。⽜逼之⼈,必有⽜逼之处。的思想,先让⽤户编辑代码,然后提交的时候,通过版本号来判断是否产⽣了冲突,发⽣了冲突的地⽅,需要我们⾃⼰修改后,再重新提交。
2024-12-08 19:05:15
954
原创 多线程冲突了怎么办?(多线程的同步与互斥问题)
在单核CPU系统⾥,为了实现多个程序同时运⾏的假象,操作系统通常以时间⽚调度的⽅式,让每个进程执⾏每次执⾏⼀个时间⽚,时间⽚⽤完了,就切换下⼀个进程运⾏,由于这个时间⽚的时间很短,于是就造成了「并发」的现象。另外,操作系统也为每个进程创建巨⼤、私有的虚拟内存的假象,这种地址空间的抽象让每个程序好像拥 有⾃⼰的内存,⽽实际上操作系统在背后秘密地让多个地址空间「复⽤」物理内存或者磁盘。如果⼀个程序只有⼀个执⾏流程,也代表它是单线程的。
2024-12-08 12:51:58
1189
原创 进程间通信有哪些方式
由于每个进程的⽤户空间都是独⽴的,不能相互访问,这时就需要借助内核空间来实现进程间通信,原因很简单,每个进程都是共享⼀个内核空间。Linux内核提供了不少进程间通信的⽅式,其中最简单的⽅式就是管道,管道分为「匿名管道」和「命名管道」。匿名管道顾名思义,它没有名字标识,匿名管道是特殊⽂件只存在于内存,没有存在于⽂件系统中,shell命令中的「」竖线就是匿名管道,通信的数据是⽆格式的流并且⼤⼩受限,通信的⽅式是单向的,数据只能在⼀个⽅向上流动,如果要双向通信,需要创建两个管道,再来。
2024-12-08 11:02:23
748
原创 进程、线程基础知识
线程是进程当中的⼀条执⾏流程。同⼀个进程内多个线程之间可以共享代码段、数据段、打开的⽂件等资源,但每个线程各⾃都有⼀套独⽴的寄存器和栈,这样可以确保线程的控制流是相对独⽴的。线程的优缺点?线程的优点:⼀个进程中可以同时存在多个线程;各个线程之间可以并发执⾏;各个线程之间可以共享地址空间和⽂件等资源;线程的缺点:当进程中的⼀个线程崩溃时,会导致其所属进程的所有线程崩溃。举个例⼦,对于游戏的⽤户设计,则不应该使⽤多线程的⽅式,否则⼀个⽤户挂了,会影响其他同个进程的线程。
2024-12-07 13:37:48
665
原创 软中断和为什么0.1+0.2不等于0.3?
最后,再来回答开头多问题。为什么负数要⽤补码表示?负数之所以⽤补码的⽅式来表示,主要是为了统⼀和正数的加减法操作⼀样,毕竟数字的加减法是很常⽤的⼀个操作,就不要搞特殊化,尽量以统⼀的⽅式来运算。⼗进制⼩数怎么转成⼆进制?⼗进制整数转⼆进制使⽤的是「除2取余法」,⼗进制⼩数使⽤的是「乘2取整法」。计算机是怎么存⼩数的?计算机是以浮点数的形式存储⼩数的,⼤多数计算机都是IEEE 754标准定义的浮点数格式,包含三个部分:符号位:表示数字是正数还是负数,为0表示正数,为1。
2024-12-06 20:11:43
845
原创 CPU是如何执行任务的?
理解 CPU 是如何读写数据的前提,是要理解 CPU 的架构,CPU 内部的多个 Cache + 外部的内存 和磁盘都就构成了金字塔的存储器结构,在这个金字塔中,越往下,存储器的容量就越大,但访 问速度就会小。CPU 读写数据的时候,并不是按一个一个字节为单位来进行读写,而是以 CPU Cache Line 大小为 单位,CPU Cache Line 大小一般是 64 个字节,也就意味着 CPU 读写数据的时候,每一次都是以 64 字节大小为一块进行操作。
2024-12-06 15:31:04
952
原创 内存管理面试常问
为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独⽴分 配⼀套虚拟地址空间,每个程序只关⼼⾃⼰的虚拟地址就可以,实际上⼤家的虚拟地址都是⼀样的,但分布到物理地址内存是不⼀样的。作为程序,也不⽤关⼼物理地址的事情。每个进程都有⾃⼰的虚拟空间,⽽物理内存只有⼀个,所以当启⽤了⼤量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使⽤的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换⼊)。
2024-12-06 11:31:03
1233
原创 本地缓存Caffeine从入门到原理剖析
自定义的缓存状态收集器的作用:每当缓存有操作发生时,不管是查询,加载,存入,都会使得缓存的某些状态指标发生改变,哪些状态指标发生了改变,就会自动触发收集器中对应的方法执行,如果我们在方法中自定义的代码是收集代码,比如将指标数值发送到 kafka,那么其它程序从kafka读取到数值,再进行分析与可视化展示,就能实现对缓存的实时监控了。收集器接口为 StatsCounter ,我们只需实现这个接口的所有抽象方法即可。下面举例说明。@Override。
2024-12-05 19:03:59
1278
原创 CPU 缓存一致性
CPU在读写数据的时候,都是在CPU Cache读写数据的,原因是Cache离CPU很近,读写性能相⽐内存⾼出很多。对于 Cache⾥没有缓存CPU所需要读取的数据的这种情况,CPU则会从内存读取数据,并将数据缓存到 Cache⾥⾯,最后CPU再从Cache读取数据。
2024-12-01 22:49:25
1101
原创 如何写出让CPU跑得更快的代码
由于随着计算机技术的发展,CPU与 内存的访问速度相差越来越多,如今差距已经⾼达好⼏百倍了,所以CPU 内部嵌⼊了CPU Cache组件,作为内存与CPU之间的缓存层,CPU Cache由于离CPU核⼼很 近,所以访问速度也是⾮常快的,但由于所需材料成本⽐较⾼,它不像内存动辄⼏个 GB⼤⼩,⽽是仅有⼏⼗ KB到MB⼤⼩。当CPU访问数据的时候,先是访问CPU Cache,如果缓存命中的话,则直接返回数据,就不⽤每次都从内存读取速度了。
2024-12-01 22:48:53
929
原创 存储器金字塔
各种存储器之间的关系,可以⽤我们在图书馆学习这个场景来理解。CPU可以⽐喻成我们的⼤脑,我们当前正在思考和处理的知识的过程,就好⽐CPU中的寄存器处理数据的过程,速度极快,但是容量很⼩。⽽ CPU中的好⽐我们⼤脑中的短期记忆和⻓期记忆, 需要⼩⼩花费点时间来调取数据并处理。我们⾯前的桌⼦就相当于内存,能放下更多的书(数据),但是找起来和看起来就要花费⼀些时间,相⽐ CPU Cache 慢不少。⽽图书馆的书架相当于硬盘,能放下⽐内存更多的数据,但找起来就更费时间了,可 以说是最慢的存储器设备了。
2024-12-01 06:21:26
1136
原创 CPU 是如何执行程序的
要想知道程序执行的原理,我们可以先从「图灵机」说起,图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,而且还定义了计算机由哪些部分组成,程序又是如何执行的。图灵机长什么样子呢?你从下图可以看到图灵机的实际样子:图灵机的基本组成如下:有⼀条「纸带」,纸带由⼀个个连续的格⼦组成,每个格⼦可以写⼊字符,纸带就好⽐内存,⽽纸带上的格⼦的字符就好⽐内存中的数据或程序;有⼀个「读写头」,读写头可以读取纸带上任意格⼦的字符,也可以把字符写⼊到纸带的格⼦;
2024-11-30 13:00:20
1004
原创 操作系统知识总结—进程管理
发送信息的进程将消息头写好,接受信息进程根据消息头读取信息或寻找信封是哪一个线程的实现分为两类:用户级线程(User-Level Thread,UTL)和内核级线程内核级线程又称内核支持的线程。通过进程通信——管道通信的例子来了解什么是进程同步。读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据→读数据”的顺序来执行的。如何解决这种异步问题,就是“进程同步”所讨论的内容。含义。
2024-11-10 15:41:52
1031
原创 操作系统知识总结—概述(基于王道网课)
在多道程序环境下,cpu的分配和运行都以进程(或线程)为基本单位,因此对cpu的管理可理解为对进程的管理。计算机中所有的信息都是以文件的形式存在的,操作系统中负责文件的管理的部分称为文件系统,文件管理包括文件存储空间的管理、目录管理及文件读写管理和保护。为多道程序的运行提供良好的环境,方便用户使用及提高内存的利用率,主要包括内存分配与回收、地址映射、内存保护与共享和内存扩充。设备管理的主要任务是完成用户的I/O请求,方便用户使用各种设备,并提高设备的利用率,主要。附上一张图理解对进程的管理。
2024-11-05 07:56:41
981
1
原创 Java中的线程
这看上去挺复杂的,状态类型也比较多。但其实在操作系统层面,Java线程中的BLOCKED、WAITING、TIMED_WAITING是一种状态,即前面我们提到的休眠状态。也就是说。所以Java线程的生命周期可以简化为下图:其中,BLOCKED、WAITING、TIMED_WAITING可以理解为线程导致休眠状态的三种原因。那具体是哪些情形会导致线程从RUNNABLE状态转换到这三种状态呢?而这三种状态又是何时转换回RUNNABLE的呢?以及NEW、TERMINATED和RUNNABLE状态是如何转换的。
2024-09-10 16:33:25
1319
原创 用等待通知机制优化循环等待
由上一篇文章你应该已经知道,在如果apply()操作耗时非常短,而且并发冲突量也不大时,这个方案还挺不错的,因为这种场景下,循环上几次或者几十次就能一次性获取转出账户和转入账户了。但是如果apply()操作耗时长,或者并发冲突量大的时候,循环等待这种方案就不适用了,因为在这种场景下,可能要循环上万次才能获取到锁,太消耗CPU了。其实在这种场景下,最好的方案应该是:如果线程要求的条件(转出账本和转入账本同在文件架上)不满足,则线程阻塞自己,进入状态;
2024-09-05 16:10:00
1084
原创 对互斥锁的优化以及有可能带来的死锁问题
续接上文,我们用Account.class作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户A 转账户B、账户C 转账户D这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了,这样的话,性能太差。试想互联网支付盛行的当下,8亿网民每人每天一笔交易,每天就是8亿笔交易;每笔交易都对应着一次转账操作,8亿笔交易就是8亿次转账操作,也就是说平均到每秒就是近1万次转账操作,若所有的转账操作都串行,性能完全不能接受。
2024-09-05 15:45:10
773
原创 并发编程中存在的问题以及如何解决
你已经知道,导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了。合理的方案应该是按需禁用缓存以及编译优化。那么,如何做到“按需禁用”呢?对于并发程序,何时禁用缓存以及编译优化只有程序员知道,那所谓“按需禁用”其实就是指按照程序员的要求来禁用。所以,为了解决可见性和有序性问题,只需要提供给程序员按需禁用缓存和编译优化的方法即可。
2024-09-05 14:42:11
1330
原创 字节一面面经
T(Just-In-Time)和AOT(Ahead-Of-Time)是两种不同的编译方法,用于将编程语言代码转换为机器码,以便于计算机执行。JMM(Java Memory Model)Java内存模型,是java虚拟机规范中所定义的一种内存模型。Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。所有的共享变量都存储于主内存(计算机的RAM)这里所说的变量指的是实例变量和类变量。
2024-08-10 22:12:01
1036
原创 美团面经到店研发
原理:Hash索引使用哈希表来存储索引键和对应的记录指针。当进行索引查找时,它会计算索引键的哈希值,然后通过哈希表查找对应的记录。优势查找速度快:哈希表的查找时间复杂度为O(1),因此Hash索引的查找速度非常快。不需要排序:由于查找基于哈希值,因此不需要对数据进行排序。劣势不支持范围查询:Hash索引不支持范围查询,因为它基于哈希值,而不是数据本身的顺序。无法利用索引进行排序:由于索引是基于哈希值的,所以无法直接利用索引进行排序。
2024-08-10 16:36:19
1175
原创 美团到店面经
再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信「是否可用」和「之前握手信息是否有被中途篡改过」。
2024-08-10 13:50:02
1262
原创 厂里资讯之热点文章实时计算
Kafka Stream是Apache Kafka从0.10版本引入的一个新Feature。它是提供了对存储于Kafka内的数据进行流式处理和分析的功能。Kafka Stream的特点如下:Kafka Stream提供了一个非常简单而轻量的Library,它可以非常方便地嵌入任意Java应用中,也可以任意方式打包和部署除了Kafka外,无任何外部依赖充分利用Kafka分区机制实现水平扩展和顺序性保证。
2024-07-22 21:47:43
844
原创 redis面试基础知识
返回值:GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。,但底层数据结构却差别很大。传统的方式:使用set保护用户的ID,然后就可以统计set中的元素数量作为标准判断,这个方式如果保存大量的用户id,就会比较麻烦。占用的内存是固定的,2^64不同元素的技术,只需要费12KB内存。前提是所有的数据录入了china:city中。以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。
2024-07-21 20:47:49
1010
原创 计算机网络面试基础知识篇
综上所述,TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。再给大家贴一下每一层的封装格式:网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
2024-06-24 10:48:47
1278
原创 厂里资讯之热点文章实时计算
Kafka Stream是Apache Kafka从0.10版本引入的一个新Feature。它是提供了对存储于Kafka内的数据进行流式处理和分析的功能。Kafka Stream的特点如下:Kafka Stream提供了一个非常简单而轻量的Library,它可以非常方便地嵌入任意Java应用中,也可以任意方式打包和部署除了Kafka外,无任何外部依赖充分利用Kafka分区机制实现水平扩展和顺序性保证。
2024-06-20 09:41:58
1050
原创 厂里资讯之热点文章定时计算
当前软件的架构已经开始向分布式架构转变,将单体结构拆分为若干服务,服务之间通过网络交互来完成业务处理。在分布式架构下,一个服务往往会部署多个实例来运行我们的业务,如果在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度。将任务调度程序分布式构建,这样就可以具有分布式系统的特点,并且提高任务的调度处理能力:1、并行任务调度并行任务调度实现靠多线程,如果有大量任务需要调度,此时光靠多线程就会有瓶颈了,因为一台计算机CPU的处理能力是有限的。
2024-06-19 23:00:28
681
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人