操做系统知识回顾---进程线程模型

1、进程模型linux

(一)多道程序设计程序员

从系统容许多个程序同时进入CPU那一天开始,咱们才有了进程,这个对CPU资源的抽象。咱们把这种多个程序同时运行在CPU的状况叫作多道程序。其优势没必要赘述,举个例子,单一程序设计时,比如公交车上每次只能坐一我的,多道之后,就能坐多我的,有上有下。也是基于这样的设计思路,才有如今的各类貌似高端的技术。多道,跟中断,DMA,SPOOLer一并,被称为计算机操做系统发展史上里程碑同样的创造。web

(二)进程定义算法

在某个数据集合上,具备独立功能的程序运行过程,叫作进程。英文里有许多叫法(process task job)固然换汤不换药,不一样时代的产物罢了。进程的出现,解决了程序并发执行时对系统资源共享的描述问题,同时顺路解决了程序执行时动态特征的描述问题。虽然是抽象出来的概念,但做为程序员,那东西是存在的。数据库

(三)进程控制操做windows

进程控制的目的是为进程完成生命周期指明方向,保驾护航。系统建立了进程,必定要负责到底。从进程建立,撤销,到状态转换中的阻塞,唤醒,挂起,激活,同时还有进程间优先级的控制。这些控制指令都是经过“原语”实现的,这个词不出意外最早是在数据库基础知识中学到的,对滴,不能被打断,打断就抛弃结果。对于系统,没有被打断的可能性。缓存

此处加一个小插曲:进程的建立fork()的执行过程服务器

1.为子进程分配一个空闲进程描述符;网络

2.赋予子进程惟一标示符pid;数据结构

3.以一次一页的方式复制父进程的地址空间(这是Unix的实现方式,linux引入COW技术);

4.子进程得到父进程共享资源的指针;

5.子进程进入就绪态,加入调度队列;

6.子进程返回0,向父进程返回pid。

(四)进程分类及进程层次结构

系统进程vs用户进程,系统进程优先于用户进程

前台进程vs后台进程,先后台进程有优先级的区别,前台每每高于后台

计算密集vsI/O密集,决定了调度策略,是系统设计时讨论的话题

进程的层级结构有树形(unix)和平行结构(windows)

(五)进程状态切换

基本状态为三态及转换,如图1

发展一下成为五态模型,加入了建立和撤销两个case,如图2

再复杂一点,加入挂起原语,使得就绪和阻塞有挂起状态,增长了系统调度复杂性,但提升了灵活度,下降调度难度。如图3

linux中包含五种状态,使用宏进行了定义:

TASK_RUNNING对应运行态,TASK_INTERRUPTIBLE可中断态,TASK_UNINTERRUPUTIBLE不可中断态,两种是就绪态中的不一样方向

TASK_ZOMBIE僵死状态,对应于阻塞态,TASK_STOPPED中止态,对应于进程的撤销状态。五个状态之间的转换,如图4

(六)进程控制块

就像开车得有方向盘,管理得有管理的可控对象,对于进程来说,PCB就是进程的方向盘,他是一个专门的数据结构,记录了进程的外部特征,描述了进程的运动过程,标记了进程在整个生命周期中的活动,成为了系统感知进程存在的惟一标识。这个数据结构中包含了三个方面的内容:

进程管理,内存管理,文件管理

看上去就很容易理解了,OS的大部分功能经过进程来实现,因此进程中必须包含实现操做系统功能的“方向盘”。这些内容中,多数是记录了管理相应对象的主指针,以及指向不一样管理对象描述块的指针,好比文件管理,指向文件描述块,就是咱们常说的FCB等。

在linux系统中,TCB被具体实现为task_struct其中包含了进程调度 pid,信号处理,状态管理,进程队列指针,定时控制,信号量管理,上下文切换,文件系统管理,内存管理等等。这个数据结构能看懂,看完,你的Linux内核分析工做就能够开始了。

(七)进程虚拟地址空间

内存管理模块会在进程建立的时候分配地址空间,这些空间被进程划分为四大部分:

PCB占用,用户栈空间,私有用户空间(代码),共享空间。其中,PCB占用的部分又划分为PCB号,进程状态,进程控制信息

(八)进程上下文环境

首先应该明白什么叫作上下文,小学语文的时候,老师就会让咱们结合上下文来猜不认识的词的意思,中学英语老师也有这个习惯。如今,这个方式仍然适用,只不过是系统用,他需呀这个上下文信息来猜咱们运行到哪里了,进程是什么状况了。咱们读完上文,就会记住,而后去读下文,最后综合上下文进行猜词。系统也得这么作。也就是保存上下文信息,分析当前进程运行状态。

