认识进程和线程,那我们首先必须认识冯诺伊曼体系结构
冯诺伊曼体系结构
描述了一台计算机硬件上的基本结构
他提出计算机中存储和表示数据都是通过二进制来表示的
风诺依曼体系结构由四大部分组成:
1.(CPU)中央处理器
2.存储器:存储器又分为
- 2.1内存储器(简称内存)
- 2.2外存储器(简称外存) 如:硬盘,光盘,U盘软盘……
3.输入设备 如:键盘,鼠标,麦克风……
4.输出设备 如:显示器,音箱,打印机……
注意:有的设备即是输入设备又是输出设备 如:手机的触摸屏(即能点击又能显示出画面),网卡(即能从网上下载数据,又能上传数据到网上)
举一个例子来说明这些硬件之间是如何配合的(数据不是简单的发送和接收,它的内部是十分复杂的)
例如:A在电脑上从QQ上发送一句“hello ”到B的电脑上
操作系统
1.概念:操作系统(英语:operating system,缩写作 OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面
2.内核
内核是一个操作系统的核心,主要功能为直接与硬件通信(靠各硬件对应的驱动程序)然后提供一个抽象的接口给应用程序,为应用程序提供一个运行环境并分配程序运行必须的cpu和内存资源
3.操作系统(内核)
1.管理计算机所有的硬件设备
2.管理计算机中的软件资源
4.那么是如何进行管理的呢?(先描述再组织)
4.1.描述:管理一个硬件的时候,都会通过一个类(也可能是一个结构体)来描述这个硬件的所有信息,目前的windows、Linux、mac都是用C语言实现的,那么C语言是里面是使用struct结构体来描述硬件设备和软件资源的
4.2.组织:通过一定的数据结构实现,目的是为了方便进行“增删改查”
了解到一定的操作系统,下面来认识进程和线程
进程的初步认识
前面我们提到操作系统是管理硬件设备和软件资源,而进程就是操作系统需要管理的软件资源的一部分
我们无时无刻都在跟进程打交道,如:打开我们的任务管理器,我们就可以看到很多的进程
一个所谓的“程序”一般只一个可执行的文件(如“.exe”文件),如果不双击.exe文件的时候,那么他此时就是一个文件默默的在磁盘(外存)上,如果双击这个文件的时候,操作系统就会把这个exe文件从磁盘加载到内存中,并且CPU开始执行这个程序中的代码,此时执行这个代码的过程就称为“进程process”。(有些操作系统中也管进程叫做“任务task”)
如我们找到qq所在的.exe文件,然后双击,在打开我们的任务管理器我们就可以看到qq已经在运行了
对于现代的操作系统来说,同一时刻,运行着很多的进程,那么
操作系统是如何管理进程的呢?
1.描述: 每个进程都会创建一个结构体(对象),称为“进程控制块(PCB)”
2.组织: 内核中使用一个双向链表,把所有的PCB对象串到一起
例如:
a)任务管理器如何显示所有的进程信息呢?
遍历内核中的链表,取出每个PCB对象,在打印这个对象的属性就可
b)当创建新的进程的时候,本质上就是创建了一个PCB对象,然后将这个对象加到链表中
c)当销毁已有进程的时候,本质上就是把该进程对应的PCB对象从链表中删除掉了
3.一个进程包含哪些内容(PCB中有什么)
3.1进程持有了一些操作系统的资源
a)CPU资源(进程中的代码需要在CPU上执行)
b) 内存资源(每个进程都会消耗一定的内存)
c)占据磁盘IO(持有一些文件资源,因为进程可能会在的磁盘上读取数据)
d)占据网络IO(通过网卡来上传/下载一定的数据)
进程 也可以视为是操作系统进行资源分配的基本单位
4.进程的PCB中还有一些其他属性
例如
a)进程id:进程的唯一身份表示,类似你的身份证号码
b)进程的状态
c)进程的优先级
d)进程的上下文信息
e)进程的记账信息
进程的调度,具体是由操作系统内核中的调度器模块实现的,这里的调度顺序是有一定的规则,但是这个规则比较复杂,当程序员在应用层写代码的时候,是无法预测该进程何时被调度走,下一个进程何时被调度进来的,实现的是“抢占式”策略。
5.时间片
(1)现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。所谓的多任务,就是操作系统可以同时运行多个任务。
(2)操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行
(3)任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。
这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发。
6.并发和并行
- 并发:多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
(微观上一个个执行,宏观上同时进行) - 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。
(微观上就是同时进行)
并发和并行的目的只有一个:提高程序效率
7.线程
7.1线程和进程的关系
如果进程是一个个工厂,那么线程就是工厂里面的一条条流水线
一个进程中可能包含着很多的线程
a)一个进程中可能包含着很多的线程
b)每个线程都有自己要执行的逻辑(相关代码)
c)一个进程中可以同时有多个这样的要执行的逻辑,然后让这些逻辑并发是的执行
d)线程和线程之间,很多资源是共享的,共享的目的是为了编程方便,更方便的实现一些并发任务,而且当一个线程出现bug的时候,只会当前线程所在的进程会被终止,而不会影响到其他进程。如:内存和管理的文件
e)进程和进程之间,资源是相互独立的,为了保证目的的稳定性,不要因为一个进程出现bug而导致所有的进程被终止
进程的调度实质上是线程的调度,而线程的调度和进程的调度一样
线程是操作系统调度执行的基本单位
8.操作系统对于线程的管理,仍然是“描述+组织”
a)每个线程都有一个PCB对象来描述,若干个PCB对象要放到一个双向链表中组织
b)线程和PCB之间是一一对应的,而一个进程会和N个PCB对应
c)有些系统中的“线程”也成为“轻量级”进程
9.关于进程和线程的关系如下图
9.1单进程单线程
9.2单进程多线程
这就是实现了线程和线程之间是资源共享得到
发生冲突情况:就是两个老铁都要吃同一个鸡大腿
此时如果某个线程出现异常,并且又没有得到很好的处理的话,此时就会导致整个进程被终止
9.3多进程单线程
注意:这种方式开销比较大,因为需要两个房间,还需要两个桌子一只鸡,但是确实只有一个人在吃鸡
9.4多进程多线程
这就说明进程和进程之间是相互独立的
注意:单进程多线程的开销相对于多线程单线程来说开销更小,因为
(1)线程比进程更轻量级
(2)创建一个线程的成本比创建进程低
(3)销毁一个线程的成本也比销毁进程低
低的理由,分配资源的最小单位,每次创建进程都得分配一堆配套的资源,线程的资源可以和其他同进程中的线程共享,也就不需要重新分配了
9.5当线程多的时候会提高效率,但是线程越多越好吗?
答:当然不是,因为线程过多,会导致有的线程无法共享到同进程下的资源,线程的数量是会提高并发程度,也就能提高程序的执行效率,但不是线程越多越好
线程的多少和CPU的核数是相关的,也是和当前线程执行的任务类型相关(CPU密集型的任务还是IO密集型的任务)