首页 > 系统相关 >操作系统学习笔记2-进程和线程

操作系统学习笔记2-进程和线程

时间:2023-03-11 10:35:32浏览次数:55  
标签:状态 task 操作系统 阻塞 笔记 PCB 线程 进程 CPU

2.进程和线程

2.0 引入

2.0.1 顺序执行

  • 特征
    • 顺序性
    • 封闭性:独占整机资源
    • 可再现性:只要在相同的环境与初始条件下,执行结果相同
  • 顺序执行的场合:单道批处理系统

2.0.2 并发执行

  • 特征
    • 与上述顺序执行完全相反

2.1 进程(Process)

2.1.1 定义

  • chatGPT版:一个具有独立功能的程序关于某个数据集合的一次运行活动

  • 人话版:程序在并发环境中的执行过程& 进程是程序的一次执行


2.1.2 特征

  • 动态:创建产生,调度执行,撤销消亡
  • 并发:多个进程存在同一内存中运行
  • 独立:独立运行、获得资源、接受调度的基本单位
  • 异步:不可知速度推进,程序执行失去再现性

:配置同步机制,能保证结果可再现


2.1.3 进程与程序

  • 动态和静态
  • 暂存与长存
  • 一个程序可能有多个进程

2.1.4 进程状态

  • 基本状态

    • 运行(Running)[1]当前进程分配到CPU,其程序正在CPU上执行的状态

    • 就绪(Ready)[2]进程已具备运行条件,但因其它进程正占用CPU,暂时不能运行,等待分配CPU的状态

    • 阻塞(Blocked):因等待某种事件的发生(如系统调用、I/O操作、合作进程信号)而暂时不能运行的状态。即使CPU空闲,也无法使用。

  • 基本状态的转换

:阻塞->运行 漏! 就绪->阻塞 漏!

  • 五种状态的转换
  • 挂起状态(Suspend)

    • 定义

    所谓挂起,是使处于基本状态的进程(就绪、运行、阻塞/睡眠)处于静止(非终止)状态,此时系统回收被这些进程占用的内存资源,将其实体复制到外存的进程交换区。挂起不等于撤销,可通过解挂(换入,或称激活,Active)重新分配内存。

    • 挂起原因

    终端用户的请求,父进程请求,负荷调节的需要,操作系统的需要

    • Block Vs Suspend
    1. 对系统资源占用不同:虽然都释放了CPU,但阻塞的进程仍处于内存中,而挂起的进程通过“对换”技术被换出到外存(磁盘)中。
    2. 发生时机不同:阻塞一般在进程等待资源(IO资源、信号量等)时发生;而挂起是由于用户和系统的需要,例如,终端用户需要暂停程序研究其执行情况或对其进行修改、OS为了提高内存利用率需要将暂时不能运行的进程(处于就绪或阻塞队列的进程)调出到磁盘 。
    3. 恢复时机不同:阻塞要在等待的资源得到满足(例如获得了锁)后,才会进入就绪状态,等待被调度而执行;被挂起的进程由将其挂起的对象(如用户、系统)在时机符合时(调试结束、被调度进程选中需要重新执行)将其主动激活。
  • 拓展:进程状态举例

    • UNIX进程状态转换
    • Linux进程状态转换

2.1.5 进程描述

  • 进程映像·
    • 程序
    • 数据集
    • PCB(Process Control Block):描述进程的动态性的数据结构,描述进程当前的状态、本身的特性、对资源的占用及调度信息等,称为进程控制块
    • :用来保存过程调用和相互传送参数的踪迹
  • PCB(进程控制块)介绍

PCB是一个数据结构,一般应包括:

进程名。它是唯一的标志,对应进程的一个标志符(name)或数字(ID)。

特征信息。包括是系统进程还是用户进程,进程实体是否常驻内存等信息。

进程状态信息。表明该进程的执行状态status,是运行状态、就绪状态还是阻塞状态。

调度优先权。表示进程获取CPU 的优先级别priority。

通信信息。comm_info,反映该进程与哪些进程有什么样的通信关系,如等待哪个进程的信号等。

现场保护区。当对应进程由于某种原因放弃使用CPU 时,需要把它的一部分与运行环境有关的信息保存起来,以便在重新获得CPU 后恢复正常运行。通常被保护的信息有程序计数器PC、程序状态字PSW、各工作寄存器的内容等。

资源需求、分配和控制方面的信息,own_resource,如进程所需要或占有的I/O 设备、磁盘空间、数据区等。

进程实体信息。Start_addr,指出该进程的程序和数据的存储情况,在内存或外存的地址、大小等。

族系关系。Process_family,反映父子进程的隶属关系。

其他信息。如文件信息、工作单元等。

  • PCB(进程控制块)作用
    1. 每个进程有唯一的进程控制块
    2. 操作系统根据PCB管理进程
    3. 进程的动态、并发等特征通过PCB表达
    4. PCB是进程存在的唯一标志。创建即建立PCB,终止即消亡PCB
  • 举例:Linux系统PCB设计

