考研面试复习题

操作系统

1. 通道技术,DMA, 两者的区别是什么?这两个技术哪个先提出来的?哪个性能更强?

  • DMA (Direct memory access)直接内存访问,数据交换不经过CPU,直接在内存和I/O 设备之间进行。
  • 常用的设备和CPU之间数据传送控制方式有4种,它们是程序直接控制方式、中断控制方式、DMA方式和通道方式。程序直接控制方式和中断控制方式都只适用于简单的、外设很少的计算机系统,因为程序直接控制方式耗费大量的CPU时间,而且无法检测发现设备或其他硬件产生的错误,设备和CPU、设备和设备只能串行工作。中断控制方式虽然在某种程度上解决了上述问题,但由于中断次数多,因而CPU仍需要花较多的时间处理中断,而且能够并行操作的设备台数也受到中断处理时间的限制,中断次数增多导致数据丢失。DMA方式和通道方式较好地解决了上述问题。这两种方式采用了外设和内存直接交换数据的方式。只有在一段数据传送结束时,这两种方式才发出中断信号要求CPU做善后处理,从而大大减少了CPU的工作负担。DMA方式与通道控制方式的区别是,DMA方式要求CPU执行设备驱动程序启动设备,给出存放数据的内存始址以及操作方式和传送字节长度等;而通道控制方式则是在CPU发出I/O启动命令之后,由通道指令采完成这些工作。
  • 一、轮询方式
      对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。
      尽管轮询需要时间,但轮询不比I/O设备的速度要快得多,所以一般不会发生不能及时处理的问题。
      当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询毕竟占据了CPU相当一部分处理时间,因此程序轮询是一种效率较低的方式,在现代计算机系统中已很少应用。
  • 二、中断方式
      处理器的高速和输入输出设备的低速是一对矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制方式中CPU之间的数据传送,是很必要的。
      在I/O设备中断方式下,中央处理器与I/O设备之间数据的传输步骤如下:
      ⑴在某个进程需要数据时,发出指令启动输入输出设备准备数据
      ⑵在进程发出指令启动设备之后,该进程放弃处理器,等待相关I/O操作完成。此时,进程调度程序会调度其他就绪进程使用处理器。
      ⑶当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转向预先设计好的中断处理程序,对数据传送工作进行相应的处理。
      ⑷得到了数据的进程,转入就绪状态。在随后的某个时刻,进程调度程序会选中该进程继续工作。
      中断方式的优缺点
      I/O设备中断方式使处理器的利用率提高,且能支持多道程序和I/O设备的并行操作。
      不过,中断方式仍然存在一些问题。首先,现代计算机系统通常配置有各种各样的输入输出设备。如果这些I/O设备都同过中断处理方式进行并行操作,那么中断次数的急剧增加会造成CPU无法响应中断和出现数据丢失现象。
      其次,如果I/O控制器的数据缓冲区比较小,在缓冲区装满数据之后将会发生中断。那么,在数据传送过程中,发生中断的机会较多,这将耗去大量的CPU处理时间。
  • 三、直接内存存取(DMA)方式
      直接内存存取技术是指,数据在内存与I/O设备间直接进行成块传输。
      DMA技术特征
      DMA有两个技术特征,首先是直接传送,其次是块传送。
      所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
      DMA工作过程
      ⑴当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。
      ⑵发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起。进程调度程序调度其他进程占据CPU。
      ⑶输入设备不断地窃取CPU工作周期,将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。
      ⑷DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。
      ⑸中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。
  • DMA与中断的区别
      ⑴中断方式是在数据缓冲寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU 进行中断处理。这就大大减少了CPU进行中断处理的次数。
      ⑵中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制完成的。这就排除了CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。
  • DMA方式的优缺点
      在DMA方式中,由于I/O设备直接同内存发生成块的数据交换,因此I/O效率比较高。由于DMA技术可以提高I/O效率,因此在现代计算机系统中,得到了广泛的应用。许多输入输出设备的控制器,特别是块设备的控制器,都支持DMA方式。
      通过上述分析可以看出,DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了始终周期,CPU处理效率降低了,要想尽量少地窃取始终周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU出理效率。
  • 四、通道方式
      输入/输出通道是一个独立于CPU的,专门管理I/O的处理机,它控制设备与内存直接进行数据交换。它有自己的通道指令,这些通道指令由CPU启动,并在操作结束时向CPU发出中断信号,见图6-3。
      输入/输出通道控制是一种以内存为中心,实现设备和内参内直接交换数据的控制方式。在通道方式中,数据的传送方向、存放数据的内存起始地址以及传送的数据块长度等都由通道来进行控制。
  • 另外,通道控制方式可以做到一个通道控制多台设备与内存进行数据交换。因而,通道方式进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。
  • 1、通道一般用在大型计算机系统中(不是大型机)。
    2、通道实质是一台能够执行有限的输入输出指令,并能被多台外设共享的小型DMA专用处理机。
    3、通道的作用–解决了两个问题。
    a.由cpu承担输入输出的工作。
    虽然dma无需cpu进行外设与内存的数据交换工作,但是这只是减少了cpu的负担。因而dma中,输入输出的初始化仍然要由cpu来完成。
    b.大型计算机系统中高速设备共享dma接口的问题。大型计算机系统的外设太多以至于不得不共享有限的dma接口(小型计算机系统比如pc机中每个高速设备分配一个dma接口)。
    所以通道技术时间早,能力强。dma更加适用于小型微机。
    2. 同步锁,自旋锁
  • 自旋锁(spin lock)与互斥锁类似,都是为了保护共享资源。互斥锁是当资源被占用,申请者进入睡眠状态;而自旋锁则循环检测保持着是否已经释放锁。
  • 自旋锁:如果锁可用,则“锁定”被设置,而代码继续进入临界区;相反,如果锁被其他人获得,则代码进入忙循环(而不是休眠,这也是自旋锁和一般锁的区别)并重复检查这个锁,直到该锁可用为止,这就是自旋的过程。

