首页 > 系统相关 >深入理解操作系统中进程与线程的区别及切换机制(下)

深入理解操作系统中进程与线程的区别及切换机制(下)

时间:2023-08-29 13:58:02浏览次数:46  
标签:操作系统 队列 线程 切换 进程 上下文 CPU

前言

上一篇文章中我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。
在本篇文章中,我将探讨研究进程的状态模型、控制结构和切换机制。希望通过这篇文章的分享,能够帮助更多的人理解和掌握进程管理的知识,为他们在计算机领域的学习和工作提供帮助。

进程的控制结构

也可以说是数据结构,毕竟操作系统也是一个进程,只要是应用程序就必然符合一条定律:程序=算法+数据结构,进程作为一种抽象概念,可将其视为一个容器,该容器聚集了相关资源,包括地址空间,线程,打开的文件,保护许可等。因此对于单个进程,可以基于一种数据结构来表示它,这种数据结构称之为进程控制块(PCB),这人家的专有名词;

每个进程都有一个唯一的PCB作为其标识,当进程被销毁时,PCB也会随之消失。如下:

image

PCB之间通过链表连接,形成各种队列,如就绪队列和阻塞队列。比如:

  1. 就绪队列:把所有就绪状态的PCB链在一起;
  2. 阻塞队列:把所有因等待某事件而处于等待状态的进程链在一起

另外,在单核CPU系统中,只有一个运行指针,因为在某个时刻,只能运行一个程序。

image

进程的切换

进程的切换是为了保证每个进程都能获得公平的CPU时间片来执行自己的程序,这也叫做上下文切换,上下文切换涉及以下内容:

  1. 存储进程的相关信息,如计数器、寄存器等,以便在切换回来时能正常加载。
  2. 更新进程的状态,如从运行态切换到就绪态等。
  3. 将当前进程放入就绪队列或阻塞队列中。
  4. 根据调度算法从就绪队列中选择一个进程加载并运行。
  5. 更新内存管理的数据结构(建立虚拟内存与物理内存的关系)。
  6. 新进程将自己的堆栈信息加载到CPU的计数器和寄存器中,占用时间片。

发生进程上下文切换有哪些场景?

时间片用完,强制进行上下文切换。

内存不足,将无用的进程交换出去挂起,待资源充足后再切换回来。

进程调用sleep函数进入睡眠状态,让出CPU,需要重新进行系统调度(对于线程也适用)。

有更高优先级的程序需要运行,当前进程需要让出CPU,确保高优先级进程能使用时间片。

发生硬件中断时,CPU立即处理相关中断服务程序,如键盘输入。即使是单核CPU,也能良好处理中断程序和进程之间的时间片占用。不必担心持续敲击键盘会导致系统崩溃,尤其现在大多数是多核处理器。

线程

在早期的操作系统中,以进程作为独立运行的基本单位,直到后来计算机科学家们提出了更小的能独立运行的基本单位,即线程。

程是进程中的一条执行流程,多个线程可以共享代码段、数据段、打开的文件等资源,但每个线程都有一套独立的寄存器和栈,确保线程的控制流是相对独立的。可以将线程视为CPU调度的基本单位。可以想象一个我们的Java多线程,代码公用、全局变量公用等,但是进程会控制好线程自己的独立栈信息等;

image

线程的上下文切换

线程与进程最大的区别在于:线程是调度的基本单位,而进程则是资源拥有的基本单位。

线程的上下文切换是指在切换线程时,需要保存和恢复线程的执行上下文。与进程相比,线程上下文切换的代价要小得多。

如果一个进程只有主线程,那么线程的切换流程与进程切换相同。

如果是进程内的某个线程进行切换,代价会更小。只需要保存线程的相关寄存器和计数器等信息,因为其他资源和虚拟内存是进程内共享的,无需切换。因此,线程的上下文切换开销较进程小很多。

总结

进程和线程是操作系统中的两个重要概念。进程是程序的一次执行过程,拥有自己的地址空间和资源,是资源分配的基本单位。进程之间通过上下文切换来共享CPU,保证公平分配。进程切换涉及到保存和加载进程的相关信息、状态变更、队列操作、调度算法等。

