第二章 进程管理

2-1-进程的基本概念

2-1-1关于程序执行顺序

1)引入前趋图:描述进程执行前后关系的图

有向无循环图(DAG)

Pi结点:描述一个程序段、进程、或一条语句。
有向边“→”:结点之间的偏序或前序关系
Pi→Pk,则Pi是Pk的直接前趋,Pk是Pi的直接后继。

在这里插入图片描述

2)程序顺序执行时的特征

顺序性 处理机的操作严格按程序规定顺序执行
封闭性 程序一旦开始执行,其计算结果不受外界因素影响。
可再现性 程序执行只要初始条件一样,不论如何停顿,重复执行多少次结果都一样

3)程序的并发执行分析

在这里插入图片描述

  • List item要符合前趋关系:
    Ii->Ci; Ci->Pi;
    Ii->Ii+1;Ci->Ci+1;
    Pi->Pi+1;

  • 并发不是随意的
    如C1,C2无法交替执行,只能顺序执行;但C2和P1则没有严格时间关系

多道程序运行,走走停停的可能顺序有很多种,符合前趋图的关系才是合理并发

4)并发程序执行时的特征
  • 间断性(运行表现)
    多道 -> 程序并发执行-> 要共享系统的资源 -> 形成相互制约的关系
    -> 相互制约导致并发程序具有“执行——暂停——执行”这种间断性的活动规律。

  • 失去封闭性
    共享资源,资源状态由多道程序改变,程序运行失去封闭性。即程序运行受其他程序的影响

  • 不可再现性
    结果不确定,程序执行将没有任何意义
    在这里插入图片描述

2-1-2进程

OS利用“进程实体”控制程序执行就产生了“进程”,进程就是用于描述、控制程序在内存中并发运行的一个东东

1)进程的定义

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位

2)进程的特征
  • 结构性特征,进程的根本——PCB
  • 动态性
    进程实质上是进程实体的一次有生命期的执行过程。程序只是静态的一组有序指令。
    进程最基本特征
  • 并发性
    多个进程实体同存于内存中,在一段时间内同时运行。
    有PCB的程序才能并发
  • 独立性
  • 异步性
区别进程与程序
动与静:
	进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。
永久与暂时:
	进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存。
结构:
	进程的组成包括程序、数据和进程控制块(进程各种控制信息)。	
进程与程序的对应关系:
	都可1对n。通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
3)进程的基本状态
  • 就绪状态Ready
    进程获得除CPU之外的所有必需资源,一旦得到CPU控制权,可立即运行
  • 运行状态Running
    进程已获得所有运行必需的资源,正在处理机上执行
  • 阻塞状态Blocked
    正在执行的进程由于发生某事件(请求I/O、申请缓冲、时间片到)而暂时无法执行时,便放弃CPU后暂停
    在这里插入图片描述
  • 挂起状态*:就绪的、但不会被调度执行
    产生原因
    用户自己请求暂停
    父进程检查、协调子进程时挂起子进程
    调节负荷的需要,负载过重,为保证实时任 务的控制,挂起一些不重要的进程
    操作系统的检查和记录需要挂起进程。

    在这里插入图片描述
各种状态下的进程队列
单处理机系统,执行态的进程只有一个;
就绪态、阻塞态的进程可有多个。一般讲它们分别排称一个队列,称就绪队列、阻塞队列。
阻塞队列有的会根据不同原因再排成多个队列。
Linux的进程状态*
创建状态:

Pcb已建立,
但资源分配还未完成

终止状态:

不可再执行,
归还资源,保留一份状态码好计时统计数据。

增加了操作系统管理进程的灵活性。如os可根据性能和内存容量限制,推迟创建态转入就绪态

2-1-3进程控制块PCB

进程实体:代码段+数据段+PCB

进程控制块是进程存在的唯一标志
进程控制块定义 Process Control Block

存放进程的管理和控制信息的数据结构称为进程控制块。

