[Linux打怪升级之路]-进程和线程

前言

作者小蜗牛向前冲

名言我可以接受失败,但我不能接受放弃

 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正

目录

一、进程

1、进程的状态

2、进程的控制

3、进程的上下文切换

二、线程 

1、什么是线程

2、进程和线程有什么区别

3、调度算法有哪些


一、进程

进程我们简单的理解就可以认为是内存中运行的程序

1、进程的状态

进程的状态大体上可以分为三种:运行状态,就绪状态,阻塞状态。

 当一个进程A正在运行的可能,来一个优先级更高的B进程,这就会导致进程A由运行状态切换为就绪状态,直到进程B的时间片用完,在由CPU选择处于就绪状态的进程。

进程A也有可能他要进行I/O,但我们知道I/O是非常慢的,对于CPU的运行速度来说,这就会导致操作系统会将进程A的状态由运行状态变为阻塞状态。当I/O请求资源准备好之后,在把阻塞状态变为就绪状态,等待操作系统的调度。

其实操作系统还有二种状态:准备状态和结束状态。

准备状态:进程被创建的状态。

结束状态:进程正在从系统消失的状态。

当存在大量的进程处于阻塞状态的时候,这些进程如果都存在在内存中,就会浪费资源,所以操作系统会把这些进程置换到磁盘中,这时候我们称这些进程被挂起。

挂起又可以分为二种:

阻塞挂起状态:进程在磁盘上等待某个事件的出现(比如I/O请求完毕)。

就绪挂起状态:进程在磁盘上,一但进入到内存立刻可以运行。

导致进程被挂起的原因是非常多的,除了进程使用的空间不在物理内存中,还可能调用了sleep函数或者用发生了Ctrl+z的信号。 

2、进程的控制

在了解进程进程控制前,我们知道操作系统在管理资源,都是先描述,在组织。所以为了管理好进程,操作系统中一个PCB数据结构(进程控制控制块)。

PCB中存放着进程的描述信息,进程控制和管理信息,资源分配清单,CPU相关信息。(描述)

进行描述信息:进程标识符和用户标识符

进程控制和管理信息:进程的状态,进程的优先级

资源分配清单:内存空间和虚拟内存空间的信息

CPU相关信息:主要是一些寄存器的值,保存进程切换相关信息的值

PCB通常是通过链表的方式进行管理进程,比如把相同状态的进程链接在一起,组成队列。(组织)

了解PCB数据结构,继续了解进程的控制过程,创建,终止,阻塞,唤醒

 进程创建

申请一个空白的PCB,填写进程的控制管理信息,比如进程的唯一描述符

为进程分配运行必须的资源,比如内存资源

将PCB插入到就绪队列,等待被调度运行

进程终止 

进程终止有三种方式:正常结束,异常结束,外界干预(kill)。

当子进程终止后,其资源被父进程回收。当父进程被终止后,子进程成为孤儿进程被1号进程领养,资源也由1号进程回收。

  • 查找需要终止的进程的 PCB;
  • 如果处于执行状态,则立即终止该进程的执行,然后将 CPU 资源分配给其他进程;
  • 如果其还有子进程,则应将该进程的子进程交给 1 号进程接管;
  • 将该进程所拥有的全部资源都归还给操作系统;
  • 将其从 PCB 所在队列中删除;

阻塞进程

当一个进程需要等待某件事情的完成,他可以调用阻塞语句将自己阻塞,一旦阻塞只能由其他的进程唤醒。

  • 找到将要被阻塞进程标识号对应的 PCB;
  • 如果该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行;
  • 将该 PCB 插入到阻塞队列中去

进程唤醒

到进程的资源等代到后,由于放现进程进行通知,对该进程唤醒。

  • 在该事件的阻塞队列中找到相应进程的 PCB;
  • 将其从阻塞队列中移出,并置其状态为就绪状态;
  • 把该 PCB 插入到就绪队列中,等待调度程序调度;

3、进程的上下文切换

在理解进程上下文切换时,我们先简单的理解CPU上下文的切换,对与一个单核的CPU,我们看似在这台脑上一边听歌一边微信聊天,也就是认为任务在同时跑,但是其实不这样的,只是CPU切换的速度非常快,我们没有查觉到而已。

其中,CPU 寄存器和程序计数是 CPU 在运行任何任务前,所必须依赖的环境,这些环境就叫做 CPU 上下文

