进程与进程调度
文章平均质量分 89
guoguangwu
这个作者很懒,什么都没留下…
展开
-
linux内核中的互斥操作
内核中的很多操作在进行的过程中都不容许受到打扰,最典型的例子就是队列操作。如果两个进程都要将一个数据结构链入到同一个队列的尾部,要是在第一个进程完成了一半的时候发生了调度,让第二个进程插了进来,结果很可能就乱了。类似的干扰也有可能来自某个中断服务程序或bh函数。在多处理器SMP结构的系统中,这种感染还有可能来自另个处理器。不过,除了一个进程主动调用schedule染出CPU的情况(显然不会发生在不容许收到干扰的过程中途)之外,只有在系统空间返回到用户空间的前夕才有可能发生调度。这样的安排使得上述两个进程原创 2021-12-25 15:43:49 · 1410 阅读 · 0 评论 -
linux内核-系统调用nanosleep()与pause()
处于种种原因,运行中的进程常常需要主动进入睡眠状态,并发起一次调度让出CPU。这一定要通过系统调用,或者在系统调用内核才能做到。注意,前面的博客中讲到的系统调用sched_yield与此有所不同,那只是让内核进行一次调度,而当前进程继续保持可运行状态。而这里所说的是,当前进程进入睡眠,也就是将进程的状态变成TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE,并从可执行队列中脱钩,调度的结果一定是其它进程得以运行。并且,进程一旦进入睡眠状态,就需要经过唤醒才能将状态恢复成TASK_原创 2021-12-19 11:44:18 · 5470 阅读 · 0 评论 -
linux内核-强制性调度
linux内核中进程的强制性调度,也就是非自愿的、被动的、剥夺式的调度,主要是由时间引起的。前面讲过,这种调度发生在进程从系统空间返回用户空间的前夕。当然,并非每次从系统空间返回到用户空间时都会发生此类调度。从前面博客引用entry.S的代码片段ret_with_reschedule可以看出,此时是否真的调用schedule,最终还要取决于当前进程task_struct结构中的need_resched是否为1(非0)。因此,问题就归结为当前进程的need_resched是在什么情况下才置成1的。在目前版本的原创 2021-12-19 11:21:53 · 1177 阅读 · 0 评论 -
linux内核-进程的调度与切换
在多进程的操作系统中,进程调度是一个全局性的、关键性的问题,它对系统的总体设计、系统的实现、功能设置以及各个方面的性能都有着决定性的影响。根据调度结果所做的进程切换的速度,也是衡量一个操作系统性能的重要指标。进程调度机制的设计,还对系统复杂性有着极大的影响,常常会由于实现的复杂程度而在功能与性能方面做出必要的权衡和让步。一个好的系统的进程调度机制,要兼顾三种不同应用的需要:...原创 2021-12-12 22:45:44 · 1924 阅读 · 0 评论 -
linux内核-系统调用exit与wait4
系统调用exit与wait4的代码基本上都在kernel/exit.c中,下面我们在引用代码时凡不特别说明出处的均来自这个文件。先来看exit的实现(kernel/exit.c):asmlinkage long sys_exit(int error_code){ do_exit((error_code&0xff)<<8);}显然,其主体为do_exit。先看它的前半部:NORET_TYPE void do_exit(long code){ struct t原创 2021-12-05 15:37:22 · 1609 阅读 · 0 评论 -
linux内核-系统调用execve()
读者在linux内核-系统调用fork、vfork与clone中已经看到,进程通常是按其父进程的原样复制出来的,在多数情况下,如果复制出来的子进程不能与父进程分道扬镳,走自己的路,那就没多大意义。所以,执行一个新的可执行程序时进程生命历程中关键性的一步。linux为此提供了一个系统调用execve,而在C语言的程序库中则又在此基础上向应用程序提供一整套的库函数,包括execl、execlp、execle、execlco、execve和execvp。此外,还有库函数system,也与execve有...原创 2021-11-28 22:01:27 · 4247 阅读 · 2 评论 -
linux内核-系统调用fork、vfork与clone
前面已经简要地介绍过fork与clone二者的作用于区别。这里先来看一下二者在程序设计接口上的不同:pid_t fork(void);int clone(int (*fn)(void *), void *stack, int flags, void *arg, ... /* pid_t *parent_tid, void *tls, pid_t *child_tid */ );系统调用clone的主要作用是创建一个线程,这个线程可以是内核线程,也可以是用户线程。原创 2021-11-21 16:39:45 · 2321 阅读 · 0 评论 -
linux内核-进程三部曲:创建、执行与消亡
就像世上万物都有产生、发展与消亡的过程一样,每个进程也有被创建、执行某段程序以后最后消亡的过程。在linux系统中,第一个进程时系统固有的、与生俱来的或者说是由内核的设计者安排好了的。内核在引导并完成了基本的初始化以后,就有了系统的第一个进程(实际上是内核线程)。除此之外,所有其他的进程和内核线程都由这个原始进程或其子孙进程所创建,都是这个原始进程的后代。在linux系统中,一个新的进程一定要由一个已经存在的进程复制出来,而不是创造出来(而所谓创建实际就是复制)。所以,linux系统(Unix也一样)并不向原创 2021-11-21 09:29:27 · 927 阅读 · 0 评论 -
linux内核-进程与进程调度
进程四要素要给进程下一个确切的定义不是件容易的事情。不过,一般来说linux系统中的进程都具备下列诸要素:有一段程序供其执行,就好像一场戏要有个剧本一样。这段程序不一定是进程所专有,可以与其他进程共用,就好像不同剧团的许多场演出可以共用一个剧本一样。 有起码的私有财产,这就是进程专用的系统堆栈空间。 有户口,这就是在内核中的一个task_struct数据结构,操作系统教科书中常称为进程控制块。有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。同时,这个结构又是进程的财产登记卡,原创 2021-11-07 20:09:41 · 515 阅读 · 0 评论