Day 16 16.1 并发爬虫一、进程、线程以及协程
并发爬虫一、进程、线程以及协程
1. 并发与并行
2. IO密集型任务和计算密集型任务
3. 同步与异步
4. IO模型(IO多路复用)
5. 内核态多线程,用户态多线程
- 所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。
- 强调多个事件在同一时间间隔发生
【1】进程概念
- 我们都知道:
- 计算机的核心是CPU,它承担了所有的计算任务;
- 操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;
- 应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
-
多道技术:
- 空间复用+时间复用,于是有了进程!
-
进程是一种抽象的概念,从来没有统一的标准定义。
- 进程一般由程序、数据集合和进程控制块三部分组成。
例子:我和我的女朋友们的故事
我就是CPU,我跟三个女朋友玩就是三个任务
1. 我教第一个女朋友做菜,菜谱就是程序,食材就是数据,我做饭的过程就是一个进程(切换,状态保存)
2. 我给第二个女朋友治疗脚伤,医疗手册就是程序,医药箱就是数据,治疗脚伤的过程就是第二个进程
。。。
- 进程状态反映进程执行过程的变化。
- 这些状态随着进程的执行和外界条件的变化而转换。
- 在三态模型中,进程状态分为三个基本状态,
- 即运行态,
- 就绪态,
- 阻塞态。
- 在五态模型中,进程分为
- 新建态、
- 终止态,
- 运行态,
- 就绪态,
- 阻塞态。
【2】线程的概念
-
在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。
- 任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。
- 后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程。
-
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。
-
一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
-
一个标准的线程由
- 线程ID
- 当前指令指针(PC)
- 寄存器和堆栈组成。
-
而进程由
- 内存空间(代码、数据、进程空间、打开的文件)
- 一个或多个线程组成。
线程的生命周期
-
当线程的数量小于处理器的数量时,线程的并发是真正的并发,不同的线程运行在不同的处理器上。
- 但当线程的数量大于处理器的数量时,线程的并发会受到一些阻碍,此时并不是真正的并发,因为此时至少有一个处理器会运行多个线程。
-
在单个处理器运行多个线程时,并发是一种模拟出来的状态。操作系统采用时间片轮转的方式轮流执行每一个线程。
- 现在,几乎所有的现代操作系统采用的都是时间片轮转的抢占式调度方式,如我们熟悉的Unix、Linux、Windows及macOS等流行的操作系统。
-
我们知道线程是程序执行的最小单位,也是任务执行的最小单位。
- 在早期只有进程的操作系统中,进程有五种状态,创建、就绪、运行、阻塞(等待)、退出。
- 早期的进程相当于现在的只有单个线程的进程,那么现在的多线程也有五种状态
- 现在的多线程的生命周期与早期进程的生命周期类似。
线程的生命周期
# 创建:一个新的线程被创建,等待该线程被调用执行;
# 就绪:时间片已用完,此线程被强制暂停,等待下一个属于它的时间片到来;
# 运行:此线程正在执行,正在占用时间片;
# 阻塞:也叫等待状态,等待某一事件(如IO或另一个线程)执行完;
# 退出:一个线程完成任务或者其他终止条件发生,该线程终止进入退出状态,退出状态释放该线程所分配的资源。
进程与线程的区别
前面讲了进程与线程,但可能你还觉得迷糊,感觉他们很类似。的确,进程与线程有着千丝万缕的关系,下面就让我们一起来理一理:
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
【3】协程(Coroutines)
协程(Co-routine),也可称为微线程,或非抢占式的多任务子例程,一种用户态的上下文切换技术(通过一个线程实现代码块间的相互切换执行)。这种由程序员自己写程序来管理的轻量级线程叫做『用户空间线程』,具有对内核来说不可见的特性。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
协程解决的是线程的切换和内存开销的问题
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17218092.html