操作系统---进程篇

进程(process)就是操作系统的灵魂,一个软件的程序通常就是由若干进程组成的。现在计算机一般采用多道程序设计和多处理机设计(所谓的4核、八核其实就是指多个处理机)。

一、并行和并发

并行:就是由多个CPU情况下,多道程序可以在同一时刻依靠不同CPU运行,注意是同一时刻,而不是时间间隔,这就是并行性。

并发:现在我们假设只有一个CPU,那么多道程序要运行,必然在同一时刻只有一个才可以占用CPU,而计算机让CPU在同一时间段内快速地在多道程序间交换注意这里是同一时间间隔这样就造成了一种伪并行的感觉,这就是并发性。


    二、进程和程序的区别

进程和程序很容易被混淆。可以举一个简单例子,例如一位科学家,买了食谱和一些面粉等原材料准备给他女儿做蛋糕。那么食谱上蛋糕的做法就是程序(即被适当描述的算法),科学家就是CPU,那么科学家按照食谱上的做法,结合面粉这些原料做蛋糕的过程这就是进程了。总的来说,程序是静态的,就是一堆代码。进程是动态的,更强调一系列动作的总和。单个处理机经常被多个进程共享,它使用某种调度算法决定进程间的切换。


    三、进程的创建和终止

进程的创建,通常是由一个已经存在的进程执行了创建进程的系统调用而创建了一个新的进程。这个已经存在的进程可能是一个由键盘或鼠标启动的系统进程、一个已经存在的用户进程,或一个批处理管理进程。这个进程的工作就是执行一个创建进程的系统调用,这个系统调用就会通知操作系统创建一个新进程,并且直接或间接地指定在该进程中运行的程序。(fork程序就是用来创建一个进程的,通常调用该程序所得到的子进程是父进程的一个副本,但是拥有独立的地址空间,需要执行一个execve或类似的系统调用,修改存储映像以用来运行别的程序)。总的来说,记住进程通常由三种方式(系统程序调用系统调用、用户程序调用系统调用、批处理管理程序调用系统调用)创建

进程的终止,通常有四个原因:1、正常退出(自愿,exit),2、出错退出(自愿),3、严重错误(非自愿),4、被其他进程杀死(非自愿,kill)。

四、进程调度

要理解进程调度,必须先知道进程一般情况下有三个状态:

运行态:正在占有处理器正在运行;

阻塞/等待态:等待某个事件的完成;阻塞队列

就绪态:等待系统分配处理器以便运行。就绪队列

运行态---->阻塞态/等待态:通常是由于等待外设IO操作,因为IO操作比起CPU高速运算来说慢的多得多,CPU不可能把这些时间都让这个程序在占有着CPU的情况下在等待,因此将该进程转换为阻塞态,至于阻塞队列中。同理等待主存资源也是一个原因。说白了之所以切换到等待态就是为了等待某个相对CPU来说慢的多的事件的完成。

阻塞态--->就绪态:等待的条件已完成,那么进程就从阻塞队列转到了就绪队列,只需等待CPU分配处理器即可。

就绪态---->运行态:系统按某种策略选中一个处于就绪状态的进程,使其获得处理机并执行。

运行态--->就绪态:时间片用完或者被抢占,让出CPU。不是由于自身原因,而是由于外部原因导致。

进程调度算法(就是从就绪队列中选取哪个进程进入运行态的策略):先进先出算法、短进程优先算法、轮转法、多级反馈队列。说白了获取资源就可以摆脱等待态。


    五、进程(process)和线程(控制流、thread)

    在有些情况下,需要在相同的地址空间中有多个控制流并行得运行,就像他们是单独的进程一样(只是他们共享相同的地址空间),通常这些控制流就被称为线程,或者轻量级进程。

举个简单例子,就是我们访问一个web页面时,对于web页面上的每一幅小图像,浏览器都必须与站点建立一个连接。这种情况下,就可以采用多线程,让浏览器可以同时传输多幅图像。

线程和进程一样,也有三种状态。

总的来说,线程就是控制流,多线程就比如web页面读取多个图片时的机制。线程是CPU调度的最小单位,进程是资源分配的最小单位(因为一般情况下,多个线程公用一个人由进程所获取的地址空间。)

六、同步机制

临界资源、临界区(critical section)、互斥量(mutex)、信号量(samaphore)、事件(event)

临界资源:比如例如打印机、磁带机这种就属于临界资源

