协程、线程与进程

协程、线程、进程等概念是我们作为开发人员经常会听到的一些词。本文就这些概念做了一些浅陋的研究,希望能够抛砖引玉。 在讲解线程,协程之前首先需要了解一些基础的计算机概念

内核:在现代操作系统中,往往将一些基本的、公共的、运行频率高的模块以及关键数据结构独立开来,使其常驻内存,这一部分被称为内核。内核是基于硬件的第一层软件封装,它控制着计算机的硬件资源,负责管理进程、内存、文件网格系统、设备驱动程序等,为上层的应用提供安全的硬件访问。上层应用程序通过内核提供的接口访问硬件资源,这些接口被称为系统调用。

特权级:一种保护数据安全、阻止恶意行为的机制。操作系统提供不同的权限来访问对应级别的资源。从系统的安全性和稳定性考虑,用户的应用程序不能直接访问硬件资源,一些危险的指令只有操作系统可以执行,此外特权级也可以防止一些应用程序滥用其他程序的资源。0级特权可以访问计算机硬件资源,3级特权一般是给应用程序使用的,可以调用基本的cpu指令。

内核态和用户态:当一个进程执行系统调用执行内核代码的时候,进程就处于内核态。进程执行用户自己的代码的时候,称为用户态。内核态运行在0级特权,用户态运行在3级特权

程序、进程、线程、协程:

  1. 程序:一组数据和指令的集合。
  2. 进程:执行中的程序实例,是一个动态的概念。每个进程有自己独立的地址空间。
  3. 线程:属于进程,是cpu的基本调度单位,线程用于处理并发逻辑,拥有独立的栈。
  4. 协程:轻量的用户态线程。
  5. 调度:一个方法,决定接下来哪个上下文可以获取cpu时间

举例描述,我们桌面上的应用A是程序,它是由指令和数据构成的集合,当我们打开应用A时,就可以在任务列表里面看到一个应用A的进程,每次打开都会有一个唯一的进程Id标识该进程。如果我们打开另外一个应用B,就会产生一个应用B的进程,试想一下,如果进程之间的内存空间是可以共享的,那么B运行时可能就会发现内存中多了很多A的变量(B表示一脸懵逼),应用程序之间的数据就会遭到污染,严重的话应用的一些用户登录信息甚至可能被恶意程序获取,所以每个进程都会有独立的内存空间,进程之间的数据是不可以直接访问的。最初操作系统中能够拥有资源和独立运行的基本单位是进程,由于进程创建、撤销以及切换的开销太大,所以出现了线程。线程是cpu的基本调度单位,它基本不占用系统资源(只占有极少数的保证运行必不可少的资源),因此线程的切换等操作都比进程快很多,无论是内核的线程还是应用程序的线程,它们的创建、切换和撤销等操作都是由内核实现,在线程切换的过程中,进程为了管理需要从用户态切换到内核态,还是会消耗资源,协程就是为了解决这个问题而出现的。协程是通过语言级别的调度算法实现的,程序自己控制着现成的切换,进程不需要进入内核态,协程就是轻量的用户态线程

进程与线程的区别:

  1. 地址空间和其他资源:进程之间互相独立,同一进程的各线程之间共享
  2. 通信:进程之间通过管道、消息队列、旗语、共用内存以及套子节等方法通信(IPC),线程之间可以直接读取数据(如全局变量)通信

线程有三种状态:等待态(阻塞态)、就绪态、运行态。基本操作如下:

  1. 派生:线程在进程中派生出来,可以有线程或者进程派生
  2. 阻塞:如果一个线程需要等待某个事情发生才能执行,则被阻塞,线程处于等待态
  3. 激活:如果阻塞线程的事件发生,则被激活,线程处于就绪态
  4. 调度:选择一个就绪态线程进入执行状态,该线程进入运行态。
  5. 结束:如果一个线程结束,它的寄存器上下文以及堆栈内容等将被释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值