Java从入门到精通 (十一) ~ 操作系统、进程和线程

无论做什么,请记住都是为你自己而做,这样就毫无怨言!今天,我为自己而活!今天,又是美丽的一天!早安,朋友!

目录

前言

一、操作系统

1. 概念

2. 操作系统的基本功能

3.操作系统内核 

4. 操作系统的类型

二、并发和并行

并发:是指系统能够同时处理多个任务。多线程

并行:是指系统同时执行多个操作,多进程

三、进程

1. 概念

2. 进程的特性

 3. 进程的属性

4. 进程的组织

5. 进程间的通信

扩展:虚拟地址空间(保证了进程的独立性)

6. 进程的应用场景

四、线程(“轻量级进程”)

1. 线程的概念

2. 线程的特性

与进程的差异

优势:

挑战:        

3. 线程同步与通信

4. 线程的六大状态

5. 线程池和执行者框架



前言

操作系统:计算机背后的智慧大脑,本质是一个软件

        在当今数十亿台设备上运行的软件背后,存在一个关键的、却常被忽视的技术支柱 —— 操作系统。操作系统是计算机系统中的核心软件,它负责管理和协调计算机硬件资源,并为用户和应用程序提供服务和接口。无论是个人电脑、智能手机,还是大型服务器,都依赖于操作系统的顺畅运行。


进程:计算机运行的基本单位

        在计算机科学中,进程(Process)是操作系统中的一个核心概念,它代表了正在运行的程序的实例。理解进程是理解操作系统和多任务处理的关键,本文将介绍进程的定义、特性、管理以及在现代计算中的重要性。 


线程:并发编程的核心概念

        在计算机科学和软件开发中,线程(Thread)是一种重要的并发编程概念,它允许程序同时执行多个任务,提高系统资源的利用率和响应速度。本文将介绍线程的定义、特性、应用以及在现代软件开发中的重要性。 


一、操作系统

1. 概念

操作系统:是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件

操作系统功能介绍:

  1. 系统资源的管理者
    1. 文件管理
    2. 存储器管理
    3. 处理机管理
    4. 设备管理
  2. 最接近硬件的一层软件
  3. 向下管理所有的硬件设备

操作系统毕竟是个软件,不可能认识所有的硬件设备,但是操作系统知道硬件设备由哪几个大类,知道每个大类大致有哪些功能,然后硬件厂商就可以开发一个驱动程序(软件)专属这个硬件设备,然后操作系统就可以对这个驱动程序来完成对硬件设备的操控,比如鼠标为什么插上就可以使用。

  1. 对上要给软件提供稳定的运行环境并且提供方便易用的服务

    操作系统提供稳定的运行环境意味着它应能有效管理硬件资源,防止因硬件故障或资源竞争而导致软件崩溃或运行异常。操作系统负责管理和分配CPU、内存、硬盘等硬件资源,以确保各个软件程序可以平稳地运行,并且能够有效利用资源,提高系统的整体性能和效率。

 

2. 操作系统的基本功能

  1. 资源管理

    • 处理器管理:操作系统负责调度进程和线程,以便在多任务环境中有效地利用CPU资源。
    • 内存管理:管理系统内存的分配和释放,保证每个程序都能获取到所需的内存空间。
    • 文件系统管理:管理文件的存储、检索和组织,确保数据的安全性和可靠性。
    • 设备管理:管理和控制输入输出设备,如磁盘驱动器、打印机、网络接口等,使得它们能够有效地与计算机通信和交互。
  2. 用户接口

    • 提供用户与计算机系统交互的界面,如命令行界面(CLI)和图形用户界面(GUI)等。
    • 一条命令一个响应
    • 多条命令
  3. 错误检测与处理

    • 监控系统运行过程中的错误和异常,采取适当的措施进行处理,以确保系统的稳定性和可靠性。

3.操作系统内核 

操作系统“内核”是操作系统里面最核心的功能模块

内核分为内核态和工作态,一个程序在运行过程中,可能在用户态工作也可能在内核态工作

  • 管理系统资源

    • 管理计算机中的硬件资源,如内存、硬盘、处理器,以确保资源合理有效的分配和使用

  • 进程管理

    • 管理系统中的进程,如进程的创建、调度和终止等操作。以确保多个进程在系统中协调运行

  • 内存管理

    • 管理系统的内存资源,包括内存的分配、回收、页面置换等操作,以提供给进程足够的内存空间

  • 文件系统

    • 管理文件系统,包括文件的创建、读写和删除等操作,以提供对文件的管理和访问

  • 设备驱动程序

    • 管理硬件设备的驱动程序,以便于应用程序可以通过内核与硬件设备进行通信和操作

  • 总结

    • 内核是操作系统的核心,硬件的驱动程序都在操作系统内核中工作,负责管理计算机的硬件资源和提供基本的系统服务,为用提供运行环境和操作硬件的接口。