上下文信息在系统中指的是用户地址空间内容,可能是指正在运行的程序,硬件寄存器内容,多指程序运行状态,该进程相关的核心数据结构最新内容。根据不一样的操做对象,咱们又把上下文信息分为三种,

用户级上下文:用户地址空间,用户栈信息,程序段信息(代码段,数据段)

系统级上下文:静态信息(PCB,资源使用表)动态信息(核心栈)

寄存器级上下文:PC IP SP ABCD那一些寄存器内部的信息,若是不太懂,能够看组成原理,也能够等个人AT&T汇编指令笔记一文,那里头会讲这些枯燥的符号

再加一个小插曲:中断处理和进程调度的关系,实际上就是当系统发生中断,进程做何反应?

来个原汁原味的图图来讲明,英文很差,仍是转行吧,别作IT了。如图5

2、线程模型

(一)线程引入

操做系统课程里,陈老师喜欢用字处理软件和web服务器两个例子引入线程,估计是翻译外文书的结果,我也喜欢翻译外文书,估计是找了个翻译专业的媳妇的结果,哈哈哈,说远了。此处也给你们简单介绍一下这两个模型。

1.字处理软件,比较常见的就是word,固然,当今的2013,绝非这么简单。咱们抽象出来三个线程,接收键盘输入并显示,自动排版缩进,自动存盘。三个过程都是在word的进程中,他们共享当前所操做的文件,协同处理,固然他们分工不一样,也有前后顺序。

2.web服务器,一个web server进程中会包含这么几个进程,网络链接,分派线程,网页处理,网页缓存等。这些线程运行在用户空间,由网络链接请求发起。固然,话又说回来,并不是全部的web服务器都得设计成多线程的模型,系统管理用的多了,实际用于工做的资源就会少,平衡这些因素,才能选出合适的设计方案。

基于这两个模型,咱们引入线程的概念,对于一个活动的进程,咱们想让他同时执行多种功能,可是这几种功能之间经过不一样进程的解决方案通讯开销太大,调度开销也不小,所以咱们应该给出一个比进程更轻量级的实体,他们可以共享的资源更多,通讯更方便高效,低耗,线程这玩意就应运而生了。老话说得好,进程是系统最小资源分配单位,线程是系统最小调度单位,线程是轻量级的进程。一语中的。

(二)线程模型

线程的模型与进程类似,一样包含线程实现功能所需的数据结构,运行时状态等信息,同时包含可读写的所在进程的资源。那么进程与线程的实质上的区别在哪儿呢?

一个线程能够运行在不一样进程之间,一个进程能够有多个线程。线程能够有本身的资源,也能够共享进程的资源。本质上的区别,能够从线程的实现机制中说明。

(三)线程实现机制

1.用户级线程linux

经过用户程序空间的一组线程库函数完成全部线程的管理。内核并不知到线程的具体运行状况,线程之间的切换和状态转移不须要核心态系统支持,调度过程是基于应用程序,特有的线程过程。具体的实现过程以下:当系统对进程进行调度的时候,进程对其内部的用户级线程进行调度和状态转换,提升进程内部资源的利用率。当进程内部一个线程处于阻塞状态时,能够将其余就绪态的线程运行。可是当线程提出系统调用或者发生中断时,进程也被阻塞。

这么作的优势是:线程切换没必要调用系统核心;调度过程是基于用户程序的,能够针对用户程序业务逻辑选择更好的调度算法;用户级线程模型能够运行于任何系统上,只须要有相应的线程库支持。

固然缺点也很明显,当进程内部某一个线程进行系统调用时,整个进程都会被阻塞,这样会影响总体的效率;进程分配到的资源不可以在两个CPU同时运行,换句话说,用户级线程不能支持多核多线程的用户要求。

常见的用户级线程支持库是POSIX线程库,其中包含线程控制的大部分函数接口。

2.核心级线程windows

相对应于用户级线程,就是系统线程。这种线程模型中,全部的线程管理都由系统完成;没有线程库,可是系统提供了调用API函数接口;系统完成线程的上下文切换,系统进行线程调度,并以线程为基本调度单位进行管理。

优势:对于多处理器,核心能够同时调度同一进程的不一样线程在不一样CPU中运行。线程的阻塞不会影响其余线程的运行。核心例程是多线程的。

缺点:在同一进程中调用系统内核,会下降进程运行效率。

固然也有混合上述两种模型的系统solaris,其中线程的建立在用户级别,线程调度在系统级别。

相关文章
相关标签/搜索