写在草稿纸上,之前的工作早晚会被埋没了。


之前看了一下SSD的I/O调度算法,发现里面大有文章。 看的还是Stan Park的论文:https://dblp.org/rec/html/conf/fast/ParkS12 该论文有15页。该论文的中心内容为作者自行研发的一套SSD I/O调度器,为了体现出其性能的优越性,作者将其与一些常见的Linux I/O调度器进行了性能比较,包括应用程序综合性能和读写公平程度两大方面。毕竟,这个I/O调度器的目的是为了解决由SSD基本结构造成的读写不公平性。(读写操作共用相同队列,但是写入时间要远远长于读取时间,按照最短任务,最先执行Shortest Job First, SJF的理论来看,让大量耗时较短的读取操作等待耗时较长的写入操作完成,会对性能有相当大的负面影响;当然也不能一味地优先读取,这样对写入也不公平,让一定时间内的读取任务优先执行即可)

  1. NOOP 仿佛是No Operation的缩写。(= =)正如其名字一样,一个队列,先来先走,不做任何操作。在实际情况下根据算法实现者的考虑,可能会对任务按照地址进行一定的顺序重排,这样能够减少一定的I/O时间(最明显的是机械硬盘,连续读取省去了磁头机械臂移动带来的额外等待耗时),但整体思路就是按先来后到发送I/O请求。

  2. CFQ Linux下经常使用的一个I/O调度器,全名为Completely Fair Queueing,即完全公平队列。采用类似模拟的方法计算任务的发送顺序,给每个任务建立一个单独的请求队列,然后分配相同的时间片给每个队列用以执行请求。由于公平性问题在网络(不是社交网络,理解成设备之间通信的网络比较好)上也有需求,可以借鉴一下CFQ在网络上的解决方法:由于网络层传输数据是按照包来的,显然在包头定义完长度之后整个包的大小就确定了,包的传输中断的话会被对方主机认为包损坏,因而在网络层包不可拆。所以采用这么一个办法:用计算机模拟包的预计传输时间,每次发送预计完成最早的包,在宏观上就有着近似的效果。但是由于我没有深入研究Linux上的具体实现方法,在磁盘I/O上的具体规则如何有待考证。

  3. WFQ Weighted Fair Queueing,加权公平队列,是CFQ的一种改版,可以为不同优先级的队列分配对应合适的时间片长度。

  4. Deadline https://blog.csdn.net/hs794502825/article/details/24664259 照着链接看了一下源码,没看完,说的太具体了,讲的是在Linux系统中的实现,而不是算法本身的思路。

  5. Anticipation 翻译为中文是预测。该算法主要针对在HDD上运行、需要连续读取数据的应用。如上文NOOP中略微提到过的请求重排序一样,该算法会在单次I/O请求结束后较短的时间内,强制空闲I/O设备,等待可能出现的连续地址的请求。这样对于某些加载-处理类型的任务较为友好。解决的问题是“假空闲”:一个任务的I/O请求执行完毕后,可能还没有发送下一请求;此时系统认为该程序程序暂时不需要I/O,开始处理其他程序的I/O请求。而可能恰恰在1-2ms后,该任务发出了下一I/O请求,可是却需要等到其他任务的请求执行完成后才能得到处理。(个人举例是MD5校验码的计算:MD5计算可以使用当前已计算的部分,即已经获得的部分内容的MD5码,追加需要计算部分的数据进行计算。这样做的目的是节约内存,不然一次加载整个文件的话,有的设备内存会吃不消。则程序的运行流程可视为:读取数据-合并至已有的部分数据MD5-读取数据-继续合并MD5,直至整个文件加载完成,完成整个文件的MD5计算)似乎Anticipation的等待时间典型值为6ms。但是由于该方法使用场景过于狭窄(尤其是现在多任务系统,而且不会都是连续读取型请求,所以强制空闲反而可能降低整体I/O效率),所以现在的Linux内核基本上都是不用这个的,仅作为替选方案存在于<=4.x版本的Linux内核中。

  6. Deficit Round Robin 毛。。咳咳,俄罗斯友人的一项传统游戏,一把左轮,一发子弹,一人一枪,看谁先中。这里的Round Robin有着类似的规则,所有程序轮流使用相同时间的稀缺资源(如磁盘或网络I/O),直到任务执行完成。而这里的Deficit一词直译为赤字,引申为赊欠,表示在一个Round Robin轮回中没有使用完的时间可以加到下一轮回。没有用完分配时间的原因是,原子性的任务耗时若是小于可用的剩余时间,将不能执行,因而有很大概率会剩下零散的时间片。若是忽略每个程序可能剩下的不等资源片,又会在整体上表现出资源分配的不公平性。因而,采取占用一点资源的方式,记录下每个任务所剩下的未使用资源,在下一个周期补上,能够有效地弥补其公平性。 A:你们玩吧,今天我不参加了 BC等:行,我们先玩,明天多给他来两枪 与上面的冷笑话相反的是,在系统中程序是不会嫌资源多的。

