操作系统之进程与线程的理解(一)

对进程的理解

进程是可以并发执行的程序在某个数据集合上的运行过程,是系统进行资源分配调度的基本单位。进程由三部分组成,程序,数据和进程控制块(简称PCB)。简单的说,进程就是程序的一次执行

为确保进程安全可靠的并发执行引入了进程控制机制

原语是由若干条机器指令构成的并用以完成特定功能的一段程序,而且这段程序在执行期间不允许中断。原语作为一个状态不可分隔。确保并发执行状态下,系统核心数据的正确性。

什么时候需要创建进程呢
  1. 用户登录 时, 由OS为合法终端创建一个进程 2.调度到某个批处理作业 时,由作业调度程序创建 3.运行程序请求提供服务 (如:打印文件),由OS创建 4.运行中进程因自己的需要,由它自己创建子进程

允许进程创建子进程,子进程可以继承父进程的所拥有的资源,从而形成树型进程家族。优点如下:

第一,资源分配严格 。祖先拥有进程家族的所有资源,子进程可在祖先进程所拥有的资源中进行分配、使用与归还。

第二,进程控制灵活 。可根据需要给予进程不同的控制权力,而且可根据需要创建第多个子进程并行工作,协同完成任务。

第三,进程层次清晰,关系明确,方便管理。

进程的创建方式

进程的具体创建方式分为两种。一种是操作系统初始化,建立起一些常驻内存的系统进程;另一种是使用创建原语,用于创建非常驻内存系统进程和用户进程,具体过程如下:

第一步,创建一个空白PCB,分配一个唯一的进程标识符;

第二步,为新进程的程序和数据分配内存空间;

第三步,初始化进程控制块,填入处理机的状态信息和控制信息,如指令指针、栈指针、优先级等;

最后,设置相应的链接,将新进程PCB加到就绪队列的链表中。

进程状态转换相关原语
进程阻塞

处于运行状态的进程,在其运行过程中期待某一事件发生,如请求系统服务、等待键盘输入等,主动调用阻塞原语(block)将自己阻塞,把CPU让给其他进程执行。

阻塞原语执行时,使处于运行态的进程停止运行,将运行现场保存在其PCB的CPU现场保护区,然后将改进程的状态由运行态变为阻塞态 ,并将其PCB插入到相应等待事件的阻塞队列中。最后,转进程调度程序重新调度,将处理机分配给一个就绪进程,按新进程PCB中的处理机状态设置CPU环境,使它投入运行。

进程唤醒

当被阻塞进程期待的事件到来时,由中断处理进程或其它产生该事件的进程调用唤醒原语(wakeup),将期待该事件的阻塞进程唤醒。如果该事件是等待I/O设备操作完成,则由硬件提出中断请求,在中断处理程序中寻找并唤醒阻塞进程。如果事件是等待某进程发一个信息,则由发送进程把该等待进程唤醒。

在唤醒原语执行时,将被阻塞进程从相应等队列中移出,并将其PCB中的现行状态由阻塞改为就绪态,然后将该进程插入就绪队列中。

进程挂起

当进程请求将自己挂起或父进程请求将子进程挂起时,调用挂起原语(suspend),将指定进程挂起。

挂起原语在执行过程,检查要挂起进程的状态,若处于活动就绪态就将其改为静止就绪态,对于活动阻塞态的进程则将其改为静止阻塞态。如果被挂起的进程正在执行则还要转到调度程序重新调度。

进程激活

要激活指定进程,调用激活原语(active)将它激活。在执行过程,将要激活的进程调入内存,并检查它的状态,若是静止就绪态则将其改为活动就绪态,若为静止阻塞态就将其改为活动阻塞态。如果采用的是抢占调度策略,被激活的进程优先级高则引起重新调度。

通常在以下情况需要终止一个进程

第一 正常结束 。在批处理系统中,进程已运行完成遇到Halt指令,或分时系统中,用户退出登录,需要结束当前进程。

第二 异常结束 。当前进程发生出错和故障事件,如内存越界、写只读文件、算术运算错、运行超时等,由于无法继续执行,需要结束当前进程。

第三 外界干预。在操作系统干预、父进程请求、父进程终止等情况下,也需要结束当前进程。

进程中止

一旦发生上述终止进程的事件,OS便调用撤消原语终止当前进程,具体过程如下:

首先若进程处于执行态, 应立即终止该进程的执行,并置调度标志为真;若有子孙进程则将其全部终止,以防它们失控,然后将该进程所占有的全部资源还给父进程或系统;将该进程的PCB从所在队列中移出,回收PCB

创建进程属于一种机制 top指令可以查看进程的动态情况 一个进程一旦创建就可以为其分配cpu,并运行