最后:操作系统 = 操作系统内核  + 配套的应用程序

配套的应用程序:

  • 在操作系统上运行的软件程序,用于完成各种任务和提供各种功能。

4. 操作系统的类型

根据应用场景和设备类型的不同,操作系统可以分为多种类型,包括但不限于:

  • 桌面操作系统:如Windows、macOS、Linux等,主要用于个人电脑和工作站。
  • 服务器操作系统:如Linux服务器版、Windows Server等,专门用于管理和运行服务器资源。
  • 嵌入式操作系统:如Android、iOS等,用于嵌入式系统和移动设备。
  • 实时操作系统:如RTOS(Real-Time Operating System),专门用于对时间敏感的应用,如航空航天控制系统和工业自动化。

二、并发和并行

并发:同一时间应对多件事情的能力 (感觉上的同时执行)
并行:同一时间动手做多件事情的能力 (真正的同时执行)

并发:是指系统能够同时处理多个任务。多线程

  1. 并发并不意味着同时进行所有任务,系统通过在任务之间快速切换(时间片轮转或者其他调度方式),使得在单个时间段内似乎是同时进行了多个任务。
  2. 并发通常是通过时间分片的方式:切换不同任务的执行,每个任务都有自己的执行时间片。注意:这里的时间片非常小(计算机执行的非常快),切换的非常快,因此给人的感觉就是多个任务同时进行。

比如:视频就是图片一帧一帧的进行,因为切换的速度非常快,所以 就给人一种错觉,感觉不到图片是一点点切换的。

并行:是指系统同时执行多个操作,多进程

并行:多个任务在同一时刻开始和执行,通常每个任务都分配给不同的处理单元(如多核处理器或者多台机器)。实现并行的关键在于同时具有多个执行单元,能够并行地执行多个任务。

三、进程

1. 概念

        进程是指计算机中正在运行的一个程序的实例。每个进程都有自己的内存空间、代码和数据,它们之间相互独立,通过操作系统的调度和管理来分配处理器资源。在多任务操作系统中,可以同时运行多个进程,每个进程都有自己的执行流程和执行状态。

一般来说系统一开机就会有成百的进程被创建,有些进程是系统自动创建的,有些是手动创建的,每个进程想要运行都需要一定的系统资源(硬件设备),每个进程都是资源分配的基本单位

与程序是不同的概念,有些人总将进程和程序混淆:

程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。
当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程一个程序可以开启多个进程。

2. 进程的特性

  1. 独立性:每个进程是独立运行的实体,它们之间不会直接影响或干扰彼此的执行。

  2. 资源分配:操作系统负责为每个进程分配所需的资源,包括内存空间、CPU时间片、文件和设备等。

  3. 并发执行:多个进程可以并发执行,通过操作系统的调度算法决定哪些进程在哪个时刻执行。

  4. 通信机制:进程之间可以通过共享内存、消息传递等机制进行通信,实现数据交换和协作。

 3. 进程的属性

使用类/结构体,把被管理的一个对象的各个属性表示出来

  • PCB的属性(一个进程有一个)

    • pid:进程的身份标识

      • 每一个进程都有一个pid,同一时刻,不同进程的pid是不同的

    • 内存指针(一组属性)

      • 描述进程持有的“内存资源”是什么样子的

      • 每个进程在运行时时候,都会分配一定的内存空间,这个进程,内存空间,具体在哪里,以及分配的空间中有哪部分,每部分都是饭啥的,都是由内存指针进行区分的

      • 内存指针表示该进程在内存中的位置,意义快速找到内存中进程的位置,并恢复其上下文

    • 文件描述符表(顺序表结构)

      • 描述了进程持有的“硬盘资源”是啥样的 文件有关=>和磁盘有关

      • 一个进程要涉及到硬盘操作,就需要按照文件的方式来操作,当前进程关联了哪些文件,都能操作哪些文件,都是由文件描述符表决定的

      • 文件描述符表是进程控制块中的一个重要部分,用于管理进程打开的文件。意义是管理和追踪打开的文件

    • 进程的调度(进程持有的CPU资源的相关情况)

      • 进程的状态

        • 就绪状态

          • 已经准备好运行,正在等待分配CPU时间

        • 运行状态

          • 进程正在执行并占用CPU

        • 阻塞状态

          • 进程由于某种原因暂时无法继续执行,如等待I/O操作完成

        • 创建状态

          • 进程正在被创建但尚未开始执行

        • 终止状态

          • 进程已经执行完毕或被终止

      • 进程的优先级

        • 更好的调配系统资源,可以确保系统中重要或紧急的任务能够得到优先处理,从而提高系统的响应速度和效率

      • 进程的上下文

        • 进程在某一时刻的运行状态以及相关的数据结构,跟日记一样,一般都会把寄存器的值存到上下文中,就相当于存在内存中了

        • 存档

          • 进程从CPU离开之前,需要保存现场,把之前CPU中各种寄存器状态都记录在内存中

        • 读档

          • 下次进程回到CPU上执行的时候,此时就可以把保存这些寄存器的值,恢复回去,进程就会沿着上次执行的位置,继续执行

      • 进程的记账信息

        • 记账信息,会记录当前进程持有CPU的情况(在CPU执行多久了)就可以作为操作系统调度进程的参考依据,防止有些CPU一点资源也没有

    • 总结

      • 每个进程都有对应的PCB,用来管理进程的相关信息,PCB包含了操作系统对进程管理的所有信息,如进程状态、程序计数器、寄存器值、进程优先级、进程ID等

