linux内核架构学习笔记(1)进程管理和调度

134 阅读3分钟

进程调度对于一个操作系统来讲是至关重要的,微观上来讲,单核cpu在同一时间内只能执行同一个任务,但是操作系统可以为cpu提供的计算资源进行调度,让使用者在宏观上看,进程是同时进行的。

这种管理方式同时也告诉了我们,为了使这种“同时“运行的任务更顺滑,且不会出错,所以就必须解决以下的几个问题:

1、	非其他要求,进程间不能彼此干扰。

2、	CPU时间需更加公平的共享

3、	切换进程时,必须确保运行环境被及时储存以及完全复原。

对于实时操作系统来讲,为了保证任务在规定时限内完成,需要让高优先级的任务得到更快的响应,那么何时让高优先级的进程得到相应,这里就需要分可抢占式内核和不可抢占式内核。

这里我们不详细赘述,linux是分时操作系统,操作系统通过时间片来分配CPU时间,优先级相对较高的进程则会在这一个时间片内得到更多的时间,这种调度方案称之为抢占式多任务处理。

在讨论调度器如何分配CPU时间之前,需要说一个很基本的东西,一个进程可能拥有的状态。

1、	运行:进程占用CPU时间片进行运算。

2、	等待:已就绪,在等待队列中,但并没有得到CPU

3、	睡眠:很多种称呼,挂起,阻塞,未准备好,无法运行状态。

所有的进程都保存在一个进程表中,无论是以上的哪种状态。 接下来需要介绍的概念是两种进程运行时根据运行空间的不同而区分的两种状态,一种是运行在内核空间的核心态,一种是运行在用户空间用户态,两种状态主要是权限的区别,如果权限没有区别,那么,建立的保护机制都是多余的。

进程运行时,可以通过两种方法切换到核心态,一种是系统调用,另一种是终端,中断是自动触发的相较与主动调用的系统调用来讲,这种中断的发生是不可预测的。

对于进程,还需要介绍的一点是,典型的UNIX进程包括,二进制代码组成的应用程序,单线程,分配给应用程序的一组资源。不管进程或者线程,对于任务调度来讲,他们都属于调度的单独的一个任务。

命名空间:

类似于其他高级语言提供的命名空间概念,在Linux中,命名空间代表把原来全局共享的资源拆分成很多个被一组进程共享的资源。

想象一种场景,当一台linux主机需要给很多不同的用户提供完全的执行权限时,包括root权限,使用虚拟环境是一种不错的选择,但是资源的分配可能做的不会很好,Linux的命名空间就可以实现这种功能。

本质上,命名空间建立了系统的不同视图,不同命名空间下的进程对于系统来讲,资源仍然是全局唯一的,但在命名空间内的资源却无法提供在容器外部的唯一ID。 实现这种机制的主要方式是子空间对父空间的映射,如下图

对于命名空间来讲,抛开进程是没有意义的,命名空间内的所有进程都被删除后,命名空间也会被删除