1.5 进程

1. 进程定义

1. 进程是资源分配最小单位

2. 当一个可执行程序被系统执行(分配内存等资源)就变成了一个进程

进程定义拓展回答内容

1. 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,这种执行的程序就称之为进程

2. 程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念

3. 在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。

4. 进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。

5. 进程之间有自己独立的内存,各进程之间不能相互访问

6. 创建一个新线程很简单,创建新进程需要对父进程进行复制

多道编程概念

多道编程: 在计算机内存中同时存放几道相互独立的程序,他们共享系统资源,相互穿插运行

单道编程: 计算机内存中只允许一个的程序运行

2. 有了进程为什么还要线程?

1. 进程优点:

提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率

2. 进程的两个重要缺点

a. 第一点:进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。

b. 第二点:进程在执行的过程中如果阻塞,即使进程中有些工作不依赖于输入的数据,也将无法执行(例如等待输入,整个进程就会挂起)。

c. 例如,我们在使用qq聊天, qq做为一个独立进程如果同一时间只能干一件事,那他如何实现在同一时刻 即能监听键盘输入、又能监听其它人给你发的消息

d. 你会说,操作系统不是有分时么?分时是指在不同进程间的分时呀

e. 即操作系统处理一会你的qq任务,又切换到word文档任务上了,每个cpu时间片分给你的qq程序时,你的qq还是只能同时干一件事呀

3. 进程间互相访问数据的四种方法

注:不同进程间内存是不共享的,所以互相之间不能访问对方数据

法1:  利用Queues实现父进程到子进程(或子进程间)的数据传递

法2:  使用管道pipe实现两个进程间数据传递

法3:  Managers实现很多进程间数据共享

法4:借助redis中间件进行数据共享

4. 进程池

from  multiprocessing import Process,Pool
import time,os
def foo(i):
    time.sleep(2)
    print("in the process",os.getpid()) #打印子进程的pid
return i+100
 
def call(arg):
print('-->exec done:',arg,os.getpid())
 
if __name__ == '__main__':
    pool = Pool(3)                      #进程池最多允许5个进程放入进程池
    print("主进程pid:",os.getpid())     #打印父进程的pid
    for i in range(10):
       #用法1 callback作用是指定只有当Foo运行结束后就执行callback调用的函数,父进程调用的callback函数
        pool.apply_async(func=foo, args=(i,),callback=call)
        #用法2 串行 启动进程不在用Process而是直接用pool.apply()
        # pool.apply(func=foo, args=(i,))
    print('end')
    pool.close()    #关闭pool
    pool.join()     #进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

5. 进程和程序的区别

1. 程序只是一个普通文件,是一个机器代码指令和数据的集合,所以,程序是一个静态的实体

2. 而进程是程序运行在数据集上的动态过程,进程是一个动态实体,它应创建而产生,应调度执行因等待资源或事件而被处于等待状态,因完成任务而被撤消

3. 进程是系统进行资源分配和调度的一个独立单位

4.一个程序对应多个进程,一个进程为多个程序服务(两者之间是多对多的关系)

5. 一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程

猜你喜欢

转载自www.cnblogs.com/lihouqi/p/12664232.html
1.5