1)进程控制块中的信息
  • 进程标识符信息
    每个进程都必须有一个唯一的标识符
    内部标示符:唯一的数字序号,方便系统使用
    外部标示符:方便用户使用,用户进程访问某进程时使用

  • 处理机状态信息
    主要由处理机的各种寄存器中的内容组成,被中断时这些信息要存放到PCB。
    通用寄存器:用户程序访问的,暂存信息
    指令计数器:下一条指令地址
    程序状态字PSW:一些状态信息
    用户栈指针:每个用户进程都有的存放过程和系统调用参数及调用地址的一组系统栈。

  • 进程调度信息
    进程状态
    进程优先级
    进程调度所需的其他信息:调度算法相关信息
    事件:状态转换有关的事件

  • 进程控制信息
    程序和数据的地址(单个进程):数据所在的内外存地址
    进程同步和通信机制(多进程间):同步和通信机制的信号量、消息队列指针等
    资源清单
    链接指针(PCB的组织):本PCB所在队列的下一个进程PCB首地址。

2)pcb信息的存放

系统运行中有若干个程序的PCB,它们常驻内存的PCB区。
采用的数据结构:PCB结构体,PCB链表或队列

3)pcb的组织方式?
  • 链接方式
    同一状态的PCB,依靠链接指针链接成队列。就绪队列;若干个阻塞队列;空白队列(PCB区的空PCB块)
    在这里插入图片描述
  • 索引方式
    同状态的PCB同样集中记录,但以索引表的方式记录PCB的地址。用专门的单元记录各索引表的首地址。
    在这里插入图片描述

2-2-进程控制

进程图

可用 “进程图”描述一个进程的家族关系,该图实际就是一种有向树
在这里插入图片描述
系统中运行的进程并不都是孤立的,有的进程运行后,会调用其他进程来执行,这样就组成了进程间的父子关系

2-2-1 进程控制

  • 一个进程创建另一进程的事件(原因)

用户登录:分时情况下用户的请求
作业调度:批处理中
提供服务:运行中的用户程序提出功能请求,要创建服务进程(如打印服务)
应用请求:应用程序自己创建进程,完成特定功能的新进程。(木马程序)

  • 创建过程
    (1) 申请空白PCB
    (2) 为新进程分配资源
    主要是内存资源的处理
    (3) 初始化进程控制块
    标识符(包括父进程的)、程序计数器指向程序入口地址,就绪态、优先级等信息的填写。
    (4) 将新进程插入就绪队列

OS通过调用进程创建原语Creat()创建新进程
原语是由若干指令构成的原子操作过程,作为整体实现功能,不可被打断
其他各控制工作也都是由OS内核以“原语”的方式实现,以保证不被打断

2-2-2 进程终止

引起进程终止的事件
  • 正常结束
  • 异常结束
    内存越界错误
    保护错(权限错,如修改只读文件等)
    非法指令(不存在的指令,程序异常转向而把数据当指令)
    特权指令错(用户态程序试图执行只有OS可执行的指令)
    运行超时、运算错、i/o故障等
  • 外界干预
    操作员或操作系统干预(死锁时,可人为结束)
    父进程请求终止子进程
    父进程终止,子孙进程也跟着终止
终止进程

对上述事件,OS调用内核终止原语,执行下列过程:

  • (1) 根据进程标示符,检索出该进程PCB,读其状态。

    *IF 执行态,立即终止该进程,置调度标志为真,指示重新进行调度。
    *IF 有子孙进程,亦应予以终止,以防成为不可控进程。

  • (2) 归还全部资源至其父进程或系统。

  • (3) 将该进程PCB从所在队列或链表中移出

2-2-3 进程的阻塞与唤醒

引起进程阻塞和唤醒的事件

请求系统服务的满足情况
启动某种需等待(I/O)操作
合作需要的新数据尚未到达
执行某功能的进程暂时无新工作可做(如发送数据进程)

阻塞和唤醒过程

