Python中的多进程与多线程(一)

Python中的多进程与多线程(一)

进程和线程的概念以及区别

1、进程的基本概念

  • 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

  • 进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称之为进程。

2、进程的基本状态以及状态之间的关系

  • 状态:运行、阻塞、挂起阻塞、就绪、挂起就绪

  • 状态之间的转换:

    • (1) 准备就绪的进程,被CPU调度执行,变成运行态

    • (2) 运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态

    • (3) 运行中的进程,进程执行完毕(或者时间片用完),变成就绪态

    • (4) 将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程之前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态

    • (5) 将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态

3、线程的基本概念

  • 线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。

  • 线程的优点:

    • (1) 易于调度

    • (2) 提高并发性;通过线程可以方便有效地实现并发性,进程可以创建多个线程来执行同一个程序中的不同部分

    • (3) 减少开销;创建线程比比创建进程要快,所需的开销较小

4、进程和线程的关系以及区别

  • 关系:

    • (1) 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程

    • (2) 资源分配给进程,同一进程的所有线程共享该进程的所有资源

    • (3) 处理机分给线程,即真正在处理机上运行的是线程

    • (4) 线程在执行过程中,需要协作同步。不同进程的线程间要利用信息通信的方法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体

  • 区别:

    • (1) 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

    • (2) 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行

    • (3) 拥有资源:进程是拥有资源的一个独立单位,线程不拥有资源,但可以访问隶属于进程的资源

    • (4) 系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销

5、进程间通信的方式

  • (1) 管道以及有名管道:管道可用于具有亲缘关系的父子进程之间的通信;有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信

  • (2) 信号:信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的

  • (3) 消息队列:消息队列是消息的链接表,它克服了以上两种通信方式总信号量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取消息

  • (4) 共享内存:可以说是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等

  • (5) 信号量:主要作为进程之间以及同一进程的不同线程之间得到同步和互斥的一种手段

  • (6) 套接字:这是一种更为一般的通信机制,它可以用于网络中不同机器之间的进程间通信,应用广泛

6、同步和互斥的区别

  • 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如:假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数。当然,在把整个文件掉入内存之前,统计它的字符数是没有意义的。但是,由于每个操作都有自己的线程,操作系统会把两个线程当作是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字符数。未解决这个问题,必须使两个线程同步工作

  • 所谓同步,是指散步在不同进程之间的若干程序片段,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必须是互斥的。少数情况下可以允许多个访问者同时访问资源

  • 所谓互斥,是指散步在不同进程之间的若干程序片段,当某个进程运行其中一个程序片段时其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段之后才能运行。如果用对资源的访问来定义的话,互斥某一资源时,只允许一个访问者对其进行访问,具有唯一性和排他性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的

猜你喜欢

转载自blog.csdn.net/J__Max/article/details/82862850