说说Golang goroutine并发那些事儿

摘要:今天我们一起盘点一下Golang并发那些事儿。

Golang、Golang、Golang 真的够浪,今天我们一起盘点一下Golang并发那些事儿,准确来说是goroutine,关于多线程并发,咱们暂时先放一放(主要是俺现在还不太会,不敢出来瞎搞)。关于golang优点如何,咱们也不扯那些虚的。反正都是大佬在说,俺只是个吃瓜群众,偶尔打打酱油,逃~。

说到并发,等等一系列的概念就出来了,为了做个照顾一下自己的菜,顺便复习一下

基础概念 进程 进程的定义

进程(英语:process),是指计算机中已运行的程序。进程曾经是`分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。

程序本身只是指令、数据及其组织形式的描述,相当于一个名词,进程才是程序(那些指令和数据)的真正运行实例,可以想像说是现在进行式。若干进程有可能与同一个程序相关系,且每个进程皆可以同步或异步的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时平行性运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)。

进程的创建

操作系统需要有一种方式来创建进程。

以下4种主要事件会创建进程

系统初始化 (简单可理解为关机后的开机)

正在运行的程序执行了创建进程的系统调用(例如:朋友发了一个网址,你点击后开启浏览器进入网页中)

用户请求创建一个新进程(例如:打开一个程序,打开QQ、微信)

一个批量作业的初始化

进程的终止

进程在创建后,开始运行与处理相关任务。但并不会永恒存在,终究会完成或退出。那么以下四种情况会发生进程的终止

正常退出(自愿)

错误退出(自愿)

崩溃退出(非自愿)

被其他杀死(非自愿)

正常退出:你退出浏览器,你点了一下它

说说Golang goroutine并发那些事儿

错误退出:你此时正在津津有味的看着电视剧,突然程序内部发生bug,导致退出

说说Golang goroutine并发那些事儿

崩溃退出:你程序崩溃了

说说Golang goroutine并发那些事儿

被其他杀死:例如在windows上,使用任务管理器关闭进程

进程的状态

运行态(实际占用CPU)

就绪态(可运行、但其他进程正在运行而暂停)

阻塞态(除非某种外部的时间发生,否则进程不能运行)

前两种状态在逻辑上是类似的。处于这两种状态的进程都可以运行,只是对于第二种状态暂时没有分配CPU,一旦分配到了CPU即可运行

第三种状态与前两种不同,处于该状态的进程不能运行,即是CPU空闲也不行。

如有兴趣,可进一步了解进程的实现、多进程设计模型

进程池

进程池技术的应用至少由以下两部分组成:

资源进程

预先创建好的空闲进程,管理进程会把工作分发到空闲进程来处理。

管理进程

管理进程负责创建资源进程,把工作交给空闲资源进程处理,回收已经处理完工作的资源进程。

资源进程跟管理进程的概念很好理解,管理进程如何有效的管理资源进程,分配任务给资源进程,回收空闲资源进程,管理进程要有效的管理资源进程,那么管理进程跟资源进程间必然需要交互,通过IPC,信号,信号量,消息队列,管道等进行交互。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspwzj.html