重学操作系统原理系列 - 进程管理(一)

简介: 重学操作系统原理系列 - 进程管理(一)

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

1 线程的引入

引入理由:

  • 应用需要
  • 开销考虑
  • 性能考虑

1.1 应用需要

一个web服务器工作方式:

  • 从客户端接收网页请求
  • 从磁盘上检索相关的网页,读入内存(此时进程是停止的,直到读取完毕)
  • 将网页返回给对应客户端

可以看到每次从磁盘读取的时候进程都是暂停的,导致性能低下。咋提高服务器工作效率?通常使用网页缓存。在没有线程情况下的两种解决方案:

  • 一个服务进程undefined,也是一种顺序编程,虽采用缓存机制,但性能同样不高。而若设置多个进程,这多进程间又相互独立,有独立的地址空间,所以不能共享信息
  • 有限状态机undefined,这种方式编程模型复杂,采用非阻塞I/O
多线程的解决方式

这是一个多线程的web服务器的工作方式,首先读取客户端的请求,之后由分派线程将各个任务分派给工作线程,这里还是采用了网页缓存。

一个web服务器的实现有三种(构造服务器的方法):

模型 特性
多线程 有并发、阻塞系统调用
单线程进程 无并发、阻塞系统调用
有限状态机 有并发、非阻塞系统调用、中断

6.1.2 开销的考虑

进程相关的操作:

  • 创建进程
  • 撤销进程
  • 进程通信
  • 进程切换

时间/空间开销大,限制了并发度的提高。

线程的开销小:

  • 创建一个新线程花费时间少(撤销亦如此)
  • 两个线程切换花费时间少
  • 线程之间相互通信无须调用内核(同一进程内的线程共享内存和文件)

6.1.3 性能的考虑

如果有多个处理器的话,一个进程就会有多个线程同时在执行了,这样可以极大的提高运行性能

2 线程的基本概念

在同一进程增加了多个执行序列(线程)。

线程:进程中的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程

进程的两个基本属性:

  • 资源的拥有者:进程还是资源的拥有者
  • CPU调度单位:线程继承了这一属性

线程的属性

  • 有标识符ID
  • 有状态及状态转换-->需要提供一些操作
  • 不运行时需要保存的上下文(程序计数器等寄存器)
  • 有自己的栈和栈指针
  • 共享所在进程的地址空间和其他资源
  • 创建、撤销另一个线程(程序开始是以一个单线程方式运行的)

3 线程机制的实现

参考:https://www.monografias.com/trabajos107/gestion-procesos-sistemas-operativos/gestion-procesos-sistemas-operativos2

三种实现机制:

  • 用户级线程
  • 核心级线程
  • 混合(两者结合)方法

用户级线程

在用户空间建立线程库:提供一组管理线程的过程。

运行时系统:完成线程的管理工作(操作、线程表)。

内核管理的还是进程,不知道线程的存在。

线程切换不需要内核态特权。

例子:UNIX。

线程是由运行时系统管理的,在内核中只有进程表。典型例子是UNIXundefined POSIX线程库--PTHREAD

POSlX(Portable Operating System Interface)多线程编程接口,以线程库方式提供给用户

Thread call Description
Pthread_create Create a new thread
Pthread_exit Terminate the calling thread
Pthread_join Wait for a specific thread to exit
Pthread_yield Release the CPU to let another thread run
Pthread_attr_init Create and initialize a thread's attribute structure
Pthread_attr_destroy Remove a thread's attribute structure

优点

  • 线程切换快
  • 调度算法是应用程序特定的
  • 用户级线程可运行在任何操作系统上(只需要实现线程库)

缺点

  • 内核只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上
  • 大多数系统调用是阻塞的,因此,由于内核阻塞进程,故进程中所有线程也被阻塞。(可以在调用之前判断进行解决,如果是阻塞线程,那么就换其他线程)

核心级线程

内核管理所有线程管理,并向应用程序提供API接口。

内核维护进程和线程的上下文。

线程的切换需要内核支持。

以线程为基础进行调度

例子:Windows

混合模型

  • 线程创建在用户空间完成
  • 线程调度等在核心态完成
  • 例子如Solaris操作系统

4 线程状态(Java)

新建

创建后尚未启动的线程。

运行

包括 OS 中 Running 和 Ready 状态,该态的线程可能正在运行,也可能正在等待 CPU 为其分配执行时间

无限期等待

该态线程不会被分配 CPU 执行时间,要等待其他线程显式唤醒。如下方法会让线程进入无限期等待:

  • 未设置 timeout 的 object.wait()
  • 未设置 timeout 参数的 Thread.join()
  • LockSupport.park()

有限期的等待

该态的线程也不会被分配 CPU 执行时间,不过无需等待被其他线程显式唤醒,而是在一定时间后,由 OS 自动唤醒

  • 设置了 timeout 的 object.wait() 方法
  • 设置了 timeout 参数的 Thread.join()
  • LockSupport.parkNanos()
  • LockSupport.parkUnit()

阻塞 V.S 等待

  • 阻塞态在等待获取一个排它锁,该事件将在另外一个线程放弃这个锁时发生
  • 等待状态在等待一段时间或唤醒动作

结束

已终止线程的线程状态,线程已结束执行。

5 进程的通信类型

  • 共享存储器、管道、客户机-服务器系统(socket)
  • 直接通信、间接通信(信箱)

IPC,进程间通信(inter-process communication),允许进程之间互传数据和指令。多个进程同时运行时,可用IPC使它们协作完成任务,提高系统资源利用率和效率。

常见IPC机制包括管道、消息队列、共享内存和套接字等。

管道

允许一个进程将输出发送到管道,然后另一个进程可以从该管道读取输入。

Linux管道可用 "|" 符号表示,如:command1 | command2。即 command1 的输出自动成为 command2 的输入。

管道只是一种通信机制,使进程能以更高效简单的方式协作。由于管道功能强大且能与其他命令联合使用,是编写复杂 shell 脚本的基础。

管程(Monitors)

也称监视器,一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变量。

管程实现了在一个时间点,最多仅一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度简化程序设计。

管程提供了一种机制,线程可临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访问。

目录
相关文章
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
496 32
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
缓存 运维 前端开发
阿里云操作系统控制台:高效解决性能瓶颈与抖动之进程热点追踪
遇到“进程性能瓶颈导致业务异常”等多项业务痛点时,提供高效解决方案,并展示案例。
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2902 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
454 6
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
222 4
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
200 2

推荐镜像

更多