JavaEE引入-操作系统简介进程与线程

目录

操作系统

结构图操作系统功能及

进程(任务) 

进程与程序(可执行文件)的区别

CPU 分配 —— 进程调度

内存分配 —— 内存管理

进程管理 

进程管理中的核心概念(进程调度4种属性)

进程的虚拟空间

 进程间通信

线程(Thread)

为什么要有线程

进程与线程之间的区别(面试重点) 


前言:

在学习JavaEE之前,我们首先要了解关于计算机的有关知识,例如我们了解计算机的操作系统是干嘛的,它与我们使用电脑上的各种软件都有些什么影响,以及知道什么是进程和线程,进程与线程之间又有些什么关联。


操作系统

概念

“操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。简单理解就是: 操作系统是搞管理的软件,管理着硬件设备和各种软件,还要进行内存管理,文件管理,设备管理,以及接下来我们要讲的进程管理

结构图操作系统功能及

进程(任务) 

概念:

每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一,简单来说就是: 进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程, 同时,在操作系统内部,进程又是操作系统进行资源分配(CPU资源和内存资源)的基本单位

例如我们在电脑上打开资源管理器,此时就可以查看我们电脑上当前操作系统 进行中的进程

进程与程序(可执行文件)的区别

首先我们要明白的是,进程是操作系统将一个程序运行起来,完成一系列任务的抽象过程,而程序也就是可执行文件(.exe),他是静态放置于硬盘空间上的,只要我们不双击这个文件,那这个文件就会一直静态的存放在硬盘上,此时操作系统也不会为该可执行文件分配资源也就不会产生进程,而一当我们双击了该文件,那操作系统就会给该可执行文件分配资源,将其加载到内存上,执行文件中的代码,从而产生进程。

CPU 分配 —— 进程调度

进程调度是指操作系统按某种策略或规则选择进程占用CPU进行运行的过程。详情关于进程调度的知识请参照这篇文章《进程调度》

内存分配 —— 内存管理

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

进程管理 

什么是进程管理呢?我们都知道在我们的电脑上,一个操作系统上同时进行着许许多多个进程,而可用资源是有限的,要想所有的进程都正常进行,那操作系统此时就必须将他们合理安排,且进程管理又是在操作系统的内核中进行的。

进程管理中的核心概念(进程调度4种属性)

1.PCB(进程控制块):也就是一个结构体/类,其中包含了表示进程的核心信息,在操作系统内核中,就会把一个个PCB通过一个双向链表串联在一起这样方便管理时进行增删查改的操作其实在计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。例如在 Java 语言中,我们可以通过类/对象来描述这一特征。

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

PCB中包含的信息

2.实现进程调度的关键属性

为什么要进程调度呢?要进行进程调度的本质原因就是:计算机上CPU上的核心数是6核的,而进程是十分多的,所以要想使这些进程正常进行就必须要对CPU资源进行合理分配也就是调度

  • 进程的优先级:每个进程都有相应的 优先级 ,优先级决定它何时运行和接收多少 CPU 时间。
  • 进程的状态:进程有很多的状态,例如比较典型的两种状态为,就绪状态:进程是准备就绪的随时可以在CPU上执行的,和阻塞状态:进程在等待某个任务执行结束(读写磁盘),只有在完成读写磁盘之后才会在CPU上执行
  • 进程的进账信息:通过一个进程在CPU上运行的时间就可以知道一个进程是否处于饥饿状态 (长时间没有运行)
  • 进程的上下文:进程上下文是运行程序的一种"存档和读档",例如某一个进程在执行了一半的时候被调度走了,一段时间后,如果想要继续执行为执行完的进程,那就要用到进程的上下文。

管理步骤

  1. 先描述进程的关键信息,也就是操作系统内核中用一个结构体/类将其关键特征信息进行记录描述,创建PCB。
  2. 操作系统给创建好的PCB进程控制块分配系统资源,这一个步骤是十分耗时间的
  3. 然后再使用一种数据结构(例如双向链表)将这些结构体/类进行关联放到操作系统内核中,整理在一起。

进程的虚拟空间

进程是需要使用部分系统资源的,其中内存资源是十分重要的一种资源,我们假想一下一个场景,如果我们所有的进程都在同一块内存空间内,假设某一个本来指向A进程的指针,发生解引用之后却指向了无关联的进程B,那这时候A,B进程的执行都会受到影响,可能就会发生我点开QQ,却给我打开了微信的故障,所以为了避免这种情况的发生,这也就违背了操作系统要给程序提供稳定运行空间的原则,所以为了避免这种情况我们就用到了进程的虚拟空间,也就是将不同的进程分别放在一块独立的虚拟内存块中,这样就达到了进程之间互不干扰的问题。

 那一旦有了进程的虚拟空间,那进程就会产生一个非常重要的特性,那就是"隔离性",也就是说,进程与进程之间是相互独立的,互不干扰的,即使是一个进程崩溃了,也不会导致其他进程崩溃。

