雅可比松弛法

有道题叫分析,那先了解下这种方法。

查阅了资料后初步得知这是一种通过矩阵迭代解方程组的方法。

给出如下方程:

a11*x1+a12*x2+a13*x3=b1

a21*x1+a22*x2+a23*x3=b2

a31*x1+a32*x2+a33*x3=b3

可以化成如下式子:

x1=(b1-a12*x2-a13*x3)/a11

x2=(b2-a21*x1-a23*x3)/a22

x3=(b3-a31*x1-a32*x2)/a33

我们先假设x1=0, x2=0, x3=0,代入式子右边:

x1=b1/a11

x2=b2/a22

x3=b3/a33

我们得到新的x1,x2,x3,于是我们可以继续将新的值代入方程,又得到新的x1,x2,x3,如此循环下去,X将会越来越接近准确值。

如果以矩阵的形式表示上述方程,即Ax=B。将A分成对角矩阵D,右上三角矩阵U,左下三角矩阵L。Ax=B转化为Dx=b+(L+U)x,继而转成x=b*D^(-1)+(L+U)x*D^(-1)

又由于DLUA都是已知量,可以把上式系数算出来,于是式子可以化简成x(k)=Tx(k-1)+c。

于是又可以令x=[0,0,....,0],然后迭代。

现在我明白这是怎么一回事了,但是刚才才看就挺懵的。

这篇博客以上部分是笔记,想具体了解该算法请左转https://www.cnblogs.com/gongxijun/p/10149337.html

MPI代码分析(书上的题,有些看不懂)

float Arow[N],X[N],NewX,B,error,Temp;//雅可比迭代法的输入应该是矩阵吧,那NewX和B是矩阵,Arow是N*N的矩阵,X是数组,至于error嘛,Allreduce里面用到了,作为recvAddress,大概理解成,如果error超过一定量度,就不会继续迭代
MPI_Comm comm;//MPI通信域
error=SomeLargeValue;//一个常量,error值超过它就不再迭代
初始化A、x和B
MPI_Init(&argc,&argv);//进入MPI环境
comm=MPI_COMM_WORLD;//为MPI通信域赋值
MPI_Comm_rank(comm,&my_rank);//获取当前进程在指定通信域的编号到my_rank
while(error>SomeErrorBound){//一次完整的迭代
Temp=B;//B是常量矩阵
for(int i=0;i<N;i++)Temp-=Arow[i]*X[i];//A是系数矩阵的一列,X是未知数(为上一次迭代计算出的值),算出一个矩阵,用B减去,减了N次
Temp/=A[my_rank];//只除以这个处理器对应的系数矩阵的一行
NewX=Temp+X[my_rank];//新的X要加上Temp
MPI_Allgather(&NewX,1,MPI_FLOAT,&X,1,MPI_FLOAT,comm);//每个处理器处理了一行(获得了一个新的X),聚集起来每个处理器获得所有新的X
Temp=Temp*Temp;//为什么要平方
MPI_Allreduce(&Temp,&error,1,MPI_FLOAT,MPI_SUM,comm);//所有处理器的Temp都被归并到根进程的error,方式是计算总和
}

Ribbon效果

形状

由n、n-1、n-2三个点围成三角形,n++循环。

颜色

透明度取决于alpha值。

渐变色取色环上临近的颜色。我找到rgb变化的规律后,手写了三个分段函数,他们的规律(参照色环上的顺序)大概是R变化时GB不变,G变化时RB不变,B变化时RG不变,他们的周期相同,6个阶段中每个阶段都有一种原色数值上升/下降。

写分段函数用了很多if,其实可以不用分段,渐变并非一定要与色环的顺序一致并且饱和度相当。我们也可以直接用cos选择一个0-256的数,rgb的数值由此决定,每次循环该数值变化一点点,这样也可以渐变。

代码

写的比较乱就不贴了。

同步、异步与阻塞、非阻塞

通常,同步操作是阻塞的,而异步操作非阻塞,但两对概念也可以交叉组合。

同步与异步是基于消息和通信的概念。异步操作立即返回,操作完成后通知,而同步操作等待操作完成才返回(返回就相当于完成通知,也意味着没有通知)。

