一言
雾柳迷苍星,夜百闻梦云。潦中倒杯酒,终与化月灵。——星向有感
操作系统笔记:第二章(上)、进程、线程的基本概念

2.1.1进程的基本概念、组成、特征

概念:进程是动态的,是程序的一个执行过程,

  • 当进程创建时,会为进程创建一个PID,这个ID是独有的,还有进程所属用户UID

  • 还要记录进程的各种信息(所用内存、所用文件、所用I/O设备等等),这些信息保存在进程控制块(PCB)中,PCB是进程存在的唯一标志。当进程结束时,操作系统会回收他的PCB。

  • PCB:

    • 进程描述信息(PID、UID)

    • 进程控制和描述信息:CPU、磁盘、进程当前状态

    • 资源分配清单:正在使用哪些文件、使用哪些设备等等

    • 处理机相关信息:PSW、PC等寄存器的值

进程的组成(进程实体(进程映像)的组成): 进程是动态的,进程实体是静态的。是某一时刻进程的状态

  • PCB

  • 程序段:程序的代码

  • 数据段:运行程序过程中生成的数据(各种变量)

可以说,进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

进程的特征

  • 动态性:最基本特征

  • 并发性

  • 独立性:能够独立的获得资源,独立接受调度的基本单位

  • 异步性:各进程以不可预知的速度独立进行

  • 结构性:由PCB,程序段、数据段组成

2.1.2进程的状态与转换、进程的组织。

进程的状态:

基本状态:

  • 就绪态—>只是因为没有空闲CPU,不能运行

  • 运行态—>就绪态运行在CPU上,出于运行态

  • 阻塞态(等待态):某进程运行之前,可能会等待一个事件的发生(比如等待系统资源的分配),在这个时间发生之前,他不会运行,这个时候,他会下CPU,转化为阻塞态

————————————————————————

另外的状态

  • 创建态—>为进程创建PCB、分配资源

  • 终止态:当进程结束时,会调用exit—>回收PCB等空间资源

进程状态的转换(五状态模型):

20230714135555

补充:七状态模型
20230714135607

进程的组织:

链接方式:(链表)

20230714135621

索引方式(数组)

20230714135633

2.1.3进程控制

什么是进程控制:对系统中的所有进程实现状态转换,它具有创建新进程,撤销已有进程、实现进程状态转换等功能。

怎么实现:需要用到原语:

原语的原子性是不可中断的,是一气呵成的。

怎么实现的:CPU在执行了一个指令之后,会检查中断信号。当执行了关中断指令后,就不会检查了,当再执行开中断之后,就继续检查,利用开中断和关中断可以实现原语。

进程的创建:

  • 创建原语

    • 申请空白PCB

    • 为新进程分配资源资源

    • 初始化PCB

    • 将PCB插入就绪队列 创建态-→就绪态

  • 引起进程创建的事件:

    • 用户登录

    • 作业调度:新作业放入内存时

    • 提供服务:用户向系统提出请求时

    • 应用请求,进程主动请求

进程的终止

  • 撤销原语

    • 找到要终止进程的PCB

    • 剥夺CPU

    • 杀掉所有子进程

    • 将资源归还给父进程

    • 删除PCB

  • 引起终止的原因

    • 主动结束

    • 异常结束(执行有问题(除数为0))

    • 外界干预(任务管理器杀死进程)

进程的阻塞和唤醒

  • 阻塞原语

    • 找到PCB

    • 保护进程现场,将其标记为阻塞态,暂停进行

    • 将该进程的PCB插入到等待队列

  • 唤醒原语

    • 找到PCB

    • 标记为就绪态,从等待队列中剔除

    • 插入到就绪队列中

进程的切换 //这个得补补计组。

  • 切换原语

    • 将运行环境写进PCB

    • PCB进入相应队列

    • 选择另一个进程执行,并更新PCB

    • 根据PCB恢复新进程所需的运行环境.

2.1.4 进程通信

定义:两个进程之间的数据交互(通信)。

