仝瑞阳

摘 要:本文阐述了进程、线程概念,描述了进程与线程的关系;通过我们熟悉的知识竞赛场景做类比,能深入浅出地理解操作系统中的进程、线程概念及执行过程;以门钥匙为例生动、形象地诠释了进程间的通讯、同步与互斥机制;阐述了进程、线程的创建方法以及应用特征。

关键词:进程;线程;并发;共享;资源

0引言

操作系统是应用程序(用户)与计算机硬件的中间层,其管理计算机软硬件、为用户提供接口。操作系统的核心是进程、线程的调度执行;为了提高CPU的执行效率引入多进程、多线程机制,准确理解进程、线程是掌握操作系统原理的关键。

1进程与线程

进程:是有独立功能的程序在一个数据集合上运行的过程,是一个被操作系统进行资源分配和调度的一个独立调度单位。由机器指令、数据、堆栈和控制等部分组成。进程是程序执行的过程;进程有就绪、执行、阻塞等几种状态。

线程:是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源[1]。

进程和线程的关系:线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。

进程和线程的区别:进程是操作系统资源(中央处理器、内存、文件、网络等)分配的基本单位;线程是任务调度和执行的基本单位(占用CPU)。每个进程都有独立的代码和数据空间,线程有独立的运行栈和程序计数器,因此进程之间切换开销大,线程之间切换开销小,故线程又叫轻量级进程。系统为每个进程分配不同的内存空间;线程除CPU外不单独分配内存(使用其所属进程的资源,线程组共享)。

多进程是多个进程同时存在于内存中形成并发执行(不是同时执行)。

为理解进程、线程,现举一我们熟悉的知识竞赛场景对照描述:舞台上有n个队,每队有m个队员进行抢答,抢答器系统对应CPU,一个队对应一个进程,一个人对应一个线程。此时就相当于有n个进程,每个进程拥有m个线程。

一个队占有一个抢答台位相当于一个进程拥有的内存空间,m个队员共享。

某队员抢答有效进行发言相当于线程拥有CPU执行。

进程调度:调度算法有先来先服务(FCFS)、轮转(RR)、优先级、多队列、多级反馈队列等。调度方式有抢占式、非抢占式。队员争抢过程相当于非抢占式、先来先服务进程调度方法。

2 进程间通信与同步

虚拟内存机制(程序运行时以分页、段方式把一部分部分调入内存[2])为进程管理存储资源带来了种种好处,但是也给进程带来了一些麻烦,因为每个进程拥有独立的虚拟内存地址空间,所以对不同的进程来说一个相同的虚拟地址以为着不同的物理地址。CPU执行指令是采用了虚拟地址,对于一个特定的变量来说,对应着一个特定的虚拟地址。因此两个进程不能通过简单的共享变量的方式来进行通信,只能用信号、管道等方式通信,效率比直接共享内存方式差。

进程互斥与同步:多进程并发执行会出现争用资源,若资源唯一(象独木桥一次只许一人),就必须对资源使用进行限制,争用这一资源的进程称为是互斥关系,某段时间只能某个进程占用资源。若某两个或几个进程执行顺序先后是确定的不能改变(如生产和消费必须是先生产再消费)称这两个进程是同步关系。

互斥、同步通过信号量机制给以保障。信号量相当于门锁的钥匙,互斥相当于只有一把钥匙,拿到钥匙者开锁进门,出来时交出钥匙,只能一人进门(实现原语操作);同步的实现用两层信号量,相当于两道门锁,第一道门是先后次序(生产先执行,消费者看有产品再执行)的控制,第二道门实现互斥。

3进程、线程创建

进程创建唯一方法是调用函数fork(),该调用创建一个与原进程代码完全一样的子进程,原进程称为父进程,新进程称为子进程,父子进程不同的是进程标识号(PID)以及它们的进程控制块(PCB)中的父子进程标识号记录字段,通过下面代码作一说明:

If(fort()==0)

Printf(“I am  son_process\n”);

else

Printf(“I am father_process\n”);

Sleep(1);

执行结果是I am  son_process

I am fathe_rprocess

或者: I am father_process

I am  son_proces

从结果看if与else中的代码都完成一次执行,说明fort()向父进程返回了不为0的值(即进程的ID)而向子进程返回了0值。

线程创建:C语言利用Pthreads库创建线程数据结构,Pthreads运行在用户空间,内核调度实体(KSE)运行在内核空间;Linux内核提供clone系统调用创建类似线程的轻量级进程[3]。

Java中线程的实现:Java语言提供了java.lang.Thread类来表示线程,提供了run方法表示线程的运行的逻辑控制流[4]。

4结语

构建并发程序可以基于进程也可基于线程,现代多任务操作系统(如WINDOWS)采用时间片轮转调度的多线程方式,由于切换开销比进程小,并发执行效率高。

参考文献:

[1]汤小丹,梁红兵,哲凤屏,等. 计算机操作系统.4版. 西安:西安电子科技大学出版社, 2019 ,39-40

[2]白中英,戴志涛.计算机组成原理.6版.北京:科学出版社,2019,104-105

[3]邵国金等.Linux操作系统.3版.电子工业出版社,2018,339

[4]软件开发技术联盟.Java开发实战.清华大学出版社,2013,237-238