菜鸟笔记
提升您的技术认知

操作系统笔记

进程,线程,协程与并行,并发进程线程协程的区别死锁进程,线程,多线程i++的线程安全性同步和异步孤儿进程和僵尸进程/proc进程信息linux中的分段和分页互斥量 mutex线程进程间通信进程创建进程优先级进程的基础知识进程与线程的区别(面试题)线程的控制(创建,终止,等待,分离)可重入 VS 线程安全死锁的概念一级缓存和二级缓存的理解一句话解说内存屏障 Memory barrierbrk(), sbrk() 用法详解malloc/free函数的简单实现一文讲透 “进程、线程、协程”Linux进程状态线程池的陷阱linux内核学习之进程和线程进程与线程的区别和联系内存寻址linux IO子系统和文件系统读写流程Page cache和buffer cache的区别与联系漫谈linux文件IO多线程和多进程的区别内存泄漏字节、字、位、比特的概念和关系如何避免死锁ANSI是什么编码?CPU寻址范围(寻址空间)CPU 使用率低高负载的原因创建多少个线程合适操作系统下spinlock锁解析、模拟及损耗分析线程堆栈堆和栈的内存分配堆和栈的概念和区别堆和栈的区别,申请方式,程序的内存分配什么是 POD 数据类型Linux内存分配小结--malloc、brk、mmap系统调用与内存管理(sbrk、brk、mmap、munmap)进程描述和控制CPU执行程序的原理编译的基本概念Linux虚拟地址空间布局一个程序从源代码到可执行程序的过程程序的运行机制——CPU、内存、指令的那些事分页内存管理——虚拟地址到物理地址的转换深刻理解Linux进程间通信fork之后父子进程的内存关系fork之后,子进程继承了父进程哪些内容关于协程及其锁的一些认识对协程的一点理解std::thread join和detach区别CAS和ABA问题CAS算法锁和无锁无锁队列的实现Lock-Free 编程锁开销优化以及CAS

进程描述和控制

阅读 : 161

一、什么是进程:

开发操作系统是为了给应用程序提供一个方便、安全和一致的接口。

操作系统是计算机硬件和应用程序之间的一层软件,对应用程序和工具提供支持。

目标: 
资源对多个应用程序是可用的; 
物理处理器在多个应用程序间切换以保障所有程序都在执行中; 
处理器和IO设备能得到充分利用。

所有现代操作系统采用的方法都是依据对应于一个或多个进程存在的应用程序执行的一种模型。

进程的几种定义:

一个正在执行中的程序; 
一个正在计算机上执行的程序实例; 
能分配给处理器并由处理器执行的实体。

进程的两个基本元素是程序代码(可能被执行相同程序的其他进程共享)和代码相关的数据集。

假设处理器开始执行这个程序代码,且我们把这个执行实体称为进程。

在执行进程时,进程可以唯一的表征为以下元素: 
标示符,状态,优先级,程序计数器,内存指针,上下文数据,IO状态信息,记账信息。

上述的列表信息被存放在一个称为进程控制块的数据结构中,该控制块由操作系统创建和管理。进程控制块包含了充分的信息,这样就可以中断一个进程的执行,并且在后来恢复执行进程时就好像进程未被中断过一样。

进程控制块是操作系统能够支持多进程和提供多重处理技术的关键工具。

当进程被中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制块中的相应位置,进程状态也被改变为其他的值,例如阻塞态或就绪态。

现代操作系统可以自由的把其他进程置为运行态,把其他进程的程序计数器和进程上下文数据加载到处理器寄存器中,这样其他进程就可以开始执行。

可以说,进程 = 程序代码 + 相关数据 + 进程控制块

二、进程状态:

对一个被执行的程序,操作系统会为该程序创建一个进程或任务。

从处理器的角度看,它在指令序列中按某种顺序执行指令,这个顺序根据程序计数器的寄存器中不断变化的值来指示,程序计数器可能指向不同进程中不同部分的程序代码。

从程序自身角度看,它的执行涉及程序中的一系列指令。

1 两状态进程模型,

一个进程或者正在执行,或者没有执行。

当操作系统创建一个新进程时,它将该进程以未运行态加入到系统中,操作系统指导这个进程是存在的,并且正在等待执行机会。当前正在运行的进程不时被中断,操作系统中的分派器部分将选择一个新的进程运行。

必须有一些与进程相关的信息,包括进程在内存中的当前状态和位置,及进程控制块。未运行的进程必须保持在某种类型的队列中,并等待他们的执行时机。分派器从队列中选择一个进程来执行。