3. 信号量机制实现?信号量怎么实现? pv操作底层?信号量是谁创建?操作系统内核还是应用层?这个变量在内核空间还是用户空间?

  • 整形信号量表示的是资源的数目S。P操作将减少一个资源,V操作将增加一个资源(即释放一个资源,因为资源不会被操作生出来,只会因别人不用而释放)。
    这里不用wait和signa这种看着含义更加明显的名词,是因为,P、V可以这么联想:一个进程想利用资源了,就拍拍手,表达自己的意愿,这样就可以将S-1,而当自己用好了,就表示一个V字手势,表示成功了,资源可以收回去了。
    既然S是可用资源的数目,那么S = 0,表示已经没有资源可用了。
    在整型信号量中,只要S <= 0,就会不断测试,看何时有资源可用。
    也因此,进程会一直等,不遵循让权等待的原则。
    原文:https://blog.csdn.net/u011240016/article/details/52628969
    在这里插入图片描述
    4. 什么是操作系统内核?在应用层上写可以改内核中的程序吗?微内核 宏内核区别?哪种操作系统微内核 哪种宏内核?是么是系统调用?

  • 微内核:提供操作系统核心功能的内核的精简版本,它设计成在很小的内存空间内增加移植性,提供模块化设计,以使用户安装不同的接口与,如DOS、Workplace OS、Workplace Unix等。IBM、Microsoft等操作系统都采用了这一研究成果的优点。(百度百科)

  • 宏内核:是操作系统核心架构的一种,此架构的特性是整个核心程序都是以核心空间(Kernel Space)的身份及监管者模式(Supervisor Mode)来运行。相对于其他类型的操作系统架构,如微核心架构或混核心架构等,这些核心会定义出一个高级的虚拟接口,由该接口来涵盖描述整个电脑硬件,这些描述会集合成一组硬件描述用词,有时还会附加一些系统调用,如此可以用一个或多个模块来实现各种操作系统服务,如进程管理、共时(Concurrency)控制、存储器管理等。(百度百科)

  • 1、微内核相当于一个信息交换中心,自身可以实现的功能较少,他的主要职责是传递一个请求,一个A模块对其他模块功能的请求。而宏内核相当于一个是一个中央集权控制中心,把内存管理,文件管理等功能全部管理。

  • 2、两个内核的优缺点:
    A、理论上来看,微内核的设计思想更好一些,它将系统分为各个小的功能模块,把设计难度大大降低。因此,系统的维护与修改也方便进行。
    B、但是微内核的通信失效率很高,是一个大问题。宏内核的功能模块之间的耦合度太高,将修改与维护的代价提高。但是在目前的linux操作系统里不会因为此造成很大问题(目前的linux还不算很复杂)。宏内核因为是直接调用的,所以效率比较高。
    微内核的操作系统有:Window,Minix,Mac等等。宏内核的操作系统有:Unix,Linux等等。
    原文:https://blog.csdn.net/genuinemonster/article/details/82877582

  • 什么是系统调用?Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。
    随Linux核心还提供了一些C语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。
    5. Cpu 指令系统,指令集,划分为两个部分?区别?
    指令集可分为复杂指令集和精简指令集两部分。复杂指令集,英文名是CISC,(Complex Instruction Set Computer的缩写)。精简指令集, 英文是RISC (Reduced Instruction Set Computing 的缩写)。在技术人员的研究过程中发现,约有80%的程序只用到了20%的指令,而一些过于冗余的指令严重影响到了计算机的工作效率,就这一现象,精简指令集的概念就被提了出来.具体区别自己了解。
    6. 特权指令和用户指令,特权指令能不能再用户层出现?如果用户非要写特权指令,可以阻止吗?

  • 所谓特权指令是指有特权权限的指令,由于这类指令的权限最大,如果使用不当,将导致整个系统崩溃。比如:清内存、置时钟、分配系统资源、修改虚存的段表和页表,修改用户的访问权限等。如果所有的程序都能使用这些 指令,那么你的系统一天死机n回就不足为奇了。为了保证系统安全,这类指令只能用于操作系统或其他系统软件,不直接提供给用户使用。因此,特权执行必须在核心态执行。实际上,cpu在核心态下可以执行指令系统的全集。形象地说,特权指令就是 那些儿童不宜的东西,而非特权指令则是老少皆宜。

  • 为了防止用户程序中使用特权指令,用户态下只能使用非特权指令,核心态下可以使用全部指令。当在用户态下使用特权指令时,将产生中断以阻止用户使用特权指令。所以把用户程序放在用户态下运行,而操作系统中必须使用 特权指令的那部分程序在核心态下运行,保证了计算机系统的安全可靠。从用户态转换为核心态的唯一途径是中断或异常。
    原文:https://blog.csdn.net/jxq0816/article/details/51714468

