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

对进程的理解

进程是可以并发执行的程序在某个数据集合上的运行过程,是系统进行资源分配调度的基本单位。进程由三部分组成,程序,数据和进程控制块(简称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

相关推荐
星海穿梭者10 分钟前
SQL SERVER 查看锁表
java·服务器·前端
Voyager_413 分钟前
Linux服务器NAS挂载:Truenas
linux·运维·服务器
liujing102329291 小时前
Day01_Linux移植基础
linux·运维·服务器
桥边驿语人1 小时前
Docker 容器无法访问外网的问题排查与解决指南
运维·docker·容器
ZStack开发者社区1 小时前
ZStack Cloud v5.4.0 LTS让运维自动驾驶,让合规开箱即用
运维·云计算
叶凡要飞1 小时前
linux安装google chrome 谷歌浏览器
linux·运维·chrome
专注VB编程开发20年2 小时前
vb.net编写DDE(Dynamic Data Exchange)服务器
运维·服务器·github·vb.net·dde
Clownseven2 小时前
如何用Fail2ban保护Linux服务器?防止SSH暴力破解教程
linux·服务器·ssh
chaofan9803 小时前
如何用 Claude Code 搭建安全、可测、可自动化的 GitHub CI 流程?
运维·人工智能·ci/cd·ai·自动化·github·claude
无敌最俊朗@3 小时前
Linux 进程创建与控制详解
linux·运维·服务器