IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 计算机操作系统之进程、线程、协程 -> 正文阅读

[系统运维]计算机操作系统之进程、线程、协程

一、线程、进程、程序概念

1、程序:程序其实就是存在操作系统上的一大堆指令(指令序列),是一个静态的概念,比如你的QQ放在电脑上,但是没有去执行它,那么它就是一个程序。

程序在内存中执行时主要包括三个部分:程序段、数据段、进程控制块(PCB)。

程序段用来存放程序中的指令本身。

数据段存放程序运行中需要的一些数据,比如变量、常量等。

PCB是一个数据结构,用来描述进程的各种信息,比如程序代码的存储位置,它是进程存在的唯一标识。

2、进程:进程相比程序来讲,他是一个动态的概念,当你电脑上的程序放进内存中开始运行的时候,他就是一个进程。粗俗地来讲,进程就是正在执行的程序,是一个动态的,它拥有自己的独立的操作空间和资源,也就是说,进程是操作系统分配资源(比如内存)和调度的基本单位

3、线程:实际上进程在运行的时候,实际上是多个或者一个线程在运行。比如你开始运行了QQ,那么你可能打开了多个聊天框和多个人聊天,那么实际上这就是一个多线程并发执行的例子。也就是说,线程是运行的基本单位,但是和进程不同的是,线程它没有自主独立的操作空间和资源,因为一个进程往往有很多个线程并发进行,因此它们一般是共享自己本进程的资源和内存的。

线程和进程还有一个关系,就是一个进程至少拥有一个线程(主线程),但是可以拥有多个线程,也就是我们常说的多线程。

4、协程:除开以上这三个概念,还有一个概念叫做协程。协程的本质其实也是一个线程,他是我们操作系统上所部署的虚拟机中所产生的线程,比如Java里面JVM中的线程,就叫做协程。但是为什么我们还是将JVM里面的协程叫做线程呢?因为它和操作系统中的线程有一个一对一的关系,也就是说,比如JVM有一个.class文件要开启协程,它在JVM虚拟机上开启协程和我们操作系统上的.exe文件开启线程是一个道理。但是JVM终究没有真正的操作系统吊,所以当它开启一个协程的时候,那么它就会向操作系统请求让操作系统给他开启线程,所有JVM运行的时候实际上就是运行的操作系统的线程,所有也把JVM的所创建的协程叫做线程。

这里引入一个新的语言:Go语言,这个语言的虚拟机在创建协程的时候,并不和操作系统进行一对一线程支持,而是自成一派,自己管理自己的线程,但是运行的时候终归要向人家操作系统请求线程,它的骚操作在于,它向操作系统申请了一个线程池,往往这个线程池的数量远远小于Go虚拟机中的协程数,用线程池来进行多线程并发问题,这也就是为什么Go语言被称为天生用来进行高并发开发的语言了。

1.1、进程

1.1.1、进程的状态:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??在这里插入图片描述

其中,它的三种基本状态是:

1、就绪态(Ready):已经具备运行状态,但是因为没有CPU空闲,所以没法运行(万事俱备,只欠CPU)。

2、运行态(Runing):占有CPU并在CPU上面运行(多少核就能有多少进程处于这个状态)。

3、阻塞态(Wait/Block):因为等待某一事务,而不能运行。如等待读磁盘操作。

另外两种状态:

1、创建态(New):每个进程在运行前,操作系统会对它进行分配空间、分配资源、初始化PCB块的操作,这样一个进程才能投入使用,这个过程就叫做创建态。

2、终止态(Terminated):进程在运行结束或者因为BUG而不能运行下去的时候,需要对它进行撤销操作,并回收它的资源和内存,删除它的PCB块,这个过程叫做终止态。

1.1.2、进程转换:

进程转换主要发生几个基本状态之间:

注意:运行态——>阻塞态是进程自身做出的一种主动行为;阻塞态——>就绪态不是进程能自己控制的,是一种被动行为。

进程也不能直接从运行态变成就绪态,也不能从阻塞态直接变成运行态。

1.1.3、进程通信

顾名思义,就是进程之间的信息交换。

进程各自拥有自己的地址空间,并且各自相互独立,所以一个进程是不能直接访问另一个进程的地址空间的,但是进程之间的信息交互却是必须实现的,操作系统提供了以下三种方法。

1、共享存储:

