xbox

“xbox” HALO 战争机器 皇牌空战6 Forza4 忍者龙剑传2 荒野大镖客: 救赎 合金装备系列 鬼泣: DMC 给他爱IV;V 寂静岭系列 生化危机系列 刺客信条3、4 (大革命不清楚可不可以) 战地3、4、硬仗 蝙蝠侠阿卡姆系列 极品飞车系列 cod系列 (好像最高能支持12) 火影忍者: 究极忍者风暴 狗1丁丁历险记 (墙裂推荐) 孤岛惊魂3、4孤岛危机3 (不过手柄操作很不舒服,外星人基本只能苟或者开厚皮以老拳挥之) 老滚5尘埃黑魂2 (不清楚3能不能玩) 心灵杀手 (Alan wake) 这个大赞!黑道圣徒死或生忍龙阁门禁锁47 (强烈推荐5) 漫威英雄大战卡普空睡犬 (热血无赖) 古墓丽影9、10ff系列 (好像最高到雷霆归来) 狙击手光环系列 作者: Leo唉趣稀 链接: https://www.zhihu.com/question/299721178/answer/516954491 来源: 知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021-02-10 · 1 min · 46 words · -

gdb

“gdb” GDB是什么 GDB 全称"GNU symbolic debugger",从名称上不难看出,它诞生于 GNU 计划 (同时诞生的还有 GCC、Emacs 等) ,是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。 Windows 操作系统中,人们更习惯使用一些已经集成好的开发环境 (IDE) ,如 VS、VC、Dev-C++ 等,它们的内部已经嵌套了相应的调试器。 GDB的吉祥物: 弓箭鱼 图 1 GDB 的吉祥物: 弓箭鱼 总的来说,借助 GDB 调试器可以实现以下几个功能: 程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量; 可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态 (例如当前变量的值,函数的执行结果等) ,即支持断点调试; 程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误。 GDB (GNU Debugger) 是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。 对于C程序来说,需要在编译时加上-g参数,保留调试信息,否则不能使用GDB进行调试。 但如果不是自己编译的程序,并不知道是否带有-g参数,如何判断一个文件是否带有调试信息呢? gdb 文件 例如: $ gdb helloworld Reading symbols from helloWorld…(no debugging symbols found)…done. 如果没有调试信息,会提示no debugging symbols found。 如果是下面的提示: ...

2021-01-06 · 1 min · 124 words · -

rust basic

“rust basic” Rust 是一种 预编译静态类型(ahead-of-time compiled)语言 Rustup Rust 的工具链管理器 Rustup 是一个命令行应用,能够下载并在不同版本的 Rust 工具链中进行切换 —— 如编译器 rustc 和标准库,该应用所支持的平台数量不少。事实上,rustc 本身就支持大约 56 个平台,而 rustup 实际上能够为其中14个平台管理编译器,为30个平台管理标准库。 Rust 1.8 中引入的 Rustup,是一个针对 Rust 语言的工具链管理器(toolchain manager),其目标是让交叉编译 Rust 代码更加简单。Mozilla 工程师 Brian Anderson 近期与我们分享了关于此的更多细节。 此外,rustup 能够追踪工具链的具体版本,包括 Rust 的 nightly 版本、beta 版本和发行版本。举个例子,你可以用 rustup 检查程序在下一个 Rust 发行版下的行为。但是之前,你需要安装当前平台下的 Rust beta 版本的工具链,然后利用该工具链运行单元测试。使用 rustup 之后,可以通过执行类似下面的代码完成: $ rustup install beta $ rustup run beta cargo test 再举一个例子,Anderson 介绍了如何使用 rustup 为使用 musl 标准库(而非大家常用的glibc标准库)的 Linux 版本创建静态二进制文件: $ rustup target add x86_64-unknown-linux-musl $ cargo run –target=x86_64-unknown-linux-musl Features 管理安装多个官方版本的 Rust 二进制程序。 配置基于目录的 Rust 工具链。 安装和更新来自 Rust 的发布通道: nightly, beta 和 stable。 接收来自发布通道更新的通知。 从官方安装历史版本的 nightly 工具链。 通过指定 stable 版本来安装。 安装额外的 std 用于交叉编译。 安装自定义的工具链。 独立每个安装的 Cargo metadata。 校验下载的 hash 值。 校验签名 (如果 GPG 存在)。 断点续传。 只依赖 bash, curl 和常见 unix 工具。 支持 Linux, OS X, Windows(via MSYS2)。 cmd rustup -h 使用 rust help 来查看子命令的帮助。 rustup doc –book 会打开英文版的 The Rust Programming Language。 ...

2021-01-01 · 2 min · 277 words · -

ECMAScript, javascript basic