7. 进程线程区别

  • 进程是资源分配的最小单位,线程是程序执行的最小单位。
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
    8. 什么是虚拟内存?分页 分段区别
    https://www.cnblogs.com/jmsjh/p/8017202.html

10. 死锁,四个条件

  • 1.互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放

  • 2.请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。

  • 3.不剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用

  • 4.循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞。
    11. 解释中断?跳到的程序叫什么?
    12. 进程最基本的三个态? 他们如何转化的?
    1.进程的三种基本状态:

  • 进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。

  • 就绪(Ready)状态
    当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

  • 执行(Running)状态
    当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

  • 阻塞(Blocked)状态
    正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

  • 2.进程三种状态间的转换
    一个进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和执行状态,也可以多次处于阻塞状态。图3_4描述了进程的三种基本状态及其转换。
     (1) 就绪→执行
    处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
     (2) 执行→就绪
    处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
     (3) 执行→阻塞
    正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
     (4) 阻塞→就绪
    处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
    13. 先来先服,短队列优先,分别存在什么问题?

  • 先来先服是从后备队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后放入就绪队列
    进程调度中使用此算法时,每次都从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行,该进程会一直运行到完成或者因发生某事件而阻塞后,进程调度程序才会把处理机分配给其他进程

  • 以作业长短来确定优先级,作业越短优先级越高,作业的长短用作业所需的运行时间来衡量

  • 为了解决上面两个可以使用时间片轮选的调度算法。即每个人使用的时间片是固定的。

  • 优先级调度等。 各有所长
    14. 长队列长时间得不到CPU?怎么解决

  • 可以采用时间片轮转法。
    15. 外部中断

  • (1)外部中断:来自于CPU以外,包括:
    I/O中断,来自I/O设备,是可屏蔽中断;时钟中断、控制台中断;硬件故障,比如内存故障、电源掉电等,是不可屏蔽中断。这些中断都是异步的,可在任何时候发生,与CPU正在执行的内容无关。

  • (2)内部中断:来自于CPU内部,包括:
    ①程序故障,如使用非法指令、地址越界、浮点溢出、除法错等:
    ②系统调用,用户程序中使用系统调用指令请求操作系统的服务,是程序中有意安排的,往往也把这种中断称为自愿中断。
    这类中断是在程序执行过程产生的,是同步的,是执行程序中的指令引起的。它们不使用中断控制器,不能被屏蔽。

  • 引起外部中断原因如下:

  • 中断优先级
    在某一时刻有几个中断源同时发出中断请求时,处理器只响应其中优先权最高的中断源。当处理机正在运行某个中断服务程序期间出现另一个中断源的请求时,如果后者的优先权低于前者,处理机不予理睬,反之,处理机立即响应后者,进入所谓的“嵌套中断”。中断优先权的排序按其性质、重要性以及处理的方便性决定,由硬件的优先权仲裁逻辑或软件的顺序询问程序来实现。

  • 不可屏蔽中断
    不能由程序控制其屏蔽,处理机一定要立即处理的中断称为非屏蔽中断或不可屏蔽中断。非屏蔽中断主要用于断电、电源故障等必须立即处理的情况。处理机响应中断时

  • 按照事件发生的顺序,中断过程包括 :
    ①中断源发出中断请求;
    ②判断当前处理机是否允许中断和该中断源是否被屏蔽;
    ③优先权排队;
    ④处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序,保护断点地址和处理机当前状态,转入相应的中断服务程序;
    ⑤执行中断服务程序;
    ⑥恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。
    上述过程中前四项操作是由硬件完成的,后两项是由软件完成的。
    16. 进行生命周期 唯一标识进行?创建一个进程?撤销进程?
    https://www.cnblogs.com/mickole/p/3185889.html
    17. 安卓操作系统,内核。Windows内核是什么内核,有什么区别?
    安卓内核基于linux,是宏内核。window是微内核
    内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用。
    我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序,它们大部分是对外围设备的管理和界面操作。外部管理程序与用户进程所占据的地址空间称为外部空间。
    通常,一个程序会跨越两个空间。当执行到内河空间的一段代码时,我们称程序处于内核态,而当程序执行到外部空间代码时,我们称程序处于用户态。
    原文:https://blog.csdn.net/AlbenXie/article/details/80436095
    19. 虚拟内存,空间不够,把某页掉出去,又调回来,这个现象叫什么

  • 抖动

