进程理论储备
# 操作系统
详见 前面计算机基础中的操作系统章节.. 想要深入了解的话,推荐看《现代操作系统》,前三章足矣.
参考链接:https://www.cnblogs.com/linhaifeng/p/6295875.html
OS是位于计算机硬件与软件之间的控制程序.
# 操作系统的功能
操作系统位于计算机硬件与软件之间.. OS本身也是一个软件,它帮我们控制硬件;
它会将硬盘、cpu等如何运作的复杂操作封装成简单的接口给应用程序使用.. 起到一个承上启下的作用!
第一大功能:
将硬件的复杂操作封装成简单的功能/接口,给应用程序使用..
最典型的代表: python中操作硬盘的文件处理程序!!
第二大功能:
将多个应用程序对硬件(cpu、硬盘、网卡等)的争抢变得有序化..
对无序的争抢加以限制!!
特别提醒:
OS管理着这一套硬件;OS肩上扛着的多个应用程序是共享这套硬件的;OS决定它们给哪个应用程序用.
# 操作系统的发展史
先说一嘴,操作系统是如何从无到有发展到今儿这个状态的过程就是进程的演变过程!!
题外话: 人工智能就是人不断发觉自身的过程..
Ps:下述的操作系统发展史是从人类开始进入电子时代开始的.. 电子时代之前的算盘也算计算机Hhh.
第一代:真空管与穿孔卡片
无编程语言,无操作系统的概念
串行 -- 一个任务 "完完整整运行完后" , 才能运行下一个任务!! 特别强调完完整整!!
任务一个个的运行不叫串行.因为多道技术基于单核下实现的并发,本质上也是一个个运行的..
第二代:晶体管和批处理系统
批处理系统,有进程那味道在里面啦! 尽管依旧是串行的.
第三代:集成电路芯片和多道程序设计
并发 -- 多个任务看起来是同时运行的即可. 单核也可以实现并发!!
并行 -- 多个任务真正意义上的同时运行. 只有多核才能实现并行!!
提醒哈,CPU是用来计算的,CPU是无法执行IO操作的,一旦遇到IO操作,OS就会让CPU去执行别的任务的计算.
多道技术的背景: 想要在单核下实现并发.(单核同一时刻只能执行一个任务)
<任务并发实现> -- 切换 + 保存状态
保存状态意思是保存到内存,有部分关键数据可以保存到CPU的寄存器中.
# 多道技术
多道技术有两大核心: 空间上的复用和时间上的复用.
空间上的复用是为时间上的复用做铺垫的!!一定要明确,是 "操作系统" 在使用多道技术!!
小声BB: 多道技术刚开始是没有解决内存物理层面的隔离的,问题解决后,多道技术才投入了使用..
空间上的复用: 多个 任务/进程 共同一个内存条, 但占用的内存是 相互隔离 的,并且是物理层面的隔离!!
时间上的复用: 多个 任务/进程 复用同一个cpu的时间!!
1> CPU遇到IO切换: 可以提高效率!
2> 一个任务占用CPU时间过长也会切走: 为了实现并发效果不得已而为之,反而会降低程序的执行效率.
3> 优先级高的任务也能抢走CPU的执行权限.
CPU角度 -- 在多个任务之间来回快速切换.
任务角度 -- 在这个 CPU时间片 里具有对CPU的使用权限.
Ps:没有说多核cpu,那么提到多道技术,就是 单核+多道 实现多个任务的并发执行.
Q1:有三个任务A B C.先依次加载到内存中.
它们需要cpu运算的时间都是1s,运算完后产生的数据需要放到硬盘里,硬盘IO时间都是9s.
使用多道技术,完成这3个任务需要多长时间?(Ps:cpu在三个任务之间切换的时间忽略不计)
A1:1+1+1+9 = 12s.
想通关键的一点在于,在做任务C的IO时,任务A和B的IO也在做,当任务C的IO做完时,AB的IO早就做完了.
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - - ==> 12
Q2:若任务ABC都只有运算时间10s,都没有IO. 这种情况下,并发真的比串行效率高吗?
A2:串行30s,并行是大于30s的,因为还要考虑cpu切换进程的时间..
即cpu在没有遇到IO的情况下切换,不会切换效率,反而会降低效率..
但真实情况下,还是得切,因为得实现并发,不能让CPU被单个任务捆绑过长的时间.
Q3:若CPU有四个核,OS应用多道技术,5个任务在4个核ABCD上来回切换的过程是怎样的?
A3:5个任务①②③④⑤交给OS进行调度.
1> 4个核,每个核都先接一个任务.
A:① B:② C:③ D:④ ⑤在一旁等着
2> 任务①遇到了IO,被核A踢到一旁待着.
A:⑤ B:② C:③ D:④ ①在一旁处理IO
3> 任务①的IO处理完毕了,任务③遇到了IO,被核A踢到一旁待着.
A:⑤ B:② C:① D:④ ③在一旁处理IO
4> 以此类推.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 进程
进程起源于操作系统,是操作系统最最核心的概念,没有之一.
操作系统所有其它概念都是围绕着进程展开的!!
特别提醒: 上方操作系统小节中提到的任务都可以看作是一个进程!!
# 概念
进程指的是一个正在运行的程序,或者是程序的运行过程.
硬盘里躺着的那堆代码叫做程序, 程序代码从硬盘加载到内存,CPU再取程序的代码执行,这一过程叫做进程.
进程不是真实存在的,它是一系列动作的总和, 是一个抽象的概念!
eg: 做蛋糕,(CPU)需要先阅读食谱(指令),取各种原材料(输入数据)等..
Ps: 特别注意, 这些动作(CPU)不会主动去做.. 但凡硬件(CPU、硬盘、网卡等)要动起来,都是OS在调度!!
# 进程的创建
一共有4种方式,前三种都 "与我无瓜" ,第4种才是我们要关注的!!
1> 系统初始化时创建的进程
2> 用户交互式的请求创建的进程 eg:双击QQ软件
3> 批处理作业的初始化 串行执行的
4> 一个进程在运行过程中开启了子进程 (其实这样表述有点重复了,说到进程肯定是在运行的...咬文爵字Hhh)
并发编程里多进程部分的研究要点就是: 一个进程里开启多个进程.
在一个正在运行的父进程里开启子进程是为了将原本在父进程里串行执行的任务拿到子进程里面执行,使父进程里的多个任务达到并发执行的效果..
再次重申!起进程的请求是给OS的.. OS分为了两派,它们的处理略有不同:
发给windows: 调用OS中名为 creatprocess 的接口
发给linux: 调用OS中名为 fork 的接口
△ 相同点 -- 收到开启子进程的请求,都会新开辟一块空间,放要执行任务的代码,不仅如此,父进程还会copy一份自个儿的namespace命名空间放到子进程的空间里,当作子进程运行时的全局变量..
△ 不同点 -- 父进程copy的数据略有区别. 影响不大!
windows: 子进程初始状态跟父进程不是一模一样的,实现进程相关的数据不一样.
linux: 子进程内存空间的初始状态跟父进程一模一样!!
注意一点,子进程与父进程从运行角度来看是两个完全独立的执行单位!! 这意味着它俩的物理内存相互隔离,虽然初始状态一样(不用管什么OS啦,简单认为就是副本),但后期执行代码导致的改动,互不影响!!
# 进程的状态
运行、阻塞、就绪 详见前面计算机基础中的操作系统章节!!
tail -f access.log |grep '404'
执行程序 tail 开启一个子进程, 执行程序grep开启另外一个子进程.
两个进程之间基于管道'|'通讯, 将tail的结果作为grep的输入.
进程grep在等待输入(即I/O)时的状态称为阻塞, 此时grep命令都无法运行!!
Q:如何提升任务执行的效率呢?
A:理想情况,cpu一直被此任务占用,任务的IO操作完成后,立马能得到CPU的使用.
但这是不现实的,操作系统不允许cpu资源这样浪费..
我们唯一能控制的就是阻塞.
我们只能在写程序以及部署集群架构的过程中减少任务处于阻塞态的时间,增加任务处于就绪态的时间
(任务处于阻塞态,给它cpu,它也不中用啊)
这样的话,处于就绪态的任务一旦得到cpu就会直接开始运行..任务整体的执行效率就提高了.
2
3
4
5
6
7
Ps: py中的I/O操作,文件处理中的open不是, write、read等读写操作是!! time.sleep不是,但可以模拟I/O效果.
进程并发的实现在于,硬件中断一个正在运行的进程, 把此时进程运行的所有状态保存下来, 为此, 操作系统维护一张表格, 即进程表 (process table) , 每个进程占用一个进程表项 (这些表项也称为进程控制块)..
了解即可..Hhhh
[进程管理] [存储管理] [文件管理]
寄存器 正文段指针 根目录
程序计数器 数据段指针 工作目录
程序状态字 堆栈指针 文件描述符
堆栈指针 用户ID
进程状态 组ID
优先级
调度参数
进程ID
父进程
进程组
信号
进程开始时间
使用的CPU时间
子进程的CPU时间
下次报警时间
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
☆ 进程的同步\异步and阻塞\非阻塞 很重要. 在后面的代码编程过程中会逐一进行阐述.(´▽`)