多进程

多进程:

什么是进程:

程序在计算机中一次执行的过程

理解qq聊天过程中刚才发送的信息,和现在刚刚发送的信息是两个不同的进程

 

程序;是一个静态的描述,不占用计算机资源

进程:是一个动态的过程,占有cpu内存的计算机资源,有一定的生命周期。

 

*****注意:同一个程序,每次执行都是不同的进程。因为分配的计算机资源不同。

一、进程的创建流程:

1、用户空间运行程序发起进程创建申请;

2、调用操作系统内核接口创建进程;

3、分配计算机资源,确定进程状态

4、将新的进程提供给用户使用

 

二、多个进程,如何占用cpu

1、一个内核同一时刻只能运行一个任务

2、多个进程对内核资源进行争夺,操作系统决定哪个进程占用计算机核心

3、占用计算机核心的进程,我们称之为该进程占用cpu的时间片

 

三、进程有哪些信息,如何保存

PCB(进程控制块)

linxu,unix系统中进程创建后,会在内存开辟一块空间存放进程的相关信息,称之为PCB

yangrui@ubuntu:~$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.3 225468 7424 ? Ss 07:54 0:20 /sbin/init au
root 2 0.0 0.0 0 0 ? S 07:54 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 07:54 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 07:54 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 07:54 0:00 [kworker/0:0H
root 8 0.0 0.0 0 0 ? I< 07:54 0:00 [mm_percpu_wq
root 9 0.0 0.0 0 0 ? S 07:54 0:00 [ksoftirqd/0]
root 10 0.0 0.0 0 0 ? I 07:54 0:11 [rcu_sched]

PID:在操作系统中进程的唯一标志,是大于0的整数,由系统自动分配。

四、进程特征

1、进程是操作系统资源分配的最小单位;

2、每个进程单独占用4G虚拟内存

3、进程之间相互独立,运行不受影响

 

五、进程的状态:

进程的三态:

1、就绪态:进程具备运行条件,等待系统分配处理运行

2,运行态:进程占有cpu处于运行的状态

3、等待/阻塞态(sleep,accept):又称为阻塞态,睡眠态,指进程暂时不具备运行的条件,需要阻塞等待

 

 

进程的五态:

新建态:创建一个进程,获取资源,直接表现为运行一个程序,或者在程序中创建新的进程

终止态:进程执行结束,资源回收过程

ps -aux-------》STAT表示进程状态

D  等待态(不可中断等待)

S 等待态(可中断等待)

T 等待态(暂停)

R 运行态

Z 僵尸态

 

+ 前台进程(不带+即为后台进程)

< 高优先级

N 低优先级

l 有进程链接

s 会话组

 

 

进程优先级

优先级决定了一个进程的执行权限和占有资源的优先程度

  top:动态查看当前运行的进程的状态

<+shift或者>+shift   上下翻页

linux中优先级范围    :-20------19    数字越小优先级越高,  -20最高

用户程序默认优先级为:0

nice:以指定的优先级运行进程

例如:nice -9 ./while.py 以9的优先级运行此程序。

以小于0的优先级运行时,需要管理员权限

例如:sudo nice --9 ./while.py

 

renice :改变某个进程的优先级

例如:renice 2 PID

 

父子进程(process):在系统中除了初始化进程,其他进程都有一个父进程,一个父进程可能有多个子进程。

进程树 pstree

问题:

1、什么是进程,进程的特征

2、进程的状态,每种状态怎么回事,转换

3、进程和线程的区别

 

os.fork()

功能:创建一个新的进程

参数:无

返回值:1、失败返回一个负数

               2、成功  0  在字进程中fork的返回值

               3、 成功  >0的正整数(新的进程PID), 在父进程中的返回值

 

 

********************************************************

1、父进程中的fork语句之前的内容(代码),子进程同样会复制,但父子进程空间独立,fork之后的修改不会影响到对方

 2、父子进程在执行上互不影响,谁先执行,谁后执行完全不确定

3、子进程虽然复制父进程的空间,但是有自己的特性,比如自己的PID,进程PCB,进程栈空间等。

**************************************************************

获取PID号

os.getpid()

功能:获取当前进程的PID号

返回值:当前进程的PID

 

os.getppid()

功能:获取当前进程父进程的PID号

返回值:父进程PID

 

进程的退出;

os._exit(status)

功能:结束一个进程

参数:表示进程的结束状态,是一个整数

 

sys.exit([status])

功能:结束一个进程,可以抛出异常

参数:传入一个正整数表示结束状态

          传入字符串表示结束打印

 

 孤儿进程:父进程先于子进程退出,此时子进程变成孤儿进程

***孤儿进程会被系统指定的进程所收养,即该进程成为孤儿进程新的父进程(孤儿进程退出时,“继父会进行处理,不会使其成为僵尸进程”)

 僵尸进程:子进程先于父进程退出,并且父进程没有处理子进程的退出情况,子进程就会变成僵                        尸进程。

***僵尸进程会滞留PCB的部分信息在内存中,大量的僵尸进程会消耗系统资源,所以应该尽量避免僵尸进程的产生。

 

如何避免僵尸进程的产生:

1、让父进程先退出(简单,但不好控制)

2、让父进程处理子进程的退出

**使用wait或者waitpid函数

     os.wait()---阻塞

     功能;等待子进程的退出进行处理

     参数:无

     返回值:一个二元元组,第一个值为退出的子进程的PID

                                             第二个值为子进程的退出状态

**使用信号处理

 

3、创建二级子进程

 

转载于:https://www.cnblogs.com/sike8/p/11112987.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python 中有多种方法可以实现多进程,包括使用 `os.fork()`、`multiprocessing` 模块和 `concurrent.futures` 模块等。 1. 使用 `os.fork()` `os.fork()` 是一个 Unix 系统调用,它可以复制当前进程,创建一个新进程。父进程和子进程会共享代码段,但是各自有独立的数据段和堆栈段。在 Python 中,可以通过 `os.fork()` 实现多进程,示例代码如下: ```python import os pid = os.fork() if pid == 0: # 子进程 print('I am child process, my pid is', os.getpid()) else: # 父进程 print('I am parent process, my pid is', os.getpid(), 'and my child pid is', pid) ``` 2. 使用 `multiprocessing` 模块 `multiprocessing` 模块是 Python 内置的多进程模块,可以很方便地实现多进程。示例代码如下: ```python import multiprocessing def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建子进程 p = multiprocessing.Process(target=worker) # 启动子进程 p.start() # 等待子进程结束 p.join() # 父进程 print('I am parent process, my pid is', os.getpid()) ``` 3. 使用 `concurrent.futures` 模块 `concurrent.futures` 模块是 Python 内置的线程池和进程池模块,可以很方便地实现异步任务。示例代码如下: ```python import concurrent.futures def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建进程池 with concurrent.futures.ProcessPoolExecutor() as executor: # 提交异步任务 future = executor.submit(worker) # 等待任务完成 result = future.result() # 父进程 print('I am parent process, my pid is', os.getpid()) ``` 以上是三种常用的 Python 多进程实现方式,具体选用哪种方式,需要根据实际情况来决定。需要注意的是,在 Windows 平台上,由于 `os.fork()` 不被支持,因此不能使用第一种方式创建多进程。 ### 回答2: Python多进程是指利用Python编程语言提供的多进程模块来实现并行计算。Python的多进程模块主要包括了`multiprocessing`和`concurrent.futures`两个子模块,用于实现多进程的创建、启动和管理。 使用Python的多进程可以带来多个优点。首先,使用多进程可以充分利用多核处理器的计算资源,提高程序的运行效率。其次,多进程可以实现程序的并行计算,将计算任务分配到多个进程中同时执行,从而缩短程序的运行时间。同时,多进程还可以解决Python的全局解释锁(GIL)问题,使得并行计算更加高效。 在Python中,使用多进程可以通过以下几个步骤实现。首先,需要导入`multiprocessing`或`concurrent.futures`模块。然后,通过创建`Process`或`Executor`对象来创建进程。接下来,可以使用`start()`方法启动进程,使用`join()`方法等待进程结束。同时,还可以使用`Process`或`Executor`对象提供的其他方法来管理进程的状态和结果。 除了基本的多进程操作外,Python的多进程模块还提供了一些辅助功能,如进程间通信、进程池等。进程间通信可以通过`Queue`、`Pipe`等来实现,用于实现进程之间的数据交换。而进程池可以通过`Pool`来实现,用于管理多个进程的执行和返回结果。 总之,Python多进程是一种并行计算的方法,可以充分利用计算资源和提高程序的运行效率。通过多进程的方式,可以实现更快速和有效的数据处理和计算。 ### 回答3: Python 多进程是指在一个 Python 程序中同时运行多个进程的能力。多进程可以充分利用多核处理器,并且能够提高程序的运行效率和性能。 在 Python 中,我们可以使用 `multiprocessing` 模块来实现多进程。通过创建多个进程,每个进程都拥有独立的内存空间和数据栈,可以同时运行不同的任务。 使用 `multiprocessing` 模块,我们可以创建一个进程池,通过调用其 `Pool` 类的 `map()` 或 `apply()` 方法,将任务分配给进程池中的不同进程来并行执行。这样,我们可以有效地利用多个 CPU 核心,提高程序的运行效率。 需要注意的是,每个进程都有自己独立的内存空间,因此在多进程编程时,需要特别注意进程间的数据共享和同步问题。在多进程编程中,常用的同步机制包括锁、信号量、事件等,可以通过 `multiprocessing` 模块中的相关类来实现。 此外,多进程编程还可以进一步拓展为分布式进程编程,即将进程分布在多台机器上运行,通过网络进行通信和协调。在 Python 中,可以使用 `multiprocessing` 模块中的 `Manager` 类来实现分布式进程。 总的来说,Python 的多进程编程能够提高程序的执行效率和性能,特别适合于那些需要大量计算的任务,如数据处理、图像处理等。通过合理地运用多进程,并结合适当的同步机制,我们可以充分发挥多核处理器的潜力,提高程序的运行效率和吞吐量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值