一、Linux

1、如何在 Linux 系统中查看 TCP 状态?

通过netstat -napt命令查看

2、Linux环境下如何查找哪个线程使用CPU最长

(1)步骤
①获取项目的pid:jps或者ps -ef | grep java
top -H -p pid(顺序不能变)
(2)说明
①使用上述命令很容易地找到某条占用CPU高的线程的线程堆栈,从而定位占用CPU高的原因,一般是因为不当的代码操作导致了死循环。
top -H -p pid打出来的LWP是十进制的,jps pid打出来的本地线程号是十六进制的(LWP指轻量级线程)

3、查看指定时间段的日志

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


二、操作系统概述

1、解释一下什么是操作系统

操作系统是管理硬件和软件的一种应用程序。它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层,使应用软件和硬件进行分离,让我们无需关注硬件的实现,把关注点更多放在软件应用上。
image.png

2、操作系统的主要功能

(1)进程管理
主要作用就是任务调度。在单核处理器下,操作系统会为每个进程分配一个任务;在多核处理器下,操作系统除了要为进程分配任务外,还要解决处理器的调度、分配和回收等问题。
(2)内存管理
负责管理内存的分配、回收,在进程需要时分配内存以及在进程完成时回收内存,协调内存资源,通过合理的页面置换算法进行页面的换入换出
(3)设备管理
根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面。
(4)文件管理
有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段。
(5)提供用户接口
提供了访问应用程序和硬件的接口,使用户能够通过应用程序发起系统调用从而操纵硬件,实现想要的功能。

3、什么是用户态和内核态

(1)内核态
处于内核态的 CPU 可以访问任意的数据,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般是处于特权级 0 的状态。
(2)用户态
处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,用户态下的 CPU 不允许独占,也就是说 CPU 能够被其他程序获取。

4、CPU是如何执行程序的?

(1)步骤
CPU 会根据程序计数器里的内存地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度自增,开始顺序读取下一条指令。
①第一步:CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据,数据准备好后通过「数据总线」将指令数据传给 CPU,CPU 收到内存传来的数据后,将这个指令数据存入到「指令寄存器」。
②第二步:CPU 分析「指令寄存器」中的指令,确定指令的类型和参数,如果是计算类型的指令,就把指令交给「逻辑运算单元」运算;如果是存储类型的指令,则交由「控制单元」执行;
③第三步:CPU 执行完指令后,「程序计数器」的值自增,表示指向下一条指令。这个自增的大小,由 CPU 的位宽决定,比如 32 位的 CPU,指令是 4 个字节,需要 4 个内存地址存放,因此「程序计数器」的值会自增 4。
(2)基本概念
①程序计数器:存储 CPU 要执行下一条指令「所在的内存地址」
②控制单元:负责控制 CPU 工作
③地址总线:用于指定 CPU 将要操作的内存地址
④数据总线:用于读写内存的数据
⑤指令寄存器:用来存放程序计数器指向的指令,也就是指令本身
⑥逻辑运算单元:负责计算


三、进程管理

1、并行跟并发有什么区别?

从操作系统的角度来看,线程是CPU分配的最小单位。
并行就是同一时刻,两个线程都在执行。
并发就是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。

2、说说什么是进程和线程?

进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。
线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。
操作系统在分配资源时是把资源分配给进程的, 但是 CPU 资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是 CPU分配的基本单位。

3、什么是线程上下文切换?

(1)CPU 资源的分配采用了时间片轮转也就是给每个线程分配一个时间片,线程在时间片内占用 CPU 执行任务。当线程使用完时间片后,就会处于就绪状态并让出 CPU 让其他线程占用,这就是上下文切换(目的是让用户感觉多个线程是在同时执行的)
(2)指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程

4、进程和线程的区别

(1)从属关系不同
进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程。
(2)描述侧重点不同
进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。
(3)共享资源不同
多个进程间不能共享资源,每个进程有自己的堆、栈、虚存空间(页表)、文件描述符等信息,而线程可以共享进程资源文件(堆和方法区)。
(4)上下文切换速度不同
线程上下文切换速度很快(上下文切换指的是从一个线程切换到另一个线程),而进程的上下文切换的速度比较慢。
(5)操纵者不同
一般情况下进程的操纵者是操作系统,而线程的操纵者是编程人员。


四、内存管理

1、什么是虚拟内存?

程序中所使用的内存地址
(1)物理内存地址
实际存在硬件里面的空间地址
(2)说明
①操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来(如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突)
②进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存
image.png

2、操作系统是如何管理虚拟地址与物理地址之间的关系?

(1)内存分段
程序是由若干个逻辑分段组成的,不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。
①分段机制下,虚拟地址和物理地址是如何映射的?
虚拟地址由两部分组成,段选择子和段内偏移量
image.png

  • 段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。
  • 虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

②分段为什么会产生内存碎片的问题?
外部内存碎片:产生了多个不连续的小物理内存,导致新的程序无法被装载(解决:内存交换)
image.png
内部内存碎片:程序所有的内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是很常使用,这会导致内存的浪费
③分段为什么会导致内存交换效率低的问题?
因为硬盘的访问速度要比内存慢太多了,每一次内存交换,我们都需要把一大段连续的内存数据写到硬盘上。所以,如果内存交换的时候,交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿。
(2)内存分页
分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间就称为页(Page)
①介绍
虚拟地址与物理地址之间通过页表来映射
image.png
页表是存储在内存里的,内存管理单元 (MMU)就做将虚拟内存地址转换成物理地址的工作。
当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
②分页是怎么解决分段的内存碎片、内存交换效率低的问题?

  • 采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存(解决内存碎片问题)
  • 如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上;一旦需要的时候,再加载进来。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高(解决内存交换效率低的问题)
  • 分页的方式使得我们在加载程序的时候,不再需要一次性都把程序加载到物理内存中,只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去。

③分页机制下,虚拟地址和物理地址是如何映射的?
虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址。
image.png
把虚拟内存地址,切分成页号和偏移量;根据页号,从页表里面,查询对应的物理页号;直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。


五、文件管理


六、I/O管理