ECMAScript, javascript basic, js basic https://juejin.cn/post/7103511045062590500 JavaScript 是一种轻量级脚本语言, 它本身不提供 I/O 相关的 API, I/O 操作需要宿主环境提供, <!DOCTYPE html> <html> <head> <script src="foo.js"></script> <script type="text/javascript"> console.log('javascript0') var myVar = "hello"; function showAlert() { alert('You triggered an alert!'); } </script> </head> <body> body0 <button> </body> </html> 模板字面量, 多行字符串 let learnCoding = `How to start learning web development? - Learn HTML - Learn CSS - Learn JavaScript Use freeCodeCamp to learn all the above and much, much more ! ` console.log(learnCoding); // 输出 // How to start learning web development? // - Learn HTML // - Learn CSS // - Learn JavaScript // Use freeCodeCamp to learn all the above and much, much more ! 数组 JavaScript 数组是可调整大小的,并且可以包含不同的数据类型。 ...

2020-12-03 · 2 min · 231 words · -

照片管理

“照片管理” golang + vue https://github.com/photoprism/photoprism

2020-12-02 · 1 min · 5 words · -

tcp sack

“tcp sack” https://blog.csdn.net/wdscq1234/article/details/52503315 TCP-IP详解: SACK选项 (Selective Acknowledgment) 引入理由 在文章TCP-IP详解: 超时重传机制中,有介绍到快速重传和超时重传都会面临到一个重传什么包的问题,因为发送端也不清楚丢失包后面传送的数据是否有成功的送到。主要原因还是对于TCP的确认系统,不是特别的好处理这种不连续确认的状况了,只有低于ACK number的片段都被收到才有进行ACK,out-of-order的片段只能是等待,同时,这个时间窗口是无法向右移动的。 举个例子: 服务发送4个片段给客户端,seg1(seq=1,len=80),seg2(seq=81,len=120), seg3(seq=201,len=160),seg4(seq=361,len=140) 服务器收到seg1和seg2的ACK = 201,所以此时seg1 seg2变成发送并已经确认范畴的数据包,被移除滑动窗口,此时服务器又可以多发80+120 byte数据 假设seg3由于某些原因丢失,这个时候服务器仍然可以像客户端发送数据,但是服务器会等待seg3的ACK,否则窗口无法滑动,卡主了 seg3丢失了,即使后面的seg4收到了,客户端也无法告知服务器已经收到了seg4,试想一下,如果窗口也够大,服务器可以继续持续发送更多的片段,那么这些片段被客户端接收,只能存放到队列中,无法进行确认 正式因为后续OUT-OF-ORDER的报文段的发送状况也不清楚,所以Server也不是特别清楚要如何去处理这种状况,不过一般来说只能有2中状况: 只重传超时的数据包,这种方法是最常想到的,比较实用与后面的数据包都能够正常接收的状况,只重传超时的数据包,但是如果比较坏的情况下,丢失了很多封包呢? 那就需要一个一个的等待超时了,很浪费时间。 重传这个片段以及之后的所有包,这种方法在最坏的状况下,看起来效率还是挺高的,但是如果只有一个包丢失,就去重传后面所有接受到的包,流量浪费也是很严重的。 总之对于上面阐述的问题,没有想到一个好的思路来解。但是RFC2018提供了一个SACK的方法,有效的解决这个问题 SACK(Selective Acknowledgment) SACK是一个TCP的选项,来允许TCP单独确认非连续的片段,用于告知真正丢失的包,只重传丢失的片段。要使用SACK,2个设备必须同时支持SACK才可以,建立连接的时候需要使用SACK Permitted的option,如果允许,后续的传输过程中TCP segment中的可以携带SACK option,这个option内容包含一系列的非连续的没有确认的数据的seq range,这些 SYN包中SACK Permitted 选项,双方都支持才对 SACK option格式 Kind 5 Length 剩下的都是没有确认的segment的range了 比如说segment 501-600 没有被确认,那么Left Edge of 1st Block = 501,Right Edge of 1st Block = 600,TCP的选项不能超过40个字节,所以边界不能超过4组。 可以看下实际的tcpdump抓包中的SACK option,如下图,使用tcp.option.sack进行过滤,可以看到这个SACK option只有一个片段,接收并没有进行确认,范围是18761~20101 再来将上面的例子 客户端收到seg4的时候,发送seg3的ACK 会产生一个SACK的option (361~500) ,Server收到这个ACK后,就知道seg3丢失了,但是seg4已经收到了但是并没有确认,所以就只会重传seg3 SACK的产生,RFC2018 SACK通常是由数据接收方产生,如果在connection建立的时候,SYN包中有SACK-Permitted 的选项为true,同时自身也支持SACK,那么可以在接收异常的时候,产生SACK option. 如果要发送,SACK中需要携带接收队列中所有没有被确认的数据段信息。 ...

2020-11-07 · 1 min · 104 words · -

tcp window scaling, 滑动窗口

