清华大学《操作系统》(九):进程和线程

进程

定义:

进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程。

组成:

  • 代码
  • 数据
  • 状态寄存器(正在运行的一个程序的所有状态信息):CPU状态CP0、指令指针IP
  • 通用寄存器:AX、BX、CX
  • 进程占用系统资源:打开文件、已分配内存

特点:

  • 动态性:客动态地创建、结束进程
  • 并发性:进程既可以被独立调度并占用处理机运行
  • 独立性:不同的进程的工作不相互影响
  • 制约性:因访问共享数据/资源或进程间同步而产生制约

进程与程序的联系:

  1. 进程是操作系统处于执行状态程序的抽象。程序 = 文件(静态的可执行文件);进程 = 执行中的程序 = 程序 + 执行状态
  2. 同一个程序的多次至干性过程对应为不同进程。如命令“ls”的多次执行对应多个进程
  3. 进程执行需要的资源。内存:保存代码和数据;CPU:执行指令

进程与程序的区别:

  1. 进程是动态的,程序是静态的。程序是有序代码的集合;进程是程序的执行,进程有内核态/用户态
  2. 进程是暂时的,程序是永久的。进程是一个状态变化的过程;程序可长久保存
  3. 进程与程序的组成不同。进程的组成包括程序、数据和进程控制块

进程控制块(Process Control Block, PCB):

定义:操作系统管理控制进程运行所用的信息集合。

操作系统用PCB来描述进程的基本情况以及运行变化的过程。

PCB是进程存在的唯一标志,每个进程都在操作系统中有一个对应的PCB

使用:

  1. 进程创建时生成该进程的PCB
  2. 进程终止时回收它的PCB
  3. 通过对PCB的组织管理来实现对进程的组织管理

内容:

  1. 进程标识信息。PID:进程号,UID等 哪个程序在执行,执行了几次,用户标识
  2. 处理机现场保存,主要就是寄存器,保存进程的运行现场信息:堆栈指针:记录堆栈现场;指令指针:记录进程运行到哪
  3. 进程控制信息:
  • 调度和状态信息:进程和处理机使用情况调度
  • 进程间通信信息:进程间通信相关的各种标识
  • 存储管理信息:指向进程映像存储空间数据结构
  • 进程所用资源:进程使用的系统资源,如打开文件等
  • 有关数据结构连接信息:通过与PCB相关的进程队列实现

组织

  1. 链表(便于插删,用于通用的OS):同一状态的进程PCB为一链表,多个状态对应更多个不同的链表,就绪链表,阻塞链表
  2. 索引表(数组,不利于插删,使用于固定数目的进程,相对创建更快捷):同一状态的归入一个index表(每一个index指向PCB),就绪/阻塞索引表

进程状态

划分在不同操作系统中可能不同,但是大致可以分为:

  1. 系统初始化时,创建INIT进程,INIT再负责创建其他进程;用户请求创建一个NEW PROCESS;正在运行的进程执行了创建进程的系统调用。
  2. 进程就绪:进程获取了除处理机之外的资源,得到了处理机即可运行
  3. 进程运行:内核选择一个就绪的进程,让它占用处理机(cpu)并执行
  4. 进程阻塞(等待)的三种情况:请求并等待系统服务,无法马上完成;启动某种操作(和其他进程协调工作),无法马上完成;需要的数据没有到达。进程自己触发阻塞,因为只有自己才知道何时需要等待某事件
  5. 进程抢占:进程会被抢占情况:高优先级进程就绪;进程执行当前时间用完。
  6. 进程唤醒的情况:需要的资源可被满足;等待的事件到达。因为自身没有占用cpu执行,所以只能被OS或其他进程唤醒
  7. 进程结束的情形:自愿(正常退出,错误退出),强制性的(致命错误,被其他进程所杀)

进程切换

三状态进程模型:

创建与退出只是两个短暂的状态,除此之外简化为三个状态:就绪、运行、等待。装填变迁如下图。

  • 运行状态:进程正在处理机上运行
  • 就绪状态:进程获取了除处理机之外的资源,得到了处理机即可运行
  • 阻塞状态:进程正在等待某一事件出现而暂停运行
  • 创建状态:进程正在被创建,还没转到就绪状态之前的状态
  • 退出状态:进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致