由进程调用阻塞原语阻塞自己,是主动行为:
(阻塞与唤醒原语作用相反,成对使用)
(1)将PCB中的状态改为阻塞
(2)该PCB加入到阻塞队列中
(3)转进程调度,将处理机分配给另一进程
(4)进行进程切换,即根据两切换进程的PCB,保护与重新设置处理机状态。

2-2-4 进程的挂起和激活

挂起原语将指定进程或阻塞进程挂起。

(1)检查被挂起进程的状态,活动就绪则改为静止就绪,活动阻塞则改为静止阻塞
(2)将该PCB复制到内存(方便检查)/外存(对换)指定区域
(3)*若挂起的进程是执行态,则需重新进行进程调度。

注意:进程只能挂起自己或其子孙进程。

激活原语的执行过程

若挂起进程在外存上,将其调入内存
检查进程状态,若处于静止就绪,则改为活动就绪,若处于静止阻塞,则改为活动阻塞

在这里插入图片描述

2-3-进程同步

关键:“判断”和“修改标志”

两种制约关系
  • 间接相互制约关系:主要源于资源共享,表现为 进程A—打印机资源—进程B(互斥)
  • 直接相互制约关系:主要源于进程合作,表现为 进程A写缓冲—进程B读缓冲(有序)

2-3-1理解同步的含义

1.进程同步的主要任务

使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

2.临界资源:一次仅允许一个进程使用的资源
  • 互斥:在操作系统中,当一个进程进入临界区使用临界资源时,另一个进程必须等待,直到占用临界资源的进程退出临界区,我们称进程之间的这种相互制约关系为“互斥”。
  • 同步:多个相互合作的进程,在一些关键点上可能需要互相等待或互相交换信息,这种相互制约关系称为进程同步关系。可理解为“有序”
3.临界区

每个进程中访问临界资源的那段代码叫临界区。
为了正确同步,对临界区的代码要增加控制

进入区:对欲访问的临界资源进行检。若此刻未被访问,设正在访问的标志
临界区:访问临界资源的代码。
退出区:将正在访问的标志恢复为未被访问的标志
剩余区:其余部分

在这里插入图片描述

4.同步机制应遵循的规则

实现互斥的方法应符合如下每条原则

空闲让进:资源使用最基本原则
忙则等待:保证互斥
有限等待:合适时被唤醒防止死等
让权等待:能主动释放CPU防止忙等
硬件同步机制*
  • 关中断
    进入锁测试前关闭中断,直到完成锁测试并上锁后才能打开中断。进程在临界区执行期间,系统不响应中断,从而不引发调度。
    缺点:
    滥用风险
    关中断时间过长会影响效率,限制CPU交叉执行能力

  • Test-and-Set指令

     boolean TS(boolean *lock)
     {
     	Boolean old;
     	old=*lock;
     	*lock=TRUE;
     	return old;
     }
    

*一个不可分割的原语
不适用于多CPU系统

在这里插入图片描述

  • 利用Swap指令实现进程互斥
    对换指令(intel 80x86中称XCHG指令),用于交换两个字节的内容

     void swap(boolean *a, boolean *b)
     {boolean temp;
       temp=*a;
      *a=*b;
       *b=temp;	
     }
    

为临界资源设置一个全局布尔变量lock=false。每个进程一个局部布尔变量key。

	do{
	  key=TRUE;
	   do{
	    swap(&lock,&key);
		}while(key!=FALSE);
		 临界区操作;
		 lock=FALSE;
	    剩余区;
	}while(TRUE);

完全利用软件方法,有很大局限性,也不适于多进程,现在已很少采用。
硬件指令机械操作可保证锁开、关操作不被打断;适用于任意数目的进程。但等待要耗费CPU时间,不能实现“让权等待”,从等待进程中随机选择一个进入临界区,有的进程可能一直选不上,难以实现较为复杂的进程同步问题。

2-3-2信号量机制控制进程同步

1.整型信号量