进程之间不能互相通信,所以操作系统给他们分配了一个共享空间,用来进行进程之间的互相通信。

两个进程对于共享空间的访问是互斥的,同一时间只能有一个进程访问这里。

操作系统只提供共享空间和互斥同步工具。

这种方式有两种共享模式:

1、基于数据结构:速度慢,限制多,低级方式。

2、基于存储区:在内存划出一块空间,数据形式、存放位置都由进程决定,高级方式。

2、管道通信:

管道是指用于连接进程读写的一个文件,又叫pipe文件,是在内存中开辟了一个固定大小的缓存空间,大小一般和内存页面相同。

管道只能实现半双工通信,要实现双向通信需要两个管道,各进程互斥访问管道。

数据以字符流的形式写入管道,而且是写满再读,读完再写

数据读出来数据会被抛弃,找不回来了,所以读进程只能有一个。

3、信息传递:

进程之间消息传递利用格式化的消息作为单位,通过操作系统提供的接受发送两个原语进行数据交换。

格式化的消息包括消息头和消息体:

消息头:发送进程ID,接受进程ID,消息长度等。

消息体:本次通信需要的数据。

信息传递有两种实现方式:

1、直接通信方式:

每个进程会有消息缓冲队列,直接通信就是将发送进程的消息利用发送原语直接挂在接收进程的消息缓冲队列上,再由后者用接受原语进行读取。

2、间接通信方式:

操作系统会为所以管理的进程设置一个“信箱”,进程之间的消息需要先发送到中间实体(信箱)中,因此也叫信箱通信方式。

因为消息头包含发送进程ID,接受进程ID,所以不会出现各进程之间通信紊乱的可能。

1.1.4、进程调度

需要进程调度的几个情况:

1、当前进程主动放弃了处理机。

比如:进程运行完毕,运行发送异常,等待I/O处理。

2、当前进程被迫放弃处理机。

比如:分给进程的时间片用完了、有优先级的进程进入就绪队列、有更紧急的事情需要处理。

调度方式:剥夺式和非剥夺式(不行了)。

进程调度:主要过程是用某些方式和策略(进程调度算法),从进程的就绪队列中选择一个进程,将它交给处理机进行处理。进程调度实际上是一种低级调度过程,它的调度是非常频繁的,一般操作系统都会配置。

进程调度算法:

FCFS(先来先到):出于公平设计的一种算法,先到达队列的进程先为他服务,一般是非抢占式的算法。

优点:公平,简单。

缺点:对长进程有利,对短进程不利。

不会导致饥饿(某进程一直得不到服务)。

SPF(短时间优先):追求最小平均等待时间,最小平均运行时间,最短服务时间的线程优先被执行,是非抢占式算法,有抢占式版本(SRTN)

优点:最短的平均等待时间和最短的平均周转时间。
缺点:长进程不利,短进程不利,有可能对长进程时间导致饥饿。

HRRN(高相应优先)先计算相应比[(等待时间+要求服务时间)/要求服务时间],相应比高的优先处理,一般是非抢占式。

优点:综合考虑的要求等待时间和要求服务优先,综合了前两个算法的优点,对于长时间进程,随着等待时间越长它的响应比也会越大,所以不会出现饥饿现象。

RR(时间片轮询):按照进程到达就绪队列的时间,公平分配时间片(时钟中断),轮流对各个进程进行调度,没有执行完就剥夺处理机资源,是抢占式算法。

优点:公平,响应快,适应于分时操作系统。

缺点:因为高频率的进程切换,因此需要一定地开销,而且不区分任务紧急度。

不会造成饥饿。

优先级调度算法:每个进程有自己地优先级,这里会选择优先级高的进程,优先处理。

优点:用优先级区分紧急程度,适用于实时操作系统。

缺点:如果源源不断地优先进程涌来,会造成饥饿。

多级反馈队列调度算法:设置多个优先队列,各队列优先级从高到低,时间片从小到大,进程先进入一级队列,按照FCFS分配时间片,若时间用完还未结束,就送进下一级队列队尾,若此时已经在下一级队列,则重新放回队尾,只有当k级队列为空,才会为k+1级队头分配时间片。

抢占式算法。

优点:对各进程公平(FCFS),新到达的线程能最快响应(RR),短进程只需要较少时间(SPF),总之一句话,集大成者,最牛逼。

缺点:有可能导致饥饿。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 12:01:39  更:2021-07-25 12:01:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:43:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码