首页 > 系统相关 >对进程以及创建进程的理解

对进程以及创建进程的理解

时间:2024-01-16 17:01:51浏览次数:33  
标签:__ name 创建 print 任务 理解 进程 等待

【一】进程和程序

【1】什么是进程?

  • 进程就是正在运行的程序

【2】谁来执行进程?

  • cpu

【3】进程和程序的区别?

  • 程序是存储再硬盘里面的一堆代码和数据
  • 进程是正在运行的程序

【二】进程调度问题

  • 有一个算法叫做任务调度算法
  • 就像是一个非常聪明的调度员,在计算机系统中负责安排和管理各种任务(比如程序或进程)的执行顺序。想象一下,你在一个忙碌的餐厅里,服务员需要决定先给哪个顾客上菜,这个过程就像是任务调度。
  • 在计算机中,有很多任务都想要使用CPU(就像顾客想要吃饭一样),但CPU的能力有限,不能同时处理所有任务。因此,任务调度算法的作用就是决定哪个任务先执行,哪个后执行。这样的安排既要公平,又要高效,确保每个任务都能得到合理的处理时间,同时让整个系统运行得更流畅。
  1. 先来先服务(FCFS, First-Come, First-Served):这个算法很简单,谁先来,就先服务谁。就像排队买票,先来的人先买。
  2. 短作业优先(SJF, Shortest Job First):这个算法会优先处理那些需要时间最短的任务。想象一下,如果你是厨师,你可能会先做那些更快做好的菜。
  3. 时间片轮转(RR, Round Robin):这个算法把时间分成若干小块,每个任务轮流使用一小块时间。就像玩游戏时,每个人轮流玩一会儿。
  4. 优先级调度:在这个算法中,每个任务都有一个优先级,优先级高的任务先执行。这就像是某些VIP顾客可以优先点餐。

【三】串行,并发,并行img

【1】介绍

  • 串行 (Serial):想象一下,你是一位厨师,在厨房里一次只能做一道菜。你得先做完第一道菜,然后再开始做第二道,接着是第三道,依此类推。每道菜都需要等前一道做完才能开始。这就是串行,任务一个接一个地执行,前一个完成后才开始下一个。
  • 并发 (Concurrency):现在假设你仍然是那位厨师,但这次你在做一道菜的同时,可以监控正在炖的汤,并且偶尔还可以和顾客聊天。虽然你仍然一次只能专注于一件事,但你可以在不同任务之间迅速切换,给人一种同时处理多件事的感觉。这就是并发,多个任务交替进行,但在任意时刻实际上只有一个任务在执行。
  • 并行 (Parallelism):最后,想象你现在有一个团队,团队里有几位厨师。这次,当你在准备一道菜时,你的同事可以同时炖汤,另一个同事则可以和顾客聊天。这样,几件事情真正地在同一时间同时进行。这就是并行,多个任务在同一时刻同时发生,通常需要多个处理单元(比如多个厨师)。

【2】总结

  • 串行:一个接一个,按顺序执行。
  • 并发:一次只能做一件事,但可以迅速在多个任务之间切换。
  • 并行:多件事情同时进行。

【四】同步/异步/阻塞/非阻塞(重要)

【1】介绍

  • 同步 (Synchronous):想象你去咖啡店点了一杯咖啡。在咖啡没做好之前,你就站在那里等,什么其他事都不做,直到咖啡做好,你拿到咖啡后再去做其他事情。这就是同步,你的行为(等待咖啡)和咖啡制作过程是一致对应的。
  • 异步 (Asynchronous):这次同样是在咖啡店点咖啡,但是在咖啡制作的同时,你不用站在那里等。你可以去做一些其他的事情,比如看书或者刷手机。当咖啡做好了,店员会叫你来拿。这就是异步,你的行为(做其他事情)和咖啡制作过程是分开的,不用一直等待咖啡制作完成。
  • 阻塞 (Blocking):再想象一下,你在餐馆点了一道菜,然后就坐在桌子旁边等,直到菜做好。在这期间,你不做任何事情,只是等待。这就是阻塞,你的等待阻止了你做其他事情。
  • 非阻塞 (Non-blocking):这次在餐馆点餐后,你不是一直坐在那等,而是去玩手机、看书或跟朋友聊天。尽管你还在等你的菜,但你没有被这个等待过程所阻塞,你可以同时做其他事情。这就是非阻塞,等待某个操作的完成时,你可以同时进行其他操作。

【2】总结

  • 同步:在一个操作完成之前,一直等待。
  • 异步:提交操作后可以做其他事情,操作完成后会通知你。
  • 阻塞:等待(比如输入输出操作)时什么也做不了。
  • 非阻塞:等待时还可以做其他事情。

【五】进程的创建和状态

【1】引入

  • 进程是计算机中的一个基本概念,它代表了计算机中正在运行的程序。每个进程都有自己的内存空间、数据和执行的代码。我们可以把进程想象成一个工厂里的工作线:它有自己的任务(程序代码),需要的材料(数据),以及工作的空间(内存)。

【2】进程的创建

  • 加载: 计算机把程序的代码和所需数据加载到内存中。
  • 初始化: 设置进程的初始状态,比如分配一个唯一的标识符(PID)、确定进程优先级、创建进程控制块(PCB)等。
  • 执行: 开始执行程序的代码。
  • 等待: 在某些情况下,比如等待用户输入或文件读写操作,进程会暂时停止执行。
  • 终止: 程序执行完成后,进程会被终止,释放所占用的资源。

【3】进程的状态

  • 新建(New): 进程刚刚被创建,但还未被调度到等待运行。

  • 就绪(Ready): 进程已经准备好运行,等待CPU分配时间片。

  • 运行(Running): 进程正在CPU上执行。

  • 等待(Waiting): 进程因为某些事件(比如I/O操作)而暂停执行,等待事件完成。

  • 终止(Terminated): 进程执行完毕,或者因为某些原因被终止。

  • 这就像是一个员工在公司里的不同状态:他可能在等待任务(就绪),正在做任务(运行),可能因为需要等别人的报告而暂停工作(等待),或者任务完成后回家(终止)。这样的比喻可以帮助我们更直观地理解进程的概念和状态。

【六】创建进程的两种方式

  • 方法一
# 创建进程 方法一

from multiprocessing import Process  # 导入模块中类,用于创建新的进程
import time  # 导入time模块,用于在后面的函数中实现等待(休眠)功能。


def func(name):
    print(f'{name}任务开始')
    time.sleep(3)
    print(f'{name}任务结束')


if __name__ == '__main__':
    p = Process(target=func, args=('写作业',))
    p.start()  # 异步提交了一个任务
    print('主进程')
  • 方法二
# 创建进程 方法二
from multiprocessing import Process
import time


class MyProcess(Process):
    def __init__(self, name):
        super().__init__()
        self.task_name = name

    def run(self) -> None:
        print(f'{self.task_name}任务开始')
        time.sleep(3)
        print(f'{self.task_name}任务结束')


if __name__ == '__main__':
    p = MyProcess('打游戏')
    p.start()
    print('主进程')

【七】进程之间的数据是相互隔离的

from multiprocessing import Process

age = 18


def run():
    global age
    age += 2
    print(age)


if __name__ == '__main__':
    p = Process(target=run, args=())
    p.start() # 20
    p.join()  # join会使子进程先运行完再运行主进程
    print(age) # 18
  • 可以看到主进程输出的age依旧是18
  • 而经过修改的子进程的age输出的就是20

标签:__,name,创建,print,任务,理解,进程,等待
From: https://www.cnblogs.com/Hqqqq/p/17968069

相关文章

  • javascript node.js , java jvm , jdk, jre 的理解。
    网上的截图: 来看看node.js     再来看看java.     ......
  • 正确理解c# default关键字
    背景最近QA测试一个我开发的一个WebAPI时,我意识到之前对C#的default的理解一直是想当然的。具体情况是这样,这个API在某些条件下要返回模型的默认值,写法类似于下面这样[HttpGet(Name="GetWeatherForecast")]publicWeatherForecastGet(){returndefault;}实际上,这个......
  • 16理解函数模板
    理解函数模板模板的意义:对函数类型可以做修改函数模板:boolcompare(Ta,Tb)模板实例化:定义一个模板参数类型,进行一次函数的实例化模板函数:一个函数模板的实例化就是一个模板函数模板类型参数:T模板非类型参数:模板的实参推演:根据实参反推模板参数类型模板的特例化:为函数......
  • python网站创建016:BootStrap
    什么是BootStrap?:是一个别人写好的javascript和css的代码,如果在开发项目的时候省点事,就可以在它的基础上来修改使用使用教程:https://www.runoob.com/bootstrap/bootstrap-tutorial.html下载:https://getbootstrap.net/   下载之后解压,解压之后可以随意打开一个文件,比如cs......
  • 对于 EI K 逆序对排列计数的另一种自然求和方法的理解
    有一个简单的\(O(n^3)\)DP,考虑\(f_{x+1,k}=\sum_{j=0}^{x}f_{x,k-j}\),利用前缀和优化即可。考虑这实际上是\(f_{x+1}(k)=f_x(k)*\frac{1-k^{x+1}}{1-k}\),于是答案实际上为:\[[x^k]f(x)=\prod_{i=1}^n\frac{1-x^i}{1-x}\]接下来的方法来自......
  • 对解决粘包问题的理解
    【一】什么是粘包问题想象你正在通过一条很窄的管道(网络连接)发送一串珠子(数据包)。在管道的另一端,有人(接收方)正在接收这些珠子。为了让对方知道每串珠子的开始和结束,你决定在每串珠子之间放一小块纸条(数据包的边界标记)。但是,如果这些珠子和纸条在管道中相互挤压,可能会导致纸条丢......
  • 创建DOM节点时出现错误信息:box.appendChild is not a function
    1、代码正常书写如下<divclass="box"></div><!--JavaScript代码--><script>//创建节点letbox=document.getElementsByClassName("box");letwords=document.createElement("span");......
  • 设备树 memory reg 的理解。
    再设备树中经常见到这样的描述。   这里adress使用两个u32来描述,length使用两个u32来描述。 实际上address=0x0000000040000000length=0x0c0000000 是拼起来的。至于是不是加上0x,感觉可加可不加。......
  • 类和对象的创建
    类和对象的创建publicstaticvoidmain(String[]args){    //类:抽象化,实例化    //类实例化会返回一个自己的对象    //student对象就是一个Student类的具体实例    Studentxiaoming=newStudent();    Studentxh=newStudent(......
  • 内存取证1-进程
    otterctf内存取证-----4-NameGame看到这题目,看看是不是浏览器登录,无果。这里似乎没有跟题干相关的答案。游戏登录了,登录进程里是不是包含账户信息,把进程dump下来看看。频道后面是不是账户名字,果然猜对了,上面都是假想自己做出来的,感觉蛮有意思的,所以记录下来,进程里居然......