信号量定义为一个整型量
根据初始情况赋相应的值
仅能通过两个原子操作来访问
l两个原子操作

对临界资源的互斥使用

2.记录型信号量
  • 整型信号量符合“有限等待”原则
    signal释放资源后,当CPU被分配给等待进程后,等待进程仍可继续执行,可以符合“有限等待”。

  • 但整型信号量不符合“让权等待”原则
    整型信号量的wait操作,当s ≤0时,当前进程会占着CPU不断测试;
    信号量原语不能被打断,这个占有CPU的进程会一直不断的占据CPU循环下去,陷入忙等。

  • 改进:条件不符时应能够主动放弃CPU

  • 新问题:放弃CPU的进程进入阻塞队列:因等待某信号量而放弃CPU的等待进程会有“若干”个,需将它们组织管理起来,并在合适的时候唤醒。

Value>0,表示当前可用资源的数量;
Value≤0,其绝对值表示等待使用该资源的进程数,即在该信号量队列上排队的PCB的个数。

在这里插入图片描述

  • 定义信号量semaphore代表可用资源实体的数量。又叫信号灯。 当≥0,代表可供并发进程使用的资源实体数
    当<0,表示正在等待使用该资源的进程数。
  • 建立一个信号量必须经过说明,包括 信号量所代表的意义 赋初值 建立相应的数据结构,以便指向等待使用临界区的进程。

除初值外,信号量的值仅能由标准原子操作P、V操作来改变。 PV操作是荷兰语通过和释放的意思。

3.信号量的基本应用

(1)实现进程互斥

实现多个进程互斥

互斥信号量注意点:
  • 互斥信号量mutex初值为1;
  • 每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间
  • 必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏:
    遗漏P原语则不能保证互斥访问
    遗漏V原语则不能在使用临界资源之后将其释放(给其他等待的进程);

(2)实现进程间的前趋关系(有序)
前趋关系:
并发执行的进程P1和P2中,分别有代码C1和C2,要求C1要在C2开始前完成;
为每对前趋关系设置一个同步信号量S12,并赋初值为0。则只有V操作所在进程获得cpu时能运行
在这里插入图片描述

  • 信号量值为0的点是限制的关键所在;
  • 成对使用P和V原语(在有先后关系的两个进程中),不能次序错误、重复或遗漏,否则同步顺序出错。

例子:
在这里插入图片描述

4.AND型信号量

出现原因:一些应用往往需要两个或多个共享资源,而不是前述的一个资源。进程同时要求的共享资源越多,发生死锁可能性越大。
在这里插入图片描述
解决思想:
一次性分配给进程所需资源,用完一起释放。Wait操作时对它所有需要的资源都要判断,有AND条件,故称“AND同步”、“同时wait”。
在这里插入图片描述

5.信号量集

引入原因:
每次只能获得或释放一个单位的资源,低效;
某些时候资源分配有下限的限制;
修改:在大于可分配设置的下界值t前提下,每次可分配d个。
在这里插入图片描述

只有一个信号量S的几种特殊情况:

  • Swait(S, d, d),,允许每次申请d个资源,若现有资源数少于d,不予分配。

  • Swait(S, 1, 1),蜕化为一般的记录型信号量,一次申请一个,至多分配一个(S>1时可计数,或S=1时可控制互斥)。

  • Swait(S, 1,
    0),当S>=1时,允许多个进程进入某特定区,当S变为0后,阻止任何进程进入特定区,相当于可控开关。并不对S资源的数量产生影响。

在这里插入图片描述

信号量题目做题一般方法:
分析问题,找出同步、互斥关系
根据资源设置信号量变量
写出代码过程,并注意P、V操作的位置
检查代码,模拟机器运行,体验信号量的变化和程序运行过程是否正确。

2-3-3管程

信号量机制的不足:

信号量的控制分布在多个进程中