4. 进程的组织

  • 系统一般会使用双向链表来组织多个PCB。使用数据结构,把这些表示出来的对象,串起来(为了后序的增删改查)。
  • 原理介绍: 创建新的进程,创建PCB并把PCB插入到链表中。 销毁线程:把PCB从链表上删除并释放 展示进程列表:遍历链表中的每一个节点。

5. 进程间的通信

  • 因为虚拟地址空间的存在进程之间是相互独立的,所以要有进程之间的通信。

  1. 通过文件

            进程通过读写文件来进行数据交换,这种方式简单直接,适用于需要长期存储数据或者在不同时间点进行数据交换的情况。例如,一个进程可以将数据写入文件,另一个进程再从文件中读取这些数据。
  2. 通过网络(socket)

            网络连接进行进程间通信。这种方式可以在不同计算机之间进行通信,可以是在局域网内或者通过互联网。常见的网络通信方式包括使用套接字进行通信,可以实现客户端和服务器之间的通信。另外,还有像HTTP、FTP等应用层协议,用于在网络上传输数据。

扩展:虚拟地址空间(保证了进程的独立性)

  • 操作系统先进行检查虚拟地址,完成虚拟内存映射到物理内存上(翻译虚拟地址到物理地址)。

  • 防止一个访问越界,影响了其他好的内存,又因为操作系统要给进程提供一个稳定的运行环境,所以操作系统就引入“虚拟地址空间”概念,不是分配物理内存了,而是分配虚拟的内存空间,操作系统对于内存又进行了一层抽象

6. 进程的应用场景

  • 多任务处理:允许用户同时运行多个应用程序,提高计算机系统的利用率和效率。

  • 服务器管理:操作系统通过多进程模型支持服务器端应用,如Web服务器、数据库服务器等。

  • 并发编程:开发者可以利用进程来实现并行计算和分布式系统,处理大规模数据和复杂任务。

四、线程(“轻量级进程”)

  • 线程是资源调度的基本单位

1. 线程的概念

        线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。与进程不同的是,同一进程中的多个线程共享相同的内存空间和资源,但每个线程拥有独立的执行流程和程序计数器(Program Counter)。

2. 线程的特性

  1. 拥有进程的全部属性。
  2. 每个线程都可以独立的去CPU上调度执行
  3. 同一个进程的多个线程之间,共用同一份内存空间,和文件资源....所以说创建线程不需要重新申请资源了,直接复用之前已经分配给进程的资源,省去了资源分配的开销,于是创建效率就更高了
  4. 一个进程可以包含一个或者多个线程,每一个线程都可以执行一些代码,每个线程都是可以独立调度的。

与进程的差异

 

优势:

  1. 资源效率: 线程相比进程更轻量,因此更容易创建和销毁,可以更高效地利用系统资源。
  2. 响应性和并发性: 多线程使得程序可以响应多个请求或事件,提高了系统的并发处理能力。
  3. 简化数据共享: 线程共享同一进程的资源,这使得数据共享和通信相对简单。
  4. 资源节约:   线程共享同一个进程的内存空间和资源,创建和销毁线程开销较小。 速度: 线程切换开销较小,可以实现更快的并发执行。
  5. 通信简单:  线程可以直接访问共享内存,通信相对简单。

