计算机基础理解


计算机组成原理

五级流水线指的是将CPU指令执行分成五部分,分别是指令获取部分,解码为指令部分和数据部分,算术运算部分,存储部分,写回部分(这里会写回到解码部分的ACC累加器中);每部分之间都会有一个时序触发器,每个时钟周期触发一次,五部分同时处理;但是如果前后两个指令发生了依赖,则需要冲突控制单元去控制执行停顿等待数据(其实高级的cpu这部分可以通过超线程来充分利用起来),这其实就是CPU最核心的流程了;现代的CPU流水线都很长,利用更加高效;

分支预测为什么快,指令是特殊的数据,数据预读会快,那指令预读对了也会快。

大学里做的FPGA实验,当然也是思考了好久,最后顿悟

五级流水线的本质是稳定时五个部件同时工作,一个时钟内每个部件执行对一个指令的一个部分加工 (加工稳定后放到目的地等待下一个时钟被收取)。而指令相当于产品不断的向前移动(这个指令进入下一时钟时前面的指令也进入下一个时钟),形成水流。但要考虑到数据相关,如果下一条指令需要上一条指令的新数据,而数据更新要等到写回时,那时候就晚了,所以就用旁路提前引回来。

• 解决Decode部件执行beq (要读取RF[]进行判断,如果相等进行跳转)指令与 Execute  执行的add指令(最后要将结果写会RF[2])之间的冲突:首先,本身Decode执行beq时,fetch instruction阶段预取了beq的下一条指令(本不该取的,因为beq可能跳转而不执行下一条指令)放到B那等着下一时钟被Decode部件取,所以要把此条指令CLR掉(表现为Instr有此指令,但是下一周期InstrD却被清成0000_0000)。现在谈冲突,因为Decode只从Memory阶段Forward引回旁路,所以要Stall一个周期,等add指令 到了 Memory后Decode部件再执行beq。(所以代码中判断E有相关数据--即rt rd地址相等后,Hazard触发branchStall一个时钟,然后Forward回M的最新数据) rs rt 是两个操作数的地址,rd是两个操作数计算结果写会的地址。

• 当lw在Excute(从DataMemory中读数据然后写回RF[1]),add在Decode(add指令需要读RF[1]),因为此时the lw instruction does not finish reading data until the end of the Memory stage所以无法引回更新后的数据,此时Stall一下,add还在D,lw到了M,下一时钟lw到了W,add到了E,此时相关数据就可以引回来了。

• 上面有一点,只要有stallF和stallD停一个时钟,此时E处指令进入下一个部件,中间缺条指令,只好FlushE清成0指令(前面的指令都暂停了,中间插一条0指令);

累加器ACC是一个具有特殊用途的二进制8位寄存器,专门用来存放操作数或运算结果。在CPU执行某种运算前,两个操作数中的一个通常应放在累加器A中,运算完成后累加器A中便可得到运算结果。

CPU缓存行的伪共享,每个CPU都会有一个L1缓存,多个CPU可能共享一个L2缓存,因为CPU的缓存行是以整行换进换出的,如果其中的一个变量被重置,整条缓存行就会被换出,同在一个缓存行但是没变的值也会被换出,严重影响热点变量的效率。所以一般都会在热点变量前后加空白地址,这样就不会受其他变量的影响了;java中Arrays.sort用的双轴快排,为什么比较次数多了但是性能却提升了;

当处理器A访问的变量a和处理器B访问的变量b在L3同一cache line上时产生伪共享。当A处理器改变了变量a的值时,A处理器自己的L1 cache line变成了M状态(Modified ,这行数据有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中,MESI协议),L3 cache line 变成I状态(Invalid,这行数据无效),对应的处理器B的L1 cache line不知道b变了没有就只好变成了I状态,当B再访问b时就只好再从内存中整体置换L1 cache line,花的时间就多了。Java中的伪共享以及应对方案-阿里云开发者社区

解决:在jdk1.8之前会 将需要独占缓存行的变量前后添加一组long类型的变量,依靠这些无意义的数组的填充做到一个变量自己独占一个缓存行;  在jdk1.8中通过添加sun.misc.Contended注解来解决这个问题,若要使该注解有效必须在jvm中添加以下参数: -XX:-RestrictContended sun.misc.Contended注解会在变量前面添加128字节的padding将当前变量与其他变量进行隔离;

操作系统

  • 线程

