操作系统原理-进程线程

2016/02/18 Summary

操作系统原理-进程线程

一直对高并发的web系统感兴趣,看了很多文章和资料,发现很多东西还理解的不清楚,特别是多线程和多进程方面的知识。   这样不行,所以回归原理,用了周末的时间,把操作系统原理的进程和线程的知识内容好好的温习了。突然发现,上学时不懂,不明白的问题,一下就明白了。
所以,写了这篇博客,也算是读书笔记吧。主要内容:操作系统并发、多进程、多线程

第一章

操作系统的重要任务就是对进程进行有效地调度管理,操作系统将负责进程的建立和撤销,提供进程间通信机制,控制和协调进程的运行,有效地分配和回收进程使用的资源,使整个计算机系统有条不紊地工作。 操作系统的特征: 1、并发性。   “并发”是指同事存在多个平行的活动,例如I/O操作与主机同事运行,在内存中同时存在几道运行程序。由于并发的出现,需要系统解决一个问题,即如何从一个活动切换到另一个活动,如何保护一个活动使其免受另一些活动的影响,以及如何在相互依赖的活动之间实施同步等。 程序的并发性体现为两个方面:用户程序与用户程序的并发运行和用户程序与系统程序的并发运行。   在但处理器环境下,并发执行的程序实际是交替运行的,但从宏观上看,这些程序可视为是同时运行的。 2、共享性。   共享性是指操作系统程序与多个用户程序共用操作系统中的各种资源。

进程调度: 操作系统负责进程的调度管理。具体包括:进程的建立和撤销;安排处理器在这些进程间转换,交替为它们服务;进程间的通信; 进程的建立和撤销(就绪、执行、阻塞/挂起);以及进程的同步与互斥、进程的死锁管理等。

多道程序批处理系统可以充分利用中央处理器及各种设备资源。多到程序需要内存管理和调度管理

分时操作系统(Time Sharing System) 分时操作系统的特征是一台计算机挂有若干终端,每个终端提供给一个用户,不同用户可以通过自己的终端同时访问系统。在分时操作系统中,系统将处理机的时间分割成很小的时间段,每个时间段称为时间片, 系统将处理时间片轮流分配给每个终端,用户程序以很短的时间为单位交替执行。由于调试程序的用户常常只发简短的命令,因此计算机能够为很多用户程序以很短的时间为单位交替执行,并在空闲时还能在后台运行大的作业。 unix操作系统便是分时操作系统的杰出范例。(Linux也是分时操作系统) 分时操作系统有多路性、交互性、“独占”性和及时性特征。多路性是指同时有多个用户用一台计算机,宏观上是多个人同时使用一个cpu,微观上是多个人在不同时刻轮流使用。交互性是指用户可以根据系统相应结果进一步提出新请求。 独占性是指用户感觉不到计算机在为其他人服务,就像整个系统为他自己独占使用。及时性是指用户的请求能够及时得到响应。(联想到web系统)

批处理系统和分时系统使用了多道程序设计技术。批处理系统的多道程序设计的主要目标充分利用处理器,分时系统的多道程序设计的主要目的是减少系统对用户命令的响应,及时响应用户的要求,从而可以同时支持多过喝用户 常见的通用操作系统是分时操作系统与批处理系统的结合,原则是:分时优先,批处理后。

分布式操作系统的特点是将多台计算机管理起来,使它们联合、协调工作,完成一个共同任务。 Linux 是各类服务器的最佳选择之一,在相同硬件条件下,系统性能更优越。

第二章 进程与线程

进程是操作系统最核心的概念,它是对正在运行的程序的抽象。线程是进程中的一个实例,是系统实施调度的独立单位。 多道程序设计是在内存中同时存放多道程序,这些程序在管理程序的控制下交替地在cpu上执行。虽然cpu执行的方式是顺序的,即在某一时刻只有一个程序在cpu上执行,但cpu调度程序的出现,使得多个程序交替地在cpu上运行。 从宏观上看,系统中的多个程序都“同时”得到执行,即实现了程序的并发执行。 程序并发执行产生的三各特征: 1、失去封闭性。并发执行的多个程序共享系统中的资源,因此这些资源的使用状态不再由某个程序决定,而是受到并发程序的共同影响,多个并发程序执行时的相对速度是不确定的,何时发生控制转换并非由程序本身决定,而是整个系统当时所处的环境有关 因此有一定随机性。 2、程序与计算不再一一对应。在并发执行的过程中,一个被共享的程序可以由多个用户作业调度,从而形成多个“计算”。 3、并发程序在执行时互相制约。并发程序的执行过程并非是顺序性的,而是会“走走停停”,即执行-暂停-执行 的活动规律。各个程序的执行状态与当时所处的环境资源有关。 这种停顿的原因并不是程序造成的,而是与并发的其他程序相互影响的结果。