2 进程的创建和终止,

进程的生存期围绕着进程的创建和终止。

可能创建进程的事件: 
在批处理环境中,作业提交时会创建进程; 
在交互环境中,当一个新用户试图登陆时会创建进程。

操作系统会负责新进程的创建。

传统的,操作系统创建进程的方式对用户和应用程序都是透明的。但是,当操作系统为另一个进程显式请求创建一个进程时,这个动作称为进程派生。当一个进程派生另一个进程时,前一个称为父进程,被派生的进程称为子进程。在典型情况下,相关进程需要互相之间的通信合作。

3 五状态模型

队列是“先进先出”的表,对于可运行的进程,处理器以一种轮转的方式操作(一次给队列中的玫瑰进程一定的执行时间,然后进程返回队列。阻塞情况除外)。

两状态模型的局限性: 
存在着一些处于非运行态但已经就绪等待执行的进程,同时存在另外一些处于阻塞状态等待IO操作的进程。因此如果使用单个队列,分派器应该扫描队列,查找那些未被阻塞且在队列中时间最长的进程。

将非运行状态分为两个状态:就绪和阻塞。

运行态:该进程正在执行

就绪态:进程做好了准备,只要有机会就开始执行

阻塞/等待态:进程在某些事件发生前不能执行,如IO操作完成

新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中。通常是进程控制块已经创建但还没有价值到内存中的新进程

退出态:操作系统从可执行进程组中释放出的进程,或者因为它自身停止了,或者因为某种原因被取消。

新建态:操作系统可能基于性能或内存局限性的原因,限制系统中的进程数量。当进程处于新建态时,操作系统所需要的关于该进程的信息保存在内存的进程表中,但进程自身还未进入内存,就是即将执行的程序代码不在内存中,也没有为与这个程序相关的数据分配空间。当进程处于新建态时,程序保留在外存中,通常是磁盘中。)

如果进程请求它不等待的某些事件,则进入阻塞态。

排队规则:有两个对立,就绪队列和阻塞队列。

进入系统的每个进程被放置在就绪队列中,当操作系统选择另一个进程运行时,就将从就绪队列中选择。对于没有优先级的方案,这可以使一个简单的先进先出队列。

当一个正在运行的进程被移出处理器时,它根据情况或者被终止,或者被防止在就绪或阻塞队列中。

最后,当一个事件发生时,所有位于阻塞队列中等待这个事件的进程都被转换到就绪队列中。

此外,拥有多个事件队列会很有效。一个事件对应一个队列。当事件发生时,相应队列中的所有进程都转换到就绪态。

4 被挂起的进程,

产生缘由:当一个进程正在等待时,处理器可以转移到另一个进程,但是处理器比IO要快的多,以至于内存中所有的进程都在等待IO的情况很常见。

交换:包括把内存中某个进程的一部分或全部移到磁盘中。

交换是一个IO操作,当内存中的所有进程都处于阻塞态时,操作系统可以把其中的一个进程置于“挂起态”,并将它转移到磁盘中,内存中释放的空间可被调入的另一个进程使用。

当操作系统已经执行了一个换出操作后,它可以有两种将一个进程取到内存中的选择:可以接纳一个新近创建的进程,或调入一个以前被挂起的进程。

两个考虑:进程是否在等待一个事件(阻塞与否),进程是否已经被换出内存(挂起与否)

就绪态:进程在内存中并可以执行

阻塞态:进程在内存中并等待一个事件

阻塞/挂起态:进程在外存中并等待一个事件

就绪/挂起态:进程在外存中,但是只要被载入内存就可以执行

虚拟内存方案中,可能会执行到只有一部分内容在内存中的进程,如果访问的进程地址不在内存中,则进程的相应部分可以被调入内存。虚拟内存的使用看上去会消除显示交换的需要,这是因为通过处理器中的存储管理硬件,任何期望的进程中的任何期望的地址都是可以移入或移出内存。

阻塞-》阻塞/挂起:如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻塞的进程让出空间。通常,操作系统更倾向于挂起阻塞态的进程而不是就绪态进程。

一个不在内存中的进程,不论它是否在等待一个时间,都不能立即执行。

父进程可能会希望挂起一个后代进程。挂起进程的活动都是由最初请求挂起的代理 请求的。

三、进程描述:

3.1操作系统的控制结构

操作系统控制计算机系统内部的事件,它为处理器执行进程而进行调度和分派,给进程分配资源,并响应用户程序的基本服务请求。因此,我们可以把操作系统视为管理系统资源的实体。

