[Linux] 初学者关于进程与线程的几个问题

一、一个系统中线程ID是否唯一?

就像每个进程有一个进程ID一样,每个线程也有一个线程ID。进程ID在整个系统中是唯一的,但线程ID不同,线程ID只在它所属的进程环境中有效。

这段话选自《UNIX环境高级编程第二版》第11.3节。我第一次看到这段话时,自然而然的认为线程ID既然只在其所述的进程有效,那自然在不同的进程中可以重复才对,不然多浪费资源对吧。但是工作之后我发现事实并不是如此。比如我们在程序设计时经常需要在一定的条件发生时终止某个特定线程,而这时我们的做法是直接给这个线程发终止信号。试想,如果不同的进程拥有相同线程ID的线程,那是不是会出现错杀的情况呢?所以线程的ID在系统中绝对是唯一的

我们也可以从另外一方面去理解这个问题。我们都知道Linux的线程叫轻量级进程(LWP,Light Weight Process),每个进程有一个或者多个线程(LWPs)。系统运行时以线程为执行单元,那如果一个进程没有起其他线程会怎样呢?那这个进程其实就是自己的主线程,所以单线程进程的线程ID就等于该进程ID。因为进程ID系统唯一,所以线程ID也应该系统唯一。

二、进程优先级是数值越大优先级越高吗?还是数值越低优先级越高?

这个问题我开始也搞糊涂了,因为我发现用pstop两个命令看到同一个进程的优先级不一样,用ps看时,数值越大进程优先级越高,用top看时则刚好相反。那到底是怎么回事呢?

首先根据调度策略的不同,我们将进程分为两类:
1. 实时进程
实时进程有SCHE_FIFOSCHE_RR两种调度策略。SCHE_FIFO的进程只有等当前进程执行完才能调度下一个,而SCHE_RR采用时间片轮转的方式进行调度。实时进程的优先级范围为[0,MAX_RT_PRIO-1](MAX_RT_PRIO=100),称为实时优先级,并且只有实时进程有实时优先级,这也是实时进程的静态优先级。Linux会根据实时进程的静态优先级计算优先级权重从而实现调度。

2. 普通进程
普通进程的调度策略为SCHE_OTHER普通进程没有实时优先级,仅根据nice值获得它的静态优先级。并且nice只对普通进程有效,实时进程没有nice值

static_prio=MAX_RT_PRIO + 20 + nice

nice的范围为[-20,19],所以普通进程静态优先级的范围为[100,139]

由上可知进程进程优先级(静态优先级)是数值越大优先级越低,之所以pstop看到的优先级不一样是因为显示的算法不一样。

  • 如下图所示,使用ps -lA看到的进程优先级ps_prio = static_prio - 40。所以图片中看到的watchdog进程实际的(静态)优先级应为0,而khelper进程优先级应为 100(已减去nice值20);
`ps -lA`
  • 使用ps -eo pid,cmd,class,pri,rtprio,ni看到的进程优先级ps_prio = 139-static_prio。此时列出的优先级符合一般的思维,就是显示的数值越大,优先级越高。
`ps -eo pid,cmd,class,pri,rtprio,ni`
  • 使用top看到的进程优先级top_prio = static_prio-MAX_RT_PRIO。
`top`

三、一个线程所在的进程被杀后,该线程会被终止吗?

当然会终止。线程并不能独立运行,线程只是进程的一个执行实体。所以当进程结束时,该进程下的所有线程也就都结束了。但是此时线程退出有正常退出和非正常退出两种情况。Linux创建一个线程的默认状态是joinable,那么这些线程必须由其创建者主动调用pthread_join来回收资源和获取线程退出状态,如果没有调用pthread_join的,就会类似于僵尸进程一样,造成资源浪费。如果不想主动回收,可以在线程中调用pthread_detach来分离线程。这样线程终止时资源就会被系统自动回收。

四、向进程中的一个线程发送终止信号,该进程会退出吗?

如果线程中的任一线程调用了exit_Exit或者_exit,那么整个进程机会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发给线程会终止整个进程。

单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。
(1)线程只是从启动例程中返回,返回值是线程退出码;
(2)线程被同一进程中其他线程取消;
(3)线程调用pthread_exit

五、什么叫优先级反转和优先级继承?

大家都知道多进程使用共享资源时都需要用到锁,以此达到互斥效果,保证共享数据的安全。我们假设此时系统中有A,B,C三个进程,其中A进程和C进程在运行过程中都需要访问同一块共享内存,用一个信号量控制。三个进程的优先级关系为Prio(A) > Prio(B) > Prio(C)。如下图所示,刚开始C进程在运行时获得了信号量,可是还没有执行完时(没有释放信号量),进程A在T1时刻抢占了Cpu并运行。进程A运行时也需要访问共享内存,可是信号量此时在进程C手里,在T2时刻进程A调用sem_wait()让出Cpu。可是这个时候进程C并没有马上得到调度,优先级比C高的进程B获得调度并开始执行。T3时刻,进程B运行完之后才轮到进程C运行。T4时刻,进程C使用完共享资源,用sem_post()让出Cpu,进程A最终得到信号量才继续运行。由此发现,高优先级的进程A的调度与否反而被掌握在了控制了信号量而优先级低它很多的进程C手里,这种情况就叫优先级反转。

优先级反转

优先级继承就是为了解决优先级反转的问题。如下图所示,在T2时刻,Linux使进程C临时获得进程A的高优先级以保证得到调度,等进程C使用完共享数据并释放信号量,恢复进程C的优先级。

优先级继承

六、未完待续......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,085评论 0 23
  • 作者:杨兴强原文来源:开点工作室(ID:kaidiancs) 一.从一个例子开始 看着Java线程执行起来的那种任...
    开点工作室阅读 6,758评论 2 28
  • 今天去健身房,上了一节普拉提课,有的动作有难度,但也要坚持做完,做什么事开始的时候都是最困难的,但只要能坚持,我就...
    冰咋吃阅读 116评论 0 0
  • 产品经理受大多数人诟病的原罪就是需求变更。当设计师或开发人员加班加点做的差不多时,产品经理要改需求,那大家肯定都会...
    璟扬阅读 1,035评论 2 14
  • 哇咔咔。我住的城市终于在连续好多天的阴雨天之后迎来了满满的暖暖的阳光。 很舒服的天气。现在坐在寝室阳台上码字。感觉...
    文字是本命耶阅读 182评论 0 2