1.内核的线程、进程与特权

1.内核的任务

纯技术层面,内核是硬件和软件之间的一个中间层,作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。

  1. 从应用层来讲,内核可以被认为是一台增强的计算机。应用程序与硬件本身没有关系。
  2. 程序并发运行时,内核被视为资源管理器
  3. 将内核视为

2.内核实现的策略

  1. 微内核:最基本的功能由中央内核(微内核)实现,所有其他功能都委托给一些独立进程,这些进程通过有明确定义的通信接口与中心内核通信。每个进程负责独立的模块,如各种文件系统与内存管理等,各个部分都彼此清除的话分开来,好处是动态扩展性和在运行时切换重要组件,坏处就是进程间通信开销比较大。
  2. 宏内核:内核的全部代码都打包到一个文件中,内核的每个函数都可以访问内核的其他部分。
  3. 宏内核的弥补:模块化设计。

3.进程

传统上,UNIX操作系统下运行的应用程序、服务程序以及其他程序都称为进程,如果进程想要彼此通信那么必须使用特定的内核机制。

4.进程切换与调度

Linux是多任务系统,采用并发式。系统中同时真正在运行的进程数目最多不超过CPU的数目,因此内核会按照短时间间隔在不同进程之间切换,造成多进程的假象:

  1. 通过在撤销进程的CPU资源之前保存进程所有与状态相关的要素,并将进程置于空闲状态,即可达到这一目的。在重新激活进程时,则将保存的状态原样恢复,进程间的切换称之为进程切换。
  2. 内核还必须明确如何在现存进城之间共享CPU时间。重要进程得到的CPU时间多一点,,次要进程得到的少一点。确定那个进程运行多长时间的过程称为调度

5.UNIX进程

所有的进程都有一个父进程,内核启动的init进程是第一个进程,该进程负责进一步的系统初始化硬件,并显示登录提示符与登录界面。Init进程是进程树的根,所有进程均直接或者间接源自该进程。

进程0:空闲进程

进程1init进程,内核启动之后维护的一个进程,该init进程完成内核态到用户态的转变,用户态的init进程主要是加载了根文件系统。

进程2:守护进程。

进程树结构与新进程的创建有关系。UNIX操作系统有两种创建进程的机制:fork和exec;

  1. fork可以创建当前进程的一个副本,父进程和子进程只有PID(进程ID)不同。在该系统调度执行之后,系统中有两个进程,都执行同样的操作,父进程的内容被复制。Linux使用了一个技术写时复制(copy on write):主要原理是将内存复制操作延迟到父进程或子进程向某内存页面写入数据之前,在只读访问的情况下父进程和子进程可以共用同一内存页。
  2. exec将一个新进程加载到当前进程的内存中并执行。旧进程的内存页将刷出,其内容将替换为新的数据,然后开始执行新程序。

6.线程

进程并不是内核支持的唯一程序执行形式,还有线程。我们成进程为重量级进程,线程为轻量级进程。本质上进程可能有若干线程组成,这些线程共享同样的数据和资源。

进程可以看做一个正在执行的程序,而线程则是与主程序并行运行的程序函数或例程。

举例:

使用进程时:浏览器需要并行加载若干图像时,通常浏览器需要执行几次fork和exec调用,以创建若干并行的进程例程。这些进行负责加载图像,并用某种通信机制将接收的数据提供给主程序。

使用线程时:浏览器定义了一个例程来加载图像,可以将例程作为线程启动。使用多个不同参数的多个线程即可。由于线程和主程序共享同样的地址空间,主程序就可以自动访问接收到的数据。因此除了为了防止线程访问同一内存区而采取的互斥机制外,就不需要什么通信了。

Linux用clone方法创建线程。

7.地址空间

由于内存区域是通过指针访问的,因此CPU的字长决定了所能管理的地址空间的最大长度。

地址空间的最大长度与实际可用的物理内存数量无关,因此被称为虚拟地址空间

Linux将虚拟地址空间划分为两个部分:内核空间和用户空间。

由于地址空间是虚拟化的结果,每个用户进程都认为自身有3GB的内存。各个系统进程的用户空间是完全彼此分离的。内核空间的进程一样如此。

8.特权级别

特权级(Ring)也叫(hierarchical protection domains),有的也称为用户态(user mode)。它是一种机制来保护数据和阻止恶意行为(确保计算机安全)。电脑操作系统提供不同权限访问级别的资源。特权级分为4级,特权级0、1、2、3。

http://hi.csdn.net/attachment/201202/15/0_1329317885tx6v.gif

数字越小表示的特权级越大较为核心的代码和数据,将被存放在特权级较高的层级中。处理器将用这样的机制来避免低特权级的任务在不被允许的情况下访问位于高特权级的段。

原因:用户态禁止访问内核空间。用户进程不能操作或者读取内核空间的数据,也无法执行内核空间中的代码,这是内核的专用领域,这种机制可防止进程无意间修改彼此的数据而造成的干扰。

打破的具体方法:1)系统调用,2)异步中断激活。

9.一致代码段和 非一致代码段

系统要安全,必须保证内核与用户程序分离开,内核要安全,必须不能被用户来打扰。但是有的时候,用户程序也是需要访问内核中的部分数据,那怎么办?于是操作系统就将内核中的段分为共享的代码段和非共享的代码段两部分。其中一致代码段就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接访问的代码。

一致代码段的限制作用:

(1)特权级高的代码段不允许访问特权级低的代码段:即内核态不允许调用用户态下的代码。

(2)特权级低的代码段可以访问特权级高的代码段,但是当前的特权级不发生变化。即:用户态可以访问内核态的代码,但是用户态仍然是用户态。

非一致代码段:为了避免低特权级的访问而被操作系统保护起来的系统代码,也就是非共享代码。

非一致代码段的限制作用:

(1)只允许同特权级间访问

(2)绝对禁止不同级间访问,即:用户态不能访问内核态,内核态也不访问用户态。

在ps命令的输出中很容易识别内核线程,其名称都置于方括号内。在 多处理器系统上,许多线程启动时指定了CPU,并限制只能在某个特定的CPU上运行。从内核线程名称之后的斜线和CPU编号可以看到这一点。

猜你喜欢

转载自blog.csdn.net/wangdapao12138/article/details/81610334
今日推荐