由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。

因此在80年代,出现了能独立运行的基本单位------线程(Threads)。

对线程的理解

为什么要引入线程

由于进程是资源的拥有者,所以在创建、撤销、切换操作中需要较大的时空开销 ,限制了并发程度的进一步提高。为减少进程切换的开销,把进程作为资源分配单位调度单位这两个属性分开处理,即进程还是作为资源分配的基本单位,但是不作为调度的基本单位(很少调度或切换),把调度执行与切换的责任交给"线程"。这样做的好处不但可以提高系统的并发度,还能适应新的对称多处理机(SMP)环境的运行,充分发挥其性能。

即:占用较少的资源系统/同一进程内的线程共享内存和文件/提高应用程序的性能/使用多处理机效率更高/改善程序的结构

什么是线程

线程是OS调度和分派基本单位 ,被包含在进程中,一条线程指的是进程内一个执行单元。它的特点:进程轻,进程的实体是程序 ,线程的实体是函数 ,共享进程的资源,进程中的多个线程可并发执行 ,还可以独立调度,拥有很少的资源

进程和线程几乎共享所有的资源,包括代码,数据,进程空间,打开的文件等,线程只拥有自己的寄存器和栈,因此,线程非常轻量级,线程之间切换时,系统的开销小,并发度高。

|------|----------------|------------------|
| | 进程 | 线程 |
| 组成 | 程序+数据+PCB | 函数+数据+TCB(线程控制块) |
| 基本单位 | 资源分配和独立调度的单位 | 仅仅是独立调度的单位 |
| 并发性 | 多个进程可并发执行,并发度低 | 多个线程可并发执行,并发度高 |
| 共享资源 | 每个进程拥有自己的资源 | 线程共享其所在进程的资源 |

(1)线程是进程的一个组成部分。每个进程创建时通常只有一个线程,需要时可创建其他线程。

(2) 进程的多线程都在进程的地址空间活动。

(3) 资源是分给进程的,不是分给线程的。线程在执行中需要资源时,可共享基础的资源,每个线程只拥有少量寄存器和独立的栈 ,这是其独立执行环境的必要条件。

(4) 处理机调度的基本单位是线程,线程之间竞争处理机。真正在CPU上运行的是线程。

(5) 线程在执行时,如果有共享资源,就需要同步。

线程的实现方式为用户级线程/内核级线程/两者结合

线程的分类
用户级线程

仅存在于用户空间中,由应用程序通过线程库完成所有线程的管理;内核不知道线程的存在,线程切换不需要内核特权;内核管理含线程的进程的活动,但不管理线程;当用户级线程调用系统调用时,整个进程阻塞。

内核级线程

所有线程管理由内核完成;内核维护进程和线程的上下文;线程之间的切换需要内核支持;以线程为基础进行调度。

线程模型
多对一关系

将多个用户级线程映射到一个内核级线程。

一对一关系

一个用户级线程映射到一个内核级线程。

多对多关系

任意数量N的用户线程到相等或者小于N的内核线程的多路复用。

内存地址空间是进程级别的资源,由进程统一管理和拥有

问题:进程和线程到底共亨哪些资源,哪些不能共享?

答:共享的资源有:地址空间,打开的文件描述符,信号处理函数,全局变量。不共享的资源有:线程ID,寄存器状态,栈空间等。

cpu通过PSW(程序状态字)进行标识,X86的PSW有2位二进制:00系统态,11用户态

用户态---内核态

系统调用/设备中断/异常

内核态---用户态

直接设置程序状态字PSW

相关推荐
hi0_611 分钟前
Linux 第二讲 --- 基础指令(二)
linux·运维·服务器
好记忆不如烂笔头abc13 分钟前
oceanbase开启内存大页
linux·服务器·oceanbase
学术小八15 分钟前
第二届电气技术与自动化工程国际学术会议 (ETAE 2025)
运维·自动化
二狗哈15 分钟前
go游戏后端开发29:实现游戏内聊天
服务器·游戏·golang
飞鹰服务器1 小时前
服务器与电脑的区别
运维·服务器·电脑
NorthCastle2 小时前
Docker 镜像 的常用命令介绍
运维·docker·容器·docker 镜像
开发小能手-roy2 小时前
ubuntu 服务器版本网络安全
服务器·web安全·ubuntu
dessler2 小时前
Kubernetes(k8s)-网络插件(Flannel)
linux·运维·kubernetes
无名之逆2 小时前
Hyperlane 文件分块上传服务端
服务器·开发语言·前端·网络·http·rust·php
被子你放开我3 小时前
Docker 安装CRMEB陀螺匠教程
运维·docker·容器