操作系统构造并维护它所管理的每个实体的信息表。

操作系统维护着四种不同类型的表:内存,IO,文件和进程。

内存表:内存的某些部分为操作系统保留,剩余的部分是进程可以使用的,保存在外存中的进程使用某种类型的虚拟内存或简单的交换机制。

IO表:操作系统使用IO表管理计算机系统中的IO设备和通道。在任何给定的时刻,一个IO设备或者是可用的,或者是已分配给某个特定的进程。

文件表:操作系统还维护着文件表,这些表提供关于文件是否存在。文件在外存中的位置、当前状态和其他属性信息。

进程表:操作系统为例管理进程必须维护进程表。内存、IO和文件时代表进程而被管理的,因此进程表中必须有对这些资源的直接或间接引用。

3.2进程控制结构

操作系统在管理和控制进程时,首先必须知道进程的位置,然后它必须知道在管理时所必须的进程属性(如进程ID、进程状态)

进程的物理表示:进程最少必须包括一个或一组被执行的程序,与这些程序相关联的是局部变量、全局变量和任何已定义常量的数据单元。

进程映像中的典型元素:

1)用户数据:用户空间中的可修改部分,可以包括程序数据、用户栈区域和可修改的程序

2)用户程序:将被执行的程序

3)系统栈:每个进程都有一个或多个后进先出(LIFO)系统栈,栈用于保存参数、过程调用地址和系统调用地址

4)进程控制块:操作系统控制进程所需要的数据(进程标识信息、进程状态信息、进程控制信息)

当进程互相之间进行通信时,进程标识符可用于通知操作系统某一特定通信的目标;当允许进程创建其他进程时,标识符可用于致命每个进程的父亲进程和后代进程。

进程控制块是操作系统中最重要的数据结构。每个进程控制块包含操作系统所需要的关于进程的所有信息。操作系统中的很多例程都需要访问进程控制块中的信息,直接访问这些表并不难,每个进程都有一个唯一的ID号,可用做进程控制块指针表的索引。

四、进程控制:

4.1两种执行模式

非特权态常称为用户态,这是因为用户程序通常在该模式下运行

特权态可称为系统态或内核态

使用两种模式的原因是很显然的,它可以保护操作系统和重要的操作系统表(如进程控制块)不受用户程序的干涉。在内核态下,软件具有对处理器及所有指令、寄存器和内存的控制能力

程序状态字中有一位表示执行模式,这一位应某些事件的要求而改变。在典型情况下,当用户调用一个操作系统服务或 中断 触发 系统例程 的执行时,执行模式被设置成内核态;当从系统服务返回到用户进程时,执行模式被设置为用户态。

4.2进程创建

一旦操作系统基于某种原因创建一个新进程: 
给新进程分配一个唯一的进程标识符-》给进程分配空间-》初始化进程控制块-》设置正确的连接-》创建或扩充其他数据结构

4.3进程切换

进程切换的功能:在某一时刻,一个正在运行的进程被中断,操作系统指定另一个进程为运行态,并把控制权交给这个进程。

进程切换可以在操作系统从当前正在运行的进程中活动控制权的任何时刻发生。

操作系统中两种类型的系统中断:

1)中断与 当前正在运行的 进程无关的 某种类型的 外部事件相关(如完成一次IO操作)。控制首先转移给中断处理器,它做一些基本的辅助工作,然后转移到与已经发生的特定类型的中断相关的操作系统例程。

2)陷阱与 当前正在运行的进程 所产生的错误或异常条件相关。操作系统确定错误或异常条件是否是致命的。如果是,当前正在运行的进程被转换到退出态,并发生进程切换;如果不是,操作系统的动作取决于错误种类和操作系统的设计(试图恢复或通知用户),操作系统 可能会进行一次进程切换或者继续执行当前正在运行的进程。

模式切换与进程切换:发生模式切换可以不改变正处于运行态的进程状态,在这种情况下,保存上下文环境和以后恢复上下文环境只需要很少的开销。但是,如果当前正在运行的进程被转换到另一个状态(就绪,阻塞等),则操作系统必须使其环境产生实质性的变化。因此,进程切换涉及状态变化,因而比模式切换需要做更多的工作。

五、操作系统的执行

操作系统与普通的计算机软件以同样的方式运行,也就是说,它也是由处理器执行的一个程序。操作系统经常释放控制权,并且依赖于处理器恢复控制权。

5.1无进程内核

操作系统可以完成保存进程环境的功能,并继续调度和分派另一个进程。

