<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Archive for 2021-11 on chengzhycn&#39;s blog</title>
		<link>https://blog.jinzhi.site/posts/2021-11/</link>
		<description>Recent content in Archive for 2021-11 on chengzhycn&#39;s blog</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Tue, 30 Nov 2021 08:30:28 +0800</lastBuildDate>
		
			<atom:link href="https://blog.jinzhi.site/posts/2021-11/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Linux 进程</title>
				<link>https://blog.jinzhi.site/posts/2021-11/linux-%E8%BF%9B%E7%A8%8B/</link>
				<pubDate>Tue, 30 Nov 2021 08:30:28 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2021-11/linux-%E8%BF%9B%E7%A8%8B/</guid>
				<description>&lt;h2 id=&#34;进程和轻量级进程&#34;&gt;进程和轻量级进程&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.jinzhi.site/images/notes/linux-%E8%BF%9B%E7%A8%8B/image-20211112165309944.png&#34; alt=&#34;image-20211112165309944&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;在Linux内核中，进程/线程对应的数据结构是&lt;code&gt;task_struct&lt;/code&gt;，定义在&lt;code&gt;include/linux/sched.h&lt;/code&gt;中。&lt;/p&gt;&#xA;&lt;p&gt;线程在Linux中的实现是 &lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Native_POSIX_Thread_Library&#34;&gt;Naive POSIX Thread Library&lt;/a&gt;&lt;/strong&gt; 。在内核眼中，Linux的线程实际上也是一个进程（&lt;code&gt;task_struct&lt;/code&gt;），区别是线程的“进程”共享了地址空间、文件描述符等，称作==&lt;strong&gt;轻量级进程&lt;/strong&gt;==。因此，Linux的线程也是独立的调度单元，是可以分别在不同的CPU上同时运行的。原生的Linux 线程（2.6版本内核之前）因为只实现在了用户态，所以，即使是一个多线程程序，对于内核来说只能看到一个进程，这些线程就只能在一个CPU上运行，对于多核多线程来说是很致命的。&lt;/p&gt;&#xA;&lt;p&gt;从实现的角度，Linux的线程（LWP）是通过pthread库创建/使用的。而进程和线程的创建都调用了&lt;code&gt;clone()&lt;/code&gt;系统调用（&lt;code&gt;kernel/fork.c&lt;/code&gt; ）。区别是两者使用了不同的flags。&lt;/p&gt;&#xA;&lt;h2 id=&#34;进程管理&#34;&gt;进程管理&lt;/h2&gt;&#xA;&lt;h3 id=&#34;进程状态&#34;&gt;进程状态&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;TASK_RUNNING&lt;/strong&gt;: The process is either executing on a CPU or waiting to be executed&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;TASK_INTERRUPTIBLE&lt;/strong&gt;: The process is suspended (sleeping) until some condition becomes true.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;TASK_UNINTERRUPTIBLE&lt;/strong&gt;: Like TASK_INTERRUPTIBLE, except that delivering a signal to the sleeping process leaves its state unchanged.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;pid&#34;&gt;PID&lt;/h3&gt;&#xA;&lt;p&gt;PID用来区分不同的进程结构体。Linux中最大PID数目可以在&lt;code&gt;/proc/sys/kernel/pid_max&lt;/code&gt;中查看。&lt;/p&gt;&#xA;&lt;p&gt;每个进程/轻量级进程都分配有一个唯一的PID。但是对于同一进程中的线程来说，我们拿到的是进程ID确是相同的，这是怎么实现的呢？&lt;/p&gt;&#xA;&lt;p&gt;Linux为了兼容POSIX标准，利用了线程组（thread group）这一概念。所有的线程都会把线程组里面第一个线程的PID存在tgid字段内。==getpid()系统调用返回的实际上是tgid的值。==&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * sys_getpid - return the thread group id of the current process&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Note, despite the name, this returns the tgid not the pid.  The tgid and&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * the pid are identical unless CLONE_THREAD was specified on clone() in&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * which case the tgid is the same in all threads of the same group.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * This is SMP safe as current-&amp;gt;tgid does not change.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;SYSCALL_DEFINE0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getpid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;task_tgid_vnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;bitmap管理pid&#34;&gt;bitmap管理PID&lt;/h4&gt;&#xA;&lt;h4 id=&#34;idr管理pid&#34;&gt;IDR管理PID&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PID: replace pid bitmap implementation with IDR API &lt;a href=&#34;https://git.kernel.org/linus/95846ecf9dac5089aed4b144d912225f8ef86ae4&#34;&gt;commit&lt;/a&gt;, &lt;a href=&#34;https://git.kernel.org/linus/e8cfbc245e24887e3c30235f71e9e9405e0cfc39&#34;&gt;commit&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;进程切换&#34;&gt;进程切换&lt;/h2&gt;&#xA;&lt;p&gt;==&lt;strong&gt;TLDR&lt;/strong&gt;：进程在调用&lt;code&gt;schedule()&lt;/code&gt;方法时，将当前进程运行的寄存器信息保存在&lt;code&gt;task_struct-&amp;gt;thread_info&lt;/code&gt;内，同时从进程B中的&lt;code&gt;task_struct-&amp;gt;thread_info&lt;/code&gt;中加载B运行时的寄存器信息。==&lt;/p&gt;</description>
			</item>
			<item>
				<title>正念冥想</title>
				<link>https://blog.jinzhi.site/posts/2021-11/%E6%AD%A3%E5%BF%B5%E5%86%A5%E6%83%B3/</link>
				<pubDate>Sat, 27 Nov 2021 08:30:28 +0800</pubDate>
				<guid>https://blog.jinzhi.site/posts/2021-11/%E6%AD%A3%E5%BF%B5%E5%86%A5%E6%83%B3/</guid>
				<description>&lt;h2 id=&#34;正念是什么&#34;&gt;正念是什么&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;与事物的现实性达成一致，我们可以通过拥抱它们来接受它们，在一刻一刻的觉知里。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;正念不是一个概念，而是一种与生命保持&lt;strong&gt;明智关系&lt;/strong&gt;的方式，在生命唯一的当下展开。&lt;/p&gt;&#xA;&lt;h2 id=&#34;正念的态度因素&#34;&gt;正念的态度因素&lt;/h2&gt;&#xA;&lt;p&gt;如果想要长期地实践正念，并将正念融入到生活当中，那么我们需要关注一些正念的态度因素。对于这些正念的态度因素，最主要的是让这些概念融入到脑内，心里，而并非是强制遵守它。记住即可。&lt;/p&gt;&#xA;&lt;h3 id=&#34;不做评判&#34;&gt;不做评判&lt;/h3&gt;&#xA;&lt;p&gt;不做评判并不意味着我们不去对事件品头论足，而是说==&lt;strong&gt;意识到在做评判，并且有目的地不陷入到评判中，这本身就是一种美丽而又温柔的修习。&lt;/strong&gt;==从某种意义上来说，这种修习的目的是让我们==足够关心自己以及我们所处的环境，从而不会有那种瞬间崩溃，也不会拘泥于喜欢或者不喜欢，想要或者不想要。==归根结底，当我们做出一个评判时，实际上我们就成为了它的囚徒。因为当事情发生时，评判降低了我们应对挑战的可能性。我们会困在一个观点中，而这个观点可能并不是一个完整地故事，完整地视角（盲人摸象）。&lt;/p&gt;&#xA;&lt;p&gt;==&lt;strong&gt;关键点：不被自己地喜欢和厌恶所禁锢。把自己从下意识去评判“好”与“恶”这个习惯中解救出来，从自己的欲望和恐惧中解救出来。&lt;/strong&gt;==&lt;/p&gt;&#xA;&lt;h3 id=&#34;耐心&#34;&gt;耐心&lt;/h3&gt;&#xA;&lt;p&gt;当我们失去耐心时，受害者往往是与我们生活在一起的人，我们最爱的人，还有和我们一起工作的人。&lt;/p&gt;&#xA;&lt;p&gt;我们都希望朝着一个真正变化的、有益的方向前进。但如禅语所说，==&lt;strong&gt;&amp;ldquo;you can&amp;rsquo;t push the river&amp;rdquo;&lt;/strong&gt;==，不能逆势而为。为了到达某个地方而逼自己加快脚步是不明智的，因为这样往往会让自己忘记了真正的目的。&lt;/p&gt;&#xA;&lt;p&gt;耐心是我们可以培养的一种非常可贵的品质。特别是在我们当下这个时代，它显得愈发重要。在这个电子信息时代，我们被电子产品吸引，甚至对其上瘾。我们的社会变成了一个点击型社会，所有在手机或者电脑上呈现的东西，逐步变得愈来愈“快餐”和“标题党”。它们通过社交媒体分发给我们，给我们想要的东西。这些“快餐”或者朋友圈的“点赞”实际上触发了我们大脑中神经元的连接，刺激多巴胺的释放，在这一瞬间会给人你一种非常非常满足的感觉。我们会因为朋友圈的一个“点赞”获得极大的满足感，但是这只持续了不到一秒，然后呢？我们会想要更多。我们开始观察社交媒体的生态，然后变得愈发不耐烦，这就是上瘾的一种表现，而我们甚至对此都毫无觉察。&lt;/p&gt;&#xA;&lt;p&gt;所以耐心实际上培养了对这种事情的免疫力。因为当我们意识到有那种想要得到什么的冲动时，我们可以让自己慢下来（延迟满足）。==&lt;strong&gt;所以在一整天里，不断地觉察到自己有多么不耐烦，这便能帮助我们培养耐心。&lt;/strong&gt;==&lt;/p&gt;&#xA;&lt;p&gt;我们不必强迫自己变得耐心，而是去关注那些真的陷进去的时刻，强烈地想要去得到某个结果，然后引发出一系列蝴蝶效应般的结果，最后我们再也无法被满足（成瘾）。&lt;/p&gt;&#xA;&lt;h3 id=&#34;初学者心态&#34;&gt;初学者心态&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In the beginner&amp;rsquo;s mind there are many possibilities, in the expert&amp;rsquo;s mind, there are few.&lt;/p&gt;&#xA;&lt;p&gt;—— Suzuki Roshi（铃木俊隆）&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;==&lt;strong&gt;在某种意义上，我们所知道地一切都会妨碍我们看到那里的一些东西。因为我们是在透过我们的有色眼镜看面前的东西。&lt;/strong&gt;==原有的知识结构，可能会演变为严重的问题。因为它会限定你，让你在已知的领域中对那些新兴未知的苗头视而不见，而那才是你想要发现的，全新的，前所未见的东西。&lt;/p&gt;&#xA;&lt;h3 id=&#34;信任&#34;&gt;信任&lt;/h3&gt;&#xA;&lt;p&gt;将信任带入修习实际上是在提醒自己有很多我们可以信任的东西，就比如我们可以相信我们的呼吸正在i体内穿梭，我们的脚将带着我们前行，我们的心脏仍会在今晚继续跳动。这些都是在提醒我们&lt;strong&gt;在当下这个时刻发生的事情中，有多少是可信的，是真正值得信任的。&lt;/strong&gt; 最重要的是，我们的心是否值得信赖。==&lt;strong&gt;唯一能让自己的新值得信赖的方法就是相信自己，相信自己值得信赖，即便是我们把注意力放在了可能辜负自己或者他人信任的事情上&lt;/strong&gt;==。&lt;/p&gt;&#xA;&lt;p&gt;信任是深刻的，象征洞察力的源泉。它包括如何将内在与外在的经历发散开，使其保持良好的关联。&lt;/p&gt;&#xA;&lt;h3 id=&#34;不争&#34;&gt;不争&lt;/h3&gt;&#xA;&lt;p&gt;不争不是反对积极。**不争可能会要你去做更多的事情——不依附于结果，不去拼命让结果显得更好，而是确保当下正在做的每一件都具有完整性，然后水到渠成。**现实中我们会有DDL，会有一些杂七杂八的事情，看起来和不争的概念相悖。但是当把不争带到我们的意识前，让我们专注于当下，实际上可以帮助我们更快地完成工作。&lt;/p&gt;&#xA;&lt;p&gt;当你的目标非常明确的时候，不争是很有效的。当我们太执着于胜利的结果时，可能会得不到很好的结果，因为心浮气躁。不争是将我们对胜利的渴望剥离出来，这并不意味着我们会成为一个消极的人，总是一事无成。&lt;/p&gt;&#xA;&lt;h3 id=&#34;接纳&#34;&gt;接纳&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;接纳意味着看到事物的现实，承认并接受它们就是这样的。&lt;/strong&gt; 接纳并不意味着我们不能努力去改变它们，接纳意味着看清现实，意味着你有时会意识到一些不可接受的事情。然后的问题是，我们该如何与这些不可容忍的事情，需要改变的事情保持明智的关系？这和消极的顺从一点关系都没有。&lt;/p&gt;&#xA;&lt;p&gt;==&lt;strong&gt;我们需要看到真实的现实，正在发生的一切，看到它的复杂性以及简洁性。看得清楚，然后开始行动。接纳意味着对事物的现状有深刻洞察的认识，如果你是唯一一个看清这件事情走向的人，相信自己。&lt;/strong&gt;==&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
