京东后端开发工程师秋招面经

面了两个部门,都是一面就结束了。。。

京东零售一面

对各种编程语言的理解

Java常用的数据结构

image.png
https://www.yii666.com/blog/365762.html

Java Map和List底层实现

https://blog.csdn.net/weixin_44162368/article/details/90910630

LinkedList和ArrayList区别

  1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构
  2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针
  3. 对于添加和删除操作add和remove,一般大家都会说LinkedList要比ArrayList快,因为ArrayList要移动数据

TCP/IP网络构型,每一层在做什么

image.png
https://xiaolincoding.com/network/1_base/tcp_ip_model.html

MySQL为什么索引快?

https://zhuanlan.zhihu.com/p/111709826

Redis常见的数据结构

https://xiaolincoding.com/redis/data_struct/data_struct.html

Redis和Java的String的底层实现

SDS,有单独的长度记录

二叉树

京东科技一面

操作系统的启动流程

在开机的一瞬间,也就是接电的一瞬间,CPU的cs:ip寄存器被强制初始化为0xF000:0xFFF0。由于开机的时候处于实模式,在实模式下的段基址要乘以16,也就是左移4位,于是0xF000:0xFFF0的等效地址将是0xFFFF0,此地址便是BIOS的入口地址。(BIOS是在模式下运行的,实模式只能访问1MB,20位地址线,如果寄存器超过了其最大值,溢出的部分就会回卷到0),此处只有16个字节,真正的逻辑不在这里,此处的代码只是个跳转指令:jmp far f000:e05b,跳转到BIOS代码真正开始的地方,接下来BIOS便马不停蹄地检测内存、显卡等外设信息,当检测通过后,并初始化好硬件后,开始在内存中的0x000~0x3FFF处建立数据结构,中断向量表并填写中断例程。
注:正常电脑的BIOS应该是直接写在主板上面的,可以CPU直接寻址的,也就是实模式下地址有的是访问到真正的主板上插的内存,有的是外设,还有BIOS等,都占用了地址。如下图2-1所示。
BIOS最后一项工作是校验位于0盘0道1扇区的内容,如果此扇区末尾的两个字节分别时魔数0x55和0xaa,BIOS便认为此扇区中确实存在可执行的程序(此程序便是MBR),便加载到物理地址0x7c00,随后跳转到0x7c00继续执行。
MBR读取了磁盘的第二个扇区到0x900的地址处(里面存放有loader),并跳转过去执行loader的任务。

OSI七层模型

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

Linux下怎么抓包

使用tcpdump抓包
参考链接:https://zhuanlan.zhihu.com/p/74812069

DHCP是属于哪一层,ARP、RARP是属于哪一层的?

DHCP属于应用层,其他应用层协议:HTTP、FTP、Telnet、DNS、SMTP
网络层协议:IP、ARP、RARP、ICMP、IGMP

进程和线程的区别

线程是系统调度的最小单位

僵尸进程和孤儿进程

孤儿进程则是指当一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
简单来说,当进程退出但是父进程并没有调用wait或waitpid获取子进程的状态信息时就会产生僵尸进程

reactor和proactor

  1. Reactor 是⾮阻塞同步⽹络模式,感知的是就绪可读写事件。在每次感知到有事件发⽣(⽐如可读就绪事
    件)后,就需要应⽤进程主动调⽤ read ⽅法来完成数据的读取,也就是要应⽤进程主动将 socket 接收缓存
    中的数据读到应⽤进程内存中,这个过程是同步的,读取完数据后应⽤进程才能处理数据。
  2. Proactor 是异步⽹络模式, 感知的是已完成的读写事件。在发起异步读写请求时,需要传⼊数据缓冲区的地
    址(⽤来存放结果数据)等信息,这样系统内核才可以⾃动帮我们把数据的读写⼯作完成,这⾥的读写⼯作全
    程由操作系统来做,并不需要像 Reactor 那样还需要应⽤进程主动发起 read/write 来读写数据,操作系统完
    成读写⼯作后,就会通知应⽤进程直接处理数据。

ET和LT的区别

  1. LT:⽔平触发模式,只要内核缓冲区有数据就⼀直通知,只要socket处于可读状态或可写状态,就会⼀直返回sockfd;是默认的⼯作模式,⽀持阻塞IO和⾮阻塞IO
  2. ET:边沿触发模式,只有状态发⽣变化才通知并且这个状态只会通知⼀次,只有当socket由不可写到可写或 由不可读到可读,才会返回其sockfd;只⽀持⾮阻塞IO
LT什么时候会触发?ET呢?
LT模式
  1. 对于读操作
    只要内核读缓冲区不为空,LT模式返回读就绪。
  2. 对于写操作
    只要内核写缓冲区还不满,LT模式会返回写就绪
ET模式
  1. 对于读操作
  • 当缓冲区由不可读变为可读的时候,即缓冲区由空变为不空的时候。
  • 当有新数据到达时,即缓冲区中的待读数据变多的时候。
  • 当缓冲区有数据可读,且应⽤进程对相应的描述符进⾏EPOLL_CTL_MOD 修改EPOLLIN事件时。
  1. 对于写操作
  • 当缓冲区由不可写变为可写时。
  • 当有旧数据被发送⾛,即缓冲区中的内容变少的时候。
  • 当缓冲区有空间可写,且应⽤进程对相应的描述符进⾏EPOLL_CTL_MOD 修改EPOLLOUT事件时。
为什么ET模式不可以⽂件描述符阻塞,⽽LT模式可以呢?
  • 因为ET模式是当fd有可读事件时,epoll_wait()只会通知⼀次,如果没有⼀次把数据读完,那么要到下⼀次fd 有可读事件epoll才会通知。⽽且在ET模式下,在触发可读事件后,需要循环读取信息,直到把数据读完。如 果把这个fd设置成阻塞,数据读完以后read()就阻塞在那了。⽆法进⾏后续请求的处理。
  • LT模式不需要每次读完数据,只要有数据可读,epoll_wait()就会⼀直通知。所以 LT模式下去读的话,内核缓 冲区肯定是有数据可以读的,不会造成没有数据读⽽阻塞的情况。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值