挂起进程模型:

处在挂起状态的进程映像在磁盘上,目的是减少进程占用内存。也就是说挂起就是把一个处于就绪或者等待状态的进程从内存转存到外存,通常选择低优先级进程进行挂起。

1、进程挂起

不同于进程阻塞。挂起时没有占用该内存空间,而是映像在磁盘上。类似虚存中,有的程序段被放到了硬盘上。 可以合理、充分地利用系统资源。Suspend:把一个进程从内存转到外存。 

2、挂起状态

  1. 堵塞挂起状态:进程再外存并等待某事件的出现
  2. 就绪挂起状态:进程再外存,但只要进入内存即可运行

3、状态转换

内存中被挂起:

①堵塞到堵塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源

②就绪到就绪挂起:当高优先级等待进程和低优先级就绪进程

③运行到就绪挂起:对抢占式分时系统,当有高优先级等待挂起进程因事件出现而进入就绪挂起

外存中激活:

①阻塞挂起到就绪挂起: 相关事件出现时,转变为就绪挂起但还在硬盘上。

②解挂/激活 activate:外存到内存,需要运行该进程时

就绪挂起到就绪态: 没有就绪进程或挂起就绪优先进程优先级高于当前就绪进程时

堵塞挂起到堵塞态:当一个进程释放了足够内存时,OS把高优先级阻塞挂起(认为很快出现等待的事件)转换为阻塞进程

状态队列

  • 由操作系统来维护一组队列,表示系统中所有进程的当前状态。
  • 不同队列表示不同状态。根据进程状态不同,进程PCB进入对应的队列。

线程

引入原因:一个进程内部可能有多种事件可以并发地执行,比如播放音乐时,可以拆分为磁盘读取、解码和播放三个子流程,读取主要是I/O操作,解码主要是CPU工作,这两者是可以并发执行的。因此很多时候需要在进程内部增加一类实体,满足以下特性:实体之间可以并发执行、实体之间共享相同的地址空间。在这种需求之下,出现了线程。

定义:线程是进程的一部分,描述指令流执行状态,它是进程的指令执行流的最小单元,是CPU调度的基本单位。

  • 进程的资源分配角色:进程由一组相关资源构成,包括地址空间(代码段、数据段)、打开的文件等各种资源。
  • 线程的处理机调度角色:线程描述在进程资源环境中的指令流的执行状态。每个线程有自己独立的指令指针等。

线程的优点:

  • 一个进程中可以同时存在多个线程
  • 线程之间可以并发地进行
  • 线程之间可以共享地址空间和文件等资源

线程的缺点:

  • 在进程空间内有多个控制流且执行流程不一样,有各自独立的寄存器和堆栈,但共享代码段,数据段,资源。 如果一个线程写错了,崩溃,如破坏了数据,会导致这个进程的所有线程都崩溃。

线程与进程的比较

  1. 进程是资源分配单元(内存,打开的文件,访问的网络),线程是CPU调度单位,CPU也是一种特殊的资源,要执行控制流需要的相关信息
  2. 进程拥有一个完整资源平台,而线程只独享必不可少的资源如寄存器和栈
  3. 线程同样具有就绪、阻塞和执行三种基本状态和转换关系
  4. 线程能减少并发执行的时空开销:
    线程的创建时间比进程短
    线程的终止时间比进程短
    同一进程内的线程切换时间比进程短
    由于统一进程的各线程间共享内存和文件资源,可不通过内核进行直接通信。线程的终止时间比进程短

线程三种实现方式:

  1. 用户线程:在用户空间实现,OS看不到,由应用程序的用户线程库来管理;POSIX Pthreads, Mach C-threads
  2. 内核线程:在内核中实现,OS管理的;Windows
  3. 轻量级进程lightweight process:内核中实现,支持用户线程。Solaris, Linux
  4. 用户线程与内核线程间,可以是多对一,一对一,多对多