其关键点是,进程的概念仅使用于用户程序,操作系统代码作为一个在特权模式下工作的独立实体被执行。

5.2 在用户进程中执行

常见的方法实际上是在用户进程的上下文中执行几乎所有操作系统软件。

其观点是,操作系统从根本上说是用户调用的一组例程,在用户进程环境中执行,用于实现各种功能。操作系统代码和数据位于共享地址空间中,被所有的用户进程共享。

当发生一个中断、陷阱或系统调用时,处理器被至于内核态,控制权交给操作系统。为了将控制权从用户程序转交给操作系统,需要保存模式想下午环境并进行模式切换,然后切换到一个操作系统例程,但此时仍然是在当前用户进程中继续执行。因此,不需要执行进程切换,仅在同一个进程中进行模式切换。如果操作系统完成其操作后,确定需要继续运行当前进程,则进行一次模式切换,在当前进程中恢复被中断的程序。如果确定需要发生进程切换二不是反话到先前执行的程序,则控制权被转换给进程切换例程。

在用户进程中执行的代码是共享的操作系统代码。基于用户态和内核态的概念,及时操作系统例程在用户进程环境中执行,用户也不能篡改或干涉操作系统例程。

在一个进程中,用户程序和操作系统程序都有可能执行。而在不同用户进程中执行的操作系统程序是相同的。

5.3 基于进程的操作系统

即把操作系统作为一组系统进程来实现。主要的内核函数被组织成独立的进程,同样,还可能有一些在任何进程之外执行的程序切换代码。

把操作系统作为一组进程实现,在多处理器或多计算机环境中都是十分有用的,这时一些操作系统服务可以传送到专用处理器中执行,以提高性能。

六、安全问题

操作系统对于每个进程都关联了一套权限。这些权限规定了进程可以获取哪些资源,包括内存区域、文件和特权系统指令等。典型的是,一个进程的运行代表着一个用户拥有操作系统认证的权限。

七、UNIX SVR4进程管理

UNIX区分内存中运行就绪态和被抢占态这两个状态。

只有当进程准备从内核态移动到用户态时才可能发生抢占,进程在内核态下运行时是不会被抢占的。

UNIX中有两个独特的进程。进程0是一个特殊的进程,是在系统启动时创建的。实际上,这是预定义的一个数据结构,在启动时刻被加载,是交换进程。此外进程0产生进程1,称为出事进程,进程1是系统中所有其他进程的祖先。当新的交互用户登陆到系统时,进程1为该用户创建一个用户进程。随后,用户进程可以创建子进程,从而构成一棵分支树。因此,任何程序都是由一组相关进程组成的。

进程描述:用户级上下文,寄存器上下文,系统级上下文。

进程控制:UNIX中的进程创建时通过内核系统调用fork()实现的

八、总结:

现代操作系统中最基本的构建是进程,操作系统的基本功能是创建、管理和终止进程。当进程处于活跃状态时,操作系统必须设法使美国进程都分配到处理器执行时间,并协调他们的活动,管理有冲突的请求,给进程分配系统资源。

为执行进程管理功能,操作系统维护着对每个进程的描述,或者成为进程映像,它包括执行进程的地址空间和一个进程控制块。进程控制块含有操作系统管理进程所需要的所有信息,包括它的当前状态、分配给它的资源、优先级及其他相关数据。

在整个生命周期中,进程总是在一些状态之间转换。最重要的状态有就绪态、运行态和阻塞态。一个就绪态进程是指当前没有执行但已做好执行准备的进程,只要操作系统调度到它就可以立即执行;运行态进程是指当前正在被处理器执行的进程,在多处理器系统中,会有多个进程处于这种状态;阻塞态进程正在等待某一事件的完成,如一次IO操作。

一个正在运行的进程可被一个在进程外发生且被处理器是被的中断事件打断,或者被执行操作系统的系统调用打断。不论哪种情况,处理器都执行一次模式切换,把控制转交给操作系统例程。操作系统在完成必须的操作后,可以恢复被中断的进程或切换到别的进程。

课后练习:

一、 通常哪些事件会导致创建一个进程?

1、 新作业的进入

2、 父进程由于某种原因开启一个派生进程

3、 一个新的服务的启动,操作系统因提供一项服务而创建。

4、 交互登陆,终端用户登陆到系统。

二、抢占一个进程是什么意思?

抢占就是优先级高的进程去抢占优先级低的且正在执行的进程的资源,导致优先级低的正在运行态的进程被迫阻塞(终端)。通俗的讲就是一个进程正处在运行态执行,此时一个比他优先级高的进程启动,正处于运行态的进程被阻塞,优先级高的进程执行。