进程的特征: 动态性。产生,消亡,暂停。并发性。一个程序的进程可以与另一个程序的进程并发执行,各自额执行速度无法预知,以异步形式执行。调度性。进程是系统中申请资源和调度的单位。

进程的状态。 1、运行状态。运行状态是指当前进程已经分配到cpu,正在处理机上执行时的状态。处于此状态的进程个数是不能超过cpu的数目的。 2、就绪状态。就绪状态是指进程已经具备运行条件,但其他进程占用cpu,使其不能运行而只能等待cpu的状态。处于此状态的进程数可以有多个。 3、阻塞状态。一个进程正在等待某一事件而暂时不能运行。处于阻塞状态的进程不具备执行条件,即使cpu空闲,它页无法运行。系统中处于此状态的进程可以有多个。 进程状态的转换: 1、处于就绪状态的进程被进程调度程序选中后,就分配给处理器来执行。该进程的状态就由就绪转换运行状态。运行状态的进程在运行的过程中可能需要等待某一事件发生,之后继续运行,因此该进程由运行状态转换为阻塞状态。 2、处于运行状态的进程在运行时,因分配的处理器时间片已经用完而不得不让出处理器,于是由运行状态转换为就绪状态。 3、处于阻塞状态的进程,若等待的事件已经发生,就由阻塞状态转换为就绪状态。 4、新建状态。进程刚刚被创建,尚未放入就绪队列时的状态。 5、终止状态。处于终止状态的进程不能再被调用,只能被系统撤销。 进程在生存期内不断发生变化,一个进程可以多次处于就绪状态和运行状态,也可以多次处于阻塞状态,而且可能排在不同的阻塞队列上。

程序和数据是进程的主题。一个数据结构记录进程的动态特性,如当前状态、本身特性、结构描述、对资源的占用和调度信息等,这种数据结构称为进程控制块(Process Control Block , PCB)。 程序的执行必须有一个或多个栈,用来保存过程调用和参数传递的整个过程。进程影像一般由 程序、数据、栈和PCB四步分组成。 操作系统根据PCB对进程实施控制和管理。进程控制包括:进程创建、进程撤销、进程阻塞、进程唤醒、改变进程优先级、调度进程运行。这些操作都要对应地执行一个特殊的程序段,同时系统也通过系统调用给用户提供进程控制的功能


进程创建

1.申请一个空闲PCB 2.为新进程分配资源 3.将新进程的PCB初始化 4.将新进程加到就绪队列中

进程的撤销

1.找到指定进程 2.终止该进程的运行 3.回收该进程所占用的全部资源 4.终止其所有子孙进程,回收它们所占用的全部资源 5.将被终止进程的PCB从原来队列中摘走

进程阻塞

1.立即停止当前进程 2.现行进程的CPU现场保存 3.现行状态由 运行 改为 阻塞 4.转到进程调度程序

进程唤醒

1.把阻塞进程从相应的阻塞队列摘下 2.将现行状态改为就绪状态,然后把该进程插入就绪队列中 3.如果被唤醒的进程比当前运行进程的优先级更高,则重新设置调度标识


进程是由程序段、数据段、进程控制块组成(PCB)
高级通信方式

1.共享存储器系统 2.消息传递系统 3.管道通信

线程

进程既是资源申请的独立单位,又是系统调度的独立单位,在创建、撤销和切换进程时会造成很大的开销。
现代操作系统都引进了比进程更小的独立运行单位--线程(thread)。现代操作系统把资源分配和调度分离开来,
让进程仍作为资源分配的单位,但只作为资源拥有者,而把线程作为系统调度单位。线程只拥有一些在运行中
必不可少的资源(如程序计数器、一组寄存器和栈),它与同属于一个进程的其他线程共享该进程拥有的全部资源。
线程切换时只需保存和设置少量寄存器的内容。

(进程是马路,线程是车道)   <br>   有单线程进程和多线程进程。每一个有一个thread结构,即线程控制块(TCB),主要包括:状态和调度信息、线程标识   信息、现场信息、线程私有存储区、指针(指向PCB)。进程产生时同时产生第一个线程,其他线程在以后由任一线程请求创建。   线程有三个主要状态: 运行、就绪、阻塞。如果一个进程被挂起并被换出内存,则进程的所有线程由于共享进程的地址空间,   也必须全部换出内存,所以,操作系统引起的状态变化是进程级状态变化,不作为线程状态变化。   在引入线程的操作系统中,进程只作为资源分配的基本单位,线程则是作为调度和分派的基本单位。   <br>

线程的实现与模型