1)临界区(critical section):临界区就是访问公共资源的一段代码。通常如果一个线程执行到了临界区代码,那么其他视图访问公共资源的线程将被挂起,直到该线程离开这段代码区。这样就保证了任意时刻只有一个线程访问公共资源,就不会造成异步的不定向问题。但这个只能在同一个应用程序的不同线程间实现资源的安全共享。因为只有属于本程序的才能检测到临界区是否在执行。

2)互斥量(mutex):即互斥对象,只有一个,只有拥有互斥对象的线程才有访问公共资源的权限。因此这样也保证了资源的安全共享。但是互斥量比临界区负载,且比临界区复杂以及功能强大,它可以在不同应用程序的线程之间实现对资源的安全共享。

3)信号量(samaphore):它允许多个线程同时访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目,即。这与操作系统的PV操作相同。

PV操作:

P操作申请资源:S-1;若S-1>=0,则进程执行执行;若S-1<0,则该进程被阻塞后进入该信号相对应的队列中,然后转入进程调度;

V操作释放资源:S+1;若S+1>0,则进程继续执行。若S+1<=0,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。

4)事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

七、进程通信

进程通信主要包括管道,IPC(包括消息队列,信号量,共享存储),socket

(1)管道:管道分为有名管道和无名管道,无名管道只能用于父子进程之间的通信,而有名管道则可用于无亲属关系的进程之间。

(2)消息队列:用于运行在同一台机器上的进程间通信,与管道相似;

(3)共享内存:通常由一个进程创建,其他进程对这块内存进行读写。并不常用

(4)信号量:计数器,它用来记录对某个资源的存取状况。

(5)socket:应用于不同计算机的进程通信。

八、进程通信和同步区分。

进程同步:临界区、互斥量、信号量、事件

进程通信: 管道、消息队列(事件)、共享存储、信号量、socket

相同点:两者都有信号量和消息队列(事件)

九、死锁(deallocks)

概念:死锁就是指两个后两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去。由于资源占用是互斥的,当某个资源提出资源申请后,使得有关进程在无外力协助下,永远无法分配不到必需的资源而无法继续执行,这就产生了一种特殊现象的死锁。

产生死锁的四个必要条件:

互斥条件:一个资源只能被一个进程(线程)使用

请求和保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放

不剥夺条件:此进程(线程)已获得的资源,在未使用完之前,不能强行剥夺

循环等待条件:多个进程(线程)之间形成一种头尾相接的循环等待资源关系。

死锁的预防:

因为第一个条件是天然的,因此可以选择破坏后三个死锁的条件其中一个实现对死锁的预防。

  1. 破坏请求和保持条件:

一次性请求所需的所有资源,若无法获取全部就等待,直到满足为止。

2.破坏不可剥夺条件

规定一个已占用资源的额进程若要申请新的资源,必须先释放自己已占用的资源;

3.破坏循环等待条件

将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的(升序或降序)做操作。(这个就是解决了哲学家就餐问题)

时间: 2024-10-10 05:09:13

操作系统---进程篇的相关文章

操作系统之进程篇(1)

1.进程介绍: 1.1 进程模型: 进程是一个程序的实际执行,包含了程序计数器的状态,寄存器和变量等等! 程序可以看成是一个状态的序列,程序在不同时刻呈现出不同的状态,而这种状态的前后交替过程可以看成是程序的执行过程.概念上来说,每个程序有自己的虚拟CPU,但在现实中CPU在不同的进程间来回切换,又称这种切换为伪并行! 进程和程序差别看似微小,实际上却是十分精妙; 可以将计算机执行程序的过程看成一次有趣的烹饪过程.食谱就是程序,厨师就是CPU,而食材是输入,得到的输出是鲜美可口的美食. 当厨师在

进程篇(1: 进程运行环境)--请参照本博客“操作系统”专栏

2014年5月30日  下午1:40:59 1. Unix 进程执行环境: 1.1 终止处理程序: ISO C 规定,一个程序可以登记多达32个函数,这些函数将由exit自动调用.我们称这些函数为终止处理程序(exit handler),并调用atexit函数来登记这些函数.该函数的原型如下: 1 #include <stdlib.h>2 3 int atexit(void (*function)(void)); exit调用这些终止程序的顺序与他们登记时的顺序相反(先登记后调用).同一个函数

操作系统之进程篇(3)