计算机网络

1. 协议
2. 在浏览器打一个网址进去,发生了什么?Dns是哪一层的?
https://www.cnblogs.com/SarahLiu/p/5954832.html
当你在浏览器中输入一个网址,浏览器的处理过程如下:

第一步 浏览器查找该域名的 IP 地址

第二步 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求

第三步 服务器收到请求并进行处理

第四步 服务器返回一个响应

第五步 浏览器对该响应进行解码,渲染显示。

第六步 页面显示完成后,浏览器发送异步请求。
复制代码
下面对每个环节做进一步分析:

01 浏览器查找该域名的 IP 地址
(浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也是有限制的,通常情况下为几分钟到几个小时不等,域名被缓存的时间限制可以通过TTL属性来设置。这个缓存时间太长或太短都不好,如果缓存时间够长,一旦域名被解析到的IP有变化,会导致被客户端缓存的域名无法解析到变化后的IP地址,以致该域名不能正常解析,这段时间内有可能会有一部分客户无法访问网站。如果设置时间太短,会导致用户每次访问网站都要重新解析一次域名。

如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有域名对应的DNS解析结果。其实,操作系统也会有一个域名解析的过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,你可以将任何域名解析到任何能够访问的IP地址。如果你在这里指定了一个域名对应的IP地址,那么浏览器会首先使用这个IP地址。正是因为有这种本地DNS解析的规程,所以黑客就有可能通过修改你的域名解析来把特定的域名解析到它指定的IP地址上,导致这些域名被劫持。)
浏览器缓存 首先是查找浏览器缓存,浏览器会缓存DNS记录一段时间,不同浏览器保存的时常不等(2分钟到30分钟不等)。

系统缓存 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用来查找这个网址的对应DNS信息。