正确性分析困难;
分散的P、V操作:易出错,使用不当可能导致死锁。
修改、维护困难:易读性差,任一修改都可能影响全局;测试期间发现错误困难,即使发现错误也不容易定位出错位置。
1.管程的组成

在这里插入图片描述
在这里插入图片描述

2.管程的特点
  • 任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据;
    就如同使用临界资源,就要先通过其信号量的申请。
  • 任何时刻,仅允许一个进程在管程中执行某个内部过程。
管程如何实现同步?
对共享变量互斥操作:
	管程的特点直接实现了该要求,进程一次一个进入管程调用内部过程操作共享变量。
	管程的互斥访问完全由编译程序在编译时自动添上,无须程序员关心,能保证正确。
操作的同步控制:
	靠条件变量的操作管理实现。
	进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行。

在这里插入图片描述

3.管程的同步控制(条件变量)

(主要作用就是进程同步的阻塞和唤醒控制)

局部于管程的变量有两种

  • 普通变量
  • 条件变量(用于控制进程阻塞和唤醒)
    类似信号量变量,但不取具体值;相当于每个阻塞队列的队列指针。
    对条件变量的操作需结合对普通变量的条件判断,从而控制进程状态。

*关于条件变量的操作
x.wait将执行进程挂到x对应的等待队列上;
x.signal唤醒x相应的等待队列上的一个进程。

signal操作,是重新启动一个被阻塞的进程,但如果没有进程被阻塞,则不产生任何效果
而信号量机制中的signal操作,若没有需要唤醒的进程,必须要做的还有修改信号量变量的值。
4.管程的优缺点

优点

  • 保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。管程可以以函数库的形式实现。相比之下,管程比信号量好控制。
  • 管程可增强模块的独立性:系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,使同步操作相对集中,从而增加了模块的相对独立性
  • 引入管程可提高代码的可读性,便于修改和维护,正确性易于保证:采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰。
    缺点
  • 大多数常用的编程语言中没有实现管程,如果某种语言本身不支持管程,那么加入管程是很困难的。
  • 虽然大多数编程语言也没有实现信号量,但可将P、V操作作为一个独立的子例程或操作系统的管理程序调用加入

2.4 进程通信

进程通信是指进程之间的信息交换。

  • 一、低级通信——进程之间的互斥和同步

信号量机制是有效的同步工具,但作为通信工具缺点如下:

(1)效率低(通信量少)
(2)通信对用户不透明(程序员实现,操作系统只提供共享存储器供代码操作)
  • 二、高级进程通信

用户直接利用操作系统提供的一组通信命令,高效地传送大量数据的通信方式。

操作系统隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性。

1.进程通信的类型