进程通信需要操作系统的支持,因为各个进程在操作系统上拥有的内存地址相互独立。

  • 共享存储:操作系统划定一片内存区域(共享空间),两个进程在这篇区域内进行数据交互。该区域是互斥的(避免两个进程之间数据覆盖)

    • 基于存储区的共享(高级的通信方式):这片区域的数据形式以及存储位置都由进程支配,而不是操作系统

    • 基于数据结构的共享:存放的数据形式有限制,速度慢,限制多。

  • 消息列表:以格式化的消息为单位(该单位包含消息体和消息头),通过操作系统提供的原语(send(obj,msg),receive(obj,&msg) )

    20230714135651

    自我理解:操作系统内核作为中介,例如,进程A使用原语将消息发送到操作系统内核中的进程B的消息队列,然后进程B使用原语从操作系统内核进程B的消息队列中接收消息。)

    • 直接通信:发送和接受的对象是直接点明的。

    • 间接通信:加了个信箱中介,进程A的消息send到一个信箱中,例如信箱C,该信箱存在于操作系统内核中,然后进程B从信箱C中receive信息,注:可以同时存在多个信箱,各个进程也可以随意向同一个信箱中send或者receive消息。

    自我理解:对避免资源浪费,例如,一对多的信息传递只需要一个邮箱,如果是直接通信,需要

    分别send

  • 管道通信:管道是一个特殊的共享文件(pipe),在内存中开辟一个大小固定的内存缓存区。这个缓存区是一个循环队列,数据的读写是先进先出的。(管道是允许多个写进程,多个读进程的。)

2.1.5什么是线程

在没有线程之前,进程就是cpu调度的最小单位。一个进程对应一份代码,但是有时候一个进程需要执行多个功能,这个时候,就引入了线程,在这之后,线程就是cpu调度的最小单位了。进程只是资源分配的最小单位了,而不是调度的最小单位。

线程出现之后的变化:

  • 提高了并发度(线程之间也可以并发)

  • 降低了系统开销,在线程出现之前,进程之间并发需要切换运行环境,而线程之间并发不需要

    属性:

  • 多CPU计算机中,不同线程可以占用不同CPU

    • 各个线程拥有自己的线程ID、线程控制块(TCB)

    • 他也有就绪、阻塞、运行三种基本状态

    • 线程几乎不占用系统资源

    • 同一进程的不同线程间共享进程之间的资源

    • 同一进程之间的不同线程通信不需要系统干预,因为是共享内存地址的

    • 同一进程内的线程切换不会引起进程切换

2.1.6线程的实现方式以及模型

线程的实现方式

  • 用户级线程(线程库):程序员自己编写的线程库,实现了逻辑上的线程,在操作系统层面上,线程是不存在的

    • 优点:不需要切换到核心态,系统开销小,效率高。

    • 缺点:当一个线程堵塞之后,整个进程就被堵塞了。 并发度低

  • 内核级线程:在物理层面上,内核支持线程,该线程由操作系统内核完成,该线程的调度,切换cpu都必须在核心态下实现

    • 优点:当一个线程堵塞之后,别的线程还可以继续,并发度高

    • 缺点:线程管理需要频繁从核心态到用户态之间切换,系统开销大

多线程模型

  • 多对一模型:多个用户级线程映射到一个内核级线程,且一个进程只被分配一个内核级线程

    • 优点:不需要切换到核心态,系统开销小,效率高

    • 缺点:当一个用户级线程堵塞之后,整个进程就被堵塞了。 并发度低

留个疑问:这个模型和单纯的用户级线程有什么区别?

  • 多对多模型:n个用户级线程映射到m个内核级线程(n>m)

    • 克服了多对一线程阻塞之后就进程阻塞的缺点

    • 也缓解了了一对一的系统开销大的缺点

自我理解:介于多对一和一对一之间,系统开销比一对一小,但是比多对一大,但是可以克服致命的缺点,一堵全堵。

20230714135706

2.1.7线程的状态与转换、组织与控制

和进程基本一样

评论

  1. 某一进程的人
    Linux Firefox
    11 月前
    2023-5-22 21:08:17

    该学操作系统了!

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一