Java实习生备战暑期实习------面试题打卡(操作系统OS+MySQL)(分段、分段+select/poll/epoll+MySQL锁机制)⭐⭐⭐

文章讨论了虚拟内存技术,包括虚拟地址和物理地址的概念,以及分段和分页的区别和结合使用。此外,解释了Socket通信模型,以及如何通过多进程和多线程模型改进Socket。还介绍了I/O多路复用,特别是select、poll和epoll的区别。最后,文章提到了MySQL的锁机制,包括全局锁、表级锁和行级锁的种类。
摘要由CSDN通过智能技术生成

“我认为没有遗憾,我觉得所谓的遗憾就在于当你可以努力的时候,你没有选择去努力,而不在于你能力的大小”🌹


参考资料:图解系统+图解MySQL 

目录

什么是虚拟内存技术?虚拟地址和物理地址的概念是什么?

什么是分段?什么是分页?两者有什么区别?两者能结合使用吗?

谈谈你对socket模型的理解?

使用多进程模型来改进socket

使用多线程模型来改进socket

什么是I/O多路复用?实现多路复用的方式有哪些?

MySQL有哪些锁?


什么是虚拟内存技术?虚拟地址和物理地址的概念是什么?

  • 虚拟内存技术:是操作系统提供的一种机制,可以将不同进程的虚拟地址映射为不同内存的物理地址;如果程序想要访问虚拟地址,通过虚拟内存技术将虚拟地址映射为物理地址就可以了
  • 虚拟内存地址:程序所使用的内存地址
  • 物理内存地址:实际存在硬件中的空间地址

什么是分段?什么是分页?两者有什么区别?两者能结合使用吗?

分段:

  • 将内存划分成一个个的段,不同的段有不同的属性。虚拟地址通过段表与物理地址进行映射。在映射时,通过段表找到段号,再找到相应的段基地址,然后再加上段偏移量就可以找到物理内存中的地址了。分段会产生外部内存碎片。

分页:

  • 将虚拟内存和物理内存划分成了连续的一小块一小块的内存,这么一小块且连续的内存就叫做页。虚拟地址通过页表来和物理地址进行映射。映射时,先将虚拟内存切分成页号和偏移量,然后去页表中找到虚拟页号所对应的物理页号,然后拿物理页号加上偏移量就得到了物理地址。分页解决了外部内存碎片的问题,但是会产生内部内存碎片。原因是如果程序只需要不到一个页大小的内存,只能分配给它一个页,即使页内还有剩余内存。第二个缺点就是如果进程非常多,那么也就意味着页表的数量会非常庞大,也就会占用更多的内存。

段页式内存管理:

  • 先将程序划分为多个段,然后再将每个段划分成多个页。

地址映射过程:

  • 第一次访问段表,读取到相应的页表起始地址
  • 第二次访问页表,读取到相应的物理页号
  • 第三次将物理页号加上页内偏移,得到物理地址

谈谈你对socket模型的理解?

socket实际上是一个文件,主要用于服务端和客户端之间的跨主机间通信。

  • 客户端和服务端要想进行数据的通信,需要创建一个socket。
  • 起初,服务端和客户端都调用socket()函数先创建一个基于IPV4、TCP的socket,然后服务单调用bind()函数为这个socket绑定一个IP地址和端口号,再调用listen()函数来监听连接。
  • 此时,客户端调用connect()函数,向服务端发起连接
  • 服务端调用accept()函数来接收客户端的连接,然后进入TCP三次握手过程
  • TCP三次握手完成之后,服务端从全连接队列中选取一个socket,后续的数据通信都使用这个socket,然后服务端和客户端可以使用read()和write()函数来读写数据

socket建立起来比较简单,但是只能用于一对一的通信,换句话说,一个服务器如果只能同时和一个客户端建立连接,那么未免太浪费资源了。

使用多进程模型来改进socket

  • 即为每个客户端都分配一个进程。服务器的主进程用来监听客户端的连接,当连接建立完成,服务端就会fork一个子进程,用这个子进程来处理客户端的请求。总之,就是,服务端的主进程用来监听,fork出来的子进程用来服务。
  • 但是,当客户端连接数比较少的时候,这种模型处理请求的能力是可以的;但是,当请求数增多至10000时,这种模型的弊端就会显而易见,即每个进程都会占用一定的系统资源,并且进程之间的切换也会造成一定的开销,假设有10000个进程,进程所占的资源以及切换造成的开销是巨大的。

使用多线程模型来改进socket

  • 基于创建和切换进程所造成的开销,还可因引入线程;众所周知,线程的创建和切换所造成的开销都要小于进程;并且还可以使用线程池来减少频繁的创建和销毁线程;但是,值得注意的的是,就算使用线程,当客户端的请求数量到10000之后,所造成的压力也是服务器所扛不住的

什么是I/O多路复用?实现多路复用的方式有哪些?

多路复用:一个进程维护多个socket,多个请求复用一个进程

方式:select、poll、epoll

  • select实现多路复用的方式是,将已连接的socket都放到一个文件描述符集合中,然后调用select函数将集合拷贝到内核中,内核通过遍历的方式检查是否有事件发生,如果有则对其进行标记;然后再把集合拷贝到用户态下,用户态再通过遍历的方式找到已被标记的事件,然后对其进行处理。可以看到,select实现多路复用需要拷贝并遍历两次文件描述符集合。
  • poll实现多路复用时,和select唯一区别就是select用bitsmap存放文件描述符集合,而poll用链表来存放;这两种方式下,随着并发数的增长,性能损耗会呈指数倍增长

epoll解决了select和poll所存在的问题:

  • epoll使用红黑树来保存所有的socket,在检测时,只需要传入一个socket就可以,而不需要将所有的socket都拷贝到内核下,大大减少了拷贝所造成的开销
  • epoll维护了一个链表来存放就绪事件,当内核检测到某个socket有事件发生时,会通过回调函数将其加入到链表中,然后用户调用epoll_wait函数时,只返回有事件发生的文件描述符,而不需要再对所有的socket进行遍历
  • 在epoll方式下,即使socket数量增多,效率也不会大幅度降低

MySQL有哪些锁?

MySQL中的锁,具体的可分为全局锁、表级锁、行级锁

  • 全局锁的使用对象是整个数据库,使用之后整个数据库就处于只读状态了;全局锁主要用于做全库逻辑备份

表级锁分为四类:表锁、元数据锁、意向锁、AUTO-INC锁

  • 表锁共享锁和独占锁,共享锁也就是读锁,允许多个线程同时读;独占锁也就是写锁,同一时刻只允许一个线程进行写操作
  • 元数据锁不需要我们显示使用,当我们对数据库表进行操作的时候,会自动地加上元数据锁
  • 意向锁的目的是为了快速判断表里是否有记录被加锁
  • AUTO-INC锁主要用于主键自增,当插入语句结束之后,AUTO-INC锁就会被释放

行级锁分为三类:记录锁、间隙锁、临键锁

  • 记录锁:锁住的是一条记录;有S锁和X锁之分,对记录加S锁之后,可以再加S锁,但是不能加X锁;对记录加X锁之后,不可以加S锁和X锁
  • 间隙锁:锁住的是一个范围,被锁定的范围内不允许再插入数据
  • 临键锁:是记录锁和间隙锁的组合,既锁定一条记录,又能阻止在该记录之前插入数据(也分为S锁和X锁)

加油哇兄弟们!!!

整理面经不易,如果对你有帮助请点个赞吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值