-------2011/10/31
进程
进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
作为描述程序执行过程的概念,进程具有动态性、独立性、并发性和结构化等特征。
动态性是指进程具有动态的地址空间,地址空间的大小和内容都是动态变化的。地址空间的内容包括代码(指令执行和处理器状态的改变)、数据(变量的生成和赋值)和系统控制信息(进程控制块的生成和删除)。
独立性是指各进程的地址空间相互独立,除非采用进程间通信手段,否则不能相互影响。
并发性也称为异步性,是指从宏观上看,各进程是同时独立运行的。
结构化是指进程地址空间的结构划分,如代码段、数据段和核心段划分。
线程
为了提高进程内的并发性,在引入线程的操作系统中,把线程作为处理器调度的对象,而把进程作为资源分配单位,一个进程内可同时有多个并发执行的线程。
线程(Thread)是一个动态的对象,它是处理器调度的基本单位。
进程和线程的比较
①地址空间资源:不同进程的地址空间是相互独立的,而同一进程的各线程共享同一地址空间。一个进程中的线程在另一个进程中是不可见的。
②通信关系:进程间通信必须使用操作系统提供的进程间通信机制,而同一进程中的各线程间可以通过直接读写进程数据段(如全局变量)来进行通信。当然同一进程中各线程间的通信也需要同步和互斥手段的辅助,以保证数据的一致性。
③调度切换:同一进程中的线程上下文切换比进程上下文切换要快得多。
-------2011/11/1
整理自http://oss.org.cn/ossdocs/os/process/main.htm
并发性:同步、互斥和死锁
进程的并发性产生了竞争条件,这就引出了三个控制问题:首先是互斥(mutual exclusion),实施互斥又产生了死锁(deadlock)和饥饿(starvation)。
下面是两种解决同步问题的机制:信号量、管程
信号量
①类型定义
每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类PASCAL语言表述)
semaphore = record
value: integer;
queue: ^PCB;
end;
其中PCB是进程控制块,是操作系统为每个进程建立的数据结构。
s.value>=0时,s.queue为空;
s.value<0时,s.value的绝对值为s.queue中等待进程的个数
②PV原语
对一个信号量变量可以进行两种原语操作:p操作和v操作,定义如下: procedure p(var s:samephore);
{
s.value=s.value-1;
if (s.value<0) asleep(s.queue);
}
procedure v(var s:samephore);
{
s.value=s.value+1;
if (s.value<=0) wakeup(s.queue);
}
其中用到两个标准过程:
asleep(s.queue);执行此操作的进程的PCB进入s.queue尾部,进程变成等待状态
wakeup(s.queue);将s.queue头进程唤醒插入就绪队列
s.value初值为1时,可以用来实现进程的互斥。
管程
是对信号量的发展,其基本思想是将共享变量和对它们的操作集中在一个模块中。
①类型定义
monitor_name = MoNITOR;
共享变量说明;
define 本管程内部定义、外部可调用的函数名表;
use 本管程外部定义、内部可调用的函数名表;
内部定义的函数说明和函数体
{
共享变量初始化语句;
}
②操作
wait(c):若紧急等待队列不空,唤醒第一个等待者,否则释放管程使用权。执行本操作的进程进入C队列尾部;
signal(c):若C队列为空,继续原进程,否则唤醒队列第一个等待者,自己进入紧急等待队列尾部。