路由器缓存 如果在系统缓存里没有找到找到对应的IP,请求会发向路由器,它一般会有自己的DNS缓存。

ISP DNS服务器 如果在路由器缓存里还是没有对应的IP,请求会被发送到ISP。

根域名服务器 如果还是没有,请求将发向根域名服务器进行搜索。找不到就说明此域名不存在。

02 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求

可能会重定向响应

   例如“http://facebook.com/”,服务器会给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.facebook.com/” 而非“http://facebook.com/”。

服务器重定向的原因有很多,举其中两个:

   一:跟搜索引擎排名有关。你看,如果一个页面有两个地址,就像“http://www.facebook.com/” 和“http://facebook.com/”。搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。 

   二:不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。

然后浏览器会跟踪重定向地址

   浏览器会发送另一个获取请求到”http://www.facebook.com/”。

过程:

   通过DNS获取到IP后,目标IP和本机IP分别与子网掩码相与的结果相同,那么它们在一个子网,那么通过ARP协议可以查到目标主机的MAC地址,否则的话,需要通过网关转发,也就是目标MAC是网关的MAC。 

   请求需要进行编码,生成一个HTTP数据包,依次打上TCP、IP、以太网协议的头部。其中TCP头部主要信息是本机端口和目标端口号等信息,用于标识同一个主机的不同进程,对于HTTP协议,服务器端的默认端口号是80,本机浏览器的话生成一个1024到65535之间的端口号。IP头部主要包含本地IP和目标IP等信息。以太网协议头部主要是双方的MAC地址,目标MAC可以由第一条所诉方法得到。以太网数据包的数据部分,最大长度为1500字节,所以如果IP包太大的话还要拆包,比如IP包5000字节,要分为4包,每一包都包含一个IP头部。

03 服务器收到请求并进行处理

负载均衡

   网站可能会有负载均衡设备来平均分配所有用户的请求。 

   负载均衡,即对工作任务进行平衡,分摊到多个操作单元上执行,如图片服务器,应用服务器。可分为链路负载均衡,集群负载均衡,操作系统负载均衡 

   集群负载均衡又分为硬件负载均衡和软件负载均衡。

CDN

   请求的数据可能存储在分布式缓存、静态文件或者数据库中。如果请求的数据是静态文件,如果在CDN上,那么CDN服务器又会处理这个用户的请求。如果在数据库中需要向数据库发起查询请求。

04 服务器返回一个响应

过程:

   服务器返回一个 HTTP 响应,如果返回状态码304,浏览器可以直接使用之前缓存的资源。对于内容响应,浏览器需要进行响应解码,渲染显示。

05 浏览器对该响应进行解码,渲染显示。

过程:

   在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,如果是个静态的页面,拿到此就基本结束了。如果是是动态的,那么在浏览器显示HTML时,会获取嵌入在HTML中的对象,浏览器会发送获取请求来重新获得这些文件。这些请求都要经历一个和HTML读取类似的过程。 

   对于静态的页面内容,浏览器通常会进行缓存,而对于动态的内容,浏览器通常不会进行缓存。

06 页面显示完成后,浏览器发送异步请求。

过程:

   页面显示完成后客户端仍与服务器端保持着联系。 

它会持续与服务器保持联系来及时更新一些页面信息。在浏览器中执行的 JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。

相关扩展:

ARP原理
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。
01 每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。

02 当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。

03 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。

04 源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

RARP原理

   RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。 

   工作流程:在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络。

