操作系统、进程和线程

news2024/11/18 23:40:17

目录

一、操作系统

二、进程/任务(Process/Task)

1. 什么是进程/任务

2. 进程控制块抽象(PCB Process control Block)

3. CPU分配 —— 进程调度(Process Scheduling)

4. 内存分配 —— 内存管理(Memory Manage)

5. 进程间通信(Inter Process Communication)

三、线程(Thread)

1. 什么是线程

2. 线程和进程的关系

四、问题提问和解答

五、各个技术面试的多频考点


一、操作系统

操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。

操作系统的定位如下:

操作系统由两个基本功能:
1) 防止硬件被应用程序滥用
2) 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。

二、进程/任务(Process/Task)

1. 什么是进程/任务

每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。

人话:每个应用程序在内存运行时就是一个进程

2. 进程控制块抽象(PCB Process control Block)

计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中,我们可以通过类/对象来描述这一特征。

// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
// 进程的唯一标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息(留待下面讲解)
}

我们这里用类去类比PCB,但是操作系统都是用C语言写的,所以应该把PCB描述成一个结构体更加合适 

一个PCB一般包含如下信息:

(1)pid:每个进程需要有一个唯一的身份标识~

(2)内存指针:当前这个进程使用的内存是哪一部分

(3)文件描述符表:进程运行的时候,使用了哪些硬盘上的资源

这样,每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。

操作系统再通过这种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作。

3. CPU分配 —— 进程调度(Process Scheduling)

注:进程是计算机分配资源的基本单位!!!(死记)

为了便于讨论和理解,我们大部分的场景下假设是单CPU单核的计算机。
操作系统对CPU资源的分配,采用的是时间模式 —— 不同的进程在不同的时间段(时间片)去使用 CPU 资源。

首先了解什么是并行和并发:

并行:同一时刻,两个核心,同时执行两个进程,此时这两个进程就是并行执行~

并发:一个核心,先执行进程1,执行一会之后,再去执行进程2,在执行一会之后,再去执行进程3,此时只要这里的切换速度足够快,看起来,进程123就是“同时”执行

例如:一个CPU有16个核心,也可以同时执行142个任务!通过并发+并行的方式来完成,这种状态完全是有操作系统只是控制的,程序猿根本感知不到~~,所以很多时候就把并行+并发统称为并发!【并发程度更高了,就可以称为高并发。比如一个核心(主体)并发指向了1w个任务!!,就可以称为“高并发”】


接下来这一组属性,都是描述CPU资源相关的属性。这些属性都是辅助进程调度:

a) 进程状态

简单认为,进程状态主要是这两个:

就绪态:该进程已经准备好了,随时可以上CPU执行

阻塞态:该进程暂时无法上CPU执行

举个栗子:

我同时交三个男朋友,每周要给这三个小哥哥(A、B、C)安排时间表~

默认情况下,这三个小哥哥都是随叫随到,我在排时间就十分灵活,也就是每个人都是就绪态。

假设A和我说,他要出差一个月~~

于是A就相当于阻塞态,B和C就是就绪态

b) 进程的优先级

进程之间的调度不一定是“公平”的,有优先级之分

举个栗子:

A最有钱,B最帅,C最会舔

那么在我眼中,A的优先级最高,可能每周会排4天给A,然后是B,最后才是C。

c) 进程的上下文

上下文,就是描述当前进程执行到哪里(也就是存档记录),为什么会有这个存单记录呢,因为CPU在调度每个进程都是随机的,由时间片决定。

进程在离开CPU的时候就要把当前运行的中间结果“存档”,等下次进程再次被CPU调度的时候,再回复之前的“存档”,从上次的结果继续往后指向~~【如果进程结束了,就不必村了,如果是暂时离开,就得存!】

举个栗子:

有一天,我和A在一起,A给我说:“下个月,我带你去南澳岛玩玩,你准备准备。”此时,我就可以准备一套性感的内衣。

第二天,我和B在一起,B给我说:“下个月,他的妈妈要过生日,他想让我帮忙挑选个礼物,也让我准备准备。”我准备给他妈妈挑选个手机。

过了一段时间之后,此时,A问我准备得咋样,我说手机买好了。B问我准备得咋样,我说内衣买好了,这就尴尬了~~

为了避免这种情况,我就需要在时间安排表上记录一下:和他们做了什么时,保证下次和他们在一次不会出差错!

具体到进程,所谓的上下文具体指就是进程的运行过程中,CPU内部的一系列寄存器的值

d) 进程的记账信息

统计了每个进程,在CPU上执行了多久了,可以作为调度的参考依据,可能会给一个执行时间少的进程增加他的调度次数

比如,按照之前的优先级,每周只给C排一天的实践~~

过了几个月之后,我就发现C对我的态度逐渐冷淡了,舔得力不从心

此时排查之前的时间表,原来排给C的时间太少了,难怪感情就淡了~

接下来的实践里给C多排点时间,多给他点甜头。

4. 内存分配 —— 内存管理(Memory Manage)

操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰.