最开始Linux中只有进程概念,创建进程会调用内核态clone(设置内存共享参数)->do_fork创建task_struct由内核调度。为了实现线程概念,在clone的时候设置内存共享为true,从而实现内核线程(对用户态暴露轻量级进程LWP,它是内核线程的高度抽象,每一个轻量级进程都与一个特定的内核线程关联)。当用户想创建线程时(如通过pthread库),将用户态维护的线程与内核线程进行绑定(可以1:1或者N:1或者N:N)。在N:1模型中,用户态可以维护N个用户级线程的调度(减少内核开销,但是会造成多CPU时一个进程的多个线程无法同时执行,而且单线程阻塞会造成该进程阻塞,此进程中的其他线程也都堵)。Java线程通过LWP与内核线程1:1绑定,所以线程池非常重要。

  • 启动

上电后,CPU先读取引导程序(BootLoader或BIOS),载入操作系统的相关二进制代码(此时是特权模式下),进行初始化硬件、设置中断及中断后要执行的代码和堆栈、复制代码到RAM、建立二级中断向量表、设置MMU管理虚拟内存的页表,然后降级到用户模式,这样除了软硬中断和方法调用能进入特权模式,用户程序再也没有返回特权模式的机会了,操作系统就把控了整个CPU的最高权限了。每种模式都有自己的SP(栈指针:指向自己独有的内存栈的栈顶,保存着每种模式被中断前的现场),LR(记录要返回到的指令地址,子程序调用和中断都需要),因此不同模式的切换需要底层寄存器硬件支持的。硬中断就是外部(如晶振)触发一个电平变化然后CPU进行中断指令执行,立即执行。软中断是内部指令自己发出的,可推后执行。对不起,学会这些 Linux 知识后,我有点飘

  • 死锁 

你只要给我我想要的(等待),我就给你你想要的(占有)。但是我此时还没给你你想要的,你一定不会给我我想要的。条件资源是互斥且不可剥夺,进程保持并请求资源并且循环。

  • 页预读

块(物理块):将内存存储空间也分为和页大小相等的区域,这些区域被称为块。页表:为了在内存中找到进程的每个页面所对应的物理块系统为每个进程建立一个页面映射表。分页就是减少碎片空余空间,页表中有碎片空间的地址。页表位数越多,映射内存范围越大,每个进程(假设内存一定)所需页表越少,但碎片越多。

  • 生产者和消费者

单个消费者和单个生产者的话的确是不用mutex的,因为empty和full的PV操作保证了消费者和生产者不可能同时访问同一个缓冲区;

【讨论】生产者消费者问题中的mutex没有用。_第4页_计算机与软件_考研论坛(kaoyan.com)

full代表已生产的信号量有多少,avail代表空的信号量有多少(其实是对边界的控制)。若生产者先P(mutex),再P(avail)则会造成死锁。因为若生产者占了mutex,设此时full = 1而avail = 0,生产者等待avail,而消费者此时等待mutex,(之后才释放avail ),因此顺序不能颠倒。而图上顺序生产者没有得到avail,所以就不会额外占有一个mutex。

源码

private final byte[] memoryMap; //表示完全二叉树此节点已经分配到的层高,共有4096个 private final byte[] depthMap; //表示节点的层高,共有4096个

两者对比可以得知此节点下所有子节点的可用状态

从inode结构体中获的设备节点所对应的设备号,内核根据设备号找到从内核链表中找到对应的cdev结构体;得到cdev结构体中对设备操作的方法集合,进而调用操作集合中对应的函数实现对设备的控制。

(1) 字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,调制解调器是典型的字符设备。

(2) 块设备:应用程序 可以随机访问 设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。

Linux设备挂载

linux目录结构想象成一棵树,目录就是树枝,分区就是篮子,挂载就是把篮子挂在树枝上,这样你沿着树枝就能进到篮子里获取篮子里的内容。/dev/sdb1不是目录,无法直接访问,ls/dev/sdb1无法执行,/dev/sdb1是一个类似指针的东西,指向这个分区的原始数据块。mount前系统并不知道这个数据块哪部分数据代表文件如何对它们操作。设备挂载到一个目录(挂载点)挂载点下原有文件在挂载完成后会被临时隐藏。

本质上,Ext3 mount的过程实际上是inode被替代的过程。例如,/dev/sdb块设备被mount到/mnt/alan目录。那么mount这个过程所需要解决的问题就是将/mnt/alan的dentry目录项所指向的inode屏蔽掉,然后重新定位到/dev/sdb所表示的inode索引节点。

CPU负载 ,过去1分钟1Cpu的一直有一个R或者D状态下的进程,则过去1分钟平均load为1.00

%wa表示 Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request. 显示系统有未完成的磁盘I/O请求时CPU或CPU处于空闲状态的时间百分比。因等IO导致CPU空闲时间

%id表示 Show the percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request. 显示CPU或CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。除去等待IO外CPU空闲的时间

Linux TOP CPU %wa 值的理解_93号选手的博客-CSDN博客_top wa