“tcp window scaling, 滑动窗口” TCP 滑动窗口 与窗口缩放因子(Window Scaling) 说道TCP滑动窗口协议,相信大家都很熟悉,但是说道 Window Scaling参数或许知道的和用过的人却不多,本文我们来谈谈Window Scaling的由来 TCP滑动窗口 众所周知, TCP是一种面向连接可靠消息传输协议;为了保证可靠,连接的两端保持对所有传输数据的严格跟踪,以便在需要时候进行重传或重新排序。另外为了跟踪已经发送了的数据在发送端有TCP发送缓存,在接受端有接受缓存,滑动窗口则是这个缓存的一部分,接收方接受数据后会把ack和当前滑动窗口可用空间告诉发送方,发送方则发送的数据不能超过接收方剩余窗口大小,如果接收方窗口内数据还没来得及由应用程序读取,窗口满了,则发送方会停止发送数据,直到接收方滑动窗口有空间。 假设我们有两个主机A和B,它们建立了一个TCP连接。在连接开始时 (握手时候协商) ,两个主机为传入数据分配32 KB的缓冲区空间,因此每个主机的初始窗口大小为32,768。 image.png 主机A需要向主机B发送数据,一开始则主机B告诉主机A在接受自己确认之前最多可以发送32,768字节的数据 (以最大段大小或MSS的间隔) 。假设MSS为1460字节,主机A可以在耗尽主机B的接收窗口之前发送22个段。 当确认收到主机A发送的数据时,主机B可以调整其窗口大小。例如,如果上层应用程序仅处理了一半缓冲区,则主机B会将其窗口大小降低到16 KB (这时候主机A在接受到B的确认前最多发送16KB数据到B) 。如果缓冲区仍然完全填满,主机B会将其窗口大小设置为零,表明它还不能接受更多数据,这时候主机A则停止发送数据。 image.png 在具有高带宽和极低延迟的LAN上,滑动窗口很少会满。但是,在高带宽,高延迟网络上,会出现一个有趣的现象: 在发送方接受到接收方发出确认之前,并不能最大化利用带宽。 例如,假设在通过专用10 Mbps路径连接的两台主机之间建立TCP连接,单向延迟为80ms。两个主机都约定最大窗口大小为65,535字节 (16位无符号整数的最大值) 。我们可以计算在一个时间点在一个方向上传输的潜在数据量,带宽*延迟: 10,000,000 bps除以每字节8位,乘以0.08秒等于100,000字节。 换句话说,如果主机A开始连续发送给主机B,它将在主机B接收到发送的第一个字节之前发送100,000个字节。但是由于约定的最大接收窗口只有65,535字节,所以主机A必须在发送65,535字节后停止发送,并等待来自主机B的确认。 (为简单起见,我们的示例计算不考虑TCP和低层报头。) 这种延迟浪费了潜在的吞吐量,不必要地增加了通过网络可靠传输数据所需的时间。创建TCP窗口缩放以解决此问题。 三、窗口缩放因子 窗口缩放在RFC 1072中引入并在RFC 1323中进行了改进。实际上,窗口缩放只是将16位窗口字段扩展为32位长度。解决方案是定义TCP选项以指定计数,通过该计数,TCP标头字段应按位移位以产生更大的值。 image.png 如上图 window size设置为5840字节,但是窗口缩放因子为7 (window scale) ,也就是这时候最大实际窗口为 5840*128。window scale为1将字段的二进制值向左移位一位,使其加倍。计数为2将值向左移动两位,使其翻倍。计数为7 (如上例所示) 将该值乘以128. image.png 窗口缩放选项 (window scaling) 可以在tcp握手时候在SYN分组中的连接期间仅发送一次。可以通过修改TCP标头中的窗口字段的值来动态调整窗口大小,但是在TCP连接的持续时间内,标度乘数保持静态。仅当两端都包含选项时,缩放才有效;如果只有连接的一端支持窗口缩放,则不会在任一方向上启用它。最大有效比例值为14 (RFC 1323的2.3节为有兴趣的人提供了一些背景信息) 。 回顾我们之前的示例,我们可以观察窗口缩放如何使我们能够更有效地进行网络传输 (最大化利用网络带宽) 。为了计算我们的理想窗口,我们将端到端延迟加倍以找到往返时间,并将其乘以可用带宽: 2 * 0.08秒* 10,000,000 bps / 8 = 200,000字节。为了支持这种大小的窗口,主机B可以将其窗口大小设置为3,125,其window scaling因子为6 (3,125左移6乘以200,000) 。幸运的是,这些计算都是由现代TCP / IP堆栈实现自动处理,无须应用程序层面干预。 ...

2020-11-07 · 1 min · 90 words · -

tcp dump, wireshark