操作系统给进程分配的内存,是以“虚拟地址空间”的方式进行分配的,每个进程范围的内存地址,都不是真实的物理地址。

 人话:页表其实就相当于一个检测员,看看你的给的地址是否正确。保证了一个进程的独立性,一个进程无法直接干预另一个进程的内存内容,每个进程都有自己的独立的地址空间。大大提升了操作系统的“稳定性”。

5. 进程间通信(Inter Process Communication)

如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备“隔离性
(Isolation)”

但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求就应运而生。
目前,主流操作系统提供的进程通信机制有如:管道、共享内存、文件、网络、信号量、信号
其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。

举个栗子:

一个小区因为疫情封了,外面的人进不来,里面的人出不去。

我想点外卖,外卖员就会把外卖送到保安亭(相当于公共空间

外卖员是一个进程,我是一个进程!

三、线程(Thread)

前面讲了那么多进程的知识,目的不在讲进程,而是为了引出线程!!!

1. 什么是线程

首先,我们得知道进程,是比较“重量的”,速度慢,消耗资源多的

创建一个进程,成本比较高

销毁一个进程,成本也比较高

调度一个进程,成本也挺高的……

所以多进程编程,可以解决并发的问题,但不是一个高效的选择!

为什么进程这么有“重量”?

主要体现在资源分配上,资源分配是一个耗时的操作(包括了内存分配,文件读取分配等等)

引入线程:

举个栗子:

我的大姨想要扩建自己的厂子,有两种方案

(1)再去找个地皮,重新建立物流系统等等(多进程)

(2)在原本的厂子上进行扩建,不需要重新建立物流系统,做到了资源共享,同时提高了出货量(多线程)

我们再次回顾下进程调度:

(1)为啥要调度?狼多肉少(进程多,CPU处理不过来)

(2)CPU按照并发的方式来执行进程的

(3)PCB中提供了一些属性,进程的优先级、进程的状态、进程的上下文、进程的记账信息……

2. 线程和进程的关系

进程包含线程,一个进程里可以有一个线程,或者多个线程。每个线程都是一个独立的执行流。多个线程直接,也是并发执行的。

一个进程中的多个线程之间,共用同一份系统资源,包含了①内存空间、②文件描述符表

只有在进程启动,创建第一个线程的时候,需要花成败去申请系统资源,一旦进程(第一个线程)创建完毕,此时,后续再创建的线程,就不必再申请资源了,创建/销毁的效率也提高了不少。(线程也被称为“轻量级”的进程)

总结进程和线程的区别:

  1. 进程包含线程。
  2. 进程有自己独立的内存空间和文件描述符表。同一个进程中的多个线程之间共享同一份地址空间和文件描述符表。
  3. 进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位
  4. 进程之间具有独立性,一个进程挂了,不会影响到别的进程;同一个进程里的多个线程之间,一个线程挂了,可能会把整个进程带走,影响到其他线程的。

四、问题提问和解答

(1)计算机在什么情况下会再创建一个进程

答:取决于你的代码咋写。创建进程和创建线程都是程序猿可以控制的~~。例如同一个程序,内部想要并发地完成多组任务,此时使用多线程比较合适(比如:微信,是一个程序,里面同时聊天、看朋友圈等等可以理解为线程)。多个程序之间,此时就是多个进程了(比如:微信、QQ音乐等等)。

(2)进程里的多线程有没有上限呢?

答:只要系统资源够,没有上限的。但也不是线程越多越好。

五、各个技术面试的多频考点

(1)谈到JavaSE,最高频的问题是多态

(2)谈到数据结构,最高频的问题是哈希表的实现

(3)谈到数据库,最高频的问题是索引和事务

(4)谈到系统编程,最高频的问题是进程和线程的基本概念和区别

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

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

相关文章

【Redis】第5讲 Redis的下载并安装

下载Redis中文网https://www.redis.net.cn/ 百度网盘下载: 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://p…

软件测试这些基本类型你知道吗?

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 关于软件测试的类型,从不同角度来讲,可以分很多种,有时候甚至觉得软件…

深入理解Elasticsearch中的Match Phrase查询

文章目录 摘要Match Phrase查询的原理Match Phrase查询的用法Match Phrase查询的示例代码 Match Phrase查询的注意事项总结 摘要 Elasticsearch是一个功能强大的开源搜索引擎,它提供了丰富的查询功能。其中,Match Phrase查询是一种强大的查询类型&#…

1784_C语言实现常用的复数运算

全部学习汇总: GitHub - GreyZhang/c_basic: little bits of c. 这是最近学习的C语言数据结构的中的案例,但是没有给出具体的实现代码。根据自己的学习水平简单编写了一下,倒是能够计算与输出,但是不知道还有没有什么缺陷。 借用…

C++笔记之文档术语——将可调用对象作为函数参数

C笔记之文档术语——将可调用对象作为函数参数 相关博文:C笔记之函数对象functors与可调用对象 文章目录 C笔记之文档术语——将可调用对象作为函数参数1.在函数参数中传递可调用对象2.‘在参数中传入可调用对象’和‘将可调用对象作为函数参数’哪个描述更加专业…

MyBatis友人帐之使用注解开发

一、利用注解开发 mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建 sql 类型主要分成 : select () update …

由union引发的Struct占用内存空间和大小端问题的思考

1. 背景 在看Lua源码的时候,很多地方都用到了union(共用体或者联合体),在定义lua类型的时候,为了以一个结构来包含所有的数据类型,设计了一个 TValue类型,TValue类型最终关联到 Value类型&#…

番茄小说推文和番茄短剧推广怎么申请授权

番茄小说推文和番茄短剧推广都可以通过“巨量推文”进行授权 番茄小说是一个独立的小说平台,他们在推文市场有推广预算后交给我们达人进行推广,推广完成后可以获得番茄小说的cpa拉新奖励 番茄短剧和番茄小说类似,只是一个是推广短剧的平台一…

VisualStudio配置opencv

下载opencv 链接:https://opencv.org/releases/ 我下载的是4.7.0,选择windows下载。 下载成功后打开exe文件,选择路径安装。 配置环境变量 安装成功后找到安装目录,复制bin目录路径。 我的是放在了D盘 D:\Opencv4.7.0\opencv…

多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布

9月20日,以“多模态 多引擎 超融合 新生态”为主题的亚信科技AntDB数据库8.0产品发布会成功举办,从技术和生态两个角度全方位展示了AntDB数据库第8次大型能力升级和生态建设成果。浙江移动、用友、麒麟软件、华录高诚、金云智联等行业伙伴及业界专家共同…

《动手学深度学习 Pytorch版》 7.5 批量规范化

7.5.1 训练深层网络 训练神经网络的实际问题: 数据预处理的方式会对最终结果产生巨大影响。 训练时,多层感知机的中间层变量可能具有更广的变化范围。 更深层的网络很复杂容易过拟合。 批量规范化对小批量的大小有要求,只有批量大小足够…

CTF--攻防世界--杂项基础

多做几道基础题就会发现这东西真的跟智障题一样,开始嘲笑当初的自己了。 就当是学习笔记了【根据题库给的顺序,随便写几道】 用那个隐写工具一步完事 这一题我是真的理解了杂项的概念,这玩意是真杂啊,死活都没想到居然还有这种题…

网络编程day05(IO多路复用)

今日任务&#xff1a; TCP多路复用的客户端、服务端&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> …

若依使用及源码解析(前后端分离版)

部署环境 JDK > 1.8 MYSQL > 5.7 Maven > 3.0 Node > 12 Redis > 3 运行若依项目 下载若依源码 若依官网 若依项目源码(前后端分离) 运行后端项目 ruoyi-ui就是vue项目&#xff08;这里使用vscode打开&#xff09; 整体用idea打开 1.配置数据库(sq…

千兆以太网传输层 UDP 协议原理与 FPGA 实现

文章目录 前言心得体会一、UDP 协议介绍二、UDP 数据报格式三、UDP 数据发送测试四、Verilog实现UDP 数据发送1、IP 头部检验 IPchecksun 的计算2、以太网报文的校验字段 FCS 的计算3、以太网报文发送模块实现五、以太网数据发送测试六、仿真代码七、仿真波形展示八、上板测试九…

婚礼策划展示小程序制作全程解析

随着互联网的发展&#xff0c;小程序已成为各行各业所钟爱的一种数字化工具。对于婚礼策划师来说&#xff0c;一款专为自己业务打造的小程序能够更好地展示婚礼策划方案&#xff0c;提升服务质量&#xff0c;加强与客户的沟通。以下就是制作婚礼策划展示小程序的全程解析。 一、…

【Linux网络编程】gdb调试技巧

这篇博客主要要记录一下自己在Linux操作系统Ubuntu下使用gbd调试程序的一些指令&#xff0c;以及使用过程中的一些心得。 使用方法 可以使用如下代码 gcc -g test.c -o test 或者 gcc test.c -o test ​ -g的选项最好添加&#xff0c;如果不添加&#xff0c;l指令无法被识别 …

机试(2017 cs se)

2017计算机系夏令营 题解参考&#xff1a; 2017 华东师范计算机系暑期夏令营机考 A. 不等式 Problem #3304 - ECNU Online Judge 有点像贪心算法 选一个刚刚好在条件范围里的b[i]作为候选&#xff0c;【这个“刚刚好”是指选一个符合这个条件的最极限的值】 代码 #in…

力扣669 补9.16

最近大三上四天有早八&#xff0c;真的是受不了了啊&#xff0c;欧嗨呦&#xff0c;早上困如狗&#xff0c;然后&#xff0c;下午困如狗&#xff0c;然后晚上困如狗&#xff0c;尤其我最近在晚上7点到10点这个时间段看力扣&#xff0c;看得我昏昏欲睡&#xff0c;不自觉就睡了1…

关于Python安装Scrapy库的常见报错解决

目录 1、关于pip3命令的报错 2、执行scrapy报错&#xff08;Python3下的OpenSSL模块出错&#xff09; 3、卸载pyopenssl时报错 由于Scrapy该库在Windows下会存在兼容问题&#xff0c;下面介绍的是在Linux系统进行安装。 1、关于pip3命令的报错 报错代码&#xff1a; error…