• C语言编译(build)过程包括:预处理(读入#include的.h ,展开#define的宏 -e -> .i),狭义的编译(-s -> .s),汇编(汇编转为机器语言 -c -> .o ),链接(链接.o或.a或.so输出可执行文件或程序库 -o ->.out)。动态链接是指,链接库文件不是和.o文件拼接在一起,而是当可执行文件运行时,才去内存调用库文件,如果没有就加载。

• 狭义的编译包括:词法分析(通过扫描器scanner输出token),语法分析(通过解析器praser把token生成语法树),语义分析(区分变量局部还是全局,解析变量声明引用,类型检查,初始化检查,函数返回检查),生成中间代码(将复杂语句分解成单位语句,可跨不同的CPU),不同CPU汇编代码生成(只有不到30个的寄存器和跳转语句)

网络

  • 网络七层

物理层 (网线) 数据链路层 (CRC,MAC,交换机,tcpdump抓包) 网络层(IP地址与物理地址的转换,路由器,IP,ICMP->ping) 传输层(分割组合数据,TCP/UDP需要端口,socket在这层之上进行编程) 会话层(两节点间会话的建立维护,RPC) 表示层(编码格式和加密) 应用层 (http/https) 发送数据时五层自顶往下加包头,接收数据时五层由下到上去包头。

当你在源电脑A地址栏输入目的IP 120.78.151.238:80点回车GET请求,操作系统给你把7层的数据封装好从网线发送出去,首先经过工作在数据链路层的网桥(或交换机,每个接口是一个冲撞域,所有接口组成广播域),将源电脑A的 存入网桥的转发表(以后到此mac地址的数据就交给对应的网线接口,如果没有就广播),再到达工作在网络层的路由器,然后从路由器的路由表找到目标IP(通过掩码分网段)对应的子网路由器IP,再从高速ARP缓存中找出 的映射(如果没有发送ARP报文进行广播寻找,目的MAC地址填入ff-ff-ff-ff-ff-ff),得到子网路由器MAC地址,再通过网桥找出对应的网线接口,把数据发送过去。  ip数据包经由路由转发的时候源ip和目的ip不会改变,除非做了nat转换才能改变。ARP表是没有掩码的,是不区分网段的(路由表可以)。

•  IP地址(145.13.3.10)与子网掩码(255.255.255.0)按位相与就是子网地址(145.13.3.0)。其实就将IP地址分为网络前缀(就是子网地址)+主机号。为了更有效的查找,在路由器中将IP放入路由表中(一个二叉线索树,只区分不同即可,不一定要到32层),每个叶节点包括子网掩码和子网地址(并储存对应的MAC地址),每搜索到一个叶子结点,就将目标IP与子网掩码按位与得出子网地址看与此结点储存的子网地址是否相同,然后就找到了子网的MAC地址。(子网相对于整个网络来说是子网)

• IP地址(32位)互联网网络层的抽象地址。MAC地址是上网设备的唯一标识(48位),IP会变而MAC不会变(一台机器原先在山东上网你拿到北京去),因此通信时只有目的IP地址是不行的,还得必须知道目的MAC地址的(而IP地址可以划分子网提高查找效率,也是必须有的)。每个子网最大分配数别忘-2(保留全0标识自身和全1广播地址)。

• ICMP(用于传输出错报告控制信息,ICMP 报文作为 IP 层数据报的数据部分,加上数据报的首部,组成 IP 数据报发送出去)的应用:traceroute。源主机向目的主机发送无法交付的UDP。其中的TTL先设为1,路由器R1接收到后把TTL减一,返回ICMP时间超过差错报文给源主机。源主机再发送UDP,TTL设为2, .....(大部分时候路径不变)

• RIP内部网关协议,即一种基于距离向量的路由选择协议,按固定的时间间隔仅和相邻路由器交换自己的路由表(存在最大跳数15)。OSPF通过Dijkstra算法算出最短路告诉大家。

• 虚拟专用网VPN就是通过公网建立内网稳定通道(隧道技术,把内网数据报加密包装在公网ip数据报中,然后通过公网ip抵达对方的专用网络,进行拆包和处理)。要想VPN连接因特网,必须有一个合法的IP地址进行代理,当VPN内部电脑请求外部IP时,通过网络地址转换NAT记录请求从内部哪个IP发出的,接收时就转发给那个IP。但是如果作为服务器时,根本不知道转发给哪个专用网地址,所以无法实现请求。 局域网与广域网之间用网关连接。

  • IP层的包头和TCP层的包头 参考

为什么要time_wait等2msl为了解决最后一个ack挂掉的问题,如果ack=y+2挂掉,Fin还会再发送一次重试

• 三次握手,四次挥手:因为你发送消息,但你不知道对方是否收到消息,所以要对方发一个确认收到的信息才会行动,对方也是同样的要求。

• 静态IP就是手动设置的IP地址;动态IP则是自动获取的IP地址。DHCP是动态分配IP的一个协议,DHCP服务器(或路由器)会从之前设置好的地址池上的IP里拿出一个分配给要求获取IP主机上。

•  HTTP1.0是短连接:TCP连接后传完数据接着断开。HTTP/1.1起,默认使用长连接,Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒。SOCKET是长连接,连接后不管是否使用都保持连接,但安全性较差,但是实时性高。对于一个Socket以 客户端的IP及端口号服务器端的IP以及端口号 唯一标识,服务器端需bind()端口并listen()此端口,通过accept()堵塞等待客户端的连接;客户端可以不bind端口,connect()时自动选不使用的端口发送数据。HTTP2.0使用了TCP层面的多路复用,做到同一个连接并发处理多个请求。

• TCP默认采用Nagle算法,小包合成大包发送,当发送缓冲区满了要发送数据,时间间隔到了也要要发送。如果发送的频率太快,或者接受的频率太慢,就会出现粘包。可以定下格式自己拆包。(UDP无粘包,面向消息而不是面向连接,每一个消息都会有消息头定边界)

• TCP与UDP区别总结:

1、TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务(通过校验和,重传控制,序号标识,滑动窗口、确认应答);UDP尽最大努力交付,即不保证可靠交付

3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP对系统资源要求较多,UDP对系统资源要求较少。忘了LWIP协议

  • 滑动窗口

拥塞窗口主要考虑网络的问题,不断的调整发送的窗口大小;

滑动窗口是考虑到接收端接收能力的反馈,不断的调整发送窗口的大小;

发送方(维持发送窗口) 接收发 [ 1 2 3 ] 4 5 seq = 2 seq = 1 ack = 3(只需要对序列最后一个的2回应即可,3代表下次期望接收3,发送端发送窗口更新到3,也就 包含了更多未发送的数据),此时的 win = 3(滑动窗口:已发送未ack + 待发送未ack) 1 2 [ 3 4 5 ] seq = 3 seq = 4

  • 网络安全

1. RSA算法证明

先用到 欧拉函数证明:如果正整数m与n互质,那么 1 = m ^ φ(n) mod n 

n = 3 ,φ(n) = 2, m取5,5^2 mod 3 = 1,特例能过;

设φ(3)个新数为 m*1,m*2,因为1,2互质,那么m*1 mod 3, m*2 mod 3 也一定互质(且小于3);

小于3 的互质数就1跟2,而m*1 mod 3, m*2 mod 3也是小于3的互质数(两组数一定会一一对应),1*2 = m*1 * m*2 (mod 3) 一定成立

那 1=m ^ φ(3) (mod 3)

然后特别的,n取素数,则 φ(n) = n - 1 ,得出费马小定理:

设 n = p1 * p2 ,p1 和 p2 均为素数,φ(p1*p2) = φ(p1)*φ(p2)= (p1-1) * (p2-1)

然后证明RSA如何通过公钥破解私钥:

明文^公钥 mod n = 密文 ,密文^私钥 mod n = 明文

前者带入后者 明文^(公钥*私钥) mod n = 明文 1式

根据 欧拉公式:明文^φ(n) mod n = 1,量边同时 * 明文 ,明文 ^ [φ(n) + 1] mod n = 明文 2式

1式2式一等,公钥*私钥 = φ(n) + 1

公私钥生成时,n取p1*p2,得出φ(n)=(p1-1)*(p2-1)之后销毁p1,p2;

现在把n和公钥给别人,别人想破解私钥,得知道φ(n),就得知道p1跟p2,就得因式分解n,n取特别大,就得遍历,非常耗时。

2. 数字证书:

  • 服务端生成公钥私钥
  • CA证书中心:摘要 = hash(服务端公钥 + 服务端信息),签名=CA私钥encrypt(摘要),证书 = 服务端公钥 + 服务端信息 + 签名(经过BASE64编码)
  • 服务端拿到证书,客户端请求服务端,通过tls拿到 证书
  • 客户端拿到证书 = 服务端公钥A + 服务端信息A + 签名,然后通过服务端公钥A + 服务端信息A生成签名A比解密出来的签名,一样说明没动。

自签证书指的是,CA公钥跟服务端公钥是同一个公钥。

3. 网络攻击:

• CSRF(Cross-site request forgery)跨站请求伪造。防御措施:

1. 通过 referer、token 或者 验证码 来检测用户提交。

2. 对于用户修改删除等操作最好都使用post 。

3. 尽量不要在页面的链接中暴露用户隐私信息。

4.避免全站通用的cookie,严格设置cookie的域。

• 跨站脚本攻击(Cross Site Scripting),缩写为CSS。是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值