比如:B进程正在运行,而另一个具有更高优先级的A进程处于阻塞态,当处于阻塞态的进程A由于某个事件的触发而转换为就绪态,由于A优先级大于B,因此,此时中断进程B,将处理器分派给进程A。

三、 什么是交换,目的是什么?

交换:就是将内存中的进程换到外存中的“挂起队列”。 
目的是为了让内存有更多的可运行空间,加快执行速度。

四、 挂起进程的四个特点。

1、 处于外存。从内存中被换出。

2、 不能自启动,除非有外部事件的触发。

3、 进程不能立即执行

4、 进程可能是或不是正在等待一个事件

5、 为阻止进程执行,可以通过代理把这个进程置于挂起状态,代理可以是自己,也可以是父进程或操作系统

6、 除非代理显示地命令系统进行状态转换,否则进程无法从这个状态中转移

五、 对于哪类实体,操作系统为了管理它而维护其信息表?

1、 进程表(进程)

2、 内存表(内存使用情况、虚拟内存分配)

3、 设备(I/O表,I/O使用情况)

4、 文件()

六、 进程控制块中的三类信息

进程控制块:进程属性的集合。

而程序、数据、栈和属性的集合称做进程映像

作用:包含操作系统所需要的关于进程的所有信息。

进程:一段运行的程序和维持它运行所需要的数据集。

1、 进程ID,表示当前进程的身份(1、进程标识信息(进程标识符、用户标识符、创建该进程的标识符))

2、 进程存储空间,当前进程需要执行所需要的内存空间()

3、 CPU状态(2、CPU状态信息(用户可见寄存器、控制和状态寄存器以及栈指针的信息))和进程控制信息(3、进程控制信息(调度和状态信息、进程通信、进程特权和存储管理等信息))

4、 程序实体

七、 为什么需要两种CPU执行模式

针对内存保护,因此某些机器指令(特权指令)只能由操作系统执行,比如I/O指令就属于特权指令。

CPU的两种模式是指**用户态(非特权态)和内核态(特权态)。

使用两种模式是为了提高程序的执行效率和信息安全,利用两种模式的优点并克服两种模式各自的缺点。(保护操作系统和重要的操作系统表(比如PCB表)不受用户程序的干涉。在内核态下,软件具有对处理器以及所有指令、寄存器和内存的控制能力。)

什么时候CPU处于内核模式呢? 
当用户调用一个操作系统服务或中断触发例程的执行时,执行模式被设置成内核模式; 
当从系统服务返回到用户进程时,执行模式被设置为用户态。(这点对Windows或者UNIX都是同样的)

八、 创建一个新进程所执行的步骤。

1、 分配进程ID

2、 分配内存空间

3、 初始化进程控制块

4、 设置正确的连接,将进程加入就需队列链表中

5、 创建或扩充其他数据结构

九、 中断和陷阱的区别

中断是由于外部的事件触发,而陷阱是由于自身的程序运行故障所导致的中断。

十一、中断的例子

(I/O中断,内存溢出(内存失效),时钟中断(时间片到))

十二、模式切换和进程切换的区别。

模式切换:是指同一个进程中用户态与内核态的切换。因为他们共享内存,所以不涉及资源的重新分配,因此模式切换效率更高。并且不改变正在运行的进程的状态,在这种情况下,保存上下文环境和以后恢复上下文环境只需很少的开销

进程切换:由于不同进程之间不同状态的切换需要重新分配各种资源,操作系统必须使其环境产生实质性的变化

十三、Windows操作系统内核与UNIX操作系统的执行比较

在Windows中,操作系统的执行是被当做一组系统进程来实现的。当发生中断、陷阱或系统调用时,CPU转到内核态执行,但由于操作系统是作为一组系统进程实现的,所以需进行进程切换。Windows操作系统是基于进程的操作系统。

而在UNIX中,操作系统是融合在用户进程的上下文中被执行的。当发生一个中断、陷阱或系统调用时,处理器被置于内核态,控制权转交给操作系统,为了将控制从用户进程转交给操作系统,需要保存模式上下文环境并进行模式切换,然后切换到一个操作系统例程,但此时仍然是在当前用户进程中继续执行。UNIX是基于用户进程的操作系统。

UNIX使用两类进程,系统进程和用户进程,系统进程处于内核态运行,用户进程处于用户态执行,当发生中断、异常或用户进程发出系统调用时,用户进程可进入内核态。