严晏来的博客

  • 关于我
  • 我的吉他作品
  • 我热爱的辩论
  • 我的技术博客
  • 我的软件作品
  • 我的小记
你好哇!欢迎来到我的博客!
在代码世界里摸爬滚打的菜鸟程序员一枚,喜欢搭系统、写代码,喜欢追寻各种技术,热爱生活,喜欢唱歌、弹吉他。
  1. 首页
  2. 我的技术博客
  3. 面试八股
  4. 正文

面试准备

2024年11月7日 646点热度 0人点赞 0条评论

IOS面试

IOS面试深拷贝与浅拷贝IOS内存分区堆和栈循环引用使用MySQL怎么保证读写的安全性使用锁机制socket通信是怎样实现的tcp和udp的区别和使用场景TCP如何保证可靠传输序列号的作用是什么客户端如何保证接收的ACK报文是自己想要的四次挥手的时候还能发送消息吗?四次挥手什么时候不能发送消息get和post的区别进程调度算法调度算法优缺点排序算法

深拷贝与浅拷贝

1.1 浅拷贝(Shallow Copy) 浅拷贝创建一个新的对象,但是只复制原始对象的基本数据类型的字段或引用(地址),而不复制引用指向的对象。这意味着新对象和原始对象中的引用指向相同的对象。 如果原始对象中的字段是基本数据类型,那么这些字段会被复制到新对象中,而如果字段是引用类型,则新对象和原始对- 象的对应字段将引用同一个对象。 因此,对新对象所做的修改可能会影响到原始对象,因为它们共享相同的引用。 1.2 深拷贝(Deep Copy) 深拷贝创建一个新的对象,并且递归地复制原始对象的所有字段和引用指向的对象,而不仅仅是复制引用本身。 深拷贝会递归复制整个对象结构,包括对象内部的对象,确保新对象和原始对象之间的所有关系都是独立的。 这意味着对新对象所做的修改不会影响到原始对象,因为它们拥有彼此独立的副本。

IOS内存分区

iOS中,内存主要分为五大区域:栈区,堆区,全局区/静态区,常量区和代码区。

  1. 栈(Stack):

    • 用途:用于存储局部变量、函数参数、返回地址等。栈内存是自动分配和释放的,主要用于函数调用和局部变量的管理。

    • 特点:内存分配方式为LIFO(后进先出),存取速度快,空间相对较小。

  2. 堆(Heap):

    • 用途:用于动态分配内存,存储需要在运行时分配和释放的对象和数据。堆内存由程序员手动管理,通过malloc、free、 new、delete等函数进行分配和释放。

    • 特点:内存管理灵活,存储空间较大,但分配和释放速度相对较慢,容易产生内存碎片。

  3. 全局区/静态区(Global/Static):

    • 用途:存储全局变量和静态变量。全局变量在程序启动时分配,在程序结束时释放;静态变量在第一次使用时分配,程序结束时释放。

    • 特点:内存地址固定,生命周期贯穿程序运行的整个周期。

  4. 常量区(Constant):

    • 用途:存储常量数据,例如字符串常量、数值常量等。常量区的内容在程序运行时不可修改。

    • 特点:只读区域,数据在程序加载时初始化,生命周期贯穿程序运行的整个周期。

  5. 代码区(Code/Text):

    • 用途:存储程序的可执行代码,包括函数体和编译后的指令。代码区在程序运行时是只读的,以防止意外修改。

    • 特点:只读区域,存储的是编译后的机器指令,生命周期贯穿程序运行的整个周期。

堆和栈

