欢迎光临散文网 会员登陆 & 注册

【Jcell】双T机制

2023-08-07 19:12 作者:黄金小皮鱼  | 我要投稿

备份标记:Jcell 2023、Jcell 2024pre、外包策略、劳务派遣、细胞控制、情绪控制、情感伪装和加工等。 备份时间:20230807; 【衔接位置】与前后内容的链接: 上一个:情绪控制系统。 下一个:水库结构与情绪缓冲机制。

【双T机制】双线程并行机制,是指对于一个非空流程,由两个线程对该流程负责,其中一个线程负责该流程的执行,另外一个线程对执行该流程的线程进行监督。   执行流程的线程称作「执行者线程」,监督执行者的线程为「监督者线程」。监督者与执行者可随时互换,称作「轮班」,在一个执行者、一个监督者,共两线程的轮班机制下,又叫做「双T轮替」。   记线程T1、T2,给定任务的流程,其中T1负责流程的执行,T2负责监督T1,原子化参数控制为t,其中流程执行过程为P,监督过程为Q      T1=()→P(t)      T2=()→Q(T1, t) 利用科里化,合并线程lambda表达式得到     T2=()→Q(P(t),t) 这是嵌套函数QP,但我不喜欢嵌套太多层,因此使用「合理委托策略」,把任务交给专业性更强的外包执行,因此合理委托策略又称「外包策略」或「劳动派遣策略」。   监督者线程的函数式接口(Runnable)方法run()内为线程操作(控制执行者线程的线程),执行者线程的函数式接口方法run()内为任务操作(如多线程下载、并发记忆等)。   用伪代码表示如下:   监督者.run(){    //控制条件    执行者.run(){     //执行任务    }   } 这是二级嵌套委托模型,可理解为监督者把任务委托给执行者去做。 【轮T机制与劳动派遣】事实上,可能有三线程、四线程,其中对于三T机制(三权分立),可以有两个监督者、一个执行者,或一个监督者、两个执行者。   对于外包策略,监督者把任务外包给执行者,为了避免「职业歧视」的现象出现,可以使用两种子策略——强外包策略和弱外包策略。   强外包策略是指(说白了就是垄断策略):由高层垄断并下发权利,以专业度为高优先级,专业等级由高层评定,且要求极为严格,标准统一,想要被外包或劳务派遣,自身必须有极强的专业性才能领到任务。   弱外包策略是指(说白了就是竞争策略):底层自发竞争,发挥市场的主观能动性和自我调节优势,减轻高层压力,专业性可能欠佳,但适用性更强,且流通性更高。   在实际应用中强弱外包并发使用,借助「超级多态」,专业度更高的执行者可以更大几率领到任务。   常见的外包有:下载器(Downloader)、加工器(Consumer)、生产器(Producer)、分解器(Deconsumer)、记录器(Recorder)、记忆器(Memorial)等……   垄断策略使外包更具专业性,由监督者限定每一类有且只有一个外包,但要求专业性,每一类同时只能有一个执行者领取到,且同类任务的所有执行者被认为是「合作关系」而非竞争,所领取的奖励量由任务完成度、完成效率、满意度等综合评判,它们之间只要存在竞争,就会在一定程度上影响到任务的执行完整度,这会让总奖励下降。   竞争策略使外包更具多样性,监督者有更多执行者可以选择,但任务完成专业度可能不受监督者信任,或者说监督者委托出去的任务,竞争策略影响下的执行者不一定完成的很好,为了争抢任务,执行者之间很可能会出现恶意竞争或欺骗现象,称作「内卷」。   不需要担心垄断策略因为执行者领够奖励而摆烂的现象,因为任务的完成过程十分轻松且简单,所有的便利和专业化培训均由监督者免费提供,包括算法调用、运行时优化和结构化重排(参见Jcell 2020「结构化时序分析与快排时钟逻辑」)。这可以类比,一群外包工来到快递分拣站干活,他们作为执行者,不需要考虑客观因素(如水分、伙食、劳累、工资),他们只需要保证快件完好、分类准确率和轻拿轻放。面对大件拿不动,监督者有机器,吊车、重型吊车、超重型吊车、叉车免费提供+培训,伙食包给五星级大厨,合理的工作制度、工资分配、医疗制度甚至心理辅导,让外包们尽可能轻松地完成工作。   不需要担心竞争策略会出现高层塌陷、资金周转异常、负载过高等情况。竞争策略是高层的监督者为了减轻压力让执行者利用「线程竞争机制」(参考Java、Jcell编译手册第25章第7节「线程自杀机制」),自己去卷专业度,这避免了在垄断策略内发生的现象,当高层被外界动荡局势打扰时,无法分配足够的功率去垄断外包,造成形式化外包和应试外包的情况。但意味着有更危险的定时炸弹埋在其中,当线程争抢不过资源时,线程会通过「凋亡」来终结自己,最终(被)凋亡的线程会被线程池回收再利用。   情绪控制系统可以提供冲击预案以应对这些潜在问题(如高层塌陷)。 【权能交换】执行者与监督者可以交换权利,使执行者变为监督者,监督者变为执行者,这个过程称作「权能的交换」。   交换的前提是,执行者的专业度足够高,且权重占比达到标准。 【内卷】在线程竞争过程中,线程之间不合理地争抢脑区资源,导致脑区超负载的现象,称作线程的「内卷」。 【凋亡】在线程竞争过程中,因线程获取不到执行机会,主动放弃Runnable执行的现象,称作线程的凋亡。   与线程的死亡不同,线程的凋亡通常是线程自身的时空等因素不足以支撑Runnable接口方法体的执行而引起的任务放弃现象。   例如当一个Runnable方法体内迭代次数过多导致栈溢出,那么在使用线程池创建线程时,这个Runnable任务起初将会有一个线程领取并完整执行,该执行者线程发现,自己无法成功且完整地利用现有资源完成该任务,因此选择放弃,转而选择其它任务。   当一个执行者线程具备的专业度为α,而无法成功执行Runnable任务时,那么所有专业度低于或等于α的执行者均会放弃该Runnable任务(打上标记)。   这里我认为,监督者线程是线程池内所有的已知线程生成元中,专业度最高的,而当监督者线程也无法执行该Runnable任务时,线程池抛出异常并层层向上反馈给组织级、器官级系统级和个体级。 【专业度】一个线程执行并完成任务的效能、效率、功耗、质量的综合评估因素,称作线程的专业度,一个更专业的线程意为拥有更好的任务执行能力。   和「专业性」不同,专业度是衡量线程对某件任务执行好坏的一种评估。专业性则是指线程在不同任务上不同专业度的分布,内向的线程结构并不适合人际交流,外向的线程结构坐不住(参见Jcell 2018 第7章「线程」第47节「线程的方向」) 【线程生成元】一群线程内的每个线程,总能找到与之等效的、由该线程群的子群乘积所组成的联合线程。   已知线程池分配了群T,包含了T1、T2、T3、……存在任务R交给T[i]执行,同样的,线程池也可以指派线程群的子群,由这些线程们合作解决任务R,能得到相同的结果,对于任意索引 i ,T[i]总能找到一个T的子群能够替代之,这个子群称作群T的生成元。   生成元的存在可以减少群的成员数量,类似于「裁员」,可理解为减少一个工作单位的员工数量,但这意味着员工需要进行更多的步骤(例如员工需要进行更多的交流合作、负担增加)。   数学中存在一个例子,定义    D3={A, B, C, D, E, F} 其中E为恒元,D、F为绕等边三角形中点逆时针旋转2π/3和4π/3,A、B、C为绕三个对称轴的翻转。其中,可取生成元为{D, A},则有变换(乘积)     E=D³=A²     F=D²     B=AD     C=DA 也可取生成元为{F, A},则有     E=F³=A²     D=F²     B=FA     C=AF 生成元的数目为有限群的秩。   在上述例子中,群D3的生成元为子群{D, A}或{F, A},可以用这两个元素的变换「平替」掉其余不需要的元素,但这样就需要对DA组合或FA组合进行变换,增加工作时长或加班。   工作单位可以视作一个巨型群,群元为每个员工,当公司裁员时,将保留的员工视作生成元,对他们进行额外的线性变换,交给他们额外的工作,剩下的人全部被裁。   假设生成元的长度为m,员工数量为N,那么被裁员工数量为N-m,这N-m人将会失业、露宿街头或空窗期等待下一份工作,但不可否认的是,他们失业了。而作为生成元的员工,则需要承担更大的压力和负担。   这其中唯一不变的是,公司的效益。当然可以通过保持对这m人的薪酬不变(不给加班费),即使他们为了完成任务需要加班,这会使公司收益提升(减少开支),但生成元的压力会增大。   当保证公司效益不变时,这相当于原来颁发给N-m个人的总薪水平均到m人的加班费。   上述「裁员-加班-失业」的过程称作「生成元的平替」(即「你不干有的是人干」)。   同理,我将线程池内所有已创建的线程视为线程群,并在其中取专业度较高的几个线程作为生成元,去平替掉那些不需要的线程,令他们死亡或作为「流浪线程」(脱离了线程池,由JVM或BVM直接创建的线程,平时我称其为“失业线程”)。   流浪线程:一个线程由JVM或BVM直接创建,不受线程池的管束,与线程池整体争夺资源。   事实上,线程生成元的实现是十分复杂的,涉及到动态规划、复杂度分析等各种考虑。在上述D3群中,D3裁员到只剩下F、A两个元素,而一个线程的执行是原子化的、精力有限的,尤其是当它执行一个任务时,被加synchronized锁的部分会导致F或A无法去执行其它任务。   在这样的条件下:     E=F³=A²     D=F²     B=FA     C=AF B和C的平替任务不可能同时得到执行,D、E由于可以分别交给F和A,可以同时执行。   对于B、C的平替,当A执行时(B的第一步),与此同时F同步处理C的第一步,则C阻塞,我无法断定A和F对于接手B、C的任务后哪个执行更快。因此当A执行完,会等待F执行完成,才能完成B的最后一步,同理F必须等待A执行完成,才能执行C的最后一步返回结果。   这样就出现了并发编程常见的bug——死锁。   导致B与C两个线程的平替任务都完不成,A和F双双被阻塞,由于D3裁员到只剩A、F两个元素,这意味着当A、F阻塞而无法执行其它任务时,D3被锁。   这会导致D3占用的内存和涉及到的volatile变量全部被锁住,无法正常读写访问,变成脏数据或坏数据,这个现象称作内存或数据的「软损坏」。硬损坏与之相对,是指硬件磨损导致的数据损坏。   大多数情况下,数据损坏均为软损坏,可以通过终结线程或释放任务,来解决被锁住的数据。   线程生成元应谨慎使用,虽然可以很大程度上站在调用方考虑,优化能耗和发热,但代价是容易出现线程死锁。 【线性变换基础】对于前述生成元有     FA≠AF 涉及到高阶张量的乘积变换均不符合交换群。   但如下考虑     FA=A^T F^T 若A、F是厄米性的,那么     A^T=A,F^T=F 这样可以得到     FA=AF 称由生成元{F, A}表达的元素B、C互为同步。   这意味着B与C的任务结果是等效的,执行完B,C的结果也出来了,因此F和A可以专攻B或C。 【忠告】能单就单,能不碰并发就不碰并发,不得已时尽量锁到位。

【Jcell】双T机制的评论 (共 条)

分享到微博请遵守国家法律