3. 防止DNS污染?
https://blog.csdn.net/yanzongshuai/article/details/60465042

  • 说明
    我们知道,某些网络运营商为了某些目的,对 DNS 进行了某些操作,导致使用 ISP 的正常上网设置无法通过域名取得正确的 IP 地址。常用的手段有:DNS劫持 和 DNS污染。DNS劫持 和 DNS污染 在天朝是非常常见的现象。一般情况下输入一个错误或不存在的 URL 后,本应该出现404页面,而我们看到的却都是电信、联通等运营商的网址导航页面,正常访问网站时出现电信的小广告,使用了代理却依然无法正常访问某些境外网站,以及最近 Google 几乎被彻底封杀、微软 OneDrive 打不开,这些都和 DNS 有一定关系。

  • DNS劫持
    DNS劫持 就是通过劫持了 DNS 服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原 IP 地址转入到修改后的指定 IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持 通过篡改 DNS 服务器上的数据返回给用户一个错误的查询结果来实现的。
    DNS劫持 症状:某些地区的用户在成功连接宽带后,首次打开任何页面都指向 ISP 提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问 Google 域名的时候出现了百度的网站。这些都属于 DNS劫持。

  • DNS污染
    DNS污染 是一种让一般用户由于得到虚假目标主机 IP 而不能与其通信的方法,是一种DNS 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 DNS 查询没有任何认证机制,而且 DNS 查询通常基于的 UDP 是无连接不可靠的协议,因此 DNS 的查询非常容易被篡改,通过对 UDP 端口 53 上的 DNS 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。
    DNS污染 症状:目前一些在天朝被禁止访问的网站基本都是通过 DNS污染 来实现的,例如 YouTube、Facebook 等网站。

  • 解决方法
    对于 DNS劫持,可以通过手动更换 DNS 服务器为 公共DNS 解决。

  • 对于 DNS污染,可以说,个人用户很难单单靠设置解决,通常可以使用 VPN 或者域名远程解析的方法解决,但这大多需要购买付费的 VPN 或 SSH 等,也可以通过修改 Hosts 的方法,手动设置域名正确的 IP 地址。

  • 公共DNS
    公共DNS 是一种面向大众的免费的 DNS 互联网基础服务。我们知道要上网,就必须要 DNS 解析服务,尽管大多数电脑用户都很少会去手动设置 DNS 服务器地址,而是采用默认自动获取网络商 DNS 地址的方式,不过对于一些小型网络服务商而言,可能全球或者全国 DNS 节点比较少,这样就容易导致打开网页偏慢等现象。

  • 更换 DNS 服务器地址为 公共DNS 后,可以在一定程度上加快域名解析速度、防止 DNS劫持、加强上网安全,还可以屏蔽大部分运营商的广告。

数据结构与算法

1. 排序算法
2. 贪心算法,树图,动态规划 链表
3. 遗传算法怎么做的?陷入局部最优的怎么解决?

  • 遗传算法怎么做?
    https://blog.csdn.net/u010425776/article/details/79155480
    https://blog.csdn.net/qq_31805821/article/details/79763326
  • 避免陷入局部最优解
    初始群体的产生
    遗传算法是对群体进行的进化操作,需要给其准备一些表示起始搜索点的初始群体数据。种群的个体数决定了遗传算法的多样性。数目越多,种群的多样性越好,但是会增加计算量,降低运行效率。但如果数目过少,会因为遗传多样性降低而导致比较容易出现早熟现象。所谓早熟问题,就是在遗传运算初期,少数个体适应度非常高(可能是局部最优解),这样在遗传过程中,这些个体在下一代所占的比例很高,使得交叉和变异对种群多样性的作用被严重降低,种群多样性无法保证,最终因为局部最优解的存在而错过全局最优解。一般建议种群数目取值最小为20。本例中群体规模的大小取为50,即群体由50个个体组成,每个个体可通过随机方法产生。
    https://www.cnblogs.com/21207-iHome/p/6013894.html
    4. 最小生成树
  • prim
    可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。
    2.算法简单描述

1).输入:一个加权连通图,其中顶点集合为V,边集合为E;

2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;

3).重复下列操作,直到Vnew = V:

a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;

4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

  • krustal 一种用来寻找最小生成树的算法
    1).记Graph中有v个顶点,e个边

2).新建图Graphnew,Graphnew中拥有原图中相同的e个顶点,但没有边

3).将原图Graph中所有e个边按权值从小到大排序

4).循环:从权值最小的边开始遍历每条边 直至图Graph中所有的节点都在同一个连通分量中

            if 这条边连接的两个节点于图Graphnew中不在同一个连通分量中

                                     添加这条边到图Graphnew中

在这里插入图片描述

5. 最短路径
①在非网图中,最短路径是指两顶点之间经历的边数最少的路径。
②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径。
③单源点最短路径问题
  问题描述:给定带权有向图G=(V, E)和源点v∈V,求从v到G中其余各顶点的最短路径。