“tcp dump, wireshark” TCP segment of a reassembled PDU 关于"TCP segment of a reassembled PDU" 标签: TCP segment of a reaPDUreassembled PDU http://blog.csdn.net/dog250/article/details/51809566 版权声明: 本文为博主原创,无版权,未经博主允许可以随意转载,无需注明出处,随意修改或保持可作为原创! 为什么大家看到这个以后总是会往MSS,TSO上联系呢?也许第一个解释这个的人是个高手,而且以MSS/MTU/TSO的观点解释了这个问题,还有一种可能就是TSO等技术让人觉得太牛逼,毕竟是底层硬件机制吧,抓包机制又是作用于网卡层面的,所以很自然会觉得TSO会有关联。 事实上,这个跟TSO没有关系!跟MSS有一定的关系但不是全部因果关系,在阐述"TCP segment of a reassembled PDU"之前,先把TSO理清再说。当有人问题"这个包会不会被TSO分段"这类问题时,只要看该TCP数据包的长度,拿它跟MTU比较,如果数据长度更长,则就是TSO。 那么,“TCP segment of a reassembled PDU"究竟是什么呢?答案是,这要向上看,这个跟应用层有关,而与底层关系不大!我用Wireshark的抓包例子来解释这个问题。首先看一个抓包,我们以网络测试工具baidu为例,抓取一个访问其服务器https://14.215.177.38/的一个HTTPS连接的包: 网上很多人在解释这个"TCP segment of a reassembled PDU"的时候(基本都是转载),都说什么"ACK了同一笔数据就会是reassembled PDU”,“同一个GET请求的response"云云…但是很显然,上述我抓包的截图中,402到405号包都有ACK了同一个序列号,但是为什么只有一个"TCP segment of a reassembled PDU"呢??在没有标识reassembled PDU的数据包中,另外标识了TLSv1.2的协议原语。此时,我来做一个动作,按下"Ctrl-Shift-E"组合键,事实上就是点击"分析"菜单,进入"已启用的协议"界面: 反选SSL协议,不再识别SSL协议之后,我们再看402到405号数据包: 没有了"TCP segment of a reassembled PDU"这些,除了没有这些"修饰语"之外,其它的协议层面的数据完全和之前识别SSL协议的时候相符合。我们的结论是,关掉了对SSL协议的识别,就没有了reassembled PDU的修饰,这恰恰是因为SSL协议让Wireshark知道403号包是一个reassembled PDU!如果你不知道这是个SSL协议,你就无法判断出这是不是一个reassembled PDU! 是的,这就是原因。接下来,为什么SSL协议就能识别这是一个reassembled PDU呢?这就要看你对SSL协议是否理解了,起码我是懂的,在握手阶段,Server Hello和Server的Certificate是背靠背发送的,也就是说它们是连着发给Client的,一个Server Hello,外加一个证书,一起发给Client,接下来就是不那么根本但很显然的事情了,如果这些包的总和足够小或者链路的MTU足够大,能够一次性发送过去的话,那当然好,如果不能,很显然要拆成几个分段发送了,如果中间的那个分段不能被SSL协议的原语识别,那么就会被标识成reassembled PDU,这就是为什么404,405号数据包都是连续发送的,但是却未被识别为reassembled PDU,因为SSL协议知道它们是Certificate消息和Server Key Exchange消息。 现在明白了吗?我特意没有用HTTP协议去解释这个而是选择了用SSL协议,目的就是想让大家明白,并不是针对同一个GET请求的同一笔回应会被标识为reassembled PDU!而是完全靠着应用层协议原语来识别协议消息。如果你的Wireshark被配置成不识别任何协议,比如不识别HTTP协议,SSL协议,那也就不会出现reassembled PDU了,因为Wireshark不知道到底是不是!实际上Wireshark支持你去自定义你自己的协议插件,你可以试一下,自己开发一个简单的协议,就算你的TCP数据段总和没有超过一个MSS,比如你的socket每发100字节就sleep 10秒,并且TCP socket没有设置Nagle算法,那么虽然每个段只有100字节,远没有到一个MSS,也会有reassembled PDU的标识! ...

2020-11-06 · 1 min · 195 words · -

IO同步函数: sync, fsync, fdatasync