阻塞与非阻塞的最大区别在于,执行操作后资源是否可用(当然是否阻塞也是他们的区别)。阻塞操作执行后资源可用,非阻塞操作执行后则不一定可用。

例如同步非阻塞,执行语句后就可以做别的,但是资源不可用,没有完成通知,因此需要轮询。异步阻塞,执行语句后不能做别的,执行下一条语句时资源已经可用了,有完成通知(异步阻塞和同步阻塞只差一个通知,基本没有区别)。

对数字证书的理解

最简单的情况下,服务器掌握私钥,任何人都可以使用公钥。因此只要用公钥解密就能确认数据是否来源于服务器。

但还有子证书的概念。用户操作系统里存放的根证书是有限的,因此https网站的证书是一级一级签发的。

根证书管理机构(CA)用自己的私钥签发下一级证书的公钥,而下一级证书的私钥用来加密又下一级的公钥。假定一共就3级,那么用户浏览网站时,首先收到第1级私钥加密的第2级公钥、第2级私钥加密的第三级公钥,然后用本地的第1级证书解密第2级公钥,用第2级证书解密第三级公钥,如此即可信任3级公钥。最后再用第3级公钥验证网站用3级私钥加密的内容。

基于LFS做一个Linux系统

一、搭建Linux环境

曾经有LFSliveCD用于编译LFS,但前者不维护了,可以使用其他Linux发行版。

安装debian,发现使用中文安装会乱码【问题1】,并且未设置root密码,使用su root切换却提示密码错误【问题2】,遂重装英文版本。

debian的安装过程有点长,即使下载了xfced版本,选择不从网络下载软件包,也得等数分钟。

http://www.linuxfromscratch.org/lfs/view/stable/chapter02/hostreqs.html

原本想安装VirtualBox提供的工具,方便从主机剪贴板获取命令,没想到即使以root运行挂载盘下的runasroot.sh,也提示Permission Denied【问题3】。

和午后的困倦拼了一会儿,结果我把挂载的内容复制了,就可以运行。其间我第一次复制得到的文件夹是空的【问题4】,不知道啥原因,由于弹出后挂载镜像又需要手动挂载,我就干脆重启。

虽然没干啥事,但已经过去了几个小时。。工欲善其事,必先利其器嘛。

然后运行官方提供的脚本检查所需软件是否已安装,发现报错一大堆。比如g++就没有安装,所以我apt intall g++,发现报错Unable to correct problems, you have held broken packages.【问题5】

网上说update+upgrade升级源和软件就好了,然而我试了也没用,只好手动添加源再运行以上命令,发现仍然不行。

我再观察报错,发现它都提示有依赖没有安装,难道不是自动安装依赖吗??如下提示,但如果我安装libc6-dev,那么它又会提示我安装别的,如此循环下去。

 libstdc++-6-dev : Depends: libc6-dev (>= 2.13-5) but it is not going to be installed

最后问了dalao,原来是我添加的软件源版本错了,debian9和10的版本号代称我不了解,因此没有注意。我估计以上报错原因是,debian9的源没有高版本软件,因此检查依赖就过不了,但其实有的依赖根本就已经安装好了,只是源中找不到。

更新了源之后,软件可以正常安装,其中makeinfo命令not found,对应的软件包叫texinfo。

LFS官方提供了检查软件安装的脚本,它还提示我,/bin/sh没有指向/usr/bin/bash,我目前指向的是dash。dash是debian启用的新终端,但lfs手册既然说要指向bash,那就只好改了。

现在我要了解一下,软链接( ln -s source target )和硬链接( ln source target )是什么。以前学操作系统的时候提到过,硬链接的引用是在文件系统层面上,控制i-node块的指向实现的,而软链接相当于快捷方式,本身是另一个文件。那么这里就用软链接吧,如果是快捷方式,被误删也没关系。

接近12点,检查过所有软件包都安装后进入下一步。

http://www.linuxfromscratch.org/lfs/view/stable/chapter02/stages.html

这个页面告诉我,root用户需要设置LFS环境变量。从第5章开始,/mnt/lfs必须挂载,必须创建lfs用户,5.3是关键,如果有问题重新解压包。第6章开始,使用chroot要设置LFS环境变量,必须挂载虚拟文件系统(要在chroot命令外)。

我在百度云买了一台云主机,下载软件比较快,而且可以用不同的设备操作,因此实验环境在百度云上了。