用户线程:

由一组用户级的线程库函数来完成线程的管理。如POSIX Pthreads等。

优点:

  • 不依赖于操作系统内核,可以用于不支持线程的多进程操作系统
  • 在用户空间实现的线程机制
  • 同一进程内的用户线程切换速度快,无需在用户态与核心态之间切换
  • 允许每个进程拥有自己的线程调度算法

缺点:

  • 线程发起系统调用而阻塞时,整个进程进入等待
  • 不支持基于线程的处理机抢占,除非当前运行线程主动放弃,它所在的线程的其他线程无法抢占CPU
  • 只能按进程分配CPU时间,多个线程进程中,每个线程的时间片较少。

内核线程:

由内核通过系统调用实现的线程机制,由内核完成线程的创建、终止和管理。如Windows、Linux等

特点:

  • 由内核维护PCB和TCB
  • 线程执行系统调用而被阻塞不影响其他线程
  • 线程的创建、终止和切换开销相对较大,因为通过系统调用/内核函数,在内核空间实现
  • 以线程为单位进行CPU时间分配,多线程的进程可以获得更多CPU时间。

轻量级进程:

内核支持的用户线程,一个进程可以有一个或多个轻量级进程,每个轻权进程由一个单独的内核线程来支持。如Solaris。最后这个被证实优点没有被很好地体现出来。

用户线程与内核线程的对应关系:

可以有如下图多种方式,最后证明一对一是最优的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开始Flask项目

1.新建Flask项目。2.设置调试模式。3.理解Flask项目主程序。4.使用装饰器,设置路径与函数之间的关系。5.使用Flask中render_template,用不同的路径,返回首页、登录员、注册页。6.用视图函数反转得到URL,{{url_for(‘login’)}}&am…

gcc交叉编译的实现

gcc支持多种不同的语言,也支持多种不同的CPU架构。在它的实现上,不同语言编译的实现是通过conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;这个结构体的不同定义来实现的。比如c语言的编译器就通过gcc/c-lang.c指定了lang_hooks这个结构体的…

烂泥:mysql数据库使用的基本命令

1、连接数据库的格式 mysql -h IP -u用户名 -p密码; 1.1连接远程数据库 mysql -h 192.168.1.214 -uroot -p123456 也可写成: mysql -h 192.168.1.214 -u root -p 123456 1.2连接本地数据库 mysql -uroot -p123456 也可写成: mysql -u root -p 123456 2、…

mse均方误差计算公式_PCA的两种解读:方差最大与均方误差最小的推导

这张图片很关键,来自统计学习方法的PCA插图又要考试了,推导一下方差最大化与均方差最小化,老师上课讲了一些均方差最小化,推导的过程很详细不过自己没有记下来,复习的时候再推一遍加深印象。感谢 耳东陈 老师的精彩课件…

《操作系统》OS学习(十):进程控制

进程切换(上下文切换): 定义:暂停当前运行进程,从运行状态变成其他状态,调度另一个进程从就绪状态变成运行状态要求:切换前,保存进程上下文;切换后,恢复进程…

日志管理