IO同步函数: sync、fsync、fdatasync 传统的UNIX或LINUX系统实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当空闲内存不足内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写 (delayed write) 。 当调用 write() 函数写出数据时,数据一旦写到该缓冲区 (仅仅是写到缓冲区) ,函数便马上返回。此时写出的数据能够用read()读回,也能够被其它进程读到,可是并不意味着它们已经被写到了外部永久存储介质上。即使调用close()关闭文件后也可能如此,由于缓冲区的数据可能还在等待输出。因此。从数据被实际写到磁盘的角度来看。用write()写出的文件数据与外部存储设备并非全然同步的。不同步的时间间隔非常短,一般仅仅有几秒或十几秒,详细取决于写出的数据量和I/O数据缓冲区的状态。虽然不同步的时间间隔非常短,可是假设在此期间发生掉电或者系统崩溃,则会导致所写数据来不及写至磁盘而丢失的情况。 注意: 内核将缓冲区中的数据"写"到标准输入磁盘文件里,这里"写"不是将缓冲区中的数据移动到磁盘文件里,而是复制到磁盘文件里,也就说此时缓冲区内容还没有被清除。做出这一设计也是有其道理的,假设写出到磁盘文件上,磁盘坏了或满了等等,总之就是无法将数据送出,假如缓冲区内容被清除,那数据就丢掉了。也就是说内核会等待写入磁盘动作完毕后,才放心的将缓冲区的数据删除掉。 延迟写减少了磁盘写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了 sync、fsync 和 fdatasync 三个函数: sync sync 函数只是将所有修改过的块缓冲区加入写队列,然后就返回,它并不等待实际写磁盘操作结束。所以不要觉得调用了sync 函数,就觉得数据已安全的送到磁盘文件上,有可能会出现故障,可是 sync 函数是无法得知的.通常称为 update 的系统守护进程会周期性地 (一般每隔30秒) 调用 sync 函数。这就保证了定期冲洗内核的块缓冲区。命令 sync(1) 也调用 sync 函数。sync是全局的,对整个系统都 flush。 fsync fsync 函数只针对单个文件,只对由文件描述符 filedes 指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync 不仅会同步更新文件数据,还会同步更新文件的属性 (比如 atime,mtime 等) 。fsync 可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。 fdatasync fdatasync 当初设计是考虑到有特殊的时候一些基本的元数据比如 atime,mtime 这些不会对以后读取造成不一致性,因此少了这些元数据的同步可能会在性能上有提升。该函数类似于 fsync,但它只影响文件的数据部分, 如果该写操作并不影响读取刚写入的数据,则不需等待文件属性被更新。 对于提供事务支持的数据库,在事务提交时,都要确保事务日志 (包含该事务所有的修改操作以及一个提交记录) 完全写到硬盘上,才认定事务提交成功并返回给应用层。 一个简单的问题: 在*nix操作系统上,怎样保证对文件的更新内容成功持久化到硬盘? write不够,需要 fsync 一般情况下,对硬盘 (或者其他持久存储设备) 文件的write操作,更新的只是内存中的页缓存 (page cache) ,而脏页面不会立即更新到硬盘中,而是由操作系统统一调度,如由专门的 flusher 内核线程在满足一定条件时 (如一定时间间隔、内存中的脏页达到一定比例) 内将脏页面同步到硬盘上 (放入设备的IO请求队列) 。 因为 write 调用不会等到硬盘IO完成之后才返回,因此如果OS在write调用之后、硬盘同步之前崩溃,则数据可能丢失。虽然这样的时间窗口很小,但是对于需要保证事务的持久化 (durability) 和一致性 (consistency) 的数据库程序来说,write()所提供的"松散的异步语义"是不够的,通常需要OS提供的同步IO (synchronized-IO) 原语来保证: include <unistd.h> int fsync(int fd); fsync的功能是确保文件fd所有已修改的内容已经正确同步到硬盘上,该调用会阻塞等待直到设备报告IO完成。 ...

2020-11-02 · 3 min · 486 words · -

flex

“flex” Flex 布局 网页布局 (layout) 是 CSS 的一个重点应用。 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案—-Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

2020-10-31 · 1 min · 19 words · -

调度器

“调度器” Linux Kernel调度器的过去,现在和未来 https://my.oschina.net/u/4585157/blog/4672238 调度器简介,以及Linux的调度策略 进程是操作系统虚拟出来的概念,用来组织计算机中的任务。但随着进程被赋予越来越多的任务,进程好像有了真实的生命,它从诞生就随着CPU时间执行,直到最终消失。不过,进程的生命都得到了操作系统内核的关照。就好像疲于照顾几个孩子的母亲内核必须做出决定,如何在进程间分配有限的计算资源,最终让用户获得最佳的使用体验。内核中安排进程执行的模块称为调度器 (scheduler) 。这里将介绍调度器的工作方式。 进程状态 调度器可以切换进程状态 (process state) 。一个Linux进程从被创建到死亡,可能会经过很多种状态,比如执行、暂停、可中断睡眠、不可中断睡眠、退出等。我们可以把Linux下繁多的进程状态,归纳为三种基本状态。 就绪 (Ready) : 进程已经获得了CPU以外的所有必要资源,如进程空间、网络连接等。就绪状态下的进程等到CPU,便可立即执行。 执行 (Running) : 进程获得CPU,执行程序。 阻塞 (Blocked) : 当进程由于等待某个事件而无法执行时,便放弃CPU,处于阻塞状态。 进程创建后,就自动变成了就绪状态。如果内核把CPU时间分配给该进程,那么进程就从就绪状态变成了执行状态。在执行状态下,进程执行指令,最为活跃。正在执行的进程可以主动进入阻塞状态,比如这个进程需要将一部分硬盘中的数据读取到内存中。在这段读取时间里,进程不需要使用CPU,可以主动进入阻塞状态,让出CPU。当读取结束时,计算机硬件发出信号,进程再从阻塞状态恢复为就绪状态。进程也可以被迫进入阻塞状态,比如接收到SIGSTOP信号。 调度器是CPU时间的管理员。Linux调度器需要负责做两件事: 一件事是选择某些就绪的进程来执行;另一件事是打断某些执行中的进程,让它们变回就绪状态。不过,并不是所有的调度器都有第二个功能。有的调度器的状态切换是单向的,只能让就绪进程变成执行状态,不能把正在执行中的进程变回就绪状态。支持双向状态切换的调度器被称为抢占式 (pre-emptive) 调度器。 调度器在让一个进程变回就绪时,就会立即让另一个就绪的进程开始执行。多个进程接替使用CPU,从而最大效率地利用CPU时间。当然,如果执行中进程主动进入阻塞状态,那么调度器也会选择另一个就绪进程来消费CPU时间。所谓的上下文切换 (context switch) 就是指进程在CPU中切换执行的过程。内核承担了上下文切换的任务,负责储存和重建进程被切换掉之前的CPU状态,从而让进程感觉不到自己的执行被中断。应用程序的开发者在编写计算机程序时,就不用专门写代码处理上下文切换了。 进程的优先级 调度器分配CPU时间的基本依据,就是进程的优先级。根据程序任务性质的不同,程序可以有不同的执行优先级。根据优先级特点,我们可以把进程分为两种类别。 实时进程 (Real-Time Process) : 优先级高、需要尽快被执行的进程。它们一定不能被普通进程所阻挡,例如视频播放、各种监测系统。 普通进程 (Normal Process) : 优先级低、更长执行时间的进程。例如文本编译器、批处理一段文档、图形渲染。 普通进程根据行为的不同,还可以被分成互动进程 (interactive process) 和批处理进程 (batch process) 。互动进程的例子有图形界面,它们可能处在长时间的等待状态,例如等待用户的输入。一旦特定事件发生,互动进程需要尽快被激活。一般来说,图形界面的反应时间是50到100毫秒。批处理进程没有与用户交互的,往往在后台被默默地执行。 实时进程由Linux操作系统创造,普通用户只能创建普通进程。两种进程的优先级不同,实时进程的优先级永远高于普通进程。进程的优先级是一个0到139的整数。数字越小,优先级越高。其中,优先级0到99留给实时进程,100到139留给普通进程。 一个普通进程的默认优先级是120。我们可以用命令nice来修改一个进程的默认优先级。例如有一个可执行程序叫app,执行命令: $nice -n -20 ./app 命令中的-20指的是从默认优先级上减去20。通过这个命令执行app程序,内核会将app进程的默认优先级设置成100,也就是普通进程的最高优先级。命令中的-20可以被换成-20至19中任何一个整数,包括-20 和 19。默认优先级将会变成执行时的静态优先级 (static priority) 。调度器最终使用的优先级根据的是进程的动态优先级: 动态优先级 = 静态优先级 – Bonus + 5 ...

