- exe称为文件或者源码,只有执行起来的时候才叫进程。进程是跑起来了的。把文件加载到内存中执行,我们就把这个叫做进程。进程就是程序在操作系统中的一次执行过程。
- 分为后台进程和带页面的进程。
打开电脑的任何一个应用,这里都会加入对应的进程。- 如:打开一个迅雷应用,就是起了一个进程。迅雷中同时进行5个文件的下载,就是5个线程。从宏观看,有5个文件在同时下载,从微观看,有一个时间片段,来回切换,一个时间点,只有一个在运作。这就叫并发。
- 一个进程下面有很多的线程,这样可以最大的发挥CPU的性能。线程是进程的一个执行实例。一个进程至少有一个线程
- 一个程序能不能同时起多个进程呢?看程序的设定或者操作系统。
比如暴风影音,原来可以允许多个暴风,同时播放多个视频,但是现在不行了,再打开第二个默认进入第一个。这就是原来可以同时起多个进程,现在只能单线程运行了。- 一个进程能不能同时起多个线程呢?看程序的设定或者操作系统。
比如腾讯视频。一个进程是否可以起多个线程,是可以设置的。如:视频下载的时候,可以设置为允许多个视频同时下载,也可以设置为只下载一个。- 进程和线程是操作系统的概念,是由操作系统调度的。不由用户控制。
- 多线程在单核上运行,为并发。时间片的切换速度非常快,以毫秒(?)计算,人眼反应不过来,看起来像是在同时进行。如:在网页上同时打开两个视频,看起来是同时在播放,其实是以非常快的速度切换的。从宏观看,貌似在同时进行。
- 进程--线程--协程 发展史:
①原来就是一个进程走天下,后来发现效率太低了(摩尔定律,硬件发展总比软件快)。为了跟上硬件,提高使用效率,开发了线程。线程是一个轻量级的进程,可以在一个进程上开好几个线程。
②后来发现线程还是吃资源的,毕竟线程还是作用在进程上的,还是要占用CPU和内存的。有些地方还是物理态的,比较笨拙。
③于是乎,对编译器等做了算法优化,变成逻辑态,把线程变得更轻量级,做到资源共享,就叫做协程。协程是轻量级的线程。在一个主线程(有的程序员直接称为线程/也可以理解成进程。这个还没定下来)中,可以轻轻松松地写上万个协程。
①进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。
②线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。
③一个进程可以创建和销毁多个线程,同一进程中的多个线程可以并发执行。
④一个程序至少有一个进程,一个进程至少有一个线程。
1.3 并发和并行
①多线程在单核上运行,为并发
②多线程在多核上运行,为并行
③示意图:
小结:
1.4 Go协程和Go主线程
小结:
①主线程是一个物理线程,直接作用在cpu上的。是重要级的,非常耗费cpu资源。
②协程是从主线程开启的,是轻量级的线程,是逻辑态,对资源消耗相对小。
③Golang的协程机制是非常重要的特点,可以轻松的开启上万个协程。其他编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这就突出Golang在并发上的优势了。
1.6 协程的调度模型
1.7 设置Golang运行的CPU数
为了充分利用多CPU的优势,在Go程序中,设置运行的CPU数量
go1.8 后,Go默认运行在多核上,提高效率,可以不用设置了;
go1.8 前,还是要设置一下的,可以更高效的利用cpu
问题1、使用协程来完成,效率高,但是会出现并发/并行的安全问题:同一个时间点向同一个地址写入数据,报错【concurrent map writes :并发的map写入】
这就好比:一本书可以多人同时看一个地方,但是多个人不能同时往同一个地方写。写是应该有保护的。
产生原因:多个协程同时往同一个map空间写入数据
在运行某个程序时,如何知道是否存在资源竞争问题?答:在编译程序时,增加一个参数 -race 即可。 go build -race xxx.go race:竞争
问题2、不同协程之间通信问题
1.8.1 执行结果
1.8.3 解决 “协程带来的并发/并行的安全问题” 的方法:加入 互斥锁
没有对全局变量加锁,因此出现资源争夺问题,代码出现错误【concurrent map writes】。我们尝试着加入锁
为什么读的时候也需要加锁呢?主线程不知道什么时候结束,可能中间尝试着去看一看,可能也会造成资源竞争。
1.8.4 加锁的弊端
2.1 基本介绍
2.2 声明/定义
2.3 使用的注意事项
2.4 管道的关闭
2.5 管道的遍历
3.1.5 怎么判断读取数据结束的?
x是取出来的数据,ok默认为true,当管道中的数据都被取走后,将ok设置为false
3.3.4 代码效果
说明:管道是一边写一边取的,不是我们平常理解的,都写完了才进行取值。。。也是Go快的一个原因
3.3.5 和传统方法(只用一个for循环)耗时对比
当开启多个协程的时候,可以明显的看到CPU的使用升高,执行完毕后,CPU的使用就会降下来。