应用实例——计算机网络传输的问题:怎样找到一种最经济的方式,从一台计算机向网上所有其它计算机发送一条消息。
④每一对顶点之间的最短路径
  问题描述:给定带权有向图G=(V, E),对任意顶点vi,vj∈V(i≠j),求顶点vi到顶点vj的最短路径。
 解决办法1:每次以一个顶点为源点,调用Dijkstra算法n次。显然,时间复杂度为O(n3)。 解决办法2:弗洛伊德提出的求每一对顶点之间的最短路径算法——Floyd算法,其时间复杂度也是O(n3),但形式上要简单些。

  • Dijkstra
    即从一个地方出发,到其他地点路径最短。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    言简意赅一点,就是随机选取一个点A,首先写出他到其他点的距离,然后加入距离他距离最近的一个点,也就是权值最小的一个点。然后更新A到各个点的距离,如果比原来直接走小,就更新,否则不更新。最终实现A到所有点路径是最短的。

  • 代码:
    https://github.com/Jarrywell/GH-Demo/blob/master/app/src/main/java/com/android/test/demo/graph/Dijkstra.java

  • Floyd

  • 思想:
    就是先写出每个顶点直接到其他顶点的距离。两个矩阵,一个记录每个顶点都其他顶点距离的矩阵,一个用于更新中间经历的节点。
    选取每一个节点当做中间节点,并更新每个节点与其他节点之间的距离,如果可以更新,在位置矩阵中写出该顶点来。
    这个算法是实现每个顶点都可以找到距离其他顶点最近的路。而dijsktra是实现某一个点到所有其他点的距离最短的。
    https://www.cnblogs.com/ECJTUACM-873284962/p/6995648.html
    6数据结构和算法区别?

  • 数据结构 每一个数据结构有自己特性,真对不同问题不同数据结构;算法解决的问题是 算法的灵魂是computing;

  • 1)数据结构与算法的联系:
    程序=算法+数据结构。数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的。往往是在发展一种算法的时候,构建了适合于这种算法的数据结构。 算法的操作对象是数据结构。算法的设计和选择要同时结合数据结构,简单地说数据结构的设计就是选择存储方式,如确定问题中的信息是用数组存储还是用普通的变量存储或其他更加复杂的数据结构。算法设计的实质就是对实际问题要处理的数据选择一种恰当的存储结构,并在选定的存储结构上设计一个好的算法。不同的数据结构的设计将导致差异很大的算法。数据结构是算法设计的基础。用一个形象的比喻来解释:开采煤矿过程中,煤矿以各种形式深埋于地下。矿体的结构就像相当于计算机领域的数据结构,而煤就相当于一个个数据元素。开采煤矿然后运输、加工这些“操作”技术就相当于算法。显然,如何开采,如何运输必须考虑到煤矿的存储(物理)结构,只拥有开采技术而没有煤矿是没有任何意义的。算法设计必须考虑到数据结构,算法设计是不可能独立于数据结构的。 另外,数据结构的设计和选择需要为算法服务。如果某种数据结构不利于算法实现它将没有太大的实际意义。知道某种数据结构的典型操作才能设计出好的算法总之,算法的设计同时伴有数据结构的设计,两者都是为最终解决问题服务的。
    (2)数据结构与算法的区别:
    数据结构关注的是数据的逻辑结构、存储结构以及基本操作,而算法更多的是关注如何在数据结构的基础上解决实际问题。算法是编程思想,数据结构则是这些思想的逻辑基础。
    7. 介绍一下红黑树?堆排序算法?

语言 java c++ c

1. C语言与java的区别?
2. Java和C++性能最大差异本质是什么?
3. C和C++的区别?函数指针和指针函数区别?
4. 面向对象有什么特点?分别怎么体现出来?
5. C Malloc C++ new 这两个都可以申请内存空间,有什么区别?
6. JAVA 与C++区别?

  • Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 为了兼容 C 即支持面向对象也支持面向过程。
  • Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。
  • Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
  • Java 支持自动垃圾回收,而 C++ 需要手动回收。
  • Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
  • Java 不支持操作符重载,虽然可以对两个 String 对象执行加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。
  • Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。
  • Java 不支持条件编译,C++ 通过 #ifdef #ifndef 等预处理命令从而实现条件编译。
    在这里插入图片描述在这里插入图片描述