挑战:        

  1. 线程安全问题: 多个线程访问共享数据时可能引发竞态条件(Race Condition)和死锁(Deadlock),需要使用同步机制来解决。
  2. 调试和测试困难: 多线程程序的调试和测试比单线程程序更复杂,因为需要考虑不同线程之间的交互影响。
  3. 资源竞争: 如果线程过多或者线程设计不当,可能会导致系统资源竞争,降低整体性能。
  4. 安全性: 线程之间共享内存,需要额外的同步机制来保证数据一致性,容易出现竞态条件。
  5. 稳定性: 一个线程的崩溃可能导致整个进程崩溃。
  6. 复杂性: 线程之间的同步和通信需要额外的注意,易出现死锁等问题。

3. 线程同步与通信

在多线程编程中,确保线程之间的协作和数据一致性至关重要。常见的线程同步机制包括:

  • 锁(Locks): 包括互斥锁(Mutex)、读写锁(ReadWriteLock)等,用于保护共享资源,防止多个线程同时修改造成数据不一致。
  • 信号量(Semaphores): 用于控制同时访问某一资源的线程数量。
  • 条件变量(Condition Variables): 用于线程间的通信和等待/唤醒机制。

4. 线程的六大状态

  1. 未启动的线程的线程状态: NEW

    • 指的是创建了但尚未启动(调用start方法)的线程,此时线程处于NEW状态。
  2. 可运行线程的线程状态: RUNNABLE

    • 表示线程正在Java虚拟机中执行,可能在等待CPU调度执行,或者正在执行。
  3. 阻塞等待监视器锁的线程状态: BLOCKED

    • 当线程试图进入一个synchronized代码块,但该锁已经被其他线程占用时,该线程会进入BLOCKED状态,等待获取锁。
  4. 等待线程的线程状态: WAITING

    • 线程因为调用了Object.wait()、Thread.join()或LockSupport.park()而进入WAITING状态,需要其他线程的显式唤醒或者超时等待。
  5. 具有指定等待时间的等待线程的线程状态: TIMED_WAITING

    • 线程因为调用了Thread.sleep(long millis)、Object.wait(long timeout)、Thread.join(long millis)或LockSupport.parkNanos()而进入TIMED_WAITING状态,等待一段指定的时间后自动唤醒或者超时。
  6. 已终止线程的线程状态: TERMINATED

    • 线程执行完毕或者因为异常退出后,线程的状态变为TERMINATED。

5. 线程池和执行者框架

        为了更有效地管理和利用线程,现代编程语言和框架通常提供线程池(ThreadPool)和执行者框架(Executor Framework),这些工具可以管理线程的生命周期、调度执行任务,并提供了高级的线程管理功能,如线程复用和任务队列管理。

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

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

相关文章

FPGA开发——LED流水灯实现先从左往右流水,再从右往左流水

一、概述 我们在设计完一个方向的流水灯的设计时,总是会想实现让流水灯倒着流水回去的设计,这里我也是一样,实现这种设计的方法有很多种,其中就有直接使用case语句将所有可能包含进去编写,这种设计方法是最简单的&…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(四)高斯牛顿法详解

一、高斯牛顿法详解 拓展阅读:高斯牛顿法详解_gauss-newton算法步骤-CSDN博客 1、梯度下降法 ​ ​ ​ 无论一阶泰勒展开,还是二阶泰勒展开都是关于增量​的方程。 2、牛顿法 ​ 这个自变量增量都是可求的。但是二阶求解复杂。因此为了简化有了下…

windows下运行sh文件

1、打开git bash 2、进入sh文件所在文件夹,使用sh xx.sh运行

@RequiredArgsConstructor详解

RequiredArgsConstructor详解 一、什么是RequiredArgsConstructor? RequiredArgsConstructor是Lombok的一个注解,简化了我们对Autowired书写,我们在写Controller层或者Service层的时候,总是需要注入很多mapper接口或者service接口&#xf…

初识Play Framework框架和第一个Java play web项目的创建

文章目录 初识Play Framework框架和第一个Java play web项目的创建一、简介特点架构开发流程示例代码总结 二、创建第一个Java play web项目1、下载play框架,配置系统环境变量(jdk的安装就不再说了) 2、检查play的版本和创建第一个play项目3、将项目通过idea或eclip…

【NoSQL数据库】Redis知识小册

一、缓存穿透 缓存穿透是先查Redis,发现缓存中没有数据,再查数据库。然而,如果查询的数据在数据库中也不存在,那么每次查询都会绕过缓存,直接落到数据库上。 解决方案一、缓存空数据 查询Redis缓存:首先查…

Java泛型的介绍和基本使用