各自的优缺点? 栈:由编译器自动分配并释放,速度较快,不会产生内存碎片。优点是快速高效,缺点是有限制,数据不灵活。 堆: 由程序员分配和释放,速度比较慢,而且容易产生内存碎片,不过用起来最方便。优点是灵活方便,数据适应面广泛,但是效率有一定降低 申请后的系统如何响应? 栈:存储每一个函数在执行的时候都会向操作系统索要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:操作系统有一个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空间结点链表中删除,并将该结点的空间分配给程序。由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 申请大小的限制? 栈: 栈是向低地址扩展的数据结构,是一块连续的内存的区域。栈顶的地址和栈的最大容量是系统预先规定好的,栈的大小是2M(有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈道剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 堆: 堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

循环引用

使用MySQL怎么保证读写的安全性

使用锁机制

  • 共享锁(Shared Lock)和排他锁(Exclusive Lock)

    • 共享锁(S 锁):用于对数据进行读取操作。多个事务可以同时对同一数据加共享锁,实现对数据的并发读取。例如,在执行SELECT语句时可以使用LOCK IN SHARE MODE来添加共享锁:

SELECT * FROM products WHERE category = 'electronics' LOCK IN SHARE MODE;
  • 排他锁(X 锁):用于对数据进行写入操作。当一个事务对数据加排他锁后,其他事务既不能对该数据加共享锁,也不能加排他锁,直到该事务释放锁。在执行INSERT、UPDATE或DELETE操作时,MySQL 会自动对涉及的数据行加排他锁。也可以在SELECT语句中使用FOR UPDATE来添加排他锁,用于在读取数据后可能进行修改的情况,例如:

SELECT * FROM orders WHERE order_status = 'pending' FOR UPDATE;
  • 表锁和行锁

    • 表锁:可以锁定整个表,防止其他事务对该表进行读写操作。使用LOCK TABLES语句来加表锁,例如:

LOCK TABLES customers READ; -- 对customers表加共享表锁,用于读取
-- 或者
LOCK TABLES orders WRITE; -- 对orders表加排他表锁,用于写入
  • 行锁:只锁定表中的特定行。InnoDB 存储引擎支持行级锁,它会根据事务的操作自动在行级别上进行锁的管理,这样可以提高并发性能,减少锁冲突。例如,在一个高并发的电商系统中,当多个用户同时对不同的订单进行操作时,行锁可以确保每个订单的操作相互独立,不会因为锁整个表而导致其他用户无法操作其他订单。

socket通信是怎样实现的

Socket通信的原理大致分为以下几个步骤:

  1. 服务器端建立Socket,开始侦听整个网络中的连接请求。

  2. 当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。

  3. 当完成通信后,服务器关闭与客户端的Socket连接。

    客户端的步骤如下:

  1. 建立客户端的Socket,确定要连接的服务器的主机名和端口。

  2. 发送连接请求到服务器,并等待服务器的回馈信息。

  3. 连接成功后,与服务器进行数据的交互。

  4. 数据处理完毕后,关闭自身的Socket连接。

Socket通信的基本原理是基于TCP/IP协议栈的。

简单来说,Socket是网络中的一种端点,客户端通过Socket与服务器进行连接和通信。

tcp和udp的区别和使用场景

  • 区别 TCP是面向连接的传输协议,传输数据时必须建立好连接,UDP是无连接;

  • TCP只支持一对一,UDP支持一对一、一对多、多对一、多对多等场景

  • TCP是可靠的传输协议,传输时可保证无差错、不丢失、不重复、按序到达等,UDP是不可靠,只是尽最大努力交付;

  • TCP有拥塞控制和流量控制,UDP无拥塞控制,当网络拥塞时不影响主机的发送效率;

  • TCP首部开销比UDP大(分别为20Byte和8Byte),TCP报文长度是动态的,会根据接收方窗口大小和拥塞情况来决定,UDP会保留上面传下来的报文边界,不合并、不拆分; 应用场景

  • TCP的适用于通信数据的完整性、准确性要求较高的场景 ,eg: 文件传输、邮件发送与接收、重要状态的更新等。

  • UDP的适用于通信响应度要求高、对数据信息的安全性、完整性要求相对较低的场景,常用于实时通信,eg: 网络电话、网络视频、实时通信等。

TCP如何保证可靠传输

1、数据分块:将数据包划分为合适的大小,这样更能适应网络的限制,如果数据发生错误或丢失,只要重传有问题的部分即可,减少重传的数据量。方便进行流量和拥塞控制。

2、数据包有序号,可以根据序号对失序的数据包进行重新排序、并且可以去重,丢弃重复的数据包。

3、校验和,TCP会用头部信息和数据进行校验,来确保传输过程中有没有发生变化,如果认为被修改了会丢弃这个数据包。

4、超时重传机制,发送数据包后,会启动定时器等待接收方的确认信息,如果超过一定时间都没收到之后会进行重传。

5、流量控制。TCP连接的两方都有自己的缓冲区,接收方只允许发送方发送自己能承受的数据量,如果接收方处理不过来,会要求降低发送速度,避免丢包。

6、拥塞控制:网络拥塞时,减少数据的发送。

序列号的作用是什么

TCP 序列号,是为 TCP 协议通信数据中的每一个字节赋予一个唯一编号,其作用可以概括如下:

  1. 数据分段(Segment)与重组 一次发送的数据长度如果超过设定的 MSS(Maximum Segment Size),就会被分成多个带有TCP 协议头的段(Segment)分别发送出去;接收端需将接收的分段(Segment)数据按每个 TCP 数据段(Segment)头部中的序列号来进行重组。

  2. 数据的可靠性传输 接收端在收到发送端的数据后,通过 ACK 返回接收数据的序列号,这样发送端就可以确认数据已抵达接收端。

  3. 流量控制 TCP 通过滑动窗口来进行流量控制。通信两端各自维护自身的 发送 和 接收滑动窗口大小,并将自身接收滑动窗口大小 和 序列号 发送给对端,让对端知道当前最大可以发送的数据量。

  4. 防止重复报文 TCP 有超时重发机制,如果发送的数据超过一定时间没有收到对方的确认ACK,则会认为数据可能丢失而进行重发。在有些情形下,数据并没有丢失,只是因为某些原因导致在发送路途中消耗时间过长,如果这个时间超过了 TCP 的超时重发时间,则接收端会重复接收到同一数据,这时可通过丢弃具有相同序列号的数据来去重。

客户端如何保证接收的ACK报文是自己想要的

四次挥手的时候还能发送消息吗?四次挥手什么时候不能发送消息

get和post的区别

GET是从服务器上获得数据;POST是向服务器传递数据

进程调度算法

先来先服务

短作业优先

高响应比优先

R =(已等待时间+要求运行时间)/要求运行时间

时间片轮转

高优先级调度算法

调度算法优缺点

先来先服务(FCFS)

算法思想:主要从“公平”的角度考虑(类似于我们生活中排队买东西的例子)

算法规则:按照作业/进程到达的先后顺序进行服务

用于作业/进程调度: 是否可抢占:非抢占的算法

优缺点:

优点:公平、算法实现简单;

缺点:排在长作业后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说体验很不好。

是否会导致饥饿:不会

短作业优先(SJF)

算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间

算法规则:最短作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)

