无论做什么,请记住都是为你自己而做,这样就毫无怨言!今天,我为自己而活!今天,又是美丽的一天!早安,朋友!
目录
前言
一、操作系统
1. 概念
2. 操作系统的基本功能
3.操作系统内核
4. 操作系统的类型
二、并发和并行
并发:是指系统能够同时处理多个任务。多线程
并行:是指系统同时执行多个操作,多进程
三、进程
1. 概念
2. 进程的特性
3. 进程的属性
4. 进程的组织
5. 进程间的通信
扩展:虚拟地址空间(保证了进程的独立性)
6. 进程的应用场景
四、线程(“轻量级进程”)
1. 线程的概念
2. 线程的特性
与进程的差异
优势:
挑战:
3. 线程同步与通信
4. 线程的六大状态
5. 线程池和执行者框架
前言
操作系统:计算机背后的智慧大脑,本质是一个软件
在当今数十亿台设备上运行的软件背后,存在一个关键的、却常被忽视的技术支柱 —— 操作系统。操作系统是计算机系统中的核心软件,它负责管理和协调计算机硬件资源,并为用户和应用程序提供服务和接口。无论是个人电脑、智能手机,还是大型服务器,都依赖于操作系统的顺畅运行。
进程:计算机运行的基本单位
在计算机科学中,进程(Process)是操作系统中的一个核心概念,它代表了正在运行的程序的实例。理解进程是理解操作系统和多任务处理的关键,本文将介绍进程的定义、特性、管理以及在现代计算中的重要性。
线程:并发编程的核心概念
在计算机科学和软件开发中,线程(Thread)是一种重要的并发编程概念,它允许程序同时执行多个任务,提高系统资源的利用率和响应速度。本文将介绍线程的定义、特性、应用以及在现代软件开发中的重要性。
一、操作系统
1. 概念
操作系统:是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。
操作系统功能介绍:
- 系统资源的管理者
- 文件管理
- 存储器管理
- 处理机管理
- 设备管理
- 最接近硬件的一层软件
- 向下管理所有的硬件设备
操作系统毕竟是个软件,不可能认识所有的硬件设备,但是操作系统知道硬件设备由哪几个大类,知道每个大类大致有哪些功能,然后硬件厂商就可以开发一个驱动程序(软件)专属这个硬件设备,然后操作系统就可以对这个驱动程序来完成对硬件设备的操控,比如鼠标为什么插上就可以使用。
- 对上要给软件提供稳定的运行环境并且提供方便易用的服务
操作系统提供稳定的运行环境意味着它应能有效管理硬件资源,防止因硬件故障或资源竞争而导致软件崩溃或运行异常。操作系统负责管理和分配CPU、内存、硬盘等硬件资源,以确保各个软件程序可以平稳地运行,并且能够有效利用资源,提高系统的整体性能和效率。
2. 操作系统的基本功能
-
资源管理:
- 处理器管理:操作系统负责调度进程和线程,以便在多任务环境中有效地利用CPU资源。
- 内存管理:管理系统内存的分配和释放,保证每个程序都能获取到所需的内存空间。
- 文件系统管理:管理文件的存储、检索和组织,确保数据的安全性和可靠性。
- 设备管理:管理和控制输入输出设备,如磁盘驱动器、打印机、网络接口等,使得它们能够有效地与计算机通信和交互。
-
用户接口:
- 提供用户与计算机系统交互的界面,如命令行界面(CLI)和图形用户界面(GUI)等。
- 一条命令一个响应
- 多条命令
-
错误检测与处理:
- 监控系统运行过程中的错误和异常,采取适当的措施进行处理,以确保系统的稳定性和可靠性。
3.操作系统内核
操作系统“内核”是操作系统里面最核心的功能模块
内核分为内核态和工作态,一个程序在运行过程中,可能在用户态工作也可能在内核态工作
-
管理系统资源
-
管理计算机中的硬件资源,如内存、硬盘、处理器,以确保资源合理有效的分配和使用
-
-
进程管理
-
管理系统中的进程,如进程的创建、调度和终止等操作。以确保多个进程在系统中协调运行
-
-
内存管理
-
管理系统的内存资源,包括内存的分配、回收、页面置换等操作,以提供给进程足够的内存空间
-
-
文件系统
-
管理文件系统,包括文件的创建、读写和删除等操作,以提供对文件的管理和访问
-
-
设备驱动程序
-
管理硬件设备的驱动程序,以便于应用程序可以通过内核与硬件设备进行通信和操作
-
-
总结
-
内核是操作系统的核心,硬件的驱动程序都在操作系统内核中工作,负责管理计算机的硬件资源和提供基本的系统服务,为用提供运行环境和操作硬件的接口。
-
最后:操作系统 = 操作系统内核 + 配套的应用程序
配套的应用程序:
-
在操作系统上运行的软件程序,用于完成各种任务和提供各种功能。
4. 操作系统的类型
根据应用场景和设备类型的不同,操作系统可以分为多种类型,包括但不限于:
- 桌面操作系统:如Windows、macOS、Linux等,主要用于个人电脑和工作站。
- 服务器操作系统:如Linux服务器版、Windows Server等,专门用于管理和运行服务器资源。
- 嵌入式操作系统:如Android、iOS等,用于嵌入式系统和移动设备。
- 实时操作系统:如RTOS(Real-Time Operating System),专门用于对时间敏感的应用,如航空航天控制系统和工业自动化。
二、并发和并行
并发:同一时间应对多件事情的能力 (感觉上的同时执行)
并行:同一时间动手做多件事情的能力 (真正的同时执行)
并发:是指系统能够同时处理多个任务。多线程
- 并发并不意味着同时进行所有任务,系统通过在任务之间快速切换(时间片轮转或者其他调度方式),使得在单个时间段内似乎是同时进行了多个任务。
- 并发通常是通过时间分片的方式:切换不同任务的执行,每个任务都有自己的执行时间片。注意:这里的时间片非常小(计算机执行的非常快),切换的非常快,因此给人的感觉就是多个任务同时进行。
比如:视频就是图片一帧一帧的进行,因为切换的速度非常快,所以 就给人一种错觉,感觉不到图片是一点点切换的。
并行:是指系统同时执行多个操作,多进程
并行:多个任务在同一时刻开始和执行,通常每个任务都分配给不同的处理单元(如多核处理器或者多台机器)。实现并行的关键在于同时具有多个执行单元,能够并行地执行多个任务。
三、进程
1. 概念
进程是指计算机中正在运行的一个程序的实例。每个进程都有自己的内存空间、代码和数据,它们之间相互独立,通过操作系统的调度和管理来分配处理器资源。在多任务操作系统中,可以同时运行多个进程,每个进程都有自己的执行流程和执行状态。
一般来说系统一开机就会有成百的进程被创建,有些进程是系统自动创建的,有些是手动创建的,每个进程想要运行都需要一定的系统资源(硬件设备),每个进程都是资源分配的基本单位。
与程序是不同的概念,有些人总将进程和程序混淆:
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。
当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。一个程序可以开启多个进程。
2. 进程的特性
-
独立性:每个进程是独立运行的实体,它们之间不会直接影响或干扰彼此的执行。
-
资源分配:操作系统负责为每个进程分配所需的资源,包括内存空间、CPU时间片、文件和设备等。
-
并发执行:多个进程可以并发执行,通过操作系统的调度算法决定哪些进程在哪个时刻执行。
-
通信机制:进程之间可以通过共享内存、消息传递等机制进行通信,实现数据交换和协作。
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. 进程间的通信
-
因为虚拟地址空间的存在进程之间是相互独立的,所以要有进程之间的通信。
-
通过文件
进程通过读写文件来进行数据交换,这种方式简单直接,适用于需要长期存储数据或者在不同时间点进行数据交换的情况。例如,一个进程可以将数据写入文件,另一个进程再从文件中读取这些数据。 -
通过网络(socket)
网络连接进行进程间通信。这种方式可以在不同计算机之间进行通信,可以是在局域网内或者通过互联网。常见的网络通信方式包括使用套接字进行通信,可以实现客户端和服务器之间的通信。另外,还有像HTTP、FTP等应用层协议,用于在网络上传输数据。
扩展:虚拟地址空间(保证了进程的独立性)
-
操作系统先进行检查虚拟地址,完成虚拟内存映射到物理内存上(翻译虚拟地址到物理地址)。
-
防止一个访问越界,影响了其他好的内存,又因为操作系统要给进程提供一个稳定的运行环境,所以操作系统就引入“虚拟地址空间”概念,不是分配物理内存了,而是分配虚拟的内存空间,操作系统对于内存又进行了一层抽象
6. 进程的应用场景
-
多任务处理:允许用户同时运行多个应用程序,提高计算机系统的利用率和效率。
-
服务器管理:操作系统通过多进程模型支持服务器端应用,如Web服务器、数据库服务器等。
-
并发编程:开发者可以利用进程来实现并行计算和分布式系统,处理大规模数据和复杂任务。
四、线程(“轻量级进程”)
-
线程是资源调度的基本单位
1. 线程的概念
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。与进程不同的是,同一进程中的多个线程共享相同的内存空间和资源,但每个线程拥有独立的执行流程和程序计数器(Program Counter)。
2. 线程的特性
- 拥有进程的全部属性。
- 每个线程都可以独立的去CPU上调度执行
- 同一个进程的多个线程之间,共用同一份内存空间,和文件资源....所以说创建线程不需要重新申请资源了,直接复用之前已经分配给进程的资源,省去了资源分配的开销,于是创建效率就更高了
- 一个进程可以包含一个或者多个线程,每一个线程都可以执行一些代码,每个线程都是可以独立调度的。
与进程的差异
优势:
- 资源效率: 线程相比进程更轻量,因此更容易创建和销毁,可以更高效地利用系统资源。
- 响应性和并发性: 多线程使得程序可以响应多个请求或事件,提高了系统的并发处理能力。
- 简化数据共享: 线程共享同一进程的资源,这使得数据共享和通信相对简单。
- 资源节约: 线程共享同一个进程的内存空间和资源,创建和销毁线程开销较小。 速度: 线程切换开销较小,可以实现更快的并发执行。
- 通信简单: 线程可以直接访问共享内存,通信相对简单。
挑战:
- 线程安全问题: 多个线程访问共享数据时可能引发竞态条件(Race Condition)和死锁(Deadlock),需要使用同步机制来解决。
- 调试和测试困难: 多线程程序的调试和测试比单线程程序更复杂,因为需要考虑不同线程之间的交互影响。
- 资源竞争: 如果线程过多或者线程设计不当,可能会导致系统资源竞争,降低整体性能。
- 安全性: 线程之间共享内存,需要额外的同步机制来保证数据一致性,容易出现竞态条件。
- 稳定性: 一个线程的崩溃可能导致整个进程崩溃。
- 复杂性: 线程之间的同步和通信需要额外的注意,易出现死锁等问题。
3. 线程同步与通信
在多线程编程中,确保线程之间的协作和数据一致性至关重要。常见的线程同步机制包括:
- 锁(Locks): 包括互斥锁(Mutex)、读写锁(ReadWriteLock)等,用于保护共享资源,防止多个线程同时修改造成数据不一致。
- 信号量(Semaphores): 用于控制同时访问某一资源的线程数量。
- 条件变量(Condition Variables): 用于线程间的通信和等待/唤醒机制。
4. 线程的六大状态
-
未启动的线程的线程状态: NEW
- 指的是创建了但尚未启动(调用start方法)的线程,此时线程处于NEW状态。
-
可运行线程的线程状态: RUNNABLE
- 表示线程正在Java虚拟机中执行,可能在等待CPU调度执行,或者正在执行。
-
阻塞等待监视器锁的线程状态: BLOCKED
- 当线程试图进入一个synchronized代码块,但该锁已经被其他线程占用时,该线程会进入BLOCKED状态,等待获取锁。
-
等待线程的线程状态: WAITING
- 线程因为调用了Object.wait()、Thread.join()或LockSupport.park()而进入WAITING状态,需要其他线程的显式唤醒或者超时等待。
-
具有指定等待时间的等待线程的线程状态: TIMED_WAITING
- 线程因为调用了Thread.sleep(long millis)、Object.wait(long timeout)、Thread.join(long millis)或LockSupport.parkNanos()而进入TIMED_WAITING状态,等待一段指定的时间后自动唤醒或者超时。
-
已终止线程的线程状态: TERMINATED
- 线程执行完毕或者因为异常退出后,线程的状态变为TERMINATED。
5. 线程池和执行者框架
为了更有效地管理和利用线程,现代编程语言和框架通常提供线程池(ThreadPool)和执行者框架(Executor Framework),这些工具可以管理线程的生命周期、调度执行任务,并提供了高级的线程管理功能,如线程复用和任务队列管理。