1.内核级线程
内核为应用程序开发者提供了一个应用程序设计接口API,应用程序通过调用API函数,实现线程的创建和控制管理。 在多处理器上,同一进程内线程可以并发执行。内核级线程自身可以用多线程技术实现,提高了系统的并行性和执行速度。 缺点:应用程序的线程运行在用户空间,而线程调度和管理在内核空间,即使是同一进程在运行,当对线程的控制需要从一个线程传送到 另一个线程时,也要经过用户态到核心态,再从核心态到用户态的模式切换,系统开销较大。核心级线程表格占用系统空间。
2.用户级线程
用户级线程只存在用户级,线程的创建、撤销及切换都不利用系统调度实现,因而这种线程与内核无关,内核也不知道这种线程的存在。 内核只是以进程为单位,实现进程状态的转换。线程的切换都在用户级别。 缺点:线程由于I/O等原因阻塞于内核时,多线程库调度器不知道,则该线程所在进程的所有线程都将被阻塞,使得处理器空闲,浪费资源。 系统在进程调度分配给进程的处理器时间需要由所有的线程分享,不能做到同一进程内线程在多CPU上并行。
3.混合式线程
同一个进程的多个线程可以同时在不同处理器上并行执行。(真正的多线程并行)
线程模型: 1.一对一模型 2.多对一模型 3.多对多模型

CPU 处理机调度

对CPU而言,可分配的资源是在CPU上的执行时间,分配途径是调度。 当计算机是多道程序设计系统时,通常就会有多个进程竞争CPU。当多个进程处于就绪状态而只有一个CPU时,操作系统就必须决定先运行哪一个进程。在操作系统中,完成选择工作的这一部分称为调度程序(scheduler),该程序使用的算法称为调度算法。 三种调度类型:作业调度、交换调度、进程调度。 CPU调度是对CPU进行分配,从就绪队中,按照一定的算法(公平、高效地)选择一个进程并将处理机分配给它运行,以实现多进程并发地执行。 一般情况,当占用CPU的进程因为某种请求得不到满足而不得不放弃CPU进入等待状态,或者当时间片到,系统不得不将CPU分配给就绪队列中另一进程的时候,都要引起CPU调度。进程正常结束、中断等也可能引起CPU调度。

  1. 记住进程的状态,如进程名称】指令计数器、程序状态寄存器以及所有通用寄存器等现场信息,将这些信息记录在相应的进程控制块中。
  2. 根据一定算法,决定哪个进程能获得处理机,以及占用多长时间。
  3. 收回处理机,即当执行进程因为时间片用完或因为某种原因不能再执行时,保存该进程的现场,并收回处理机。

交换调度是位于高级调度和进程调度之间的一种调度。为了提高内存利用率,系统将那些暂时不能运行的进程挂起来,当内存空间宽松时,通过交换调度选择具备运行条件的进程,将其唤醒。

进程调度

1.保存现场 当运行的进程调用进程调度程序时,表示该进程要求放弃CPU(因时间片用完或等待I/O等原因)这时候,进程调度程序把它的线程信息(如程序计数器及通用寄存器的内容等)保留在该进程PCB的线程信息区中。 2.挑选进程 根据一定调度算法,从就绪队列中选出一个进程,把它的状态改为运行状态,准备把CPU分配给它。 3.恢复现场 为选中的进程恢复现场信息,把CPU的控制权交给该进程,使它接着上次间断的地方继续运行。

抢占调度方式(Preemptive) 若有某个更为重要或紧迫的进程需要使用处理器,则立即暂停正在执行的进程,将处理器分配给这个更为重要或紧迫的进程。 抢占不是一种任意性行为,必须遵循一定的原则,主要原则有:优先权原则, 短进程有限原则和时间片原则等。

时间片轮转法 每次调度时将CPU分派给队首进程,让其执行一个时间片,时间片的长度一般从1-1100ms不等。把就绪队列看成一个环状结构,调度程序按时间片长度轮流调度就绪队列中的每一个进程,使每一个进程都有机会获得相同时间占用CPU运行。在一个时间片结束时,发生时钟中断。调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。进程可以未使用完一个时间片,就出让CPU。 时间片轮转法主要用于分时系统中的进程调度,一个分时系统有许多终端,终端用户在各自的终端设备上同时使用计算机。如果某个终端用户的程序长时间占用CPU,那么其他终端用户的请求就会得不到即时相应。一般来说,终端用户提出请求后,能在几秒钟内得到相应也就感到满意了。采用时间片轮转法,可以使系统即时地相应各终端用户的请求。

多级反馈队列是最通用的CPU调度算法。Linux进程调度是将优先级调度、时间片轮转调度、先进先出调度综合起来应用。不同类型的进程调度策略不一样。

18 Feb 2016

Search

    Table of Contents