计算机组成原理、网络、操作系统

一、常识

1、海量数据处理

1、归并、使用哈希
2、使用hashmap存储
参考链接

2、HTTP与HTTPS的区别

  • 超文本传输协议HTTP协议应用层的协议,常基于TCP/IP协议传输数据,被用于在Web浏览器和网站服务器之间传递信息,是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。
    HTTP协议以明文方式发送内容,不提供任何方式的数据加密。
  • HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

HTTPS和HTTP的区别
1、HTTPS是加密传输协议,HTTP是名文传输协议;
2、HTTPS需要用到SSL证书,而HTTP不用;
3、HTTPS比HTTP更加安全;
4、 HTTPS标准端口443,HTTP标准端口80;
5、 HTTPS基于传输层,HTTP基于应用层;
6、 HTTPS在浏览器显示绿色安全锁,HTTP没有显示;

HTTPS的缺点
(1)HTTPS协议握手阶段比较费时
(2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,
(3)SSL证书需要钱
(4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
(5)HTTPS协议的加密范围也比较有限。

HTTPS的SSL层的建立过程

几种HTTP协议版本之间的区别

HTTP原理

对称加密和非对称加密

3、Python3多线程

多线程类似于同时执行多个不同程序
多线程运行有优点
1、使用线程可以把占据长时间的程序中的任务放到后台去处理。
2、程序的运行速度可能加快。

每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

线程可以分为:
内核线程:由操作系统内核创建和撤销。
用户线程:不需要内核支持而在用户程序中实现的线程。

1、线程模块:使用 threading 模块创建线程
2、线程同步:如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。使用 Thread 对象的 LockRlock 可以实现简单的线程同步。
3、线程优先级队列:Queue 模块中提供了同步的、线程安全的队列类,这些队列都实现了锁原语,能够在多线程中直接使用,可以使用队列来实现线程间的同步。

多线程和多进程的使用场景

  • 多进程的优点
    1、编程相对容易;通常不需要考虑锁和同步资源的问题。
    2、更强的容错性:比起多线程的一个好处是一个进程崩溃了不会影响其他进程。
    3、有内核保证的隔离:数据和错误隔离。
  • 多线程的优点
    1、创建速度快,方便高效的数据共享
    2、共享数据:多线程间可以共享同一虚拟地址空间;多进程间的数据共享就需要用到共享内存、信号量等IPC技术。
    3、较轻的上下文切换开销,不用切换地址空间,不用更改寄存器,不用刷新TLB。

多进程应用场景
如web server服务器服务

多线程应用场景
1、线程间有数据共享,并且数据是需要修改的
2、在等待慢速I/O操作结束的同时,程序可以执行其他的计算任务。
3、计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

具体选择什么
1、需要频繁创建销毁的优先用线程(进程的创建和销毁开销过大)
2、需要进行大量计算的优先使用线程(CPU频繁切换)
3、强相关的处理用线程,弱相关的处理用进程。一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计“消息解码”、“业务处理”可以分线程设计

4、编译型和解释型语言

计算机不能直接的理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言的编写的程序。翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。

解释性语言:是指它常用的执行机制是使用一个“解释器”来执行,解释器对于程序是一句一句“翻译”成机器语言来一句一句执行,例如shell脚本语言。

编译型语言:是指它常用的执行机制是使用一个“编译器”来编译成机器语言,然后你就可以直接运行(执行)这个编译成的“可执行文件”。

优缺点:

  • 编译型语言
    1、编译型语言最大的优势之一就是其执行速度
    2、编译型程序比解释型程序消耗的内存更少。
    3、可执行的编译型代码要比相同的解释型代码大许多。
  • 解释型语言
    1、解释型语言提供了极佳的调试支持
    2、解释器比编译器容易实现
    3、解释型应用占用更多的内存和CPU资源

Java、Ruby、Python等高级语言都属于解释型语言

C/C++属于编译型语言

5、Post和Get请求

  • GET和POST是HTTP请求的两种基本方法。GET/POST都是TCP链接

1、GET参数通过URL传递POST放在Request body中
2、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
3、GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
4、对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
5、GET产生一个TCP数据包;POST产生两个TCP数据包。

由于HTTP的规定浏览器/服务器的限制,导致他们在应用过程中体现出一些不同

6、异步和同步、阻塞和非阻塞

后端开发

7、堆和栈

栈:先进先出的数据结构
堆:堆通常是一个可以被看做一棵树的数组对象,堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。
堆栈空间分配:
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

堆栈缓存方式:
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

二、计算机组成原理

1、内存和外存

计算器组成:运算器、控制器、存储器、输入、输出设备。
内存设备:
随机存储器:RAM,可读可写、断电数据丢失
只读存储器:ROM,只读不写、断电数据不丢失
外存设备:
硬盘、U盘等等

在这里插入图片描述

32位和64位计算机的区别

目前32位和64位是指CPU的通用寄存器位宽(数据总线的位宽)

三、计算机网络

计算机网络常见问题,较全

  • IP 位于TCP/IP模型的网络层,对上可载送传输层各种du协议的信息,例如TCP、UDP等
  • TCP 传输控制协议,是位于TCP/IP模型传输层的协议,使用三次握手协议建立连接,当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。
  • UDP 用户数据报协议,是位于TCP/IP模型传输层的协议,提供面向事务的简单不可靠信息传送服务。
  • DHCP 协议位于TCP/IP模型的应用层。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。
  • ARP 属于网络层协议

1、OSI,TCP/IP协议的体系结构

OSI分层 (7层):物理层数据链路层网络层传输层会话层表示层应用层
TCP/IP分层(4层):网络接口层网际层运输层应用层
常用五层协议 (5层):物理层数据链路层网络层运输层应用层

每一层的协议

物理层:RJ45、CLOCK、IEEE 802.3 (中继器,集线器,网关)
数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层IPICMPARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
传输层TCPUDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层FTPDNSTelnetSMTPHTTPWWW、NFS
ARP协议:地址解析协议,IP地址和MAC地址之间的对应关系。
ICMP协议:因特网控制报文协议
DHCP协议:动态主机配置协议

物理层通过物理手段把电脑连接起来,数据链路层则对比特流的数据进行分组,网络层来建立主机到主机的通信,传输层建立端口到端口的通信,应用层最终负责建立连接,数据格式转换,最终呈现给用户。

2、三次握手和四次挥手的具体过程

为什么TCP连接要建立三次连接?

(为了防止失效的连接请求又传送到主机,因而产生错误)

连接:客户端连续发送多次 SYN 建立连接的报文

  1. 三次握手才可以阻止重复历史连接的初始化(主要原因)
  2. 三次握手才可以同步双方的初始序列号
  3. 三次握手才可以避免资源浪费

如果只有2次,无法做到双向连接的建立,从建立连接server回复的SYN和ACK合并成一次可以看出来,他也不需要4次
在这里插入图片描述
客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

参考:小林coding

为什么要4次挥手

挥手:client端向server发送FIN

TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,是一个全双工模式。

  1. client端向server发送FIN包,进入FIN_WAIT_1状态,这代表client端已经没有数据要发送了
  2. server端收到之后,返回一个ACK,进入CLOSE_WAIT等待关闭的状态,因为server端可能还有没有发送完成的数据
  3. 等到server端数据都发送完毕之后,server端就向client发送FIN,进入LAST_ACK状态
  4. client收到ACK之后,进入TIME_WAIT的状态,同时回复ACK,server收到之后直接进入CLOSED状态,连接关闭。但是client要等待2MSL(报文最大生存时间)的时间,才会进入CLOSED状态。

4次挥手

在这里插入图片描述

为什么要等待2MSL的时间才关闭
  1. 为了保证连接的可靠关闭。如果server没有收到最后一个ACK,那么就会重发FIN。
  2. 为了避免端口重用带来的数据混淆。如果client直接进入CLOSED状态,又用相同端口号向server建立一个连接,上一次连接的部分数据在网络中延迟到达server,数据就可能发生混淆了。

网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

3、在浏览器中输入www.baidu.com后执行的全部过程

1、客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层

2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。

3、客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,无非就是通过查找路由表决定通过那个路径到达服务器。

4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

4、TCP和UDP协议

TCP对应的协议:

  1. FTP:定义了文件传输协议
  2. Telnet:一种用于远程登陆的端口
  3. SMTP:邮件传送协议
  4. HTTP:是从Web服务器传输超文本到本地浏览器的传送协议

UDP对应的协议:

  1. DNS:用于域名解析服务
  2. SNMP:简单网络管理协议
  • TCP/IP的流量控制
    利用滑动窗口实现流量控制,所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。TCP为每一个连接设有一个持续计时器。

  • TCP拥塞控制
    防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

  • 几种拥塞控制方法
    1、慢开始(slow-start )
    2、拥塞避免(congestion avoidance )
    3、快重传( fastretransmit )
    4、快恢复( fastrecovery )

四、操作系统

操作系统面试重难点总结

1、操作系统的四个特性

1、并发:同一段时间内多个程序执行(注意区别并行和并发,前者是同一时刻的多个事件,后者是同一时间段内的多个事件)
2、共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
3、虚拟:通过时分复用(如分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个
4、异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进

2、操作系统的主要功能

处理机管理:处理机分配都是以进程为单位,所以处理机管理也被看做是(进程管理)。包括进程控制,进程同步,进程通信和进程调度
存储器管理(内存管理):内存分配,内存保护,地址映射,内存扩充
设备管理:管理所有外围设备,包括完成用户的IO请求;为用户进程分配IO设备;提高IO设备利用率;提高IO速度;方便IO的使用
文件管理:管理用户文件和系统文件,方便使用同时保证安全性。包括:磁盘存储空间管理,目录管理,文件读写管理以及文件共享和保护
提供用户接口:程序接口(如API)和用户接口(如GUI)

3、进程的状态与转换

  • 进程的状态:创建就绪执行阻塞终止状态

运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。

就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。

阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。

注意区别就绪状态和等待状态:就绪状态是指进程仅缺少处理机,只要获得处理机资源就立即执行;而等待状态是指进程需要其他资源(除了处理机)或等待某一事件。

就绪状态 -> 运行状态:处于就绪状态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪状态转换为运行状态。

运行状态 -> 就绪状态:处于运行状态的进程在时间片用完后,不得不让出处理机,从而进程由运行状态转换为就绪状态。此外,在可剥夺的操作系统中,当有更高优先级的进程就 、 绪时,调度程度将正执行的进程转换为就绪状态,让更高优先级的进程执行。

运行状态 -> 阻塞状态:当进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行状态转换为阻塞状态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。

阻塞状态 -> 就绪状态:当进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞状态转换为就绪状态。

4、进程与线程的区别

进程:进程是进程实体的运行过程,是系统进行资源分配和调度单位(具有动态、并发、独立、异步的特性,以及就绪、执行、阻塞3种状态);引入进程是为了使多个程序可以并发的执行,以提高系统的资源利用率和吞吐量。

线程:是比进程更小的可独立运行的基本单位,可以看做是轻量级的进程(具有轻型实体,独立调度分派单位,可并发执行,共享进程资源等属性);引入目的是为了减少程序在并发执行过程中的开销,使OS的并发效率更高。

  • 两者的对比:
    调度方面:在引入线程的OS中,线程是独立的调度和分派单位,而进程作为资源的拥有单位(相当于把未引入线程的传统OS中的进程的两个属性分开了)。由于线程不拥有资源,因此可以显著的提高并发度以及减少切换开销。
    并发性:引入了线程的OS中,进程间可以并发,而且一个进程内部的多个线程之间也是可以并发的,这就使OS具有更好的并发性,有效的提高了系统资源利用率和吞吐量。
    拥有资源:无论OS是否支持线程,进程都是基本的资源拥有单位,线程只拥有很少的基本的资源,但是线程可以访问所隶属的进程的资源(进程的代码段,数据段和所拥有的系统资源如fd)
    系统开销:创建或者撤销进程的时候,系统要为之创建或回收PCB,系统资源等,切换时也需要保存和恢复CPU环境。而线程的切换只需要保存和恢复少量的寄存器,不涉及存储器管理方面的工作,所以开销较小。此外,统一进程中的多个线程由于共享地址空间,所以通信同步等都比较方便。

5、死锁

死锁是指多个进程在运行过程中,因为争夺资源而造成的一种僵局,如果没有外力推进,处于僵局中的进程就无法继续执行。

死锁原因:

1、竞争资源:请求同一有限资源的进程数多于可用资源数
2、进程推进顺序非法:进程执行中,请求和释放资源顺序不合理,如资源等待链

死锁产生的必要条件:

1、互斥条件:进程对所分配的资源进行排他性的使用
2、请求和保持条件:进程被阻塞的时候并不释放锁申请到的资源
3、不可剥夺条件:进程对于已经申请到的资源在使用完成之前不可以被剥夺
4、环路等待条件:发生死锁的时候存在的一个 进程-资源 环形等待链

死锁处理:

预防死锁:破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量

避免死锁:在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态)-如银行家算法

检测死锁:允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度大

解除死锁:与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度大

6、进程通信

  • 进程通信是指进程之间的信息交换

1、PV操作:是低级通信方式
2、高级通信方:法主要有以下三个类。
共享存储:在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如 P操作、V操作),对共享空间的写/读进行控制。
消息传递:进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
管道通信:管道通信是消息传递的一种特殊方式。所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。

7、进程同步

多进程虽然提高系统资源利用率和吞吐量,但是由于进程的异步性可能造成系统的混乱。进程同步的任务就是对多个相关进程在执行顺序上进行协调,使并发执行的多个进程之间可以有效的共享资源和相互合作,保证程序执行的可再现性。

  • 同步机制需要遵循的原则:

空闲让进:当没有进程处于临界区的时候,应该许可其他进程进入临界区的申请
忙则等待:当前如果有进程处于临界区,如果有其他进程申请进入,则必须等待,保证对临界区的互斥访问
有限等待:对要求访问临界资源的进程,需要在有限时间内进入临界区,防止出现死等
让权等待:当进程无法进入临界区的时候,需要释放处理机,边陷入忙等
经典的进程同步问题:生产者-消费者问题;哲学家进餐问题;读者-写者问题

同步的解决方案:管程,信号量。

8、用户态和核心态

内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序

特权指令:只能由操作系统使用、用户程序不能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置时钟 允许/禁止终端 停机
非特权指令:用户程序可以使用的指令。 举例:控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态)

  • 特权级别

特权环:R0、R1、R2和R3
R0相当于内核态,R3相当于用户态;不同级别能够运行不同的指令集合;

用户态—>内核态:唯一途径是通过中断、异常、陷入机制(访管指令)
内核态—>用户态:设置程序状态字PSW

  • 内核态与用户态的区别

1、内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态。因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
2、当程序运行在0级特权级上时,就可以称之为运行在内核态
3、运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。
4、这两种状态的主要差别是:
处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的。
处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。

用户态到内核态的切换:
系统调用:用户态进程主动要求切换到内核态的一种方式,用户程序通常调用库函数。
异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,比如缺页异常。
中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值