高级通信机制可归结为四大类

  • 共享存储器系统(操作存储区方式)

    相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。

    基于共享数据结构的通信方式(低级)
    诸进程公用某些数据结构,借以实现诸进程间的信息交换。
    如生产消费问题,定义共享的数据结构:n个长度的有界缓冲区。
    程序员:提供对公用数据结构的设置及对进程间同步的处理。
    操作系统:提供共享存储器。
    特点:复杂、低效率,还只适合传递相对少量的数据。

    基于共享存储区的通信方式(高级)
    在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。
    进程通信前先向系统申请获得共享存储区中的一个分区,并指定该分区的关键字;
    若系统已经分给了其他进程,则将该分区的描述符返回给申请者,申请者把获得的共享存储分区连接到本进程上;此后,便可像读、写普通存储器一样地读、写该公用存储分区。多进程借助该区通信。

  • 消息传递系统(发–收方式)
    最广泛使用的一种,进程间的数据交换,以格式化的消息为单位。屏蔽底层复杂操作。
    单机:操作系统底层编程中的消息传递系统调用;
    计算机网络:消息称为报文。程序员直接利用系统提供的一组通信命令(原语)进行通信。(④客户机-服务器系统)
    如socket编程,利用函数库的send、receive等命令即可实现网络通信

  • 管道通信(中间文件方式)
    所谓“管道”,是指用于连接一读进程和一写进程以实现通信的一个共享文件,又名pipe文件。
    向共享文件输入的写进程以字符流形式将大量的数据送入管道;而接收管道输出的读进程则从管道中接收(读)数据。
    首创于UNIX系统。其管道机制需提供三方面的协调能力:互斥、同步、确定对方是否存在。

  • Client-Server system
    套接字(Socket)
    一个套接字就是一个通信标识类型的数据结构,包含了通信目的的地址,端口号,传输层协议、进程所在的网络地址,以及针对C\S程序提供的不同系统调用(API函数)等。
    系统中所有的连接都持有唯一的一对套接字及端口连接,从而方便地区分来自不同应用程序进程或网络连接的通信,确保通信双方间逻辑链路的唯一性。
    远程过程调用(远程方法调用)
    RPC 有很多正面的应用,比如网络文件系统NFS、Web Service等,也是网络安全中容易被攻击的技术。
    Remote Procedure Call,远程过程调用。也就是说,调用过程代码并不是在调用者本地运行,而是要实现调用者与被调用者二地之间的连接与通信。
    RPC的基本通信模型是基于Client/Server进程间相互通信模型的一种同步通信形式;它对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明的。
    RPC应用开发步骤

     1.定义客户端、服务器端的通信协议(定义服务过程的名称、调用参数的数据类型、返回参数的数据类型、底层传输类型(UDP/TCP)等。
     2.开发客户端程序。
     3.开发服务器端程序。
    

    对于RPC通信协议的生成,最简单的方法是利用协议编译工具:生成实现RPC协议的生成器rpcgen( C程序) ,Remotetea( java程序)。

2.消息传递通信的实现方法

1)直接通信方式

发送进程利用OS所提供的发送命令(原语),直接把消息发送给目标进程。此时,发送进程和接收进程都以显式方式提供对方的标识符。通常利用系统通信命令(原语):
Send(Receiver, message);
Receive(Sender, message);

2)间接通信方式

基于共享数据结构的实体用来暂存发送给目标进程的消息;接收进程则从该实体中,取出对方发送给自己的消息。通常把这种实体称为信箱。

消息在信箱中可以安全地保存,只允许核准的目标用户随时读取。既可实时通信,又可非实时通信。

3.消息传递系统的实现

单机和网络环境下的高级进程通信广泛采用“消息传递”方式,需要考虑的问题:

  • 通信链路的建立
    计算机网络环境下,用原语显式建立/拆除链路
    单机系统只须利用系统原语,进程间链路由系统自动管理。
  • 消息格式
    单机系统,发送与接收进程在同一台机器,环境相同故格式简单;
    网络环境下,受不同目标机器的环境和长距离信息传输等因素的影响,消息格式较复杂,消息常是“大头+正文”
  • 同步方式(如何控制发送和接收的状态)
    即考虑平时闲着,还是平时忙碌?
    发送进程阻塞、接收进程阻塞(无缓冲紧密同步)
    发送进程不阻塞、接收进程阻塞(服务器程序)
    发送进程和接收进程均不阻塞(缓冲队列)

4.消息缓冲队列通信机制

美国Hansan提出,在RC 4000系统上实现。后被广泛应用于本地进程通信

  • 不需管理链路
  • 定义简单数据结构(亦即消息格式)
    在这里插入图片描述

在这里插入图片描述

  • 实现发送和接收的操作原语
    发送原语
    在这里插入图片描述
    接收原语
    在这里插入图片描述