https://blog.csdn.net/weixin_30685047/article/details/94999645

客户端传来UTF-8的表单,服务器的asp用的是GBK,因而服务器端会按照GBK编码读取表单,因而就会乱码 实际上这个时候在服务器里拿到的表单已经是被GBK处理过了的,而要显示出正确的文字,需要把GBK编解码过的文字重新编码,然后用对应的UTF-8再次解码,所以实际上对二进制做的是UTF-8解码从而得到GB2312环境下的正确显示。

原因是,在GB2312里面,汉字两字节一编码,UTF-8三字节一编码,GBK会替换一些不支持的编码为?,ASCII值为63,相当于修改了UTF-8的二进制数据,偶数个汉字运气好,奇数个汉字显然结尾的数据会被破坏,嗯,这就是原因。

解决思路显然是想办法不要让服务器先用GBK进行表单解码了,因而方法有二:

  1. 想办法拿到二进制的表单,然后直接使用正确的代码页解码;
  2. 看能不能把asp换到UTF-8的环境下吧。

来自[纳兰鸟儿]的 http://www.moeje.org/%E3%81%B2%E3%81%A4%E3%81%98%E9%9B%B2%E3%81%AE%E7%A9%BA%E3%81%AB-fd%E7%B3%BB%E5%88%97/

(7)#4 #4#43(7)#4#5#43(7)#1   (7)(6)3#23#43
3#2#1(77)(7)3    (7)(6)(#5)(6)(7)3#4#53
(7)#4 #4#43(7)#4#5#43(7)#1   (7)(6)3#23#43
3#2#1(77)(7)3    (7)(6)(#5)(6)(7)33#4
#4 #4#4323     #1#1#2 #2#23#4(7)(7)3      
66#5#43#4      (7)66#5#43#4

6 666#5#43#1(6)   666 6#5#43
6 66#56776#56 #4[222][2][#1]7667[#1]76
6 666#5#43#1(6)   666 6#5#43
6 66#56776#5#4 5#4[222][2][#1]66   [222][#1][2][3]6
#5676

(7)#4 #4#43(7)#4#5#43(7)#1   (7)(6)3#23#43
3#2#1(77)(7)3    (7)(6)(#5)(6)(7)33#4
#4 #4#4323     #1#1#2 #2#23#4(7)(7)3      
66#5#43#4      (7)66#5#43#4

间奏笛子轨{5312(765)}    {67[2][5]7[5]}

#6 7#67   7#67  7#6#5#4  #1#4#3#4#5  #1#5#4#5#6
#6 7#67   7#67  7[#1][#2]#4  #4#4#3#1 #4#3#4#5

6 666#5#43#1(6)   666 6#5#43
6 66#56776#56 #4[222][2][#1]7667[#1]76
6 666#5#43#1(6)   666 6#5#43
6 66#56776#5#4 5#4[222][2][#1]66   [222][#1][2][3]6
#5676

配合(似乎是一起的?)演奏食用:https://www.bilibili.com/video/av3353940/
Butter Music大草 看了百度翻译才反应过来

主要起因是IPv6的出现吧。。现在大部分卖得火的便宜路由器往往会因为要么存储空间或RAM太小,或者CPU等硬件尚未得到支持而无法使用诸如OpenWRT一类的第三方固件。估计是出于商业目的吧,现在的路由器都不会宣称自己支持IPv6,到时候路由器就可以卖两道了。(然而放在移动放在学校寝室里的华为的接入点可以支持IPv6,估计要上千)然后接上自己的路由器,IPv6地址就没了,怪可惜的。因而打算同时支持IPv4+IPv6的“路由器”,学校接入点每次都要登陆,显然不行,主角就打算选这个刚买的开发板了。在我原本的想象中,这件事应该是十分简单的,计算机网络理论十分完整而清晰,再加上GNU这样的开源组织,多少也会提供一个能用的解决方案吧,毕竟路由器这玩意还是十分实用的。结果后来发现,著名的OpenWRT还是因为Cisco因为偷偷使用了Linux才不得不开源的。开源路由固件大头都要靠这种方式开头,这发展指望不得啊,唉。。。

现在的探索历程就很迷,在国内搜,估计基本tmd都是为了应付计网实验的,两台主机,静态ip,加个ip forward完事,要不就是vmware;在国外,也差不多只会实现流量转发的功能,不过写得比较实在,会在标题写上“流量转发”四个大字而不是像国内一样,不但话说不清楚,反倒觉得自己很NB了。看了一下鸟叔的Linux私房菜,不过里面关于路由器的那部分,层次有点高。。那真的是讲路由器的,不过是路由器之间的配置,上升到RIP和OSPF那个层次了。。我想要和下层设备的交互部分,DHCP啊。。