1、错误日志配置 错误日志属于核心功能模块的参数 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置这一行即可 events {worker_connections 1024; }语法规则:error_log file level 错误的日志级别有[debug|info|notice|warn|err…

GCC 命令选项使用详解

GCC 命令行详解[转帖] 1、gcc包含的c/c编译器 gcc、cc、c、g gcc和cc是一样的,c和g是一样的,一般c程序就用gcc编译,c程序就用g编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序 gcc test.c -o test这样将编译出一个名为t…

mvn 打包_Spark源码打包编译的过程

前言上篇文章介绍了下 安装sbt环境 启动scala项目安装SBT环境运行Scala项目为什么要弄这个 因为我本来是想对spark源码编译部署spark是用scala语言编译的spark源码https://gitee.com/pingfanrenbiji/sparkspark提供的编译方式编译的前提是将所有的依赖包都下载下来而资源包管理…

审计日志功能监控

背景:公司的审计日志经常出现不记录命令的情况,但是又无法监控到审计功能是否正常。所以我们思路是,每天从CMDB服务器 ssh登录到每一台主机。如果审计功能正常,则一定会在auditlog.info文件中有登录的记录。如果24小时内这个文件没…

清华大学《操作系统》(十一):处理机调度

一、处理机调度概念 进程切换(上下文切换):切换CPU的当前任务,从一个进程/线程到另一个,保存当前在PCB/TCB中的执行上下文,读取下一个的上下文 CPU调度:从就绪队列中挑选一个进程/线程作为CPU…

通过纯css实现图片居中的多种实现方式

html结构&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 实现img位于外层div的居中显示…

GCC 命令行详解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c编译器 gcc,cc,c,g,gcc和cc是一样的&#xff0c;c和g是一样的&#xff0c;(没有看太明白前面这半句是什 么意思:))一般c程序就用gcc编译&#xff0c;c程序就用g编译 2。gcc的基本用法 gcc test.c这样将编译出一个…

Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名

该方法可以得到远程主机的域名&#xff0c;也可以得到本机名。getHostName方法的定义如下&#xff1a; publicString getHostName() 下面是三种创建InetAddress对象的方式&#xff0c;在这三种方式中&#xff0c;getHostName返回的值是不同的。 1&#xff0e;使用getLocalHost方…

猿辅导python面试_猿辅导面试经历—个人感受

今天参加了猿辅导的二面&#xff0c;无数槽点&#xff0c;不知道是不是很多公司都是这样&#xff0c;但是我还是忍不住要逼逼叨。6月10号&#xff0c;我向猿辅导投了简历&#xff0c;想做招聘邀约专员这个岗位&#xff0c;然后hr加了我的微信&#xff0c;要了一份简历之后通知我…

对称加密与非对称加密

&#xff08;一&#xff09;对称加密&#xff08;Symmetric Cryptography&#xff09; 对称加密是最快速、最简单的一种加密方式&#xff0c;加密&#xff08;encryption&#xff09;与解密&#xff08;decryption&#xff09;用的是同样的密钥&#xff08;secret key&#xff…

清华大学《操作系统》(十二):临界区与锁

多进程并发运行&#xff0c;导致多个进程间有资源共享&#xff0c;比如CPU、内存&#xff0c;因此存在不确定性和不可重现&#xff0c;可能导致多次运行结果不一致。因此操作系统需要利用同步机制在并发执行的同时&#xff0c;保证一些操作是原子操作。 互斥是指一个进程占用了…

gcc生成静态库和动态库

gcc生成静态库和动态库一、库文件简介简单地说&#xff0c;库&#xff08;Library&#xff09;就是一组已经写好了的函数和变量、经过编译代码&#xff0c;是为了能够提高开发效率和运行效率而设计的。库分为静态库&#xff08;Static Library&#xff09;和共享库&#xff08;…

python 流式计算框架_流式计算的三种框架:Storm、Spark和Flink

我们知道&#xff0c;大数据的计算模式主要分为批量计算(batch computing)、流式计算(stream computing)、交互计算(interactive computing)、图计算(graph computing)等。其中&#xff0c;流式计算和批量计算是两种主要的大数据计算模式&#xff0c;分别适用于不同的大数据应用…

清华大学《操作系统》(十八):管程于信号量

信号量与管程也是进程间通信的方式。信号量是与锁在同一层级实现的&#xff0c;是操作系统提供的一种协调共享资源访问的方法。信号量由操作系统管理&#xff0c;操作系统作为管理者地位是高于进程的。 一、信号量 1、信号量&#xff08;semaphore&#xff09;&#xff1a;是操…

Iptalbes自动封杀暴力破解(Qmail邮件系统)者的IP地址

今天发现Qmail邮件系统的maillog里面有大量的“user not found”信息&#xff0c;通过下面的日志不难发现&#xff0c;是来自同一IP的很多不同的用户连接Qmail邮件系统认证失败的信息。黑客试图通过这种方式来破解Qmail邮件系统的用户名和密码&#xff0c;从而来发送大量的垃圾…