2.5 线程

  • 线程的属性
    多线程OS中,一个进程包括多个线程,每个线程都是利用CPU的基本单位。

    轻型实体:只需一点必不可少的、能保证独立运行的资源。(TCB)
    独立调度和分派的基本单位:调度切换迅速且开销小。
    可并发执行
    共享进程资源:同进程中的线程可共享相同的进程地址空间、已打开文件、信号量机构等。

  • 线程的信息
    状态参数
    标识符、运行状态、优先级、寄存器状态、堆栈、专有存储器、信号屏蔽等。
    运行状态
    执行、就绪、阻塞

  • *多线程的应用
    一个应用程序有多个任务或功能需要同时进行处理,就最适合多线程机制。

    应用情况举例:
    网络软件,需要同时进行用户界面响应、收数据、发数据。
    网络下载工具:多线程下载的下载工具

  • *编程举例
    多线程编程过程是类似的:

    可用win32 API编写C风格程序
    C的main既是规定了主线程的代码。启动程序时,系统根据main地址,启动主线程。

    在主线程代码某处利用线程创建函数即可创建线程;给创建函数编写线程功能代码;

    利用其他一系列函数使系统管理多个线程。

    也可用封装好的类库,如JAVA,MFC

     netgameserver.java
     public class netgameserver	//主类
     {  static int usercount=1;
     	public static void main(String 					args[])//main函数
     	{Socket client=null;	...
     	  new Serthread(client).start();}//启动新线程 …}
     	}
     	class Serthread extends Thread					//自定义的线程类
     	{ 	String url="jdbc:odbc:userInfo";	
     		Connection con;  Statement stmt;
     		Socket thclient;
     		DataInputStream in=null;
     		…
     		public void run()//线程执行run函数----->
     		{System.out.println("a server thread started !");
      		boolean userlistfirshow=false;
     		while(true)//开始监听
     		{	  	
     			if(!userlistfirshow)
     		……}
     	}
     }
    
  • *线程与进程的比较
    调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位。
    并发性:进程之间可以并发,实质上是不同进程中的两个线程并发。一个进程的多个线程之间亦可并发。
    拥有资源:进程间资源相互独立;同一进程的各线程间共享。某进程内的线程在其它进程不可见
    系统开销:线程上下文切换在同进程环境下上下文切换要快得多。因为同进程内线程间共享内存地址和打开的文件资源;

  • 线程的管理
    同步和通信机制
    1)互斥锁
    比较简单的,控制线程互斥访问资源;
    适用于高频度使用的关键共享数据和程序段;
    unlock和lock两个锁操作原语;
    2)条件变量
    与互斥锁一起使用
    锁保证互斥进入临界区,但利用条件变量使线程阻塞
    注意不满足条件时,wait条件变量:
    释放互斥锁
    进程阻塞在条件变量指向队列中
    被唤醒后要重新再设互斥锁

    3)信号量
    私用信号量(private samephore)
    用于同进程的线程间同步,数据结构存放在应用程序的地址空间。属于特定进程,OS感知不到其存在。
    公用信号量(public samephore)
    用于不同进程间或不同进程中线程的同步,数据结构由OS管理,存放在受保护的系统存储区。

线程的实现方式

  • 1.内核线程KST(kernel-level thread)

    依赖于内核,利用系统调用由OS内核在内核空间完成创建、撤消、切换等线程工作。
    时间片分配给线程,所以多线程的进程获得更多CPU时间。
    优点
    多处理器系统下可实现多线程并行
    一个线程发起系统调用而阻塞,不会影响其它线程的运行
    线程切换开销远小于进程切换
    内核本身也采用多线程技术可提高系统执行速度和效率
    缺点
    用户态运行线程,调度和管理线程则是内核态。模式的切换开销大

  • 2.用户线程ULT(user-level thread)
    无须利用系统调用,不依赖于OS核心。进程利用线程库函数创建、同步、调度和管理控制用户线程。

    调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,速度比kst快。

    优点
    用户线程的维护由应用进程完成;内核不了解用户线程的存在;线程切换不需要内核特权;
    用户线程调度算法可针对应用优化;
    多线程的实现与平台无关

    缺点
    一旦系统调用引起进程阻塞,则整个进程的所有线程都不能执行
    以进程为单位分配cpu,所有在多处理器系统中没有优势

  • 3.组合方式
    内核支持多KST线程的管理,同时也允许用户应用程序级的线程管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值