2.1.6 进程切换

  • 名称解析

    • 进程的上下文(Context)

    当一个进程在执行时,CPU的所有寄存器的值、进程的状态以及堆栈中的内容被称为进程的上下文Context

    • 进程的切换(switch)

    当内核需要切换(switch)至另一个进程时,它就需要保存当前进程的上下文,以便在再次执行该进程时,能够恢复到切换时的状态执行下去。

  • 进程队列

    系统中有许多进程。处于就绪状态和处于阻塞状态的进程可以分别有多个,而阻塞的原因又各不相同。为了对所有进程进行有效的管理,常将各个进程的PCB 用适当的方式组织起来,称为进程队列

    • 线性方式

    采用顺序存储结构,操作系统预先确定整个系统中同时存在的进程的最大数目如n,静态分配空间时,把所有进程的PCB 都放在这个队列表中。

    缺点:限定系统中最大进程数目;CPU调度时需要对整个表进行遍历。

    • 链接方式

    采用链表结构,按照各进程的不同状态分别将它们的PCB 放在不同的链表队列中。

    在单CPU 情况下,处于运行状态的进程只有一个,可用一个指针指向它的PCB

    处于就绪状态的进程队列通常是一个(也可能多个)。

    阻塞队列对应不同的阻塞原因通常有多个。

    • 索引方式

    索引方式利用索引表记载不同状态进程的PCB 地址。即系统建立几张索引表,如就绪索引表、阻塞索引表等。状态相同的进程的PCB 组织在同一索引表中,每个索引表的表目中存放一个PCB 地址。各索引表在内存的起始地址放在专用的指针单元中。

  • 举例:Linux进程队列设计

以Linux0.11为例:计算机对进程的感知是依靠PCB结构(即task_struct),Linux使用了一个线性表task来存放多个进程的PCB。

<kernel/sched.c>中定义:

struct task_struct* task[NR_TASKS] = {&(init_task.task), };

这样操作系统就可以通过task来找到任何一个进程了。表中设置了一个&(init_task.task)指向初始进程的指针,表示初始进程存放在task[0]中。

为了清晰的描述这个线性表的头和尾,Linux0.11又定义了两个宏。

<include/kernel/sched.h>

#define FIRST_TASK task[0]
#define LAST_TASK task[NR_TASKS-1]


  1. 单CPU的系统,处于运行态的进程只能有1↩︎

  2. 单CPU的系统,处于就绪态的进程个数由系统决定 ↩︎

标签:状态,task,操作系统,阻塞,笔记,PCB,线程,进程,CPU
From: https://www.cnblogs.com/lfcoding/p/17205391.html

相关文章

  • 守护线程
    packagestate;publicclassTestDaemon{publicstaticvoidmain(String[]args){Godgod=newGod();Youyou=newYou();Thread......
  • 线程优先级
    packagestate;publicclassTestPoriority{publicstaticvoidmain(String[]args){MyPorioritymyPoriority=newMyPoriority();Thread......
  • MacOS 苹果笔记本使用ClashX下载安装配置教程
    一、ClashX简介ClashX是运行在macOS上的一款科学上网工具。支持的协议: Vmess,Shadowsocks,Snell,SOCKS5,ClashX现已支持SSR协议。ClashX可随时切换代理模式及节......
  • 计算机操作系统--调度算法
                         ......
  • 线程状态--礼让
    packagestate;//礼让不一定成功,看cpu调度publicclassTestYield{publicstaticvoidmain(String[]args){MyYieldmyYield=newMyYield();newThread(myYield,......
  • 线程状态--休眠
    packagestate;//模拟网络延时的作用:放大问题发生的可能性publicclassTestSleepimplementsRunnable{privateintticket=10;@Overridepublicvoid......
  • JAVA多线程处理大量数据(二)--推荐
    背景说明:要对服务器上一个目录进行全量文件读取1、多线程执行类--FileThreadUtils.javaimportcn.hutool.core.collection.CollUtil;importcn.hutool.core.io.FileUti......
  • 算法学习笔记(18): 平衡树(一)
    平衡树建议在清楚二叉搜索树的所有操作之后食用本文。本文将略过部分基础知识目录平衡树Treap旋转插入删除其他操作FHQ-Treap分裂合并其他操作Splay旋转伸展其他操作WB......
  • 笔记14
    考试十五分钟:1、编写代码实现功能tail-faccess.logf.seek()应用程序(文件对象/文件句柄1)应用程序(文件对象/文件句柄2)操作系统(真正的文......
  • 【WinForm】 自学笔记三:使用 FreeSql 连接数据库,并对数据进行增删改查
    前面使用 SqlConnection 连接数据可以的方法,每一次进行数据操作都要编写相应的SQL语句,操作起来比较繁琐。为了简化代码的编写,提高代码的可靠性,使用了FreeSql插件,来减......