操作系统(OS)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。其主要作用是管理好这些设备,提高它们的利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口,便于用户使用。
进程的定义:
1)进程是程序的一次执行
2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动
3)进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
线程的定义:
线程是操作系统可识别的最小执行和调度单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。
假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。
线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性
引入线程的好处
(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
进程与线程:
1)进程是基本资源分配单位,而线程是基本调度和执行单位;线程不拥有系统资源,但线程可以访问所属进程的资源。
2)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
3)进程之间可以并发执行,同一进程内的多个线程也可以并发执行。
4)创建和撤销进程的系统开销远大于创建和撤销线程的系统开销。
5)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
注意:
不同进程的线程间可以利用消息通信的办法实现同步。
数据段中(全局变量和静态变量)是指在开辟进程时创建的, 不一定是指类中的全局和静态变量。
协程:
协程是一种用户态的轻量级线程,又称微线程,英文名Coroutine,本质上还是一个线程
, 拥有线程的共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。协程的调度完全由用户控制。人们通常将协程和子程序(函数)比较着理解。
子程序调用总是一个入口,一次返回,一旦退出即完成了子程序的执行。
协程的起始处是第一个入口点,在协程里,返回点之后是接下来的入口点。在python中,协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的,通过相互协作共同完成任务。其运行的大致流程如下:
- 第一步,协程A开始执行。
- 第二步,协程A执行到一半,进入暂停,通过yield命令将执行权转移到协程B。
- 第三步,(一段时间后)协程B交还执行权。
- 第四步,协程A恢复执行。1234
协程的特点在于是一个线程执行,与多线程相比,其优势体现在:
协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制
,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
由于是程序自身控制, 所以协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好了。