2020-10-21 · 4 min · 704 words · -

win10外接显示器频繁休眠

“win10外接显示器频繁休眠” win10外接显示器频繁休眠 https://blog.csdn.net/YHFZXF/article/details/103408021 参考链接https://baijiahao.baidu.com/s?id=1620654112845897421&wfr=spider&for=pc 最近笔记本外接显示器总是频繁休眠,网上找了很多方法都不管用,按照这个方法设置后好像有效果,为了以后方便自己忘记怎么设置了,就把链接中的方法备份到博客。 一、查看睡眠超时设置 进入"Windows设置 - 系统 - 电源和睡眠"查看,发现"电脑在经过以下时间后进入睡眠状态"设置即使是在使用电池时也长达30分钟的,更不用说插电时是 1 小时了。如图: 所以进入睡眠状态的超时设置是没有问题的。 二、更新/重装显卡驱动 打开设备管理器,打开显卡属性窗口,切换到"驱动程序"选项卡。如图: 但是无论是"更新驱动程序",还是"卸载设备"后重装安装显卡驱动 (甚至借助DDU彻底卸载了显卡驱动,并且尝试了多个版本的显卡驱动) ,结果问题依旧。 三、排除"屏幕保护程序"制造的假象 使用Win10任务栏搜索功能搜索"屏幕保护程序"打开"屏幕保护程序设置"窗口。如图: 因为如果"屏幕保护程序"等待时间设置过短,屏幕保护程序设置为"无",并且勾选了"在恢复时显示登录屏幕"的话。一旦Win10电脑闲置超时,就会触发屏幕保护程序,但又因为并没有设置屏保,所以会屏幕一闪直接进入系统登录界面,从而给人一种进入睡眠又旋即被唤醒的错觉。 四、问题根源在"无人参与系统睡眠超时"设置 在排除以上原因后,最终找到了问题的根源是在Windows电源选项的一个隐藏设置项"无人参与系统睡眠超时"上。 之所以说它是隐藏设置项,是因为需要修改注册表才能使该设置项显示出来。方法如下: 打开注册表编辑器,定位至: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\238C9FA8-0AAD-41ED-83F4-97BE242C8F20\7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 PS: 如何快速定位至注册表中某项鉴于修改注册表有风险,所以建议修改前备份注册表 (备份注册表的方法) ,或者创建系统还原点,以便出现问题时恢复。 在右侧窗格找到名为 Attributes 的 DWORD 值,双击该值打开编辑窗口。如图: 把数值数据由默认值 1 修改为 2 ,确定。 然后还进入"Windows设置 - 系统 - 电源和睡眠",点击"相关设置"下的"其他电源设置",这时会打开"控制面板\硬件和声音\电源选项"。如图: 点击当前电源计划右侧的"更改计划设置",会跳转到"控制面板\硬件和声音\电源选项\编辑计划设置"界面。如图: 点击"更改高级电源设置"即可打开"电源选项 - 高级设置"窗口。如图: 点击 + 号展开"睡眠",即可看到"无人参与系统睡眠超时"设置项,默认正是 2 分钟,由此可见,问题的根源就是在这里。 把它修改为一个较大的数值,起码不小于你在"Windows设置 - 系统 - 电源和睡眠"设置的睡眠超时时间即可。 至此问题解决!