是否可抢占: SJF和SPF是非抢占的算法。但是也有抢占式的版本–最短剩余时间优先算法

优缺点:

优点:“最短的”平均等待事件、平均周转时间

缺点:不公平。对短作业有利。可能产生饥饿喜爱你想。

是否会导致饥饿:会。如果有不断地短作业到来,可能使长作业长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为饿死。

高响应比优先(HRRN)

算法思想:要综合考虑作业/进程的等待时间和要被服务的时间

算法规则:在每次调度时先计算各个作业或进程的响应比,高响应比的进程被优先服务

响应比 =(进程等待时间+要求服务的时间)/ 要求服务的时间

是否可抢占:非抢占的算法。因此只有当前运行的作业或者进程主动放弃处理机时,才需要调度,才需要计算响应比。

优缺点:综合考虑了等待时间和运行时间(要求服务时间);等待时间相同时,要求服务时间短的优先;服务时 间相等时,要求等待时间长的优先,对于长时间来说,随着等待时间越来越久,其响应比也会越来越大,从而避免长作业饥饿的问题。

是否会导致饥饿:否

以上这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性是很糟糕的。所示这些算法一般适用于早期的批处理系统,当然,FCFS算法也常结合其他的算法来使用,在现在也扮演着很重要角色。

时间片轮转调度算法(RR)

算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间内都可以得到响应(进程间调度)

算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完。则剥夺处理机,将进程重新放到就绪队列队尾重新排队。

用于作业/进程:用于进程调度(只有作业放入内存建立相对应的进程后,才能被分配处理机时间片)

是否可抢占:可抢占(时钟装置发出时钟中断来通知CPU时间片已到)

优点:公平;响应快,适用于分时操作系统;

缺点:由于高频的进程切换,因此有一定开销;不区分任务的紧急程度。

是否会导致饥饿:不会

时间片太大或者太小造成的影响:

如果时间片太大,使得每个进程都会在一个时间片内完成,时间片调度算法就会退化为先来先服务算法,并且会增大进程响应时间。因此时间片不能太大。 如果时间片太小,进程调度、切换是有时间代价的,它会导致进程切换过于频繁,系统会花费大量的时间来处理进程间的切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。

一般来说,设计时间片的时候要让切换进程的开销占比不超过1%。 优先级调度算法

算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务的紧急程度来决定处理进程的顺序、

算法规则:调度时选择优先级最高的进程

用于作业/进程:既可用于作业调度,也可用于进程调度。甚至还会用于在之后学习的IO调度

是否是可抢占的:抢占式和非抢占式都有。非抢占式只需要在进程主动放弃处理机时进程调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。

优点:有优先级区分紧急程度,适用于实时操作系统。可灵活地调整对各个作业/进程的编号程度。

缺点:若有源源不断的高优先级进程到来,低优先级进程可能会导致饥饿。 是否会导致饥饿:会

排序算法

标签: 暂无
最后更新:2024年11月8日

YanYanlai

这个人很懒,什么都没留下

点赞

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2024 年 11 月
  • 2024 年 10 月
  • 2024 年 8 月
  • 2024 年 5 月
  • 2023 年 6 月
  • 2023 年 3 月
  • 2022 年 12 月
  • 2022 年 9 月

分类

  • leetcode刷题记录
  • linux
  • web开发
  • 导航与定位
  • 我的小记
  • 我的技术博客
  • 我的软件作品
  • 数据结构与算法
  • 赵雷
  • 面试八股

COPYRIGHT © 2024 严晏来的博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang