电信备案网站,wordpress只显示部分文章,网址大全软件下载安装,分类wordpress目录
一、什么是进程(Process)#xff1f;
进程的管理
进程调度(重点)
二、什么是线程(Thread)#xff1f;
三、进程和线程的区别与联系
进程(Process)
线程(Thread)
总结比较 一、什么是进程(Process)#xff1f;
进程和线程是操作系统中一个非常核心的话题#…目录
一、什么是进程(Process)
进程的管理
进程调度(重点)
二、什么是线程(Thread)
三、进程和线程的区别与联系
进程(Process)
线程(Thread)
总结比较 一、什么是进程(Process)
进程和线程是操作系统中一个非常核心的话题也是程序员面试的高频考点。在计算机科学中进程和线程是操作系统管理和调度任务的基本单位对于理解计算机程序的执行、资源管理以及多任务处理都非常重要。
一个应用程序运行起来在操作系统中就会出现一个对应的进程。进程就是一个跑起来的应用程序。 打开任务管理器这里就会把当前运行的所有进程都列出来除了自己运行的应用程序还会有很多系统自带/安装某些应用给你添加的进程
而对于一个操作系统它管理的系统资源是有限的。操作系统需要管理计算机的各种资源包括CPU、内存、硬盘空间、网络连接等等。这些资源都是有限的而操作系统需要合理地分配和管理这些资源以确保不同程序和用户能够有效地共享和利用这些资源。因此进程是操作系统进行 资源分配/管理 的基本单位。
进程的管理 在操作系统中对于进程管理通常的做法是先描述再组织。 描述通常使用PCB(进程控制块)这样的结构体/数据结构来描述进程。结构体中会包含一些进程的核心信息。 组织通常使用链表这样的结构(简化的说法)来把多个PCB串起来。 PCB 包含了很多关于进程的重要信息此处只讨论几个比较关心的
1. PID 进程标识信息即进程的ID同一个机器同一时刻进程ID一定是不同的。 2. 内存指针/内存管理信息用于指向记录这个进程的指令和数据。
3. 文件描述符表记录进程打开的文件和文件描述符。 接下来的几个属性更重要更抽象是用来支持进程调度的。 在此之前先了解一下并行和并发。
在系统中包含了很多的进程而进程的数量是远远多于CPU的数量的这就需要进程调度来负责了。一个核心同一时刻只能运行一个进程16个核心同一时刻就能同时运行16个进程。这就是并行执行。
但是一个核心不同时刻可以执行不同的进程这一刻执行进程1、下一刻执行进程2......为了能够同时处理这么多进程CPU就会把总的执行时间切换成若干个小的片段每个片段执行一个进程每个片段称为时间片。由于时间片比较短CPU切换进程的速度非常快人感知不到站在人的角度看这是若干个进程在同时执行(其实不是同时)这个就是并发执行。
并行Parallelism
并行是指系统同时执行多个任务或操作实现多个操作同时进行可以显著提高系统的运行效率。在并行计算中多个处理单元可以同时执行不同的指令或操作以加快整体计算速度。并行通常指在多个处理器上同时执行多个任务或操作以提高整体性能。
并发Concurrency
并发是指系统能够同时处理多个任务或操作但并不一定是同时执行这些任务可能是通过时间片轮转的方式来实现看似同时处理的效果。在并发编程中多个任务可以交替执行通过合理的调度和资源管理来提高系统的吞吐量和效率。并发通常指系统能够处理多个任务的能力可以是在单个处理器上通过多线程实现也可以是在多个处理器上进行。
并行本质上就是同时执行。而并发并不是本质上的同时执行。但由于操作系统内核内部管理好了编写应用程序的时候无法干预普通用户也感知不到。
因此往往把并行和并发统称为并发把编写解决并发问题的程序称为并发编程。
进程调度(重点)
注意这里的属性也属于PCB管理进程的信息。进程调度可以帮助处理并发编程中的一些问题。
1. 进程状态就绪态、运行态、阻塞态。
我们可以通过一个生活中常见的例子来解释进程状态比如做菜的过程可以用来说明进程状态。 就绪态假设你打算做一顿晚餐首先收集了所有需要的食材和调料并且准备好了所有的厨具。此时你已经准备好开始做菜处于就绪态等待开始动手。 运行态当你开始处理食材、烹饪菜肴时你处于运行态正在实际执行做菜的过程不断地进行下一步操作直到菜肴做好为止。 阻塞态在烹饪的过程中有可能会出现一些情况使得你需要停下手头的工作比如等待水开、等待肉类腌制等。这时候你处于阻塞态暂时停止了当前的操作等待某个条件满足后才能继续往下进行。 就绪态到运行态当等待的条件满足后比如水开了或者肉腌制好了你又可以继续进行烹饪从就绪态转变为运行态。 运行态到阻塞态在烹饪的过程中可能会遇到需要等待的情况比如等待煮面、等待炒菜等这时候你会从运行态切换到阻塞态。
2. 优先级
假设有一个妹子(漂亮有才华)有很多人追她。但是她找对象的标准几乎所有人都不能同时满足于是她决定以每个标准找一个男朋友然后她就找了三个小哥哥谈恋爱。
A. 有钱的小哥 B. 长的很帅的小哥 C. 非常会舔的小哥
那在约会的时候妹子给男朋友们安排的时间不一定是公平的
有的小哥妹子会花更多的时间那得到更多时间的小哥对应的等待时间也就更少。即进程的优先级决定了其在就绪队列中被调度的顺序优先级高的进程会更早地得到处理器时间片从而更快地执行。 周一周二周三和A约有钱投入时间多回报更多 周四周五和B约长得帅提供情绪价值 周六和C约提供的情绪价值不如B 3. 上下文确保进程能够正确地切换和执行
妹子在和三个小哥哥聊天时要记录好每次约会的时间和约定好的事情即每次聊天都产生了哪些信息接下来要干嘛都要记录好并且下次约会时能够准确将信息对应到正确的小哥。不然就穿帮了完蛋了~~
进程在CPU执行过程中也会产生很多的中间结果在进程切换出cpu之前就需要把这些中间结果cpu的各种寄存器中的值保存到pcb的上下文里程序计数器PC、寄存器内容、堆栈指针等等下次这个进程再次执行的时候就需要将之前记录的状态恢复回来。
4. 记账信息
延续刚才的优先级有的小哥分配时间多(资源倾斜)有的小哥(C)分配的时间少。
此时就需要通过表格来统计每个小哥分配了多少时间。此时就能发现C最近分配的时间有点少于是接下来就得给C多分配点。
为了不失去C让C还能继续积极的来舔妹子妹子就需要给C适当加点甜头~~
同样的操作系统也是要避免某个进程一直吃不到CPU资源导致进程关闭就会进行类似的统计给资源分配少的进程适当的多分配一些。
相信通过这些形象的例子对进程调度会有更清楚的认识 二、什么是线程(Thread)
线程Thread是操作系统能够进行运算调度的最小单位它被包含在进程Process之中是进程的实际执行单元。一个进程可以包含多个线程称为主线程主线程是程序的入口点。这些线程共享相同的内存空间和系统资源但拥有独立的执行流程。
当前市面的CPU都是多核心CPU。需要通过一些特定的编程技巧并发编程把要完成的任务拆解成多个部分并且分别让他们在不同的CPU上运行否则多核心CPU多出来的就浪费了。
通过多进程编程的模式其实就可以起到”并发编程“的效果因为进程可以被调度到不同的CPU上运行此时就可以把多个CPU核心都利用起来。
但是多进程编程虽然可以解决上述问题但也有一些新的麻烦
假设我们正在开发一个Web服务器应用程序该程序需要同时处理多个客户端请求。为了实现并发处理我们可以使用进程和线程两种方式。使用进程的方式我们将每个客户端请求看作一个独立的进程每个进程都有自己的内存空间和系统资源。当收到一个新的客户端请求时系统会为该请求创建一个新的进程并在该进程中执行处理逻辑。这种方式的优点是进程之间相互独立一个进程的崩溃不会影响其他进程。但是这种方式的缺点是创建和销毁进程的开销比较大进程之间的通信和同步也比较复杂。
而引入线程就是为了解决多进程创建和销毁开销太大的问题。
前面说到一个进程可以包含多个线程线程其实就是进程的一部分。同一个线程共享相同的内存空间和系统资源。
因此线程解决多进程创建和销毁开销太大的核心就在于只有创建第一个线程的时候(也就是创建进程的时候)才去进行资源申请操作。后续在创建线程都没有申请资源的过程了。
再回头看上面服务器的例子
使用线程的方式我们将每个客户端请求看作一个线程在一个主线程中不断轮询客户端请求当收到新的请求时将该请求放入等待队列中并创建一个新的线程来处理该请求。处理完成后该线程结束等待队列中的下一个请求继续被处理。这种方式的优点是线程的创建和销毁开销较小线程之间的通信和同步也比较简单。
虽然多线程编程解决了多进程创建和销毁开销太大的问题但它存在一个缺点一个线程的崩溃可能会导致整个进程的崩溃。进程和线程这两个概念比较抽象下面用生活中的场景来描述一下。
进程就像是一列火车每个车厢都是一个独立的运行环境车厢之间互不干扰一个车厢的故障不会影响其他车厢。而线程就像是一列火车上的乘客每个乘客都可以在火车上自由行动但他们的行动是相互影响的一个乘客的行为可能会影响其他乘客。比如一列火车从北京开往上海这列火车可以看作是一个进程每个车厢都可以看作是一个线程每个车厢都有自己的座位、空调、电视等设施互不干扰。如果有一个车厢的空调坏了其他车厢的乘客不会受到影响。而如果有一个乘客在车厢里吸烟会影响到其他乘客的乘车体验。再比如一家餐厅里有多个服务员在同时服务不同的客人每个服务员可以看作是一个线程他们都在同一个餐厅里工作可以相互协作提高服务效率。如果有一个服务员突然生病了其他服务员可以顶替他的工作保证服务质量。而如果餐厅里的客人太多需要再招一个服务员来服务这就相当于增加了进程会增加餐厅的成本和管理难度。
多线程编程的难点
一个线程出问题会影响到别的线程。一个进程出问题一般不会影响到其他进程。 三、进程和线程的区别与联系 进程(Process)
定义进程是程序执行时的一个实例是操作系统分配资源的基本单位。特点 拥有独立的内存空间进程之间互相隔离。进程之间通信需要额外的机制如管道、信号等。进程拥有独立的地址空间和控制流程。优点 进程之间互相独立一个进程崩溃不会影响其他进程。进程可以充分利用多核处理器的并行性能。缺点 进程切换开销大资源消耗较高。
线程(Thread)
定义线程是进程内的一个独立执行流程是操作系统调度的最小单位。特点 共享进程的资源如内存空间、文件描述符等。线程之间通信相对容易可以直接访问共享数据。线程切换开销小适合处理多个任务。优点 线程之间共享资源通信方便效率高。线程可以提高程序的并发性和响应速度。缺点 多线程编程需要考虑同步和竞态条件等问题容易引发错误。
总结比较
进程是程序的执行实例拥有独立的内存空间进程之间通信复杂切换开销大而线程是进程内的执行单元共享进程资源通信简单切换开销小。进程之间互相独立一个进程崩溃不会影响其他进程而线程之间共享资源一个线程的错误可能导致整个进程崩溃。进程适合处理独立的任务线程适合处理并发任务和提高程序性能。在实际应用中通常会同时使用进程和线程来充分发挥系统资源和提高程序效率。