- 康康map
-
向量EF=EA+AB+BF,向量EF=ED+DC+CF,
因为E,F分别是AD BC的中点,所以向量EA+ED=0,向量BF+CF=0(向量大小相等,方向相反,和为0向量,你懂的)
所以向量AB+向量DC=2向量EF.
- CarieVinne
-
向量EF=向量ED+向量DC+向量CF; 向量EF=向量EA+向量AB+向量BF
则,2向量EF=向量ED+向量DC+向量CF+向量EA+向量AB+向量BF
因为E,F分别是AD,BC的中点,所以:
|向量ED|=|向量EA|,且向量ED和向量EA的方向相反,向量ED+向量EA=0
同理,向量CF+向量BF=0
最后得出,2向量EF=向量AB+向量DC
- 瑞瑞爱吃桃
-
图在哪?
如图,在四边形ABCD中,点E,F分别在AD,CB的延长线上,且∠1=∠2,DF交AB于点G,BE交CD于点H,求证EH=FG
∵ABCD为平行四边形 ∴AB‖DC且AB=DC ∵E,F分别是边AB,CD的中点 ∴AE=BE=DF=CF∴EB=DF且EB‖DF ∴四边形EBFD是平行四边形 还记得上学的时候平行四边行的定义是:一组对边平行且相等的四边形是平行四边形2023-08-01 19:57:294
如图,在四边形ABCD中,角BAD=30度,角BCD=60度,BC=CD,AB=9,AD=12,求对角线AC的长
连接BD,三角形BCD为等边三角形,在三角形ABD中利用余弦定理即可求出对边BD的长和角ADB的值,再在三角形ACD中利用余弦定理即可对边AC的长15.2023-08-01 19:57:441
(2014?武汉)如图,在四边形ABCD中,AD=4,CD=3,∠ABC=∠ACB=∠ADC=45°,则BD的长为______
2023-08-01 19:57:522
如图,在四边形ABCD中,AD平行BC,∠ABC=∠DCB,点E、F分别在AB、DC上,且BE=2EA,CF=2FD,试说明∠BEC=∠CFB
分析:要证明两个角相等,根据已知条件显然可以根据全等三角形的性质进行证明.首先根据等腰梯形的性质得到两个底角相等,再根据已知条件得到线段相等,即可证明△EBC≌△FCB.解答:证明:在梯形ABCD中,∵AD∥BC,AB=DC,∴∠ABC=∠DCB,∵BE=2EA,CF=2FD,∴BE= 2/3AB,CF= 2/3DC,∴BE=CF,在△EBC和△FCB中,{BE=CF{∠EBC=∠FCB{BC=CB∴△EBC≌△FCB,∴∠BEC=∠CFB.不懂,请追问,祝愉快O(∩_∩)O~2023-08-01 20:02:451
如图,在四边形abcd中,角b等于90度,ab等于3,bc等于4,cd等于5,ad等于5倍的根号2,则
45度。连接AC,由“角b等于90度,ab等于3,bc等于4”,可计算出ac=5,在三角形ACD中,ac=cd=5,ad=5倍根号2,可以计算出角D=角DAC=45度2023-08-01 20:03:063
如图,在平行四边形ABCD中,点E,F分别在AD,BC上
因为AD//BC,AE=CF。所以四边形AECF是平行四边形。所以AF//EC因为ABCD是平行四边形,所以AB=CD,角BAD=角DCB又因为AE=CF,所以三角形BAE全等与三角形DCF所以角AEB=角DFC因为AD//BC,所以角AEB=角EBC所以角DFC=角EBC所以BE//DF又因为AF//EC所以四边形EGFH是平行四边形2023-08-01 20:03:241
如图,在平行四边形ABCD中!AE等于三分之二AB,BF等于四分之三BC,AF与CE相交与O点。已
2023-08-01 20:03:311
如图,在四边形ABCD中,M、N分别是AD、BC的中点,若AB=10,CD=8,求MN的取值范围。
过M作ME//AB交BD与E,则E为BD中点,ME=AB/2=5,连接NE,同理NE=CD/2=4,所以在三角形MNE中,根据两边之和大于第三边,两边之差小于第三边,则1<MN<9。2023-08-01 20:03:392
在平行四边形ABCD中,AC、BD交于点O,过点O作直线EF、GH,分别交平行四边形的四条边于EGFH四点,连接 浏览
楼主好厉害!!2023-08-01 20:04:014
如图,在平行四边形ABCD中,BE,CE分别平分∠ABC和∠BCD,且BE与CE相交于AD上同一点,若BE=12cm,CE=5cm
△BCE是直角三角形,理由:∵在?ABCD中,BE、CE分别平分∠ABC和∠BCD,∴∠ABC+∠BCD=180?,∠ABE=∠EBC,∠BCE=∠ECD,∴∠EBC+∠ECB=90?,∴∠BEC=90?,∴△BCE是直角三角形;∵∠BEC=90?,BE=12cm,CE=5cm,∴BC=BE2+CE2?????????√=122+52??????√=13cm;(2)证明:∵在?ABCD中,BE、CE分别平分∠ABC和∠BCD,∴AB=CD,AD∥BC,∠ABE=∠EBC,∠BCE=∠ECD,∴∠AEB=∠EBC,∠BCE=∠CED,∴∠ABE=∠AEB,∠CED=∠ECD,∴AB=AE,DE=DC,∵AB=DC,∴AE=DE,∴点E是AD的中点;(3)∵在?ABCD中,点E为CD的中点,BC=13cm,∴AD=BC=13cm,由(2)知,AB=12AD,∴AB=6.5cm;(4)∵在?ABCD中,AB=CD=6.5cm,AD=BC=13cm,∴?ABCD的周长是:6.5+13+6.5+13=39cm,∵△BEC是直角三角形,BE=12cm,CE=5cm,∠BEC=90?,∴△BEC的面积是:12×5÷2=30cm2,∴?ABCD的面积是:2×30=60cm2.2023-08-01 20:04:083
如图,在平行四边形ABCD中,对角线AC,BD相交于点O,若E,F是AC上两动点,分别从A,C两点
解:(1)当E与F不重合时,四边形DEBF是平行四边形,理由是:∵E,F是AC上两动点,分别从A,C两点以相同的速度向C、A运动,∴AE=CF,∵四边形ABCD是平行四边形,∴OD=OB,OA=OC,∴OE=OF,∴四边形DEBF是平行四边形;(2)当运动时间t=4或28时,以D、E、B、F为顶点的四边形是矩形,理由是:分为两种情况:①∵四边形DEBF是矩形,∴BD=EF=12cm,即AE=CF=0.5tcm,则16-0.5t-0.5t=12,解得:t=4;②当E到F位置上,F到E位置上时,AE=AF=0.5tcm,则0.5t-12+0.5t=16,t=28,即当运动时间t=4s或28s时,以D、E、B、F为顶点的四边形是矩形2023-08-01 20:04:272
如图,在四边形ABCD中,AD平行于BC,∠ABC=80,AB=AD=1/2BC,CH垂直于AB于H
如图,过点D作AB的平行线,交BC于点E则四边形ABED为菱形已知BC=2AB,AB=AD所以,点E为BC中点已知CH⊥AB,DE//AB所以,DE⊥CH,且DE为线段CH的中垂线所以,DH=DC则,∠CHD=∠DCH因为DE//AB所以,∠DEC=∠B=80°所以,∠ECH=10°又EC=ED所以,∠ECD=∠EDC=(180°-80°)/2=50°所以,∠DCH=50°-10°=40°则,∠CHD=40°2023-08-01 20:04:421
如图,在四边形ABCD中,AC、BD相交于点E,AD=BD,∠ADB=∠ACB=90°,AE=2BC. 求证如下:
取AE中点F,连接DF,易知DF是RT三角形ADE,斜边AE上中线所以,AE=2DF=2AF又AE=2BC所以,AF=BC在RT△ADE和RT△BCE中∠ADE=∠BCE=90,∠AED=∠BEC所以,∠DAF=∠CBEAD=DB,∠DAF=∠CBE,AF=BC△DAF≌△DCB;(SAS)DF=DC又DF=AF=BC即有,BC=DC2)延长AD和BC交于点G在RT△ADE和RT△BDG中∠ADE=∠BDG=90,AD=DB,∠AED=∠DBGRT△DAE≌RT△BDG;(ASA)AE=BG又AE=2BCBG=2BC即有,BC=CGAC=CA,∠ACB=∠ACG=90,BC=CGRT△ABC≌RT△ACG;(SAS)∠BAC=∠CAG所以,AC平分∠BAD2023-08-01 20:04:572
如图所示,在四边形ABCD中,AD‖BC,AB=AD,角BAD的平分线AE交BC于点E连接DE.
角ADC等于60度?你会不会抄错了题目?2023-08-01 20:06:002
如图,在平行四边形ABCD中,点E是边BC的中点。如果AD=2CD,求角AED的大小。
BC=AD=2CD所以CD=12BCE为BC中点所以CE=12BCCD=CE∠CED=∠CDE因为平行四边形ABCD所以∠CED=∠EDAsoDE为∠ADC角平分线所以∠ADE=12∠ADC同理,AE为∠BAD角平分线所以∠DAE=12∠BAD∠ADC+∠BAD=180°所以∠ADE+∠DAE=90°∠ADE+∠DAE+∠AED=180°所以∠AED=90°2023-08-01 20:06:242
如图,在四边形ABCD中,∠B=∠D=90°,∠A=60°,AB=4,AD=5,求BC/CD的值
1 角平分线定理2023-08-01 20:06:446
如图所示,在四边形ABCD中,角A与角C互补,BE平分角ABC,DF平分角ABC,DF平分角ADC
∵BE∥DF所以角ADF=<AEB四边形内角和为18O°,角A和角C互补,所以另两个角互补,根据角平分线可知,角ADF与角ABE互余,即角ADE与角AEB互余,所以△ABE为Rt△2023-08-01 20:07:173
如图 在四边形ABCD中,AD//BC,E为CD的中点,连接AE到BC的延长线于点F,且AB等于BF。 求BE垂直AF
利用“角边角对应相等则全等”证明。既然AB=BF,那么他就是等腰三角形。等腰三角形的两个底角相等,————角AE=EF______________________________________________________________——边等腰三角形的底边上的中线就是高,就有两个直角三角形,两个直角相等——角角边角都对应相等,即“全等”(因为我没有下载数学编辑器,就没有办法在上面的答案中用上有关的证明用到的符号)2023-08-01 20:07:262
如图,在四边形ABCD中,∠B=∠D=90°,∠A=60°,AB=4,AD=5,求BC/CD的值
解:延长DC和AB,交于E.∠D=90°,则∠E=90°-∠A=30°,AE=2AD=10,BE=AE-AB=6.又∠ABC=90°,则∠CBE=90°.故CE=2BC,BE=√(CE^2-BC^2)=√3BC,即6=√3BC,BC=2√3,CE=2BC=4√3.又DE=√(AE^2-AD^2)=5√3,CD=DE-CE=5√3-4√3=√3.所以,BC/CD=(2√3)/√3=2.2023-08-01 20:07:461
如图,四边形ABCD中,AD平行于BC,点E在边CD上,AE平分角DAB,BE平分角ABC,试说明:AD+BC=AB
因为平行四边形CD∥AB,所以∠DEA=∠EAB因为AE平分角DAB,所以∠DAE=∠EAB,所以∠DAE=∠DEA,所以AD=AE同样2个步骤可以证明EC=BCAB=CD=AE+EC=AD+BC完了。2023-08-01 20:07:564
如图,在四边形ABCD中,AD 平行BC点E是AB上的一个动点,若角B等于60度,AB=BC,且角D
AD+AE=BC,三角形BEC和三角形DAE全等2023-08-01 20:08:051
如图,在平行四边形ABCD中,点E,F分别是对边AB,CD的三等分点,试证明;(1)四边形DEBF为平行四边形
1、在平行四边形ABCD中,点E、F分别为边AB与DC的三等分点∴DF//BE,DF=2/3DCBE=2/3AB∴DF=BE∴四边形DEBF为平行四边形(2)在平行四边形ABCD中,点E、F分别为边AB与DC的三等分点AD=BC,∠A=∠C,CF=1/3DC=1/3AB=AE∴△AED≌△CFB2023-08-01 20:08:182
如图,在四边形ABCD中,∠A=75°,∠B=∠D=90°,AB=BC,CD=1,求四边形ABCD的面积。
连接AC 因AB=BC ∠B=90°所以∠CAB=∠BCA=45° 所以∠DAC=30° ∠DCA=60° CD=1 所以AC=2 AD=根号3 AB=BC=根号2 ABCD的面积等于三角形ABC加ADC的面积 所以 面积为 1*根号3/2+根号2*根号2/2=1+2分之根号32023-08-01 20:08:251
如图,在四边形ABCD中,AB=CD,E,F分别是BC,AD的中点,连结EF并延长
天知道2023-08-01 20:08:346
如图,在平行四边形ABCD中,BD=2AB,AC与BD相交于点O,点E、F、G分别是OC、OB、AD的中点。
(1)求DE⊥OC 上面的(2)我觉得不对 今天作业 自己做的 过程很详细的写着如果 各位觉得还行的话 评为满意吧 我还是抽空写的呢 作业还好多 谢谢 ∩_∩ 解: ∵ 平行四边形ABCD ∴ OD=1/2BD CD=AB=1/2BD ∴ OD=CD ∵ E为OC中点 ∴ DE⊥OC(三线合一) (2)求EG=EF 解:连接AF ∵ F、E分别是OB、OC的中点 ∴ EF是△BOC的中位线 ∴ EF=1/2BC ∵ G是AD的中点 ∴ AG=1/2AD=1/2BC ∴ EF=AG ∵ DE⊥AC ∴ 角DEA=90° ∵ G是AD的中点 ∴ EG=1/2AD ∴ AG=GE ∴ GE=EF(直角三角形斜边的中线等于斜边的一半)2023-08-01 20:09:402
如图,在平行四边形ABCD中,角1=角2,求证:四边形ABCD是矩形
证明:∵ABCD是平行四边形,∴OC=OC,OB=OD,∵∠1=∠2,∴OA=OB,∴AC=BD,∴平行四边形ABCD是矩形。2023-08-01 20:10:012
如图,在四边形ABCD中,∠ABC=90°,AD∥BC,AB=BC。E是AB的中点,CE⊥BD.
图呢?2023-08-01 20:10:093
如图所示,在四边形ABCD中,已知AB//CD,直线AB,BC,AD,DC分别与平面a相交于点E,G,H,F。求证:E,F,G,H,四点
解:∵AB∥CD,∴AB,CD确定一个平面β.又∵AB∩α=E,ABu2282β,∴E∈α,E∈β,即E为平面α与β的一个公共点.同理可证F,G,H均为平面α与β的公共点.∵两个平面有公共点,它们有且只有一条通过公共点的公共直线,∴E,F,G,H四点必定共线.2023-08-01 20:10:352
有图,在四边形ABCD中,AB=CD,点E,F分别是BC,AD的中点,点P是BD的中点,PQ⊥EF于点Q
连接PF PEPF=1/2AB PE=1/2CD (中位线)AB=CD 所以 PF=PEPQ⊥EF 所以Q为EF中点2023-08-01 20:10:432
如图,在平行四边形ABCD中,AC为对角线,BE⊥AC,DF垂直AC,垂足分别是E,F问四边形DFEB是平行四边形吗?为什么?
∵ABCD是平行四边形∴AB=DC,AB∥DC∴∠BAE=∠DCF(内错角相等)∵BE⊥AC,DF⊥AC∴BE∥DF∠AEB=∠DFC=90°在△ABE和△CDF中AB=DC,∠BAE=∠DCF,∠AEB=∠DFC∴△ABE≌△CDF(AAS)∴BE=DF∴四边形DFBE是平行四边形 (一组对边平行且相等)2023-08-01 20:10:562
在四边形ABCD中,AD平行BC,AB=CD=2,AD=3,∠B=60°,求四边形ABCD的面积。
4√32023-08-01 20:11:033
在四边形ABCD中,AD等于DC,角ADC等于60度,角ABC等于30度,求证BD的平方等于AB的平方加BC的平方
作辅助线,角CBE=60度,角BCE=60度,BE和CE交于E点,连结AE。显然,三角形ADC、三角形BCE是等边三角形根据AC=DC,BC=CE,角BCD=角ECA可知三角形BCD和三角形ECA全等可知BD=AE另外,在等边三角形ECA中,BC=BE因为角ABC=30,角CBE=60所以角ABE=90所以在直角三角形ABE中,AE的平方等于AB的平方加BE的平方因为AE=BD BC=BE所以BD的平方等于AB的平方加BC的平方2023-08-01 20:11:182
如图,在四边形ABCD中,∠BAD=45°,∠BCD=90°,CA平分∠BCD
(1)AC=√2AE证明:从A作AM⊥BC,交CB延长线于M;作AN⊥CD,交CD延长线于N因为A在∠BCD平分线上,所以AM=AN四边形AMCN有三个直角,所以为矩形且邻边相等,因此是正方形,将△AND绕点A顺时针旋转90度,使AN与AM重合,得到△AMP∠BAD=45,所以∠NAD+∠BAM=45根据旋转,∠MAP=∠NAD,所以∠MAP+∠BAM=45即∠PAB=∠BAD=45又有AP=AD,AB=AB所以△PAB≌△DAB,BP=BD;∠ABP=∠ABDBA平分∠PBD所以AE=AMAC为正方形AMCN对角线,因此AC=√2AM=√2AE(2)由(1)结论,AMCN为正方形AC=6√2,所以AM=AN=6,S正方形AMCN=36因为BP=BM+PM=BM+DN,所以BM+DN=BDS△ABM+S△ADN=1/2×AM×BM+1/2×AN×DN=1/2×AM×(BM+DN)S△ABD=1/2×AE×BD所以S△ABM+S△ADN=S△ABD,S△ABM+S△ADN+S△ABD=2S△ABD=2×1/2×6×5=30S△BCD=S正方形AMCN-2S△ABD=62023-08-01 20:11:331
新文化运动内容是什么 为什么兴起
新文化运动的主要内容是:前期反对封建旧文化的斗争,提倡用白话文代替文言文,后期由先进的知识分子极力宣传马克思主义。 新文化运动兴起背景 1、政治方面: ①帝国主义加紧侵略; ②军阀统治,日趋黑暗,必须继续进行反帝反封建斗争。 2、经济方面: 一战期间,中国民族资本主义进一步发展。民族资产阶级力量壮大,登上政治舞台,强烈要求实行民主政治,发展资本主义,这是根本原因。 3、思想文化方面: ①辛亥革命后,西方启蒙思想进一步传播,民主共和的思想深入人心。 ②北洋军阀(袁世凯为复辟帝制)推行尊孔复古的逆流(民主共和观念和尊孔复古逆流势不两立)。 更为重要的是当时的人们对于辛亥革命失败的反思。经过辛亥革命,先进的知识分子认识到,革命失败的根源在于国民脑中缺乏民主共和意识,必须从文化思想上冲击封建思想和封建意识,通过普及共和思想来实现真正的共和政体。 4、阶级方面: 资产阶级强烈要求在中国实行民主政治。 因此,新文化运动的出现既是当时特定历史时期经济、政治、思想文化诸因素综合作用的产物,也是近代中国经历长期的物质、思想准备基础上的必然结果。 新文化运动历史意义 五四前的新文化运动对当时和以后的中国社会产生了巨大而深远的影响,主要表现在: 1、新文化运动是资产阶级激进民主主义者领导和发动的一次资产阶级新文化同封建阶级旧文化的激烈交锋,它在政治上、思想上、文化上给封建主义以沉重的打击。他们大力介绍西方的新思潮、新科学和新文化,破除了旧伦理、旧思想、旧文化对人们思想的长期禁锢,促进了中国人民尤其是青年的觉醒,因而是一次大规模的思想解放运动和资产阶级的思想启蒙运动。 2、新文化运动的兴起,标志着中国人对于现代化的努力已经从器物技术、政治制度层面进入到精神文化层面。结果,不只是洋枪取代了大刀,洋船取代了舢舨,而是更广泛器物层面上的转变,这就是洋务运动所取得的最大收获。洋务运动的成果在甲午战争中被击得粉碎,这就宣告了器物层面的现代化已经走到了尽头。 因此开始了制度层面的现代化努力,即康、梁的维新运动。这种学习西方政治制度的政治现代化的努力由于种种原因最后夭折。于是,先进的思想家们认识到思想文化的现代化是至关重要的方面,这也是新文化运动兴起的直接原因。 3、新文化运动促使人们加紧追求救国救民的真理,为伟大的五四运动作了思想先导,为马克思列宁主义在中国的传播开辟了道路。正是在新文化风暴的冲击下,引来了近代中国历史上具有转折意义的五四运动。 中国革命也迅速地转变为新民主主义革命。以1919年5月4日开始发动的五四运动,轰轰烈烈地展开了,这标志着资产阶级领导的旧民主主义革命的终结和无产阶级领导的新民主主义革命的开始。从而也为五四运动和中国民族民主革命的深入奠定了坚实的思想基础。 以上是我为大家整理的新文化运动的相关内容,希望对大家有所帮助。2023-08-01 20:06:401
新文化运动的核心内容是是什么
1、提倡民主与科学,反对专制和愚昧、迷信。 2、提倡新道德,反对旧道德。 3、提倡新文学,反对旧文学。 新文化运动历史背景: 1、政治方面:帝国主义加紧侵略;军阀统治,日趋黑暗,必须继续进行反帝反封建斗争。 2、经济方面:一战期间,中国民族资本主义进一步发展。民族资产阶级力量壮大,登上政治舞台,强烈要求实行民主政治,发展资本主义,这是根本原因。 3、思想文化方面:辛亥革命后,西方启蒙思想进一步传播,民主共和的思想深入人心。 4、阶级方面:资产阶级强烈要求在中国实行民主政治。 因此,新文化运动的出现既是当时特定历史时期经济、政治、思想文化诸因素综合作用的产物,也是近代中国经历长期的物质、思想准备基础上的必然结果。2023-08-01 20:06:471
在Linux 上,编写一个每秒接收 100万UDP数据包的程序究竟有多难
首先,我们假设:测量每秒的数据包(pps)比测量每秒字节数(Bps)更有意思。您可以通过更好的管道输送以及发送更长数据包来获取更高的Bps。而相比之下,提高pps要困难得多。因为我们对pps感兴趣,我们的实验将使用较短的 UDP 消息。准确来说是 32 字节的 UDP 负载,这相当于以太网层的 74 字节。在实验中,我们将使用两个物理服务器:“接收器”和“发送器”。它们都有两个六核2 GHz的 Xeon处理器。每个服务器都启用了 24 个处理器的超线程(HT),有 Solarflare 的 10G 多队列网卡,有 11 个接收队列配置。稍后将详细介绍。测试程序的源代码分别是:udpsender、udpreceiver。预备知识我们使用4321作为UDP数据包的端口,在开始之前,我们必须确保传输不会被iptables干扰:Shellreceiver$ iptables -I INPUT 1 -p udp --dport 4321 -j ACCEPTreceiver$ iptables -t raw -I PREROUTING 1 -p udp --dport 4321 -j NOTRACK为了后面测试方便,我们显式地定义IP地址:Shellreceiver$ for i in `seq 1 20`; do ip addr add 192.168.254.$i/24 dev eth2; donesender$ ip addr add 192.168.254.30/24 dev eth31. 简单的方法开始我们做一些最简单的试验。通过简单地发送和接收,有多少包将会被传送?模拟发送者的伪代码:Pythonfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)fd.bind(("0.0.0.0", 65400)) # select source port to reduce nondeterminismfd.connect(("192.168.254.1", 4321))while True: fd.sendmmsg(["x00" * 32] * 1024)因为我们使用了常见的系统调用的send,所以效率不会很高。上下文切换到内核代价很高所以最好避免它。幸运地是,最近Linux加入了一个方便的系统调用叫sendmmsg。它允许我们在一次调用时,发送很多的数据包。那我们就一次发1024个数据包。模拟接受者的伪代码:Pythonfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) fd.bind(("0.0.0.0", 4321)) while True: packets = [None] * 1024 fd.recvmmsg(packets, MSG_WAITFORONE)同样地,recvmmsg 也是相对于常见的 recv 更有效的一版系统调用。让我们试试吧:Shellsender$ ./udpsender 192.168.254.1:4321 receiver$ ./udpreceiver1 0.0.0.0:4321 0.352M pps 10.730MiB / 90.010Mb 0.284M pps 8.655MiB / 72.603Mb 0.262M pps 7.991MiB / 67.033Mb 0.199M pps 6.081MiB / 51.013Mb 0.195M pps 5.956MiB / 49.966Mb 0.199M pps 6.060MiB / 50.836Mb 0.200M pps 6.097MiB / 51.147Mb 0.197M pps 6.021MiB / 50.509Mb测试发现,运用最简单的方式可以实现 197k – 350k pps。看起来还不错嘛,但不幸的是,很不稳定啊,这是因为内核在核之间交换我们的程序,那我们把进程附在 CPU 上将会有所帮助Shellsender$ taskset -c 1 ./udpsender 192.168.254.1:4321 receiver$ taskset -c 1 ./udpreceiver1 0.0.0.0:4321 0.362M pps 11.058MiB / 92.760Mb 0.374M pps 11.411MiB / 95.723Mb 0.369M pps 11.252MiB / 94.389Mb 0.370M pps 11.289MiB / 94.696Mb 0.365M pps 11.152MiB / 93.552Mb 0.360M pps 10.971MiB / 92.033Mb现在内核调度器将进程运行在特定的CPU上,这提高了处理器缓存,使数据更加一致,这就是我们想要的啊!2. 发送更多的数据包虽然 370k pps 对于简单的程序来说已经很不错了,但是离我们 1Mpps 的目标还有些距离。为了接收更多,首先我们必须发送更多的包。那我们用独立的两个线程发送,如何呢:Shellsender$ taskset -c 1,2 ./udpsender 192.168.254.1:4321 192.168.254.1:4321receiver$ taskset -c 1 ./udpreceiver1 0.0.0.0:4321 0.349M pps 10.651MiB / 89.343Mb 0.354M pps 10.815MiB / 90.724Mb 0.354M pps 10.806MiB / 90.646Mb 0.354M pps 10.811MiB / 90.690Mb接收一端的数据没有增加,ethtool –S 命令将显示数据包实际上都去哪儿了:Shellreceiver$ watch "sudo ethtool -S eth2 |grep rx" rx_nodesc_drop_cnt: 451.3k/s rx-0.rx_packets: 8.0/s rx-1.rx_packets: 0.0/s rx-2.rx_packets: 0.0/s rx-3.rx_packets: 0.5/s rx-4.rx_packets: 355.2k/s rx-5.rx_packets: 0.0/s rx-6.rx_packets: 0.0/s rx-7.rx_packets: 0.5/s rx-8.rx_packets: 0.0/s rx-9.rx_packets: 0.0/s rx-10.rx_packets: 0.0/s通过这些统计,NIC 显示 4 号 RX 队列已经成功地传输大约 350Kpps。rx_nodesc_drop_cnt 是 Solarflare 特有的计数器,表明NIC发送到内核未能实现发送 450kpps。有时候,这些数据包没有被发送的原因不是很清晰,然而在我们这种情境下却很清楚:4号RX队列发送数据包到4号CPU,然而4号CPU已经忙不过来了,因为它最忙也只能读350kpps。在htop中显示为:多队列 NIC 速成课程从历史上看,网卡拥有单个RX队列,用于硬件和内核之间传递数据包。这样的设计有一个明显的限制,就是不可能比单个CPU处理更多的数据包。为了利用多核系统,NIC开始支持多个RX队列。这种设计很简单:每个RX队列被附到分开的CPU上,因此,把包送到所有的RX队列网卡可以利用所有的CPU。但是又产生了另一个问题:对于一个数据包,NIC怎么决定把它发送到哪一个RX队列?用 Round-robin 的方式来平衡是不能接受的,因为这有可能导致单个连接中数据包的重排序。另一种方法是使用数据包的hash值来决定RX号码。Hash值通常由一个元组(源IP,目标IP,源port,目标port)计算而来。这确保了从一个流产生的包将最终在完全相同的RX队列,并且不可能在一个流中重排包。在我们的例子中,hash值可能是这样的:Shell1RX_queue_number = hash("192.168.254.30", "192.168.254.1", 65400, 4321) % number_of_queues多队列 hash 算法Hash算法通过ethtool配置,设置如下:Shellreceiver$ ethtool -n eth2 rx-flow-hash udp4 UDP over IPV4 flows use these fields for computing Hash flow key: IP SA IP DA对于IPv4 UDP数据包,NIC将hash(源 IP,目标 IP)地址。即Shell1RX_queue_number = hash("192.168.254.30", "192.168.254.1") % number_of_queues这是相当有限的,因为它忽略了端口号。很多NIC允许自定义hash。再一次,使用ethtool我们可以选择元组(源 IP、目标 IP、源port、目标port)生成hash值。Shellreceiver$ ethtool -N eth2 rx-flow-hash udp4 sdfn Cannot change RX network flow hashing options: Operation not supported不幸地是,我们的NIC不支持自定义,我们只能选用(源 IP、目的 IP) 生成hash。NUMA性能报告到目前为止,我们所有的数据包都流向一个RX队列,并且一个CPU。我们可以借这个机会为基准来衡量不同CPU的性能。在我们设置为接收方的主机上有两个单独的处理器,每一个都是一个不同的NUMA节点。在我们设置中,可以将单线程接收者依附到四个CPU中的一个,四个选项如下:另一个CPU上运行接收器,但将相同的NUMA节点作为RX队列。性能如上面我们看到的,大约是360 kpps。将运行接收器的同一 CPU 作为RX队列,我们可以得到大约430 kpps。但这样也会有很高的不稳定性,如果NIC被数据包所淹没,性能将下降到零。当接收器运行在HT对应的处理RX队列的CPU之上,性能是通常的一半,大约在200kpps左右。接收器在一个不同的NUMA节点而不是RX队列的CPU上,性能大约是330 kpps。但是数字会不太一致。虽然运行在一个不同的NUMA节点上有10%的代价,听起来可能不算太坏,但随着规模的变大,问题只会变得更糟。在一些测试中,每个核只能发出250 kpps,在所有跨NUMA测试中,这种不稳定是很糟糕。跨NUMA节点的性能损失,在更高的吞吐量上更明显。在一次测试时,发现在一个坏掉的NUMA节点上运行接收器,性能下降有4倍。3.多接收IP因为我们NIC上hash算法的限制,通过RX队列分配数据包的唯一方法是利用多个IP地址。下面是如何将数据包发到不同的目的IP:1sender$ taskset -c 1,2 ./udpsender 192.168.254.1:4321 192.168.254.2:4321ethtool 证实了数据包流向了不同的 RX 队列:Shellreceiver$ watch "sudo ethtool -S eth2 |grep rx" rx-0.rx_packets: 8.0/s rx-1.rx_packets: 0.0/s rx-2.rx_packets: 0.0/s rx-3.rx_packets: 355.2k/s rx-4.rx_packets: 0.5/s rx-5.rx_packets: 297.0k/s rx-6.rx_packets: 0.0/s rx-7.rx_packets: 0.5/s rx-8.rx_packets: 0.0/s rx-9.rx_packets: 0.0/s rx-10.rx_packets: 0.0/s接收部分:Shellreceiver$ taskset -c 1 ./udpreceiver1 0.0.0.0:4321 0.609M pps 18.599MiB / 156.019Mb 0.657M pps 20.039MiB / 168.102Mb 0.649M pps 19.803MiB / 166.120Mb万岁!有两个核忙于处理RX队列,第三运行应用程序时,可以达到大约650 kpps !我们可以通过发送数据到三或四个RX队列来增加这个数值,但是很快这个应用就会有另一个瓶颈。这一次rx_nodesc_drop_cnt没有增加,但是netstat接收到了如下错误:Shellreceiver$ watch "netstat -s --udp" Udp: 437.0k/s packets received 0.0/s packets to unknown port received. 386.9k/s packet receive errors 0.0/s packets sent RcvbufErrors: 123.8k/s SndbufErrors: 0 InCsumErrors: 0这意味着虽然NIC能够将数据包发送到内核,但是内核不能将数据包发给应用程序。在我们的case中,只能提供440 kpps,其余的390 kpps + 123 kpps的下降是由于应用程序接收它们不够快。4.多线程接收我们需要扩展接收者应用程序。最简单的方式是利用多线程接收,但是不管用:Shellsender$ taskset -c 1,2 ./udpsender 192.168.254.1:4321 192.168.254.2:4321 receiver$ taskset -c 1,2 ./udpreceiver1 0.0.0.0:4321 2 0.495M pps 15.108MiB / 126.733Mb 0.480M pps 14.636MiB / 122.775Mb 0.461M pps 14.071MiB / 118.038Mb 0.486M pps 14.820MiB / 124.322Mb接收性能较于单个线程下降了,这是由UDP接收缓冲区那边的锁竞争导致的。由于两个线程使用相同的套接字描述符,它们花费过多的时间在UDP接收缓冲区的锁竞争。这篇论文详细描述了这一问题。看来使用多线程从一个描述符接收,并不是最优方案。5. SO_REUSEPORT幸运地是,最近有一个解决方案添加到 Linux 了 —— SO_REUSEPORT 标志位(flag)。当这个标志位设置在一个套接字描述符上时,Linux将允许许多进程绑定到相同的端口,事实上,任何数量的进程将允许绑定上去,负载也会均衡分布。有了SO_REUSEPORT,每一个进程都有一个独立的socket描述符。因此每一个都会拥有一个专用的UDP接收缓冲区。这样就避免了以前遇到的竞争问题:Shell1234receiver$ taskset -c 1,2,3,4 ./udpreceiver1 0.0.0.0:4321 4 1 1.114M pps 34.007MiB / 285.271Mb 1.147M pps 34.990MiB / 293.518Mb 1.126M pps 34.374MiB / 288.354Mb现在更加喜欢了,吞吐量很不错嘛!更多的调查显示还有进一步改进的空间。即使我们开始4个接收线程,负载也会不均匀地分布:两个进程接收了所有的工作,而另外两个根本没有数据包。这是因为hash冲突,但是这次是在SO_REUSEPORT层。结束语我做了一些进一步的测试,完全一致的RX队列,接收线程在单个NUMA节点可以达到1.4Mpps。在不同的NUMA节点上运行接收者会导致这个数字做多下降到1Mpps。总之,如果你想要一个完美的性能,你需要做下面这些:确保流量均匀分布在许多RX队列和SO_REUSEPORT进程上。在实践中,只要有大量的连接(或流动),负载通常是分布式的。需要有足够的CPU容量去从内核上获取数据包。To make the things harder, both RX queues and receiver processes should be on a single NUMA node.为了使事情更加稳定,RX队列和接收进程都应该在单个NUMA节点上。虽然我们已经表明,在一台Linux机器上接收1Mpps在技术上是可行的,但是应用程序将不会对收到的数据包做任何实际处理——甚至连看都不看内容的流量。别太指望这样的性能,因为对于任何实际应用并没有太大用处。2023-08-01 20:07:091
新文化运动的实质是什么?
新文化运动的实质:新兴发资产阶级与封建顽固势力进行的一场关于科学和民主的运动2023-08-01 20:07:124
一下是关于防火墙NAT(地址转换)功能的代码,请帮我解释一下,希望能每一句都解释一下,谢谢!
允许网络中10.1.6.0/24内的所有主机在访问外部网络时,把ip地址转换为175.1.1.3-175.1.1.64地址池中的任一地址 补:10.1.6.0是一个子网,不是一个具体地址这个子网包含10.1.6.1-10.1.6.254这么多个可分配具体地址.2023-08-01 20:07:182
新文化运动的主要内容,“德先生”“赛先生”分别指什么,其具体含义是什么?
"德先生"是指"民主",而"赛先生"""2023-08-01 20:07:226
Node.Js中怎样实现端口重用功能
了解http.js模块:我们都只有要创建一个http服务,必须引用http模块,http模块最终会调用net.js实现网络服务// lib/net.js"use strict"; ...Server.prototype.listen = function(...args) { ... if (options instanceof TCP) { this._handle = options; this[async_id_symbol] = this._handle.getAsyncId(); listenInCluster(this, null, -1, -1, backlogFromArgs); // 注意这个方法调用了cluster模式下的处理办法 return this; } ...};function listenInCluster(server, address, port, addressType,backlog, fd, exclusive) {// 如果是master 进程或者没有开启cluster模式直接启动listenif (cluster.isMaster || exclusive) { //_listen2,细心的人一定会发现为什么是listen2而不直接使用listen // _listen2 包裹了listen方法,如果是Worker进程,会调用被hack后的listen方法,从而避免出错端口被占用的错误 server._listen2(address, port, addressType, backlog, fd); return; } const serverQuery = { address: address, port: port, addressType: addressType, fd: fd, flags: 0 };// 是fork 出来的进程,获取master上的handel,并且监听,// 现在是不是很好奇_getServer方法做了什么 cluster._getServer(server, serverQuery, listenOnMasterHandle);} ...答案很快就可以通过cluster._getServer 这个函数找到代理了server._listen2 这个方法在work进程的执行操作向master发送queryServer消息,向master注册一个内部TCP服务器// lib/internal/cluster/child.jscluster._getServer = function(obj, options, cb) { // ... const message = util._extend({ act: "queryServer", // 关键点:构建一个queryServer的消息 index: indexes[indexesKey], data: null }, options); message.address = address;// 发送queryServer消息给master进程,master 在收到这个消息后,会创建一个开始一个server,并且listen send(message, (reply, handle) => { rr(reply, indexesKey, cb); // Round-robin. }); obj.once("listening", () => { cluster.worker.state = "listening"; const address = obj.address(); message.act = "listening"; message.port = address && address.port || options.port; send(message); });}; //... // Round-robin. Master distributes handles across workers.function rr(message, indexesKey, cb) { if (message.errno) return cb(message.errno, null); var key = message.key; // 这里hack 了listen方法 // 子进程调用的listen方法,就是这个,直接返回0,所以不会报端口被占用的错误 function listen(backlog) { return 0; } // ... const handle = { close, listen, ref: noop, unref: noop }; handles[key] = handle; // 这个cb 函数是net.js 中的listenOnMasterHandle 方法 cb(0, handle);}// lib/net.js/*function listenOnMasterHandle(err, handle) { err = checkBindError(err, port, handle); server._handle = handle; // _listen2 函数中,调用的handle.listen方法,也就是上面被hack的listen server._listen2(address, port, addressType, backlog, fd); }*/master进程收到queryServer消息后进行启动服务如果地址没被监听过,通过RoundRobinHandle监听开启服务如果地址已经被监听,直接绑定handel到已经监听到服务上,去消费请求// lib/internal/cluster/master.jsfunction queryServer(worker, message) { const args = [ message.address, message.port, message.addressType, message.fd, message.index ]; const key = args.join(":"); var handle = handles[key]; // 如果地址没被监听过,通过RoundRobinHandle监听开启服务 if (handle === undefined) { var constructor = RoundRobinHandle; if (schedulingPolicy !== SCHED_RR || message.addressType === "udp4" || message.addressType === "udp6") { constructor = SharedHandle; } handles[key] = handle = new constructor(key, address, message.port, message.addressType, message.fd, message.flags); } // 如果地址已经被监听,直接绑定handel到已经监听到服务上,去消费请求 // Set custom server data handle.add(worker, (errno, reply, handle) => { reply = util._extend({ errno: errno, key: key, ack: message.seq, data: handles[key].data }, reply); if (errno) delete handles[key]; // Gives other workers a chance to retry. send(worker, reply, handle); });}看到这一步,已经很明显,我们知道了多进行端口共享的实现原理其实端口仅由master进程中的内部TCP服务器监听了一次因为net.js 模块中会判断当前的进程是master还是Worker进程如果是Worker进程调用cluster._getServer 去hack原生的listen 方法所以在child调用的listen方法,是一个return 0 的空方法,所以不会报端口占用错误那现在问题来了,既然Worker进程是如何获取到master进程监听服务接收到的connect呢?监听master进程启动的TCP服务器的connection事件通过轮询挑选出一个worker向其发送newconn内部消息,消息体中包含了客户端句柄有了句柄,谁都知道要怎么处理了哈哈// lib/internal/cluster/round_robin_handle.jsfunction RoundRobinHandle(key, address, port, addressType, fd) { this.server = net.createServer(assert.fail); if (fd >= 0) this.server.listen({ fd }); else if (port >= 0) this.server.listen(port, address); else this.server.listen(address); // UNIX socket path. this.server.once("listening", () => { this.handle = this.server._handle; // 监听onconnection方法 this.handle.onconnection = (err, handle) => this.distribute(err, handle); this.server._handle = null; this.server = null; });}RoundRobinHandle.prototype.add = function (worker, send) { // ...};RoundRobinHandle.prototype.remove = function (worker) { // ...};RoundRobinHandle.prototype.distribute = function (err, handle) { // 负载均衡地挑选出一个worker this.handles.push(handle); const worker = this.free.shift(); if (worker) this.handoff(worker);};RoundRobinHandle.prototype.handoff = function (worker) { const handle = this.handles.shift(); const message = { act: "newconn", key: this.key }; // 向work进程其发送newconn内部消息和客户端的句柄handle sendHelper(worker.process, message, handle, (reply) => { // ... this.handoff(worker); });};下面让我们看看Worker进程接收到newconn消息后进行了哪些操作// lib/child.jsfunction onmessage(message, handle) { if (message.act === "newconn") onconnection(message, handle); else if (message.act === "disconnect") _disconnect.call(worker, true); }// Round-robin connection.// 接收连接,并且处理function onconnection(message, handle) { const key = message.key; const server = handles[key]; const accepted = server !== undefined; send({ ack: message.seq, accepted }); if (accepted) server.onconnection(0, handle);}总结net模块会对进程进行判断,是worker 还是master, 是worker的话进行hack net.Server实例的listen方法worker 调用的listen 方法是hack掉的,直接return 0,不过会向master注册一个connection接手的事件master 收到客户端connection事件后,会轮询向worker发送connection上来的客户端句柄worker收到master发送过来客户端的句柄,这时候就可以处理客户端请求了相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!推荐阅读:Vue.js双向绑定项目实战分析jquery如何判断元素内容为空2023-08-01 20:07:321
1915年兴起的新文化运动的主要内容是
新文化运动中民主和科学两面旗帜的树立,使中国许多方面都发生了翻天覆地的变化,还造成了新思想、新理论广泛传播的大好机遇。关于新文化运动的基本内容四个提倡、四个反对的阐述,真正体现出了新文化运动的“新”之所在。即:一、提倡民主,反对专制。二、提倡科学,反对迷信。三、提倡新道德,反对旧道德。四、提倡新文学,反对旧文学。新文化运动的后期进入了宣传十月革命和马克思主义的新阶段。新文化运动的后期进入了宣传十月革命和马克思主义的新阶段。2023-08-01 20:07:391
你已经被淘汰了用英语怎么说
你淘汰了2023-08-01 20:06:333
新文化运动的主要内容是( )
【答案】:D本题主要考查新文化运动的主要内容。新文化运动的主要内容是提倡民主和科学。A项也是新文化运动的内容,但不是主要内容。B.C两项是对民主和科学的具体阐释。2023-08-01 20:06:321
新文化运动前(五四运动前)指导思想和主要内容是什么
宣扬民主,反对封建专制,宣扬科学,反对封建迷信和愚昧2023-08-01 20:06:254
新文化运动前期的主要活动有哪些?
新文化运动的内容(1)前期实质:资产阶级文化反对封建旧文化,是辛亥革命在思想文化领域的延续。(2)内容: 1、思想革命:提倡新道德,反对旧道德 提倡民主与科学,反对封建专制愚昧2、文学革命:提倡新文学,反对旧文学 都把斗争矛头指向儒家传统道德。(3)后期内容:宣传十月革命,宣传社会主义。五四以后,马克思主义的传播成为主流。2023-08-01 20:06:152
权重轮询调度算法(Weighted Round-Robin Scheduling) [C语言实现]
weight[i+1] = a % weight[i+1];这句话导致后面的weight为02023-08-01 20:06:121
Kafka简介+Kafka Tool使用简介+使用实例
详细安装访问: https://www.jianshu.com/p/c74e0ec577b0 macOS 可以用homebrew快速安装,访问地址: https://www.jianshu.com/p/cddd25da8061 原文链接: https://www.jianshu.com/p/06884c5bf3f1 查看topic列表: 创建topic: --create :创建命令; --topic :后面指定topic名称; --replication-factor :后面指定副本数; --partitions :指定分区数,根据broker的数量决定; --zookeeper :后面指定 zookeeper.connect 的zk链接 查看某个topic: Kafka 作为消息系统的一种, 当然可 以像其他消 息中 间件一样作为消息数据中转的平台。 下面以 Java 语言为例,看一下如何使用 Kafka 来发送和接收消息。 1、引入依赖 2、消息生产者 示例 中用 KafkaProducer 类来创建一个消息生产者,该类的构造函数入参是一系列属性值。下面看一下这些属性具体都是什么含义。 bootstrap.servers 表示 Kafka 集群 。 如果集群中有多台物理服务器,则服务器地址之间用逗号分隔, 比如” 192.168.1.1 :9092,192.168.1.2:9092” 。 localhost 是笔者电脑的地址,9092 是 Kafka 服务器默认监听的端口号。 key.serializer 和 value.serializer 表示消息的序列化类型 。 Kafka 的消息是以键值对的形式发送到 Kafka 服务器的,在消息被发送到服务器之前,消息生产者需要把不同类型的 消息序列化为 二 进制类型,示例中是发送文本消息到服务器 , 所以使用的是StringSerializer。 key.deserializer 和 value.deserializer 表示消息的反序列化类型。把来自 Kafka 集群的二进制消 息反序列 化 为指定 的 类型,因为序列化用的是String类型,所以用StringDeserializer 来反序列化。 zk.connect 用于指定 Kafka 连接 ZooKeeper 的 URL ,提供了基于 ZooKeeper 的集群服务器自动感知功能, 可以动态从 ZooKeeper 中读取 Kafka 集群配置信息。 有 了 消息生产者之后 , 就可以调用 send 方法发送消息了。该方法的入参是 ProducerRecord类型对象 , ProducerRecord 类提供了多种构造函数形参,常见的有如下三种 : ProducerRecord(topic,partition,key,value); ProducerRecord(topic,key,value); ProducerRecord(topic, value) ; 其中 topic 和 value 是必填的, partition 和 key 是可选的 。如果指定了 pa时tion,那么消息会被发送至指定的 partition ;如果没指定 partition 但指定了 Key,那么消息会按照 hash(key)发送至对应的 partition: 如果既没指定 partition 也没指定 key,那么 消息会按照 round-robin 模式发送(即以轮询的方式依次发送〉到每一个 partition。示例中将向 test-topic 主题发送三条消息。 3、消息消费者 和消息生产者类似,这里用 KafkaConsumer 类来创建一个消息消费者,该类的构造函数入参也是一系列属性值。 bootstrap. servers 和生产者一样,表示 Kafka 集群。 group.id 表示消费者的分组 ID。 enable.auto.commit 表示 Consumer 的 offset 是否自 动提交 。 auto.commit.interval .ms 用于设置自动提交 offset 到 ZooKeeper 的时间间隔,时间单位是毫秒。 key. deserializer 和 value.deserializer 表示用字符串来反序列化消息数据。 消息消费者使用 subscribe 方法 订阅了 Topic 为 test-topic 的消息。 Consumer 调用poll 方法来轮询 Kafka 集群的消息, 一直等到 Kafka 集群中没有消息或达到超时时间(示例中设置超时时间为 100 毫秒)为止 。 如果读取到消息,则打印出消息记录的 pa此ition, offset、key 等。2023-08-01 20:05:491
新文化运动的性质
新文化运动的性质:新文化运动是我国历史上一次空前的思想大解放运动。新文化运动是一次全面的思想文化革新、文学革命运动,也是中国近代史上一次空前的思想解放运动。这次运动沉重打击了统治中国2000多年的传统礼教,启发了人们的民主觉悟,推动了现代科学在中国的发展,为马克思主义在中国的传播和五四爱国运动的爆发奠定了思想基础。内容:提倡新道德,反对旧道德;提倡新文学,反对旧文学;反对封建专制愚昧,提倡民主与科学。新文化运动的主要内容新文化运动是指20世纪初反对封建文化的思想启蒙运动。由一部分激进的资产阶级、小资产阶级民主主义者发起,目的是要打破封建主义的束缚,力争实现名符其实的资产阶级民主共和国。传播了马克思主义,促进了马克思主义同中国工人运动的结合,为中国共产党的成立创造了条件。新文化运动从内容到形式的深刻变化,是旧民主主义革命向新民主主义革命转变的重要标志之一。2023-08-01 20:05:461
翻译谢谢Using a round-robin design,the researchers asked each student to
rate their classmates,in terms of their likability and of their feelings of academic superiority. They then contrasted those ratings with the students" grades in math,physics,German,and English.Importantly,they conducted the analysis at two different social levels :"habitual"-the way people act in general,and "relationship"-the way someone acts around a specific individual.依照他们的受欢迎程度和他们对学术优势的感觉来评估他们的同学。他们然后把学生在数学、物理、德语和英语方面的成绩与这些评级进行对比,重要的是,他们在两个不同的社会层次进行了分析:“习惯性”(人们通常的行为方式)和“关系”(某些人围绕一个特定个体的行为方式)。前几日有事,没有及时给你翻译,很抱歉。2023-08-01 20:05:411