系统调用与进程
第三章
系统调用

处理应用程序分为哪几个步骤?这些步骤之间有什么关系?
答:处理应用程序分为四个步骤:编辑,编译,连接和运行。这些步骤是相互关联、
顺序执行的。具体表现为:
每个步骤处理的结果产生下一-个步骤所需要的文件;
每一个步骤能否正确地执行,依赖于前- -个步骤是否成功地完成。
第四章
进程与进程实体
程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程,例如,所谓创建xx进程,实质上是创建进程实体中的PCB;而撤销进程,实质.上是撤销进程实体中的PCB。
注意: PCB是进程存在的唯-标志!
从不同的角度,进程可以有不同的定义,比较传统典型的定义有:
- 进程是程序的一次执行过程。
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
- 进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一一个独立单位
引入进程实体的概念后,可把进程定义为:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
注:严格来说,进程实体和进程并不一样,进程实体是静态的,进程则是动态的。不过,除非题目专门考察二者区别,否则可以认为进程实体就是进程。因此我们也可以说“进程由程序段、数据段、PCB三部.分组成”
进程特征
什么是进程?进程与程序的主要区别是什么?
答:进程是- -个具有一定独立功能的程序关于某个数据集合的一次活动。进程与程序的主要区别是:
(1)程序是指令的有序集合,是一个静态概念。进程是程序在处理机的一次执行过程,
是一个动态概念。进程是有生命期的,因创建而产生,因调度而执行,因得到资源而暂停,因撤消而消亡;
(2)进程是一个独立的运行单元,是系统进行资源分配和调度的独立单元,而程序则
不是。
(3)进程与程序之间无- -对应关系。 一个程序可以对应多个进程,一个进程至少包
含一个程序。
进程组织(PCB组成方式)
链接方式
索引方式
进程状态转换
进程通信方式
共享存储:
管道通信:
1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
2.各进程要互斥地访问管道。
3.数据以字符流的形式写入管道, 当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
4.如果没写满,就不允许读。如果没读空,就不允许写。
5.数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况
消息传递:
进程间的数据交换以格式化的消息( Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
进程互斥与同步:
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)
进程调度方式
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统
进程调度算法
FCFS
按照作业/进程到达的先后顺序进行服务
用于作业调度时,考虑的是哪个作业先到达后备队列;用
于进程调度时,考虑的是哪个进程先到达就绪队列
非抢占式的算法
优点:公平、算法实现简单
缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利
不会产生饥饿
SJF
追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间
最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF, Shortest Process First)算法'
SJF和ISPF是非抢占式的算法。但是也有抢占式的版本- --最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)
优点:“ 最短的”平均等待时间、平均周转时间
缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先
如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”
非抢占式:
抢占式:
HRRN
要综合考虑作业/进程的等待时间和要求服务的时间
在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
响应比=(等待时间+要求服务时间)/要求服务时间
可用于作业调度,也可用于进程调度
非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
综合考虑了等待时间和运行时间(要求服务时间)
等待时间相同时,要求服务时间短的优先(SJF 的优点)
要求服务时间相同时,等待时间长的优先(FCFS 的优点)
对于长作业来说,随着等待时间越来越久,其响应比也会越来越大,从而避免了长作业饥饿的问题
进程互斥与同步
经典同步问题
读写者
线程
可以把线程理解为“轻量级进程”。线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务( 如QQ视频、文字聊天、传文件)。引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。
线程属性
线程的实现方式
用户级线程:
用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。(用户级线程对用户不透明,对操作系统透明)
内核级线程:
内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。可以这样理解,“内核级线程” 就是“从操作系统内核视角看能看到的线程”
组合级:
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上(n>= m)
重点重点重点:
操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。
例如:这个模型中,该进程由两个内核级线程,三个用户级线程,在用户看来这个进程中有三个线程。但即使该进程在一个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行。、
多线程模型
多对一模型:
多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进.程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
一对一模型:
一对一模型:一个用户及线程映射到-一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多对多模型:
多对多模型: n用户及线程映射到m个内核级线程(n>= m), 每个用户进程对应m个
内核级线程。
克服了多对- -模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类