面了两个部门,都是一面就结束了。。。
京东零售一面
对各种编程语言的理解
Java常用的数据结构
https://www.yii666.com/blog/365762.html
Java Map和List底层实现
https://blog.csdn.net/weixin_44162368/article/details/90910630
LinkedList和ArrayList区别
- ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构
- 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针
- 对于添加和删除操作add和remove,一般大家都会说LinkedList要比ArrayList快,因为ArrayList要移动数据
TCP/IP网络构型,每一层在做什么
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
- Reactor 是?阻塞同步?络模式,感知的是就绪可读写事件。在每次感知到有事件发?(?如可读就绪事
件)后,就需要应?进程主动调? read ?法来完成数据的读取,也就是要应?进程主动将 socket 接收缓存
中的数据读到应?进程内存中,这个过程是同步的,读取完数据后应?进程才能处理数据。 - Proactor 是异步?络模式, 感知的是已完成的读写事件。在发起异步读写请求时,需要传?数据缓冲区的地
址(?来存放结果数据)等信息,这样系统内核才可以?动帮我们把数据的读写?作完成,这?的读写?作全
程由操作系统来做,并不需要像 Reactor 那样还需要应?进程主动发起 read/write 来读写数据,操作系统完
成读写?作后,就会通知应?进程直接处理数据。
ET和LT的区别
- LT:?平触发模式,只要内核缓冲区有数据就?直通知,只要socket处于可读状态或可写状态,就会?直返回sockfd;是默认的?作模式,?持阻塞IO和?阻塞IO
- ET:边沿触发模式,只有状态发?变化才通知并且这个状态只会通知?次,只有当socket由不可写到可写或 由不可读到可读,才会返回其sockfd;只?持?阻塞IO
LT什么时候会触发?ET呢?
LT模式
- 对于读操作
只要内核读缓冲区不为空,LT模式返回读就绪。 - 对于写操作
只要内核写缓冲区还不满,LT模式会返回写就绪
ET模式
- 对于读操作
- 当缓冲区由不可读变为可读的时候,即缓冲区由空变为不空的时候。
- 当有新数据到达时,即缓冲区中的待读数据变多的时候。
- 当缓冲区有数据可读,且应?进程对相应的描述符进?EPOLL_CTL_MOD 修改EPOLLIN事件时。
- 对于写操作
- 当缓冲区由不可写变为可写时。
- 当有旧数据被发送?,即缓冲区中的内容变少的时候。
- 当缓冲区有空间可写,且应?进程对相应的描述符进?EPOLL_CTL_MOD 修改EPOLLOUT事件时。
为什么ET模式不可以?件描述符阻塞,?LT模式可以呢?
- 因为ET模式是当fd有可读事件时,epoll_wait()只会通知?次,如果没有?次把数据读完,那么要到下?次fd 有可读事件epoll才会通知。?且在ET模式下,在触发可读事件后,需要循环读取信息,直到把数据读完。如 果把这个fd设置成阻塞,数据读完以后read()就阻塞在那了。?法进?后续请求的处理。
- LT模式不需要每次读完数据,只要有数据可读,epoll_wait()就会?直通知。所以 LT模式下去读的话,内核缓 冲区肯定是有数据可以读的,不会造成没有数据读?阻塞的情况。