线程是进程中的独立执行流程,可以共享进程的资源,但有独立的寄存器和栈。线程的上下文切换相比进程较小,只需要保存线程的相关寄存器和计数器等信息。

标签:操作系统,队列,线程,切换,进程,上下文,CPU
From: https://www.cnblogs.com/guoxiaoyu/p/17659696.html

相关文章

  • 深入探究Java中的多线程并发与同步
    在后端开发中,多线程编程是一项关键技术,能够充分利用多核处理器,提高系统性能和响应能力。然而,多线程编程涉及到并发与同步问题,可能引发复杂的线程安全难题。本篇博客将深入探讨Java中的多线程编程,重点关注并发问题和同步机制。并发与多线程并发是指多个任务在同一时间段内执行,而多线......
  • 多线程同步、异步
    1、首先明确一点,对于单核CPU,任意一个时刻只有一个线程在运行。那么既然这样,多线程还有什么意义呢?举例来说,现在只有一个人,要做好几个任务。单线程就是,任务一个一个地做,必须做完一个任务后,再去做另一个任务。多线程就是一会做这个任务,一会做那个任务,每个任务做一会,不停的切换。显然,......
  • 1.操作系统(基本分页存储管理的基本概念)
    1.操作系统(基本分页存储管理的基本概念)连续分配:为用户进程分配的必须是一个连续的内存空间。非连续分配:为用户进程分配的可以是一些分散的内存空间。1.思考:连续分配方式的缺点考虑支持多道程序的两种连续分配方式:1.固定分区分配:缺乏灵活性,会产生大量的内部碎片,内存......
  • oracle 12 PDB切换
    Oracle12c开始支持PLUGGABLEDATABASE,并且提供了一个方法在CDB和PDB之间切换。 1.使用showpdbs可以确认当前有哪些PDB?[sql] viewplaincopy  SQL> show pdbs        CON_ID CON_NAME           OPEN MODE  RESTRICTED  --......
  • webpack生产环境优化:多线程打包
    转载请注明来源:http://www.eword.name/Author:ewordEmail:[email protected]生产环境优化:多线程打包多线程打包主要用于需要打包的文件较多的情况下提高打包效率,缩短打包时间。注意:开启多进程打包时,进程开启大概需要600ms,进程通信也有开销。建议:只有工作消耗时间......
  • webpack生产环境优化:多线程打包
    转载请注明来源:http://www.eword.name/Author:ewordEmail:[email protected]生产环境优化:多线程打包多线程打包主要用于需要打包的文件较多的情况下提高打包效率,缩短打包时间。注意:开启多进程打包时,进程开启大概需要600ms,进程通信也有开销。建议:只有工作消耗时间......
  • 多线程|死锁
    publicclassThreadDemo19{privatestaticObjecto1=newObject();privatestaticObjecto2=newObject();publicstaticvoidmain(String[]args){Threadt1=newThread(){publicvoidrun(){synchronized(o1)......
  • 线程池
    python3多线程有threading,很好的支持了多线程,那么问题来了,为什么还需要线程池呢,其实很好回答,如果你要爬取网站有八百页,每页设置一个线程,难道能开启八百个么,光切换的时间也很高了吧。这时候就需要用到线程池,可以设置一个20的线程池,同时只有20个线程在运行,剩下的排队。线程池模块......
  • 集合遍历使用多线程并行执行
    在业务中常常有这样的需求,需要遍历集合,分别处理,相互之前单独处理,互不影响。为了充分利用服务器资源,可以使用多线程来执行。parallelStream创建一个并行流,使用ConcurrentHashMap使多线程情况下线程安全CompletableFuture.allOf是所有线程全部执行完获得结果CompletableFuture.......
  • 键盘敲入 A 字母时,操作系统期间发生了什么?
    键盘敲入A字母时,操作系统期间发生了什么?关于8.1键盘敲入A字母时,操作系统期间发生了什么?的总结,前面都介绍了,但是在最后总结操作系统发生了什么的时候,我觉得有点不详细,于是写一写自己的补充和理解,不一定正确。键盘敲击之后,键盘控制器根据敲击的键生成扫描码,写入寄存器。同......