可能是没有找到正确博客的原因吧,在各大搜索引擎上零零散散地只是搜集到了一些相关的组件,比如Linux内核自带的IP转发IP forwarding功能,具有类似IP防火墙功能的iptables提供了网络地址转换NAT功能,hostapd提供的Wi-Fi热点功能,以及提供PPPoE拨号的pppoepppoeconf软件包(Ubuntu)。这虽然已经构成了路由器最基本的功能:数据的定向转发,但是离日常生活中花钱买的路由器还是有点距离的。除路由器的核心功能外,最关键的,也是最常用的一个,私以为便是DHCP了。

从stackoverflow上获得推荐的,ubuntu的官方路由搭建指导: https://help.ubuntu.com/community/Router

里面提到了一个DHCP服务器,不过Debian Buster的apt里面好像没有这个包: https://help.ubuntu.com/community/dhcp3-server

到时候有时间试试手动编译吧。

目前对于整个架构的设想: 使用开发板上的千兆网口作为网络输入,开发板上装Linux系统并进行有线网拨号;(已实现,pppoe) 插入无线网卡(RTL8188EU,已有内置驱动支持),作为Wi-Fi热点的发射装置;(已实现,hostapd) 使用虚拟网桥将有线网与Wi-Fi连接,让连入了Wi-Fi的设备可以手动配置后上网;(根据进一步的调查,发现这个可能要用iptables比较好,网桥的话,pppoe不知道能不能作为设备连接起来) 添加DHCP等路由器-终端自动配置服务,自动完成无线网络参数配置; 最后,如果可能的话,再更改一下Wi-Fi的认证机制,使其支持企业级认证。(记录一下,可能考虑用LEAP或者PEAP)

  1. 官网,Dowload部分选择合适的版本下载。如果没有特别要求,可以直接无脑装个最新版,本地还要配合适的java运行环境,可以也直接挑最新的。当然,若是对java有一定了解的可以去看看有个帮你区分版本区别的页面,找一个满足最低要求的组合就行,如果不想在电脑上修改太多软件配置的话。在下使用的是Java 8 + Tomcat 9。

  2. 选择用installer安装的话可以直接一把梭,因而不作赘述。在此选择Core版本的zip包,下载解压,里面是一套较为标准的Linux文件树目录。

  3. 阅读RUNNING.txt可以获得将Tomcat运行起来所需要的一系列基本配置。本文是参照该指示,从中选取部分关键配置而将Tomcat运行起来的一系列记录。

  4. 高级系统设置-环境变量,建立新项设置CATALINA_HOME。该选项是必须在Tomcat运行前定义的,用于指示Tomcat的家目录,其意义同JAVA_HOME,指向Tomcat的bin目录的上一级。其余变量可以通过下一步的方式,在文件中定义,方便管理和多实例运行。

  5. bin目录下新建setenv.bat,该文件用于提供绝大部分Tomcat运行环境所需要的参数值,Tomcat会自动寻找该文件。(没有的话自动忽略呗,因为要手动配置,所以Apache干脆直接不提供这个文件了)在里面需要明确至少一个选项:JAVA_HOME/JRE_HOME。亦即是说,在配置多实例的Tomcat的时候,允许不同实例使用不同版本的java。不需要将变量值用引号包裹,即使路径里含有空格。

  6. 由于Tomcat提供了默认的配置文件,因而在配置好环境后可跳过软件内部的配置,直接运行。使用bin目录下的脚本进行对应的操作: 启动Tomcat:startup.bat / catalina.bat start 关闭Tomcat:shutdown.bat / catalina.bat stop

  7. 使用默认配置启动Tomcat后,可以访问http://localhost:8080进行测试,会出现一个管理界面,说明配置并启动成功。

  8. 此时若是关注Tomcat的日志输出,会发现出现如淇℃伅一类的乱码。这是由于Windows控制台和Tomcat中文编码不一致导致的。Tomcat提供了汉化的提示信息,上面这个是“信息”二字经过UTF-8编码后,又经GBK解码出现的结果。解决方法有二: 1) 修改conf目录下的logging.properties文件,把java.util.logging.ConsoleHandler.encoding的对应值修改为GBK; 2) 在bin/setenv.bat中添加一行:

    SET JAVA_OPTS=-Duser.language=en

    将JVM的语言设置为英文,这样看着也更熟悉,也避免了中文乱码的问题。当然可以配合第一条使用,不然算是治标不治本。 JAVA_OPTS是传递给JVM的一系列指令,可以填写多个选项,应该是同上一样空格隔开不加引号即可。 然而指导文件中提到,若要限制Tomcat的资源占用,应该在CATALINA_OPTS里而不是这里进行设置。

  9. 若要观察服务器状态,Tomcat提供了该功能,但是出于安全考虑,设计了一套权限管理系统。 修改conf目录下的tomcat-users.xml以注册用户: 在tomcat-users标签里添加:
    <role rolename="tomcat"/>
    <user username="tomcat" password="tomcat" roles="tomcat,manager-gui"/>

    可将用户tomcat以密码tomcat添加至该Tomcat实例的管理用户。由上可见,若是用户要加入不同的组,可以通过逗号隔开即可。 然后就可用tomcat/tomcat用户名-密码对登陆管理界面。