hxysnail 最近的时间轴更新
hxysnail

hxysnail

V2EX 第 70743 号会员,加入于 2014-08-13 13:19:57 +08:00
hxysnail 最近回复了
ICMP 协议的链接错了,应该是: https://fasionchan.com/network/icmp/icmp/
当 IP 包发生差错时,会将该差错包的头部以及前 8 个字节附到 ICMP 包的数据部分。

之所以要附上差错包的前 8 个字节,是因为: IP 报文数据经常承载传输层的协议分组,前 8 个字节刚好是分组的头部。有了差错包的传输层分组头部,则可以进一步确定差错是访问目标主机的什么端口产生的。关于 ICMP 协议更具体的内容,可以参照这篇文章: https://fasionchan.com/network/icmp/ping/

ping 命令也是利用 ICMP 报文的回显请求和回显响应报文来探测主机的。原理可以看下这篇: https://fasionchan.com/network/icmp/ping/
134 天前
回复了 b0644170fc 创建的主题 Linux Linux 网络入门
推荐一个专栏,它从物理层开始介绍,写的非常浅显易懂,里面还有不少网络实验和网络编程例子,挺有趣的:

https://fasionchan.com/network/ethernet/physical-layer/
由于 GIL 全局锁的存在,Python 线程是没有办法利用到多核 CPU 的处理能力的。如果你的应用是计算密集型,需要充分利用多核处理器,建议开多进程。这里有篇文章可以参考一下: https://fasionchan.com/python-source/virtual-machine/gil/
161 天前
回复了 TripleZ 创建的主题 程序员 求 V 友推荐个 Hugo 主题~
之前看了一圈没有找到合适的,所以就自己做了一个,感觉还行:

https://fasionchan.com/python-source/

其实只要懂一些前端知识,都可以自己设计主题。我觉得自己设计灵活性非常高,有什么想法都可以实现,哈哈
194 天前
回复了 LeeReamond 创建的主题 Python Python 的 gil 到底解决了什么具体的问题?
GIL 目的在于保护 Python 虚拟机内部状态。举个例子,Python 很多变量空间,比如全局变量,内部是用 dict 来实现的。
变量的赋值,在 Python 内部最终是执行 STORE_NAME 字节码,这个字节码将变量的值,保存到对应的 dict 对象中。
假设这个动作底层是由字典的 dict.set(name, value)函数负责,它会非常复杂,还涉及 dict 对象扩容缩容,肯定不是线程安全的。

那怎么办呢?①dict.set(name, value)加锁;②用 GIL 保证同一时间只有一个线程在执行字节码。
Python 选择②,因为①引入的线程开销也不小。
有测试表明①虽然提升了 Python 的并行能力,但获得的性能提升非常有限,单线程下则全是消耗。

那为什么有 GIL 之后,多线程应用还需要加锁呢?
举个例子,有个全局变量 a,多个进程并发执行 a += 1 。
这个语句编译后大概会生成这样几个字节码:
1 LOAD_NAME 将变量从名字空间 dict 中取出,并保存在临时栈;
2 ADD 在临时栈中做加法操作;
3 STORE_NAME 将计算结果保存到名字空间 dict 中;
GIL 保证了线程在执行一个字节码时,其他线程不能执行,以便保护名字空间 dict 的安全性。

但这 3 个字节码之间可以任意切换,这样应用就会产生中间态。
举个例子,线程①执行 LOAD_NAME 后,切到其他线程执行,变量 a 发生了修改。
线程①恢复执行后,它临时栈中的值仍是旧的,这样就会覆盖了其他线程的写入。
因此,需要用户自行加锁,保存 a += 1 对应的这几个字节码的原子性,一次性执行,中间不能被打断。

总而言之,GIL 保证一个线程在执行字节码时,其他线程不能同时执行,目的是保护虚拟机内部状态的线程安全性;
用户自己加的锁,是为了让多条字节码成为一个原子操作,中间不会发生线程切换,目的在于保护程序逻辑的正确性,消除竞争态。

想要完全理解这个问题,需要了解 Python [内建对象] [虚拟机] [字节码] 等知识,有兴趣的话推荐看一个叫 [Python 源码剖析] 的专栏:
https://fasionchan.com/python-source/virtual-machine/gil/
221 天前
回复了 jonathanchoo 创建的主题 Python 请教一个 Python 中 for in 列表修改值的问题
这个问题需要在 Python 对象模型中找答案,Python 对象都是通过指针引用的。Python 中的变量,可以理解成一个与变量名绑定在一起的对象指针。

case1 中,临时变量 v 引用列表保存的 dict 对象,然后对 dict 对象进行修改,也就是对列表中的对象进行修改。case2 中,临时变量一开始引用列表中保存的 string 对象,但后来修改临时变量将它指向一个新对象,列表引用的对象没有任何变化。

关于 Python 对象模型,可以参考这个系列: https://fasionchan.com/python-source/object-model/overview/
个人不太喜欢这种风格,太花俏了。推荐语雀那样的风格,简单直白,符合技术人的风格。比如目前正在写的一个网络协议入门教程: https://www.yuque.com/coding-fan/network
2020-11-27 09:06:00 +08:00
回复了 AlohaV2 创建的主题 Python 《 Python 源码剖析》一书有续作么?
@fasionchan 看了你发的样章,写得确实不错,图画得超棒!赞赞赞!
关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1267 人在线   最高记录 5497   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 18:36 · PVG 02:36 · LAX 10:36 · JFK 13:36
♥ Do have faith in what you're doing.