注意

在进程的虚拟空间这里,可能有的同学有个疑惑,就是既然每个进程都有一块独立的虚拟空间,那会不会这些进程运行时加载到真实内存上时,大小超过内存大小呢?

 进程间通信

进程有了自己的虚拟地址空间之后,虽然解决了进程间发生干扰的可能性,将进程与进程之间进行"隔离",产生"隔离性",可是实际情况下,我们又想让进程与进程之间"交流",那就要引入进程间通信的概念。

概念

如上进程各自都有虚拟地址空间,且进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备 隔离性
但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行 信息交换 的需求。进程间通信的需求就应运 而生。
目前,主流操作系统提供的进程通信机制有如下:
1.   管道
2. 共享内存
3. 文件
4. 网络
5. 信号量
6. 信号
其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同 一主机上的进程间进行通信。

对于进程间通信我们先简单理解就行,后边我们要学习到的网络编程,其本质就是一种进程间的通信。

线程(Thread)

介绍完进程,我们接着来看一个"轻量级的进程",也就是线程,那为什么要引入线程呢,我们先看一个小案例,我们创建一个进程,以银行取钱为例:一家银行就为一个进程,它用来办理各项银行业务。但是当人多了的时候,业务办理效率就很慢了,于是为了提高效率,我们就得多建一家银行,这一家银行又为一个新的进程。但是多建家银行这成本就很高了,我们还有什么办法呢?于是我们不多建银行,而是选择在原来的银行里,多开设几个柜台,这下效率一下就提上去了,成本也降低了,那么多开的柜台,我们就称之为一个线程。

线程概念

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行着多份代码.

为什么要有线程

1.首先, "并发编程" 成为 "刚需". 

  • 单核 CPU 的发展遇到了瓶颈 . 要想提高算力 , 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.
  • 有些任务场景需要 " 等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作 , 也需要用到并发编程.
2. 虽然多进程也能实现 并发编程 , 但是线程比进程更轻量
  • 创建线程比创建进程更快 .
  • 销毁线程比销毁进程更快.
  • 调度线程比调度进程更快.

可能这样子还有一点抽象,大家呢还是没有get到线程带来的好处以及优势,那我简单举一个生活中的小例子,假如我以后成为了码农,然后打算自己开一家加工厂,由于我呢资金有限,所以呢只能勉强开一个工厂(进程),此时一个工厂只有一个工作间(主线程),若干年后呢,我发了点小财,工厂内的资源人力原材料(系统分配资源)都十分充足,多的甚至可以说闲置放在工厂十分的浪费,我此时就想着要怎么才能充分利用这些闲置的资源呢?于是我想到了两种方案,第一种方案呢,就是重新再开一家工厂(创建新进程),但是呢我的钱又不足以再开一家工厂,况且还要考虑到场地规划,人员调集等繁琐的操作(创建进程分配系统资源时非常耗时),总之如果从新开一个工厂是十分耗时且繁琐的,那我还有第二种方法就是在原来工厂里新添加几个工作间(进程里创建多个线程),然后将工厂里的资源都均匀分配给所有的工作间(多个线程共享系统资源),这样子不仅解决了资源过剩浪费的问题,而且还解决了从新建设新工厂的繁琐过程(多线程提高了效率),这样子你应该就好理解为什么要有线程了吧。当然一个进程中线程越多也不一定是一件好事,这个后面文章给大家介绍。

所以说没有线程,只有进程的话是十分低效且浪费CPU资源的,如果没有线程可能就会发生这种场景

进程与线程之间的区别(面试重点) 

  1. 进程是包含线程的,线程在进程里面。
  2. 一个进程中可包含多个线程。
  3. 进程之间有父进程和子进程的概念,而线程中没有,所有线程都是"平等的",每个线程都是一个独立的"执行流"。
  4. 每个线程都有自己的虚拟地址空间,有属于自己的文件描述符表,而同一个进程中的线程则是同时共享这一份文件描述符表和虚拟地址空间,也就是说进程之间资源是"独立的",而线程之间资源是"共享的"。
  5. 进程是操作系统进行资源分配的基本单位,线程是操作系统进行调度执行的基本单位。
  6. 一个进程崩溃了,不会影响其他进程,而一旦同一进程的一个线程崩溃了,则会将其他线程也挂了。
  7. 线程适用于CPU密集型场景(CPU运算)和IO密集型场景(读写磁盘,读写网卡等)


 好啦以上讲解的都是一些关于进程与线程的知识点,重在理解,希望对你有帮助,写作不易,给个赞支持一下吧就😘😘😘😘😘😘

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值