2020-10-21 · 1 min · 61 words · -

typescript basic

“typescript basic” number <> string let n = Number('1234') String(page_number); 遍历Array 方法一,for…of 这个貌似是最常用的方法,angular 2中HTML语法绑定也是要的这种语法。 let someArray = [1, "string", false]; for (let entry of someArray) { console.log(entry); // 1, "string", false } 方法二,for循环 for循环其实是标准的C风格语法。 let someArray = [1, "string", false]; for (var i = 0; i < someArray.length; i ++) { console.log(someArray[i]); // 1, "string", false } 方法三, for…in 官方文档上强调了for…in和for…of的区别: let list = [4, 5, 6]; for (let i in list) { console.log(i); // "0", "1", "2", } for (let i of list) { console.log(i); // "4", "5", "6" } 方法三,forEach forEach其实是JavaScript的循环语法,TypeScript作为JavaScript的语法超集,当然默认也是支持的。 ...

2020-10-19 · 1 min · 175 words · -

光圈

“光圈” 「小光圈」(像f/11、f/16、f/22等),会造成以下的效果: 1.减少光线进入相机,这时就可以用较慢的快门时间,比如拍摄流水、车轨、星轨、光影涂鸦等都需要相对时间长的曝光; 2.让点光源变成散射状,即产生明显的星芒效果; 3.大景深效果,对焦主体以外的背景或前景都可以保持清晰。 大光圈(像f/1.4、f/1.8、f/2.8等等),会有以下效果: 1.在快门时间相同的情况下,光圈越大会使越多光线进入相机,从而令曝光增加,相片变亮,尤其是在光线比较暗的情况下大光圈很有用; 2.景深变浅: 这是大光圈一个很有用的用处-制造浅景深,让焦点中主体从虚化的背景中突显出来;

2020-10-18 · 1 min · 9 words · -

piano basic

piano basic 连奏(Legato) 钢琴练习中什么是连奏? 连奏(Legato),也称连音,是音与音相衔接时,既没有一点空隙,也不互相重叠。因此,至少要有两个音依次出现,才有连奏的问题。 在乐谱上,用连线记号将需要连奏的音置于一个弧线之内。有的乐谱不画连线,只标上Legato。应当指出,相当多的乐谱或是没画上该画的连线,或是连线的位置、长短不准、不妥,这是初学者要注意的。 连奏,还有心理感受上的意义。要在感觉上连绵不断,仿佛后一个音就是从前一个音生长出来的,音音之间,“血脉”相连。 钢琴上两个相同的音如何连奏? 依据钢琴的发音原理,不用踏板时,两个相同的音事实上是连不起来的。有的乐曲,因为风格或音乐片断结构的关系,又不允许使用踏板,怎么办? (1)在意念里,想象中要把两个同音连起来。这种感觉和愿望会使弹奏者想方设法调整动作,弥补两个音的隔断。 (2)弹两个同音时,无论换指或不换指,都要手指几乎不离键,用柔软的腕部小幅度的上下动作带动手指(手指几乎不动)的方法弹出两个同音。 用这两个办法,就可以使事实上连不起来的两个同音,给人以连起来的感觉。 钢琴弹奏连音的基本要领是什么? (1)听觉要精细地监督,确实听清了两个音没有一丝缝隙、没有一毫重叠。这就要求后一个音弹下时.前一个音的手指要准时(不早也不晚)地离键。离键动作无须幅度很大,但却不可缺少。这一点必须给予一定的注意。 (2)连奏中,要运用重量转移的方法。通常,连奏的第一个音都是用“提起手、落下去”的方法弹出的。弹第二个音时,则要把第一个音“落下”时手指承受的重 量感,转移到第二个音上来。这个转移不是再落一次,而是通过弹第二个音的手指主动触键实现的。如果是两个音的连奏,这个过程已经完成,可把手提起来。如果 是若干个音的连奏,就依次逐个转移下去,直至连线的最后一音再提起手。 (3)所以,从整体综合动作看,无论连线多么短多么长,都是手部“落下——被提起”的一个过程。有时,数十上百的快速音符在一个连线之内,也要感觉到是在 第一个音上落下去,最后一音上抬起手的一个综合、整体动作,就好象是被串起来的一串珠子,提起第一个就能带出一串来一样。 Tempo Tempo 速度意大利文时间的意思,泛指乐曲演奏时的速度,常见的有:Largo(宽广的),Adagio(缓慢的),Moderato(中庸速度, 90 - 115 bpm),Andante(行板, 90 - 115 bpm),Allegro(欢乐的快板)和Presto(非常快)。 高音谱号 𝄞 高单谱号的位置是固定的, 高音谱号起点圆圈围绕第2线 https://zh.wikipedia.org/zh-cn/%E8%AD%9C%E8%99%9F 拍号 分子表示每小节中单位拍的数目,分母表示单位拍的音符时值,例如 3/4 拍即是以四分音符作为一拍的基准单位,且一个小节之内共有三拍。 表示3个4分音符 , 拍号的读法应该是拍数在前,单位在后, 按照语序读就是 三四拍 https://peking.bjd.com.cn/content/s65082f88e4b021d199f1f76b.html 音 物理现象 音乐: 指任何以声音组成的艺术 乐音 : 发音物体有规律地振动而产生的具有固定音高的音称乐音。 噪音 鼓: 噪音乐器 调式: 贝多芬 至爱丽丝 巴洛克时代 古典时代 woO : works out opus

2020-10-08 · 1 min · 65 words · -

RV basic, 房车, 拖挂房车

RV basic, 房车, 拖挂房车 https://campaddict.com/dispersed-camping/ Dispersed camping is camping in a national forest OUTSIDE of any improved campground or recreational area. Dry camping is simply camping without being hooked up to any utilities. Boondocking is camping in a remote location. It is always dry camping. 拖挂 hobby 大驰 森林河 后车的最大质量不能超过前车的整备质量 Hobby http://www.hobbyrv.com/c/ONTOUR.html 大驰 https://www.dachirv.com/h-pd-53.html

2020-10-08 · 1 min · 54 words · -

html basic

html basic button <button name="button0">button0</button> HTML Formatting Elements <b> - Bold text <strong> - Important text <i> - Italic text <em> - Emphasized text <mark> - Marked text <small> - Smaller text <del> - Deleted text <ins> - Inserted text <sub> - Subscript text <sup> - Superscript text - line break node type ELEMENT_NODE (元素节点):值为 1 ATTRIBUTE_NODE (属性节点):值为 2 TEXT_NODE (文本节点):值为 3 CDATA_SECTION_NODE (CDATA区段节点):值为 4 ENTITY_REFERENCE_NODE (实体引用节点):值为 5 (在HTML中不常见) ENTITY_NODE (实体节点):值为 6 (在HTML中不常见) PROCESSING_INSTRUCTION_NODE (处理指令节点):值为 7 COMMENT_NODE (注释节点):值为 8 DOCUMENT_NODE (文档节点):值为 9 DOCUMENT_TYPE_NODE (文档类型节点):值为 10 DOCUMENT_FRAGMENT_NODE (文档片段节点):值为 11 NOTATION_NODE (符号节点):值为 12 (在HTML中不常见)

2020-09-29 · 1 min · 92 words · -

promise

“promise” ECMAscript 6 原生提供了 Promise 对象。 Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。 Promise 对象有以下两个特点: 对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态: pending: 初始状态,不是成功或失败状态。 fulfilled: 意味着操作成功完成。 rejected: 意味着操作失败。 只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能: 从 Pending 变为 Resolved 和从 Pending 变为 Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件 (Event) 完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。 Promise 优缺点 有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。 Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段 (刚刚开始还是即将完成) 。 https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544 https://www.runoob.com/w3cnote/javascript-promise-object.html <!DOCTYPE html> <html> <head> <script type="text/javascript"> console.log('javascript0') function resolve(str) { console.log('resolve.' + str) } function reject(str) { console.log('reject.' + str) } function fun0() { console.log('fun0 start') //test(resolve, reject) new Promise(test).then(function (result) { console.log('成功: ' + result); }, function (result) { console.log('成功1: ' + result); }).catch(function (reason) { console.log('失败: ' + reason); }); } function log(str) { console.log(str) } function callback() { console.log('Done'); } function test(resolveParams, rejectParams) { var timeOut = Math.random() * 2; log('set timeout to: ' + timeOut + ' seconds.'); setTimeout(function () { if (timeOut < 1) { log('call resolve()...'); resolveParams('200 OK'); } else { log('call reject()...'); rejectParams('timeout in ' + timeOut + ' seconds.'); } }, timeOut * 1000); } </script> </head> <body> body0 <button name="btn0" onclick="fun0()">button0</button> </body> </html> https://www.cnkirito.moe/future-and-promise/

2020-09-29 · 1 min · 174 words · -

n1 coreelec

“n1 coreelec” 从官网下载最新版本的coreelec, CoreELEC-Amlogic.arm-9.2.4.2-Generic.img.gz https://coreelec.org/ 用7z 解压 CoreELEC-Amlogic.arm-9.2.4.2-Generic.img.gz, 得到 CoreELEC-Amlogic.arm-9.2.4.2-Generic.img 用Win32DiskImager.exe将CoreELEC-Amlogic.arm-9.2.4.2-Generic.img写入U盘 替换文件 运行N1降级工具,选择3 进入线刷模式 在提示插入usb线时,插入u盘 , 进入 U盘上的 coreelec系统, 开启ssh支持 ssh 登录 coreelec, 执行以下命令将coreelec写入emmc /flash/installtoemmc

2020-09-11 · 1 min · 25 words · -

windows install

“windows install” WoeUSB, linux 制作 windows 安装盘 WoeUSB 是一款主要用于在 Linux 下制作 Windows 启动 U 盘的开源软件 run woeusb gui woeusbgui wsl2 https://docs.microsoft.com/en-us/windows/wsl/install-win10 https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-kernel hyper v https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

2020-09-07 · 1 min · 30 words · -