现在的问题是分区,实验手册中制作lfs系统使用了lfslivecd,宿主系统并没有安装到磁盘上,但我现在是先装好debian,所以要从系统盘给lfs让出一个分区。

发现resize2fs可以调整分区容量,它提示我On-line shrinking not supported,也是哦,系统还在运行呢。【问题6】

遇到了非常恼人的问题,询问多人后发现无简单解决方案。Windows都可以在运行时压缩系统卷,Linux怎么就不行呢?

您好,十分抱歉,系统盘不支持分区,如果您想要进行分区的话,您可以选择购买cds磁盘挂载来充当您的数据盘,请您知悉,谢谢。

好吧,还是只能本地操作。

我下了Ubuntu19.10,打算提前分好区,免得对系统分区操作麻烦。至于百度的云服务器,就拿来给ipad当云电脑用,装个windows。

但是Ubuntu图形化安装界面总是在硬盘分区,新建分区表后卡死,背景变黑。【问题7】

实在无办法,只好先分区。下载了一个ElementaryOS,结果安装的时候没有选项。换openSUSE发行版试试。

openSUSE顺利分区,终于可以开始正式的工作了,此去已几天。

因为要复制脚本,所以用ssh连接,Parallel tools的linux版老是出错。结果能ping通,ssh却连接不上,初步判断防火墙。

幸好opensuse配置防火墙有图形化界面,配置还方便一点。

但是opensuse软件源又得配置,算了还是ubuntu省心,这次给ubuntu分配了更多的内存和显存,就没有卡死了。

ubuntu安装ssh server后继续操作,分区在安装时就设置好,进入系统后用'mount 设备 文件夹'命令挂载分区(挂载前先格式化成ext4)。

之后,我下载了所有需要的软件源码放在了$LFS/sources中。

二、制作工具链

为了避免错误操作造成的影响,这一步新建了lfs账户。

按部就班地解压文件,编译源码,这一步虽然要重复很多次而且很耗时,但只要跟着LFS手册就不会有问题。

但临时系统需要的软件编译完成后,就得准备编译内核和系统软件了,这个时候需要从lfs用户切换回root用户。切换操作只能exit,su会提示认证失败。【问题8】

三、构建内核

这一步开始需要chroot(改变根目录),进行最终的编译。

这一步只要根据LFS来就好了,但是却花了我两周的空闲时间。

温馨提示工具链+为lfs系统编译的软件总数100个左右,而且没有自动化脚本。(有的话lfs就没有diy的感觉了)

四、启动配置

System V是一个经典的启动程序,它包含init,Linux的启动level就是来自这里。

0 — halt
1 — Single user mode
2 — Multiuser, without networking
3 — Full multiuser mode
4 — User definable
5 — Full multiuser mode with display manager
6 — reboot

这里需要安装lfs-bootscript。

由于想改一下Ubuntu的启动配置,又新开了一个ssh窗口,没想到用户名密码都正确却提示Permission denied。【问题9】

我擦,原来是ssh的配置文件里有一句permitRootLogin prohibit-password,也就是只能用密钥。。赶紧注释掉。

出现了error : unknown filesystem错误。

五、GUI应用

六、窗口管理系统

待更新

DDOS

了解一下DDOS。

定义

一切使用合法方式使服务器不能提供服务不能正常提供服务的攻击,DOS即Denial of Service。一般DDOS的手段是通过大量请求耗尽服务器资源或宽带。

常见类型

软件缺陷型

winuke

不了解。

land

伪造源IP源端口与目的IP端口相同的包,使得一些主机陷入循环。

teardrop

IP分组报文重组时不会检查长度过短的情况。因此可以构造两段报文,其中第二段报文偏移量小于第一段报文的长度,这种情况下,第二段报文的偏移+长度减去第一段报文的长度小于0。而长度作为无符号数,小于0就会溢出,变成很大的数,从而导致系统分配很多资源。

协议缺陷型

Synflooding

最常听说的DDOS攻击,利用三次握手完成前服务器要保持状态,不停的发送SYN,不回ACK,导致服务器大量资源空耗。

Smurf

局域网中,攻击者伪造源ip,向广播地址发送包,这样被伪造的主机会收到所有主机的回应,回应过于密集时主机可能崩溃。