CPU 上下文切换就是先把前一个任务的 CPU 上下文(CPU 寄存器程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

其中的任务可以是进程,线程,中断。

那进程上下文切换又是什么?

进程切换主要包括:用户资源,虚拟内存,栈,全局变量。还包括内核堆栈,寄存器等内核空间。

 这些信息保存在PCB中,也就上进程间的切换其实是PCB的切换。

 进程切换的场景

  • 为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,进程就从运行状态变为就绪状态,系统从就绪队列选择另外一个进程运行;
  • 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行;
  • 当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度;
  • 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行;
  • 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序;

二、线程 

1、什么是线程

在了解线程是什么时候,我们先来看下面一个场景,我们要编写一个视频播放器,要完成读取文件数据,对数据进行解压,播放解压的数据。

当我们仅仅用:单进程跑下面的程序

 播放出来的画面和声音会不连贯,因为CPU进行运行的非常快,I/O进行是非常慢的。

那多进程跑呢?

同样会出现许多问题:

进程我怎么进行通信, 共享数据,进程切换和维护的开销是非常大的

为了解决这些问题,我们提出线程。

线程是进程的一个执行流,对于同一个进程间的线程,共享代码段、数据段、打开的文件等资源。

每个线程都有自己的栈和寄存器

2、进程和线程有什么区别

那进程和线程的具体区别体现在哪里呢?

为了更好的理解进程和线程,下面我们把进程比作火车,线程比作火车车厢。

  • 线程是跑在进程下的(单独的车厢是无法前行的)。
  • 进程间的数据是不共享的,线程的堆,数据段,代码段等数据是共享的,但是栈和寄存器是不共享的。(火车和火车上的乘客一般不会有交集,但是同一辆火车上的不同车厢上的乘客更容易产生交集,当然不同乘客都会有自己的车厢)
  • 线程的创建和切换比进程要快(乘客换车厢比换火车更加容易)
  • 进程间一般不会相互影响,但是一个线程挂掉会导致整个进程挂掉。(一个火车起火不会影响另外一辆火车,但一节车厢着火会影响其他车厢)

3、调度算法有哪些

当操作系统在运行时,可能存在许多任务等待处理,对待单核CPU要进行任务的处理。存在非常都的掉用法方法。

先来先服务调度算法

这个就在就绪队列排在前面的进程先被CPU处理,直到处理完成任务,但是这个当这个任务非常长的情况下,会导致其实进程一直得不到处理。

最短作业优先调度算法

 操作系统会优先运行服务时间较短的进程,这里看似能将一些短小进程服务处理掉,但是如果短小进程非常多,这会导致其他长时间进程得不到处理。

高响应比优先调度算法

为了衡量长短作业,每次在进程调度的时候都计算响应的优先级,在根据优先级进行任务的调度。

但是服务时间和等待时间是不可以预计,所以这也只是一个理想模型。

时间片轮转调度算法

这个就是给每个进程分配一个时间片,用完了就轮到下一个进程

 最高优先级调度算法 

在操作系统来看,有一些进程是要被加急时间处理的,所以要让最高优先级进程先运行。

进程的优先级可以分为,静态优先级和动态优先级:

  • 静态优先级:创建进程时候,就已经确定了优先级了,然后整个运行时间优先级都不会变化;
  • 动态优先级:根据进程的动态变化调整优先级,比如如果进程运行时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升高其优先级,也就是随着时间的推移增加等待进程的优先级

但是依然有缺点,可能会导致低优先级的进程永远不会运行。 

多级反馈队列调度算法

这里综合时间片轮转算法和最高优先级。

多级指的是有多个队列,每个队列的优先级从高往低递减,而且优先级越高的时间片越短

反馈指当有新进程加入优先级到的进程,立刻停止正在运行的进程,马上去运行优先级高的队列。

工作流程:

  • 设置了多个队列,赋予每个队列不同的优先级,每个队列优先级从高到低,同时优先级越高时间片越短
  • 新的进程会被放入到第一级队列的末尾,按先来先服务的原则排队等待被调度,如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成;
  • 当较高优先级的队列为空,才调度较低优先级的队列中的进程运行。如果进程运行时,有新进程进入较高优先级的队列,则停止当前运行的进程并将其移入到原队列末尾,接着让较高优先级的进程运行;

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[UE5]安卓调用外置摄像头拍照(之显示画面)

目录 部分参考文献(有些有用的我没标,没放上来) 要点 总蓝图 结果 部分参考文献(有些有用的我没标,没放上来) 【UE】获取USB摄像头画面_虚幻捕获硬件摄像头-CSDN博客 UE4安卓调用摄像头拍照确保打…

C#中结构struct能否继承于一个类class,类class能否继承于一个struct

C#中结构struct能否继承于一个类class,类class能否继承于一个struct 答案是:都不能。 第一种情行,尝试结构继承类 报错:接口列表中的类型"XX"不是接口interface。 一般来说,都是结构只能实现接口&#x…

怎样快速查找网页代码中存在的错误?

计算机很机械,代码中存在微小的错误,计算机就得不到正确的运行结果。比如,一个字母的大小写、比如,个别地方丢掉了一个符号、、、如此等等。这就要求程序员和计算机是心灵相通的,不能有任何的“隔阂”。 但是&#xf…

LeetCode516:最长回文子序列

题目描述 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 代码 /*dp[i][j]:[i,j]的回文子序列长度为d…

Kingbase常用语句

查询数据库名 SELECT * FROM SYS_DATABASE;查询模式名 SELECT * FROM SYS_DATABASE;查询表空间 SELECT * FROM SYS_DATABASE;查询包含特定字段名的所有表 SELECT table_name FROM information_schema.columns WHERE column_name your_column_name --替换为查询的字段名 A…

【随笔】Git 实战篇 -- Git Rebase出错?手把手教你如何优雅地解决常见问题 (四十二)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

React-useState

useState基础使用 useState是一个React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果 本质:和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着变化&#xff0…

QByteArray数据移位注意事项

我们的目的是要将一个QByteArray数组中的四个字节合并成一个32位的无符号整数(quint32)或有符号整数(qint32)。假设将arr中的四个字节分别设置为0xF1, 0xF2, 0xF3,和 0xF4,我们要拼出一个无符号数0xF1F2F3F4。 代码1 …

ADOP带你了解:800G 收发器的类型和应用

随着对快速数据传输的需求不断增加,800G收发器因其高带宽、快速传输速率、出色的性能、紧凑的设计和面向未来的兼容性等特性而引起了人们的极大兴趣。在本文中,我们旨在概述各种 800G 光模块,并深入研究它们的应用,以帮助您在选择…

Window下VS2019编译WebRTC通关版

这段时间需要实现这样一个功能,使用WebRTC实现语音通话功能,第一步要做的事情就是编译WebRTC源码,也是很多码友会遇到的问题。 经过我很多天的踩坑终于踩出来一条通往胜利的大路,下面就为大家详细介绍,编译步骤以及踩…

智能合约革命:Web3引领智能化商业的未来

随着区块链技术的日益成熟和普及,智能合约作为其重要应用之一,正在逐渐改变着商业世界的面貌。Web3作为下一代互联网的代表,以其去中心化、加密安全的特性,为智能合约的发展提供了无限可能,将智能合约应用于商业领域的…

工业工程师日子越来越受不了?IE们都在做什么?

有一位工业工程师(IE)毕业在一家工厂工作,入职一年了,本科读的是工业工程,他说理想很美好现实很骨感,以为做和本科一样的职业就能够大展宏图,结果上司天天让他盯生产线,在厂房一站就…

2024HW|常见红队使用工具

目录 什么是HW? 什么是网络安全红蓝对抗? 红队 常见工具 信息收集工具 Nmap 简介 漏洞扫描工具 Nessus简介 AWVS 简介 抓包工具 Wireshark简介 TangGo 简介 web 应用安全工具 Burpsuite 简介 SQLMap webshell 管理工具 蚁剑 冰蝎 后…

定个小目标之每天刷LeetCode热题(3)

这是一道简单题&#xff0c;我这里就只讲两种解法 第一种是数组加双指针&#xff0c;先遍历链表将值存到数组里&#xff0c;然后分别从数组两端进行一一比较判断是否满足回文&#xff0c;代码实现 class Solution {public boolean isPalindrome(ListNode head) {List<Inte…

88.合并两个有序数组

题目解析&#xff1a; 非递减顺序说明&#xff0c;是递增的数列。m 、n分别表示数列1 和 数列2中元素的个数&#xff0c;但是要注意的是&#xff0c;数列1的长度的是mn&#xff0c;不单纯的只是m&#xff0c;所以这里的m的含义需要特别注意。 这道题意思就是说&#xff0c;把列…

工控一体机10.1寸显示器电容触摸屏(YA07JK)产品规格说明书

如果您对工控一体机有任何疑问或需求&#xff0c;或者对如何集成工控一体机到您的业务感兴趣&#xff0c;可移步控芯捷科技。 一、硬件功能介绍 1.1 YA07JK介绍 YA07JK 是我公司推出的一款新型安卓屏&#xff0c;使用电容触摸屏。4 核 Cortex-A7 架构&#xff0c;主频1.2GHz …

STM32——启动文件选择及启动文件宏定义

文章目录 前提&#xff1a;以STM32F1xx系列芯片为例&#xff08;有方法&#xff0c;其他系列一样&#xff09;启动文件选择对应启动文件的寻找方法对应宏定义#define的寻找方法另外 前提&#xff1a;以STM32F1xx系列芯片为例&#xff08;有方法&#xff0c;其他系列一样&#x…

【YOLOv10的使用】YOLOv10的训练/验证/预测/导出模型/ONNX模型的使用

&#x1f680;&#x1f680;&#x1f680; YOLOv10: 实时端到端的目标检测 性能 YOLOv10比最先进的YOLOv9延迟时间更低&#xff0c;测试结果可以与YOLOv9媲美&#xff0c;可能会成为YOLO系列模型部署的“新选择”。 目录 1 安装 2 训练 3 验证 4 预测 5 导出模型 6 ONNX…

Ubuntu20.04升级到22.04之后出现的问题

项目场景&#xff1a; 之前一致使用的是Ubuntu20.04&#xff0c;虽然丑了点&#xff0c;但是用着没什么问题&#xff0c;最近没能按捺住好奇心&#xff0c;升级到了22.04&#xff0c;升级后颜值有所提高&#xff0c;但是也带来了一些问题。 从20.04升级到22.04&#xff0c;起始…

PG TOAST技术

1.Toast简介&#xff1a; Toast是超长字段在PG的一个存储方式&#xff0c;对于用户来说不用关注这一技术的实现&#xff0c;完全是透明的&#xff0c;它会将大字段值压缩或分散为多个物理行来存储&#xff0c;与Oracle的CLOB&#xff0c;BLOB类似。 2.Toast的存储方式&#xf…