什么是泛型 ​ 泛型就是将类型参数化,比如定义了一个栈,你必须在定义之前声明这个栈中存放的数据的类型,是int也好是double或者其他的引用数据类型也好,定义好了之后这个栈就无法用来存放其他类型的数据。如果这时候我们想要使用这…

Codeforces 903 div3 A-F

A 题目分析 数据范围很小&#xff0c;暴力枚举即可&#xff0c;然后给字符串x的长度设置一个上限&#xff0c;我设了50&#xff0c;因为n*m<25&#xff0c;多一倍够用了 C代码 #include<iostream> using namespace std; void solve(){int n,m;string x,s;cin>>…

基于RS485的Modbus协议

RS485&#xff1a;用来传输数据&#xff0c;RS485是一种差分传输的串行通信标准&#xff0c;以其强大的抗干扰能力、长距离传输和多点通信能力&#xff0c;在工业控制领域得到广泛应用。RS485使用一对差分信号线&#xff08;A和B&#xff09;来传输数据&#xff0c;差分信号能有…

eclipse ui bug

eclipse ui bug界面缺陷&#xff0c;可能项目过多&#xff0c;特别maven项目过多&#xff0c;下载&#xff0c;自动编译&#xff0c;加载更新界面异常 所有窗口死活Restore不回去了 1&#xff09;尝试创建项目&#xff0c;还原界面&#xff0c;失败 2&#xff09;关闭所有窗口&…

Django学习(二)

get请求 练习&#xff1a; views.py def test_method(request):if request.method GET:print(request.GET)# 如果链接中没有参数a会报错print(request.GET[a])# 使用这个方法&#xff0c;当查询不到参数时&#xff0c;不会报错而是返回你设置的值print(request.GET.get(c,n…

winrar安装好后,鼠标右键没有弹出解压的选项

本来安装挺好的&#xff0c;可以正常使用&#xff0c;有天我把winrar相关的文件挪了个位置&#xff0c;就不能正常使用了。 然后我去应用里面找&#xff0c;找到应用标识了&#xff0c;但是找不到对应的文件夹&#xff08;因为我挪到另外一个文件夹里了&#xff09;。 于是我找…

语言转文字

因为工作原因需要将语音转化为文字&#xff0c;经常搜索终于找到一个免费的好用工具&#xff0c;记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

Android 软键盘挡住输入框

Android原生输入法软键盘挡住输入框,网上各种解法,但不起效。 输入框都是被挡住了,第二张图的小点,实际就是输入法的光标。 解法: packages\inputmethods\LatinIME\java\res\values-land config.xml <!-- <fraction name="config_min_keyboard_height"&g…

pikachu靶场之目录遍历、敏感信息泄露

一、目录遍历 漏洞概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量&#xff0c;从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时&#xff0c;便会将请求的这个文件的值(比如文件名称)传递到后台&#xff0c;后台再执行其对应的文件。 在这个过…

如何评价估计量的好坏

目录 三大方法 概念 无偏性 如何计算估计量的无偏性&#xff1f; 步骤 有效性 有效性在不同类型的数据分析中如何评估&#xff1f; 步骤 一致性 一致性原则在实际应用中的挑战有哪些&#xff1f; 挑战 在大样本情况下&#xff0c;如何准确测量估计量的一致性&#xf…

AcWing-差分矩阵

insert函数影响范围&#xff0c;在b差分数组这样操作影响到是a里面的&#xff0c;所以下图的矩阵表示的是a数组 b[x1][y1]c;会导致a里面仅绿色范围的a[i][j]c b[x1][y21]-c;会导致a里面仅黄色范围的a[i][j]-c b[x21][y1]-c;会导致a里面仅蓝色范围的a[i][j]-c b[x21][y21]c;会导…

SQL Server 设置端口号:详细步骤与注意事项

目录 一、了解SQL Server端口号的基础知识 1.1 默认端口号 1.2 静态端口与动态端口 二、使用SQL Server配置管理器设置端口号 2.1 打开SQL Server配置管理器 2.2 定位到SQL Server网络配置 2.3 修改TCP/IP属性 2.4 重启SQL Server服务 三、注意事项 3.1 防火墙设置 3…

数据结构与算法-归并排序

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、归并排…

MySQL笔记3——高级数据查询语句DQL

多表联查 多表联查可以通过连接运算实现&#xff0c;即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查 时用到的数据库表之间的关系。 等值查询和非等值查询 非等值查询&#xff1a;SELECT * FROM 表1&#xff0c;表2 等值查询&#xff1a;SELECT * FROM 表…