在这里插入图片描述
来源:http://cs-fundamentals.com/tech-interview/java/differences-between-java-and-cpp.php
7. Python需要编译吗?编译有什么意义?不编译可以执行吗?
8. 为什么说汇编语言是低级语言?
1、不能跨平台移植;
2、汇编说白了就是机器语言的另一种书写方式,二者是1对1转换的;
机器语言是只有0、1的,对程序员来说很难记忆,不容易操作 汇编语言是比机器语言高一级的电脑语言,需要经过汇编后生成目标文件,就是机器能够识别的机器语言,优点是能够知道数据的存放位置,以及每个操作的对应物理地址,寄存器,存储器… 高级语言是比汇编语言更接近我们实际生活语言的语言,能够经过一系列步骤,最后生成机器语言,优点是比较容易进行操作,记忆,缺点是不能和实际的物理器件联系起来,比如说,你在进行运算的时候,不能知道数据的存放位置…
9.Python java 区别?Python是解释型,java是什么类型?编译需要解决什么问题?C++需要编译吗?编译干什么?
10. C跟java对多线程的支持有区别?
11. PTHREAD 听过吗?在java中需要需用第三方去做吗?线程上同步机构有区别吗?Java怎么做,c怎么做?
12. 什么是脚本语言?什么是非脚本语言
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。
解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。解释是一句一句的翻译。

  • 什么是脚本语言?
      脚本语言是一种介于标记语言和编程语言之间的语言,没有编程语言复杂、严谨的语法和规则。
      脚本语法比较简单,比较容易掌握,与编程语言也有许多相似之处,其函数与编程语言比较相似一些。与编程语言之间最大的区别是编程语言的语法和规则更为严格和复杂一些。
      脚本语言是解释性的语言,例如Python、javascript(目前接触过的)等等,它不象c\c++等可以编译成二进制代码,以可执行文件的形式存在。而脚本语言不需要编译,可以直接用,由解释器来负责解释。
  • 什么是编译语言?
      编译语言是程序在执行之前需要一个专门的编译过程,运行时不需要重新编译,直接使用编译的结果就行了,脱离其语言环境独立执行。程序执行效率高,使用方便。但程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件才能执行。因需依赖编译器,故跨平台性差些。

13. C++有指针,java为什么没有指针?指针好处?
14. Java为什么好用?
15. java接口作用?
16. java的泛型,类型具有泛化的作用。目的是什么?
** 17. C++中接口怎么描写?接口怎么用?接口与类有什么区别**
18. C中什么情况导致内存泄露?c指针什么情况会空挂?
当动态分配的内存不在使用时, 它应给被释放,这样以后可以重新使用内存。分配内存但是在使用完毕之后不进行释放将会引起内存泄露。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。
在一个进程中创建多个线程如果对线程资源不进行释放phread_join(),则会造成内存泄露。
内存泄露和内存使用的区别:内存泄露是内存已经被占用,但是不可以重新分配使用。

软件工程

1. 过程式开发是什么意思?
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。
2. 软件工程研究什么?

  • 如何研发出软件来,从需求 概要设计 伪代码,编写,单元测试,系统测试,交付用户。
    3. 单元测试是谁写的?

数据库

1. 表设计优化性能从哪几个点考虑?

前沿知识

  1. 数据挖掘中中文文本和英文文本差别在哪?
  2. 区块链共识算法?

计算问题

1. 现在有一个公平硬币,函数返回0 1 概率1/2,设计函数返回 0概率7/8,1的概率1/8.
写一个函数,里面调用三次这个子函数,如果三次结果都是1,那么此函数返回1,否则返回0.
2. 1到n正整数,n+1个数据,尽快找到这一个重复的数据。设计一个算法
https://blog.csdn.net/apie_czx/article/details/49278447 (敲重点!!!!)

  1. 将1-n n个数相加 然后计算所以数值相加 差值极为这个数
  2. 另外开辟一个数组b[], 然后将a数组的值当做b的索引,每次b中该元素+1,如果为2,贼找到了。
  3. 二分法,首先去中间值,(如果已经数组排列好了)然后对左边的数据次数求和即一个数据一次count++,看是不是小于w,如果不是则在右边继续二分。
    这个是o(nlogn)

英语问题

  • Can you describe quick sort in English?
发布了39 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/poppyl917/article/details/88732267