顺路给大家科普一下 LWP 的问题(虽然现在对并发编程什么的我也不擅长,但如上所说我会学的,而且最终会变成我的技能 #parallelism
这个本来是我在某国产 JVM 书上并发实践上看到的,当然操作系统笔记上也有讲(肯定的,现在哪个操作系统不是多用户多任务... 况且,据说此书是他们应付考研用的,不过目前我不是很熟,其中很多问题 C++ 这样的并发编程程序员都能遇到,不只是操作系统层面的问题)
LWP 是 LightWeightProcess,轻量级进程的意思
对应的概念是 KLT(Kernel-Level Threads),系统级线程
In computer operating systems, a light-weight process (LWP) is a means of achieving multitasking. In the traditional meaning of the term, as used in Unix System V and Solaris, a LWP runs in user space on top of a single kernel thread and shares its address space and system resources with other LWPs within the same process. Multiple user level threads, managed by a thread library, can be placed on top of one or many LWPs - allowing multitasking to be done at the user level, which can have some performance benefits.
类似 pthread 这样的 1:1 (LWP:KLT)模式,一个 LWP 是由一个 KLT 直接映射上的,实际上现在很多内核都是这种模式,Windows NT、Linux 都是。当然 Solaris (好像曾经叫 SunOS?)这种还会提供 N:1 的混合线程(不过应该没有专门 1:N 的,N:N 的应该有,java.util.concurrent 的 FJP 应该就属于这类,对应 j.u.c 的 FixedThreadPool 固定线程到任务的),目前大家的很多 JRE 环境实例(当然包括 JDK)大概都是直接一个 Thread 映射到一个 KLT 的(比如 9012 年的 Windows
如果喜欢不妨多了解一下,我没啥本事只能说这点了(大佬们多多指教 QAQ
For applications that require separate or custom pools, a ForkJoinPool may be constructed with a given target parallelism level; by default, equal to the number of available processors. The pool attempts to maintain enough active (or available) threads by dynamically adding, suspending, or resuming internal worker threads
同时也有类似的概念 Green Threads,用户级的线程实现,它不依赖操作系统的支持(所以,DOS 上都能用,这就是说 MRI Ruby 的一些早期版本甚至可以在 MSDOS <=6.x 上用多线程的原因)开始一些 20 世纪 Sun 的 JVM 也是 Green Threads,可是这个东西就有很大弊端,比如系统资源分配、CPU 也就是执行资源分配上操作系统认不出你这个用户自己弄的线程实现,系统资源(比如文件、互斥体、Timer 们)上的东西就很难实现甚至不可能实现,所以也不是太好,当然背后由系统级线程 KLT 支持的也有自己的缺陷,就是 User-mode 和 Kernel-mode 互相切来切去更频繁,开销比较大,CLR via C# 上是有讲的
当然这些和什么用户模式、内核模式、系统资源、任务调度之间有很大关系... 所以我还是回去用 Java 抽象出来的 java.lang.Thread 好了(删除)
坏处就是 JVM 平台上同步的确是比较简单的,他们都用 Monitor 这种重量级的方法... 当然商用 JVM 实现的优化肯定要做... 早些时候(JDK 1.2 还是 1.3 之前) Java 的
JVM 平台上对开发者们素质的要求肯定是比 C#、C++ 这种低的(但是不希望大家都只会用个
这里我们不讨论 Coroutines(协程),也不讨论什么抢占式线程、非抢占式线程,也不讨论什么原子性操作... 可重入... 线程安全... 因为我不是太懂,当然我也不是完全不懂。差不多就行了
好了不说了(科普一下而已(
这个本来是我在某国产 JVM 书上并发实践上看到的,当然操作系统笔记上也有讲(肯定的,现在哪个操作系统不是多用户多任务... 况且,据说此书是他们应付考研用的,不过目前我不是很熟,其中很多问题 C++ 这样的并发编程程序员都能遇到,不只是操作系统层面的问题)
LWP 是 LightWeightProcess,轻量级进程的意思
对应的概念是 KLT(Kernel-Level Threads),系统级线程
In computer operating systems, a light-weight process (LWP) is a means of achieving multitasking. In the traditional meaning of the term, as used in Unix System V and Solaris, a LWP runs in user space on top of a single kernel thread and shares its address space and system resources with other LWPs within the same process. Multiple user level threads, managed by a thread library, can be placed on top of one or many LWPs - allowing multitasking to be done at the user level, which can have some performance benefits.
类似 pthread 这样的 1:1 (LWP:KLT)模式,一个 LWP 是由一个 KLT 直接映射上的,实际上现在很多内核都是这种模式,Windows NT、Linux 都是。当然 Solaris (好像曾经叫 SunOS?)这种还会提供 N:1 的混合线程(不过应该没有专门 1:N 的,N:N 的应该有,java.util.concurrent 的 FJP 应该就属于这类,对应 j.u.c 的 FixedThreadPool 固定线程到任务的),目前大家的很多 JRE 环境实例(当然包括 JDK)大概都是直接一个 Thread 映射到一个 KLT 的(比如 9012 年的 Windows
如果喜欢不妨多了解一下,我没啥本事只能说这点了(大佬们多多指教 QAQ
For applications that require separate or custom pools, a ForkJoinPool may be constructed with a given target parallelism level; by default, equal to the number of available processors. The pool attempts to maintain enough active (or available) threads by dynamically adding, suspending, or resuming internal worker threads
同时也有类似的概念 Green Threads,用户级的线程实现,它不依赖操作系统的支持(所以,DOS 上都能用,这就是说 MRI Ruby 的一些早期版本甚至可以在 MSDOS <=6.x 上用多线程的原因)开始一些 20 世纪 Sun 的 JVM 也是 Green Threads,可是这个东西就有很大弊端,比如系统资源分配、CPU 也就是执行资源分配上操作系统认不出你这个用户自己弄的线程实现,系统资源(比如文件、互斥体、Timer 们)上的东西就很难实现甚至不可能实现,所以也不是太好,当然背后由系统级线程 KLT 支持的也有自己的缺陷,就是 User-mode 和 Kernel-mode 互相切来切去更频繁,开销比较大,CLR via C# 上是有讲的
当然这些和什么用户模式、内核模式、系统资源、任务调度之间有很大关系... 所以我还是回去用 Java 抽象出来的 java.lang.Thread 好了(删除)
坏处就是 JVM 平台上同步的确是比较简单的,他们都用 Monitor 这种重量级的方法... 当然商用 JVM 实现的优化肯定要做... 早些时候(JDK 1.2 还是 1.3 之前) Java 的
volatile
语义都有问题,不能阻止指令重排序,『著名』的双检锁 Singleton 模式都会直接当场爆炸不可避(尤其是那些 Constructor 副作用很强大的类...)JVM 平台上对开发者们素质的要求肯定是比 C#、C++ 这种低的(但是不希望大家都只会用个
synchronized
,volatile
而且是滥用这种万能同步语义(那玩意,说实话,真的很 trivial,我开始完全不懂数据竞争同步问题的时候(就是完全没有任何分析能力)都会用它同步多线程的 Hashtable 了(synchronized
的 HashMap)可以说是相当简单相当 trivial(这里我们不讨论 Coroutines(协程),也不讨论什么抢占式线程、非抢占式线程,也不讨论什么原子性操作... 可重入... 线程安全... 因为我不是太懂,当然我也不是完全不懂。差不多就行了
好了不说了(科普一下而已(
Wikipedia
Light-weight process
a means of achieving computer multitasking
duangsuse::Echo
可惜没有绘制成图表 plot 好看一些 🤔 r.size #=> 187 一共统计了 187 条消息。 r.sort_by { |it| it['published'] }.first['published'] => 2019-03-24 11:22:00 +0800 第一条消息是 2019-03-24 11:22 发送的 r.sort_by { |it| it['published'] }.last['published'] => 2019-04-05 20:06:00 +0800 最后一条消息是…
😃 那么,简而言之,我觉得有价值的信息:
2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse
+ 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签
+ 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签
+ 链接和 Tag 都有的消息有 17 条,占总消息的 9%
+ 187 条消息里,折行最多的消息是这条,它有 4232 个字和 7 条链接。
当然,这 70 条都是回复本频道消息的。
IT 那点事 (YuutaW 鱼塔): 10
羽毛的小白板: 10
duangsuse Throws: 6
Rachel 碎碎念 (IFTTT): 5
Rachel 的消息发布站点 (Rachel Miracle.) via @like: 3
YSC 的频道: 2
duangsuse ¯\_(ツ)_/¯ |学渣 | 我爱学习 | ∈ [E²PROM, 范畴论]: 2
Doge: 2
YuutaW 鱼塔: 2
Rachel 碎碎念 (湘江一桥): 2
DogeSpeed广播: 1
😄 @haneko_daily 被转发的次数最多,继续努力!
😳: 4
😲: 3
😡: 2
😑: 2
🙄: 2
😋: 2
😀: 2
😥: 2
🍹: 1
😐: 1
最火的 hashtags 组合:
所有 Hashtags:
以及他们的消息覆盖个数:
== 非线性查询(当然和算法上那个没有关系啦,就是复杂一点的查询)
// 收集所有单 / 双数索引
受到解析度(只到分钟)和浮点运算准确度的影响,有很多消息都是在间隔一分钟内发完的,统计结果可能不正确。
好啦,还有什么别的信息,请大家自己来发掘呗( 😝 比如说,我熬夜发过多少消息。
def get_link(h); "https://t.me/dsuse/#{h['debug']['no'] + 9511 + 20}"; end+ 一共统计了 187 条消息。
2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse
+ 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签
+ 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签
+ 链接和 Tag 都有的消息有 17 条,占总消息的 9%
map { |h| [h['body'].size, h] }.sort_by { |it| it.first }.reverse
map { |h| [h['body'].size, h] }.sort_by { |it| it.first }.reverse.first[1]['links'].size+ 187 条消息里,最长的消息是这条,它有 4475 个字 — 连链接都有 25 条! 🤪
+ 187 条消息里,折行最多的消息是这条,它有 4232 个字和 7 条链接。
sum { |it| it['body'].size } / size+ duangsuse 的平均字数:359 字 / 消息
sum { |it| it['body'].lines.size } / size+ duangsuse 的平均行数:11 行 / 消息
find_all { |it| it['header_type'] == 'REPLY' }.size
+ 过去的 187 条消息里,有 70 条都是回复,占总量 37%find_all { |it| it['header_type'] == 'FORWARDED' }.size
+ 过去的 187 条消息里,有 45 是转发自其他频道或个人的,占总量 24%当然,这 70 条都是回复本频道消息的。
a.uniq.map { |u| [u, a.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" }+ 转发者和条数表如下:
IT 那点事 (YuutaW 鱼塔): 10
羽毛的小白板: 10
duangsuse Throws: 6
Rachel 碎碎念 (IFTTT): 5
Rachel 的消息发布站点 (Rachel Miracle.) via @like: 3
YSC 的频道: 2
duangsuse ¯\_(ツ)_/¯ |学渣 | 我爱学习 | ∈ [E²PROM, 范畴论]: 2
Doge: 2
YuutaW 鱼塔: 2
Rachel 碎碎念 (湘江一桥): 2
DogeSpeed广播: 1
😄 @haneko_daily 被转发的次数最多,继续努力!
sort_by { |it| it['hashtags'].size }.reverse+ 具有最多标签的消息是这条,它有足足 8 条标签!
sort_by { |it| it['links'].size }.reverse.first
+ 具有最多链接的消息是这条,它有 25 条链接!同时也是字数最多的消息!find_all { |it| it['header_type'] == 'A_PHOTO' }.size过去 187 条消息里,一共有 29 条广播是单纯的一个照片 🖼
find_all { |it| it['header_type'] == 'A_ALBUM' }.size过去 187 条消息里,一共有 5 条广播是照片集 📸
find_all { |it| it['header_type'] == 'IS_STICKER' }.size可爱 🐱 的 duangsuse 在过去 187 条消息里使用了 28 个 sticker 抒发自己的感情,使用的表情这么多:
find_all { |it| it['header_type'] == 'IS_STICKER' }.collect { |it| it['ext'] }.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }😔: 7
😳: 4
😲: 3
😡: 2
😑: 2
🙄: 2
😋: 2
😀: 2
😥: 2
🍹: 1
😐: 1
find_all { |it| it['header_type'] == 'HAS_FILE' }.sizeduangsuse 在过去 187 条消息里发了 8 个文件,它们是:
find_all { |it| it['header_type'] == 'HAS_FILE' }.collect { |it| it['ext'] }["axml.rb", "AndroidManifest.xml", "AndroidManifest.xml", "TextSort.kt", "RandomPicture.kt", "Vibrator.svg", "Vibrator.png", "Vibrator.svg"]
最火的 hashtags 组合:
collect { |it| it['hashtags'] }.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }结果太长,在这里查看
所有 Hashtags:
hs = s.flatten.find_all { |it| it.is_a? Array }.flatten.map { |s| s.tr(" ", "") }#Android #zhihu #KDE #Low #Haha #life #tech #tencent #WeChat #weibo #share #tools #dev #Markups #Telegram #Hack #aop #Huawei #通知 #Freedom #sysadmin #GitHub #travis #CI #Sysadmin #Linux #Coolapk #Web #frontend #HTML #China #school #Microsoft #Life #VisualStudio #-} #OOP #web #geekapk #doge #CS #fix #CSharp #School #blog #recommended #bin #backend #Kotlin #Java #Share #svg #blogPOst #PL #JVM #Moha #code #ALgotithm #DuangsuseSB #GeekApk #SQL #Learn #wiki #Mozilla #ES6 #JavaScript #MoHa #Paper #haha #dotnet #bad #OOP_Delegates #Parallelism #dotNet #Csharp #Windows #performance #Channel #weekly #linux #Ruby #Project
"#" + hs.uniq.join(' #')
以及他们的消息覆盖个数:
hs.yield_self { |r| r.uniq.map { |u| [u, r.count(u)] }.sort_by { |it| it.last }.reverse.to_h.each { |e| puts "#{e.first}: #{e.last}" } }太长,这里看
== 非线性查询(当然和算法上那个没有关系啦,就是复杂一点的查询)
// 收集所有单 / 双数索引
ar = []; ar2 = []
i = 0 // 0 2 4 6
while i < self.size; ar << self[i]; i += 2; end
i = 1 // 1 3 5 7
while i < self.size; ar << self[i]; i += 2; end
aa = ar.zip(ar2)
我们将比较相邻两消息之间的关系。aa.zip(aa.map { |ms| ms.last['published'] - ms.first['published'] }).sort_by { |p| p.last }.reverse
间隔最长的两条消息是这条和这条,间隔 44880 秒(12 小时)b.map { |h| [h.last, h.first.first['body'].size ] }.map { |a| a.last / a.first }.select { |it| not it.nan? and not it.infinite? }.sort.reverse平均打字速度:7 字 / 秒 🤔
受到解析度(只到分钟)和浮点运算准确度的影响,有很多消息都是在间隔一分钟内发完的,统计结果可能不正确。
好啦,还有什么别的信息,请大家自己来发掘呗( 😝 比如说,我熬夜发过多少消息。
Telegram
duangsuse::Echo
AXMLParser parser = new AXMLParser(apkFileInputStream);
int eventType = parser.getType();
while (eventType != AXMLParser.END_DOCUMENT) {
String parserName = parser.getName();
boolean isManifest = "manifest".equals(parserName);
[...]
eventType…
int eventType = parser.getType();
while (eventType != AXMLParser.END_DOCUMENT) {
String parserName = parser.getName();
boolean isManifest = "manifest".equals(parserName);
[...]
eventType…
#life #dev duangsuse 落实 10:30 准时睡觉『政策』。 🐱
考虑到健康原因(不让自己的努力白费),每晚 10:30(h:m) 必须立即睡觉
== duangsuse::Echo 参考 #Telegram hashtags
duangsuse::Echo 常年利用 hastags 标记消息所含知识领域,并且,这也会为未来 Echo 频道进行简单准确的数据统计带来可能(不然,我也有其他手段,比如 NLP、统计预测)
以下是新的标签实例(不区分大小写、不能保证消息只含这些标签):
== 消息平台部分
#Telegram #zhihu #Github #so #Coolapk #book #wiki
== 注释部分
#life #China #School #Statement #lib #recommended #low #fix
#project #blog #share #Learn #paper
#dev #tech #art #meetUp #conference
#Moha #Haha
#gnu
#Microsoft #Mozilla #WeChat #QQ #Weibo #Tencent #Baidu #Ali #Qihoo
#tools #code
== 程序设计语言部分
#Kotlin #Java #JavaScript #JavaScript_ES6 #TypeScript
#Rust #Go #Swift #Dart #Crystal
#Ruby #Python #Perl #Tcl #Lua #PHP
#C #D #Cplusplus #CSharp #Objc
#Pascal #Fortran #Delphi #Ada #Basic #VisualBasic
#Scheme #Haskell #Scala #Clojure
#TeX #Graphviz
#Octave #Matlab
#Shell
(有些写出来是为了鼓励我去写,其实不一定真的写过)
== 软件平台部分
#Android #Windows #Win32 #MacOS #Java #Java_JVM #CLR #Qt #GTK #Tk #WxWidgets
#CSS #XML #JSON #KDE #Postgres #dotnet
== 软件技术领域部分
#backend #sysadmin #frontend #sysadmin_net
#OI #CS #IT #Informatics
#stat #ann #ann_dnn #machl
#math #math_linearAlgebra #math_discrete
#se #se_dia #se_ci #se_ee
#comm #net #www #web #http #html #mail #wireless
#circuit #embedded #os #db #db_relAlgebra #SQL
#bin #encoding #encoding_audio #encoding_image #encoding_video #encoding_text
#hpc #parallelism #distributed #simd #gpgpu #crypto
#pl #pl_plt #ce_vee #ce #ce_optimize #fp_monad #fp_proof #fp #oop #oop_arch #sp #parser
#algorithm #struct #lists #maps #sets
#security #security_lowlevel
#signalProc #nlp #phonetic
#cg #cg_dip #cg_3d #cg_2d #cg_lowlevel
#gui #gui_animation #gui_layouts #cli #visualization
考虑到健康原因(不让自己的努力白费),每晚 10:30(h:m) 必须立即睡觉
== duangsuse::Echo 参考 #Telegram hashtags
duangsuse::Echo 常年利用 hastags 标记消息所含知识领域,并且,这也会为未来 Echo 频道进行简单准确的数据统计带来可能(不然,我也有其他手段,比如 NLP、统计预测)
以下是新的标签实例(不区分大小写、不能保证消息只含这些标签):
== 消息平台部分
#Telegram #zhihu #Github #so #Coolapk #book #wiki
== 注释部分
#life #China #School #Statement #lib #recommended #low #fix
#project #blog #share #Learn #paper
#dev #tech #art #meetUp #conference
#Moha #Haha
#gnu
#Microsoft #Mozilla #WeChat #QQ #Weibo #Tencent #Baidu #Ali #Qihoo
#tools #code
== 程序设计语言部分
#Kotlin #Java #JavaScript #JavaScript_ES6 #TypeScript
#Rust #Go #Swift #Dart #Crystal
#Ruby #Python #Perl #Tcl #Lua #PHP
#C #D #Cplusplus #CSharp #Objc
#Pascal #Fortran #Delphi #Ada #Basic #VisualBasic
#Scheme #Haskell #Scala #Clojure
#TeX #Graphviz
#Octave #Matlab
#Shell
(有些写出来是为了鼓励我去写,其实不一定真的写过)
== 软件平台部分
#Android #Windows #Win32 #MacOS #Java #Java_JVM #CLR #Qt #GTK #Tk #WxWidgets
#CSS #XML #JSON #KDE #Postgres #dotnet
== 软件技术领域部分
#backend #sysadmin #frontend #sysadmin_net
#OI #CS #IT #Informatics
#stat #ann #ann_dnn #machl
#math #math_linearAlgebra #math_discrete
#se #se_dia #se_ci #se_ee
#comm #net #www #web #http #html #mail #wireless
#circuit #embedded #os #db #db_relAlgebra #SQL
#bin #encoding #encoding_audio #encoding_image #encoding_video #encoding_text
#hpc #parallelism #distributed #simd #gpgpu #crypto
#pl #pl_plt #ce_vee #ce #ce_optimize #fp_monad #fp_proof #fp #oop #oop_arch #sp #parser
#algorithm #struct #lists #maps #sets
#security #security_lowlevel
#signalProc #nlp #phonetic
#cg #cg_dip #cg_3d #cg_2d #cg_lowlevel
#gui #gui_animation #gui_layouts #cli #visualization
所以问题弄久了终究还是抽象问题 🤔
我不擅长 #parallelism ,但既有一般的编程实践和文档查找能力,对抽象的掌控也是还行的
我不擅长 #parallelism ,但既有一般的编程实践和文档查找能力,对抽象的掌控也是还行的