1. 信号量机制的缺陷问题: 在上面的生产者消费者实例中,信号量的工作机制如下(我们以生产者的代码为例): 1 down(&empty); 2 down(&mutex); 3 enter_item(item); 4 up(&mutex); 5 up(&full); 如果交换1号和2号语句,变成: 1 down(&mutex); 2 down(&empty); 那么可能会出现下面的情形: mutex变成0,此时empty == 0,那么生产者阻塞; 此时消费者

操作系统之进程篇(2)

进程间通信(InterProcess Communication,IPC): 进程通信中遇到的三个问题: a) 进程之间如何进行信息的传递? b) 多个进程在执行自己的核心代码时如何能够不相互影响? c) 当进程之间出现相互依赖关系时,如何才能合理的调度进程的执行顺序! 1. 竞争情形: 当两个或多个进程同时读写某个共享资源的时候,程序运行的最终结果由各个进程的具体执行的情况所决定! 如何避免竞争情形的出现,那么我们首先引入关键代码区的定义: 程序中访问共享内存或其他共享资源的代码区被称为关键代

进程篇(4: 基本进程控制:其他相关控制)--请参照本博客“操作系统”专栏

1. 更改进程的用户ID和组ID:为什么我们要更改用户ID和组ID的呢? 在UNIX系统中,特权是基于用户和组ID的.当用户需要增加特权,或要访问某个当前没有能力访问的文件时,我们需要更改自己的权限,以让新的ID具有合适的特权或访问权限.与此类似,当程序需要降低其特权或阻止对某些资源的访问时,也需要跟换用户ID或组ID;一般而言,在设计应用程序时,我们总是试图使用"最小特权"模型.依照此模型,我们的程序应当值具有为完成特定的任务所需要的最小特权. NAME getuid, geteui

进程篇(2: C程序的存储空间布局)--请参照本博客“操作系统”专栏

1.  C程序的存储空间布局: C 程序由下面几个部分组成: 正文段(即是代码段): 这是由CPU执行的机器指令部分.通常,正文段是可以共享的,并常常是可读的,以防止程序因为意外原因而修改自身的代码! 初始化数据段(即数据段): 它包含了程序中需要明确的赋初值的变量. 非初始化数据段(bss段):在程序开始执行之前,内核将此段中的数据初始化为0或空指针. 栈.自动变量以及每次函数调用时所需保存的信息都存放在此段中.每次调用函数时,返回地址以及调用者的环境信息(如某些寄存器的值)都存放在栈中.然后

操作系统之进程篇(4)--经典进程间通信(IPC)问题

1. 哲学家进餐问题: 问题描述: 五个哲学家在一个圆桌上进餐,每人的面前放了一盘意大利面,两个盘子之间有一个叉子,但是由于盘子里面的面条十分光滑,需要两个叉子才能进行就餐行为.餐桌的布局如下图所示: 假设哲学家的生活中只有两个活动:吃饭和思考[吃饭维持自身之生存,思考探究生存之意义],当然这样的哲学家在现实之中是不存在的.当一个哲学家在殚精竭虑之时,饥饿感随之而来,这是他会拿起左右手边的两个叉子来想享用这俗世之中的美味.酒足饭饱之后,又"躲进小楼成一统,管他春夏与秋冬"去了.问题是:

进程篇(3: 基本进程控制:进程的退出)--请参照本博客“操作系统”专栏

1. exit函数: 进程的五种正常的结束方式: 在main函数中执行return语句,这等效于exit; 调用exit函数.此函数由ISO C定义,其操作包括运行各终止处理程序,然后关闭所有标准I/O流等. 调用_exit或_Exit函数,ISO C定义了_Exit函数,目的是为了为进程提供一种无需运行终止处理程序和信号处理程序而终止的方法.并不处理标准I/O流! 进程的最后一个线程在其启动例程中执行返回语句,然后该进程以终止状态0返回. 进程的最后一个线程调用pthread_exit函数.

操作系统基础篇

程序运行的4个因素 (1).程序设计语言 (2).编译系统 (3).操作系统 (4).指令集结构(硬件系统) 操作系统的定义:操作系统是掌控计算机上所有事情的软件系统(硬件资源,软件资源) 操作系统对内存,i/o,cpu,外存等管理分为 1.cpu管理-------进程管理(@1.每个程序都能使用cpu,@2.非阻塞(一个进程不能一直占用cpu),@3.优先级) 2.内存管理------管理缓存,主存,磁盘等存储介质所形成的内存架构 3.外存管理-------文件系统,建立在磁盘空间上 4. i