进程:a program in execution(执行中的程序)

进程包括通过程序计数器(program counter)的值和处理器寄存器(processor's registers)的内容来表示的当前活动(current activity),代码段(text section),堆栈段(stack),数据段(data section),以及堆(heap)。

stack:包括临时数据(函数参数、返回地址和局部变量)

data section:包括全局变量

heap:在进程运行期间动态分配的内存

注:程序本身不是进程,程序只是被动实体,而进程是活动实体(a process is an active entity)。


进程状态:

新的(New):进程正在被创建

运行(Running):指令正在被执行

等待(Waiting):进程等待莫个事件的发生(如I/O完成或收到信号)

就绪(Ready):进程等待分配处理器

终止(Terminated):进程完成执行

进程控制块(PCB):每个进程在OS内用PCB来表示

· 进程状态

· 程序计数器:计数器表示进程要执行的下个指令的地址。

· CPU寄存器

· CPU调度信息

· 内存管理信息

· 记账信息

· I/O状态信息

进程调度:选择一个可用的进程到CPU上执行,若有多个,需等待(单处理器系统)

进程进入系统,会被加入到作业队列(job queue),该队列包含系统中的所有进程。驻留在内存中就绪的,等待运行的进程保存在就绪队列(ready queue)中。(通过链表实现)

等待特定的I/O设备的进程列表称为设备队列(device queue)。每个设备都有自己的设备队列。

新进程处于就绪队列,当它被分配到CPU执行时,可能出现下面三种情况

1.进程可能发出一个I/O请求,并被放到I/O队列中

2.进程可能创建一个新的子进程,并等待其结束

3.进程可能会由于中断而强制释放CPU,并被放回到就绪队列

当进程从所有队列中删除时,其PCB和资源将得以释放。

那进程是如何被选中的?

进程的选择是由相应的调度程序(scheduler)来执行的

批处理系统:进程更多是被提交,而不是马上执行。这些进程被放到磁盘的缓冲池中。

长期调度程序(long-term scheduler)或者作业调度程序(job scheduler):从该缓冲池中选择进程,并装入内存以准备执行。

短期调度程序(short-term scheduler)或者CPU调度程序(CPU scheduler):从准备执行的进程中选中进程,并为之分配CPU

中期调度程序(medium-term scheduler):将进程从内存或CPU竞争中移出,从而降低多道程序设计的程度,之后,进程能被重新调入内存,并从中断处继续执行。

当出现中断时,OS会进行上下文切换

上下文切换:内核将旧进程的状态保存在其PCB中,然后装入经调度要执行的并已保存的新进程的上下文(进程上下文用进程的PCB表示)。

进程的一些操作 注意点

进程创建:在UNIX中通过fork()系统调用,可创建新进程,新进程通过复制原来进程的地址空间而成。两个进程都执行fork()之后的指令。

注:对于新进程,fork()的返回值是0,对于父进程,返回值为子进程的进程标识符

进程终止:进程可通过exit()请求OS删除自身,进程终止,并将状态值返回父进程,释放进程资源(父进程也能终止子进程)。

那当父进程终止了,子进程怎么办?

有些系统,会进行级联终止(cascading termination),操作系统会将其所有子进程也终止了。

而UNIX系统:当父进程终止,那么其所有子进程会以init进程作为父进程。


在OS中,并发执行的进程可以是独立进程或是协作进程。

协作进程就需要一种进程间通信进制(interprocess communication)(IPC)来允许进程相互交换数据与信息。

进程间通信有两种模式:

1.共享内存

这种模式的通信,需要通信进程建立共享内存区域。一块共享内存区域驻留在生成共享内存段进程的地址空间,其它希望使用这个共享内存段进行通信的进程必须将此放到它们自己的空间。

一旦建立了共享内存,所以的访问都被处理为常规的内存访问,不需要来自内核的帮助

这里需要一个缓存,当需要信息时,缓冲中要有这个信息。

两种缓存,一种是无限缓冲,无限往里面产生信息,另一种是有限缓冲,缓冲空,接收信息的进程要等待,缓冲满,发出信息的进程要等待。

2.消息传递

通过系统调用来实现

1.直接通信

send(P,message):发送消息到进程P

receive(Q,message):接收来自进程Q的消息

2.间接通信

send(A,message):发送一个消息到邮箱A(mailbox,一个对象,可以向其中存放消息,并删除,有唯一标识符)

receive(A,message):接收来自邮箱A的消息

OS提供了进制来允许进程创建邮箱,通过邮箱接收和发送消息以及删除邮箱。开始时,拥有者是唯一能通过该邮箱接收消息的进程,但通过系统调用,有拥有权和接收特权可能传递给其他进程,使邮箱有了多个接收者。

这时,当有多个进程都对邮箱执行receive(),哪个进程能接受到消息取决于所选择的方案

1.允许一个线路最多只能与两个进程相关联

2.一次最多允许一个进程执行receive()操作

3.运行系统随意选择一个进程以接收消息

笔记 进程(processes)的更多相关文章

  1. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  2. JUC学习笔记——进程与线程

    JUC学习笔记--进程与线程 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的进程与线程部分 我们会分为以下几部分进行介绍: 进程与线程 并发与并行 同步与异步 线程详解 进程与线程 ...

  3. python学习笔记-进程线程

    1.什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述 ...

  4. linux-2.6.18源码分析笔记---进程

    一.进程重要字段描述 在目录include\linux\sched.h下定义了进程描述符task_struct,关注如下字段: 进程状态 volatile long state:表示进程状态,在该文件 ...

  5. 《linux内核设计与实现》阅读笔记-进程与调度

      一.进程 process: executing program code(text section) data section containing global variables open f ...

  6. Linux内核笔记——进程管理之执行体

    内核版本:linux-2.6.11 在Linux中,有多种执行体(指令流.执行单位),它们是CPU调度和分配资源的基本单位,它们是内核态可见的,即内核态下,每一种执行体都有对应的唯一数据结构task_ ...

  7. linux c学习笔记----进程创建(fork,wait,waitpid)

    1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己 ...

  8. Linux使用小笔记<进程操作篇>

    问题一: 查看哪个进程占用了哪个端口.以及杀掉进程 1.查看占用端口: sudo lsof -i :80 lsof 命令 是 list open files的意思 比如: lsof filename ...

  9. Python自学笔记-进程,线程(Mr serven)

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...

随机推荐

  1. JS 4 新特性:混合属性(mixins)之二

    Mixins many classes[混合许多个类] 迄今为止,我们已经学会了简单的继承,我们还能够通过使用mixins处理机制来混合许多类.源于这种理念是非常简单的:我们能够把许多个类最终混合到一 ...

  2. 【转】输入/输出流 - 全面掌握IO

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  3. struts2 错误提示页面

    以前做的一个网站,最近服务器后台出现一些异常,问题是客户访问一个该网站下不存在的action,为了给客户一个友好的界面提示以及减小服务器端日志文件的内容.就在struts2下进行了如下配置: 在str ...

  4. php生成html文件的多种方法介绍

    我经常会在网上看到有人问怎么将整个动态的网站静态化,其实实现的方法很简单.  代码如下 复制代码 <?php//在你的开始处加入 ob_start(); ob_start(); //以下是你的代 ...

  5. Spring中的IOC\DI\AOP等概念的简单学习

    IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终, 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.Spr ...

  6. KinerCode.js

    1 /*验证码*/ function KinerCode(options) { this.opt = this.extend(true, this.options, options); this.op ...

  7. BackTrack5-r3 w3af无法更新问题解决

    wget http://pypi.python.org/packages/source/p/pybloomfiltermmap/pybloomfiltermmap-0.2.0.tar.gz --no- ...

  8. _crol_和_cror_函数

    “_crol_” 与“_cror_”其实就是左右循环代码,其具有程序代码简单执行效率高的优点! 是在单片机c语言编程中常用到的,变量=_crol_(变量名,移动位数),例如:P0=_crol_(P0, ...

  9. C#知识体系(二)用案例来理解委托与事件

    上一篇博客讲到了LinQ和lambda的常用方法 还有很多我们未知但c#设计团队已经为我们封装好的类和方法.随着我们不断的熟悉C#语言,渐渐的就会接触到其他的知识点,委托.事件.反射.线程.同步,异步 ...

  10. 解决表单(搜索框)回车的时候直接提交了表单不运行js的问题

    我想在搜索输入框中输入关键词后回车,先运行一段js,然后在提交表单,而默认情况下回车的时候也会出发表单的提交所有没法等js运行完成,故利用 onkeydown="if(event.keyCo ...