操作系统学习笔记——进程与线程(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文重点在于区分进程和线程,会结合一些经典考研题进行综合理解。同时本文会借用清华大学ucore OS实验中的部分代码帮助理解。

请用点赞催更~


一、进程

(一)基本概念

1.区分进程与程序

在操作系统诞生初期,为了提高操作系统的并发性和共享性,引入进程这个概念。这里伴随着三个重要概念的产生,我这里用两组集合来表示他们(进程,进程映像)&&(进程,程序)。让我们来看看这两组概念的辨析:

ps:进程映像也被叫做进程实体。

(1). 进程,进程映像
进程映像=PCB+程序段+相关数据段,它是静态概念;
进程的定义有很多,我们只需要灵活的理解,需要记忆的是进程是一个动态的概念。

(2). 进程,程序
程序程序是指令的有序集合,无执行含义,所以它也是静态的;
相反进程是动态的。

2.特征(了解)

四大特征:动态性,并发性,独立性,异步性

3.进程的五种状态及其转换

这里不对进程的五个状态的转换做说明,因为有太多的文章讲了类似的事情。我们把重点放在一些值得关注的点上面(俗称 考点)。

首先,我们要对特殊状态的转化做到心中有数,所谓特殊是指单向性,触发条件的特定性,我们结合一些题目来记忆。

eg1.在进程转换时,不可能发生的状态是___。(阻塞->运行)
eg2.__事件的发生必然引起进程的切换。(一个进程从运行态变为就绪态)

(二)进程构成

1.构成元素(PCB+程序段+数据段)

大家对进程实体的构成并不陌生,但你知道他们具体的工作吗?
这里假设一个进程实体的构成为PCB,共享正文段,数据堆段,数据栈段组成。

PCB:里面的东西都是大同小异的,包括PID,UID,优先级,状态等,如下图所示,图为UCORE OS中PCB的具体构成部分。
在这里插入图片描述
正文段:(也叫程序段)其中包含的是二进制代码和常量。(代码+常量)

数据堆段:里面是动态分配的存储区。(动态分配内存)

数据栈段:存放临时使用的变量,包括一些未赋值的临时变量。(变量)

大家记住正文段,堆栈段中有什么,剩下的全在PCB。>.<

2.控制方式

上次我们讲中断里提到过,内核态主要负责的四大板块,其中一个是原语。

啥是原语,我们现在来解释。一般把进程控制用的程序段称为原语。
常用的原语有:

  • 创建原语(用于进程的创建)
  • 终止原语(使进程终止)
  • 阻塞原语即Block原语(将运行态的进程转为阻塞态)
  • 唤醒原语即Wakeup原语(将阻塞态进程放入就绪态)

特别需要注意的是,Block原语要与Wakeup原语配套使用,否则你的进程就一直处于阻塞态永远不会被唤醒。

(三)进程通信

1.共享存储

即通信的进程存在一块可以直接访问的共享空间。这里有个问题,如果两个通信进程同时读取或者同时写入到底以谁为准呢?所以要利用同步互斥工具(P/V)。

OS只负责提供可共享使用的存储空间和同步互斥工具(P/V)。数据交换由用户自己安排。

2.消息传递

在消息传递系统中,进程间的数据交换是用格式化的消息(message)为单位.通过发送原语和接受原语进行数据交换。
具体的通信方式分成两种:
1)直接,直接交给想要想给的进程;
2)间接,相比直接通信,需要一个中间实体(这个实体叫做信箱),跟现在的写信寄信收信的方式很像;

这种方式的优点:隐藏通讯细节,对用户透明。这样的机制常用于计算机网络和分布式系统中。

3.管道通信

基于文件系统的进程通信方式。对于一个进程,它有一个读缓冲区和一个写缓冲区,所以缓冲区只允许一边写入另一边读出。即一个进程的读缓冲区是另一个进程的写缓冲区,因为这种特殊机制的存在,这决定了管道通信是半双工通信。

管道通信中的共享文件是一种特殊文件,特殊性体现在:
1)限制管道大小;
2)读进程也可能工作得比写进程快。

二、线程

(一)基本概念

引入线程机制之后,线程成为了一个基本的CPU执行单元,也是程序执行流的最小单元,线程是一个"轻量级的进程"。由线程id,pc,寄存器集合和堆栈组成。

最重要的是,线程是进程中的一个实体,线程不能自己拥有系统资源,但线程还有一点在运行中必不可少的资源。一句话,有点资源但不多,虽然不多但是有。它可以与共享他所属的进程的全部资源(进程允许共享的全部资源)。

线程可以创建更多的线程,一个进程可以有多个线程。

(二)进程与线程的比较

  1. 调度。进程之间的切换必须进行上下文切换,开销大;线程之间的切换不一定会引起进程之间的切换,而在同一个进程下不同线程的切换所需要的开销很小,所以平均一下使得线程调度更小。
  2. 并发。引入线程提高了操作系统的并发性。
  3. 资源。进程是系统中拥有资源的基本单位;线程点资源但不多。
  4. 独立。每个进程有自己的独立地址空间和资源,除了全局共享变量,其他资源不允许其他进程访问;线程没这么独立。
  5. 开销。关于开销的论述也在调度中提到了。
  6. 线程支持多处理机系统。

(三)三种线程实现方式

1.用户级线程(ULT)

内核意识不到线程的存在。调度仍然是以进程为单位。

优点:

  • 线程切换不用进入内核,节省开销;
  • 进程的调度算法仍然可用,用户可以根据对自己的线程使用不同的调度算法;
  • 用户级线程管理是属于用户程序的一部分与操作系统无关,更加灵活。

缺点:

  • 一旦有一个线程出问题,则该进程内的所有线程都会被阻塞;
  • 不能发挥出多处理机的优势,内核每次分配给进程一个CPU,因为用户级线程的数量操作系统的内核是不知道的。

2.内核级线程(KLT)

由内核创建线程。

优点:

  • 能发挥多处理机优势,因为内核知道由多少线程,所以他给每个线程分配一个CPU调度;
  • 如果一个线程受阻,其他还能跑;

缺点:

  • 同一进程中的线程切换,需要从用户态转到内核态执行,系统开销大,这是因为用户进程的线程还是在用户态运行,而线程的调度和管理却在内核。

3.组合式线程

集合了前面的优点,还有效的避免了前面的缺陷,是现代操作系统常用的操作。

总结

我们用“人的生命历程”来类比进程。首先,人的生命历程一定是一个动态的、过程性的概念,要研究人的生命历程,先要介绍经历这个历程的主体是什么。主体当然是人,相当于经历进程的主体是进程映像,人有自己的身份,相当于进程映像里有 PCB:人生历程会经历好几种状态出生的时候、弥留的时候、充满斗志的时候、发奋图强的时候及失落的时候,相当于进程有创建撤销、就绪、运行、阻塞等状态,这几种状态会发生改变,人会充满斗志而转向发奋图强,发奋图强获得进步之后又会充满斗志预备下一次发奋图强,或者发奋图强后遇到阻碍会进入失落状态,然后在别人的开导之下又重新充满斗志。类比进程,会由就绪态转向运行态,运行态转向就绪态,或者运行态转向阻塞态,然后在别的进程帮助下返回就绪态。
若我们用“人生历程”这个过程的概念去类比进程,则对进程的理解就会更深一层。前面生活化的例子可以帮我们理解进程的实质,但它毕竟有不严谨的地方。一种较好的方式是,在类比进程和“人生历程”后,再看一遍前面较为严谨的书面阐述和讨论,这样对知识的掌握会更加准确而全面。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值