操作系统之程序、进程、线程、并发、并行、多线程、高并发

操作系统之程序、进程、线程、协程、并发、并行、多线程、高并发

1.程序

一个程序至少有一个进程

2.进程

从不同的角度进程可以有不同的定义,比较典型的定义有:
(1)进程是程序的一次执行过程。
(2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
(3)进程是指一个具有一定独立功能的程序在操作系统中关于某个数据集合进行的一次运行活动,它是系统进行资源分配和调度的一个独立单位,是操作系统程序动态执行的基本单元

3.进程三种状态

进程共有三种状态:就绪、阻塞和运行
1.就绪态:
就绪状态是指程序已达到可以运行的状态,只等CPU分配资源就可以运行的状态。
2.阻塞态
当程序运行条件没有满足时,需要等待条件满足时候才能执行时所处的状态,如等待i/o操作时候,此刻的状态就叫阻塞态。
3.运行态
进程占用CPU,并在CPU上运行。即程序正在运行时所处的状态。

4.线程

线程是进程中执行运算的最小单元,是操作系统执行处理机制的基本单位。每个进程至少有一个线程,线程可以利用进程所拥有的资源执行调度和运算。

5.进程与程序之间的区别

进程与程序的主要区别:
1.用户下达运行程序的命令后,就会产生进程,即运行一个程序时,操作系统首先要创建一个进程,为进程分配内存等资源,然后加入进程队列中执行。同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一程序,却不会相冲突。进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。进程与程序有关,进程包含程序。程序是进程的核心内容,没有程序就没有进程。
2.进程和程序的组成不同。从静态角度看,进程由程序、数据和进程控制块(PCB)三部分组成,而程序是一组有序的指令集合,程序是静态的操作系统指令文件。进程不仅仅是程序,还包含程序在执行过程中使用的全部资源。没有资源,程序就无法执行,因此进程是程序执行的载体。
3.程序是静止,进程是动态的,进程是操作系统进行资源分配的概念;
4.进程具有并发性,而程序没有;
5.进程是竞争计算机资源的基本单位,程序不是。
6.进程有一定的生命期,而程序是指令的集合,本身无“运动”的含义。没有建立进程的程序不能作为一个独立单位得到操作系统的认可。
7.对单个进程的某个时刻而言,一个程序可对应多个进程,即同一程序可以产生多个进程;但一个进程只能对应一个程序。但对整个系统中的进程集合及进程的生命周期而言,进程与程序之间可以形成一对一,多对一,一对多,多对多的关系。

在这里插入图片描述

通俗解释:
一个网页游戏即一个程序,不同的用户打开,就是多个游戏,即多个进程
我打开一个程序,比如chrome,有十多个进程,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束;

6. 进程和线程的区别

1.调度:
进程是资源管理的基本单位,线程是程序执行的基本单位
2.切换:
线程上下文切换比进程上下文切换要快得多
3.拥有资源:
进程是拥有资源的一个独立单位,进程是操作系统资源分配的基本单位,所有与该进程有关的资源,均会被记录在进程控制块PCB中,以表示该进程所拥有的资源,同一进程下的所有线程共享该进程下的所有资源;
线程是分配处理机的基本单位,与系统资源分配无关,线程不拥有系统资源,但是可以访问隶属于进程的资源;

事实上,正在在处理机上运行的是线程,并非进程,即进程将CPU资源分给线程,即真正在CPU上运行的是线程。
4.系统开销: 创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,I/O设备等,OS所付出的开销显著大于在创建或撤销线程时的开销,进程切换的开销也远大于线程切换的开销
5.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
6.线程在执行的时候需要协作同步,不同进程的线程间要利用消息通信方法实现同步。
7.操作资源分配给进程,同一进程的所有线程共享该进程的所有资源。
同一个进程中的线程共享同一内存空间,但是进程之间是独立的。
同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。
对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。
8.线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。
9.同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。
10.创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。
11.一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。
12线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)。
13.进程之间的关系只有父子关系,没有主从关系,他们之间是并行独立的。但是线程之间是有主从关系的,而且他们共享的是同一个内存块(包括程序、数据和堆栈)。

13.打个比方:
进程之间是父子关系,父进程fork子进程,就好比你养了个儿子。这个子进程会拷贝一份内存块,把程序和数据都复制过去,你儿子跟你长的也很像。但是一旦出生下来了,你们就是两个独立的个体,法律上都是平等的。子进程之后就完全独立了,父进程与子进程之间的关系,与其他进程的关系都是一样的,平等的,谁也管不着谁了,他们也只能采用进程间通信才能相互了解。父亲死了,儿子还活着;父进程over了,子进程可以照样活的好好的。
但是进程的不同线程的关系可不是这样的。进程可以由多个线程组成,这称之为多线程程序,他们之间的关系就好比你的大脑与四肢和身体其他部分的关系一样。大脑就是主线程,其他部分就是子线程。子线程由主线程派生,而依附于主线程。主线程一旦over,进程就over了,其他子线程更是over了。他们的内存和数据都是同一份,没有进行隔离(既方便,也危险),不需要额外的通信函数。

7.多进程(多任务)

在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务(多进程),即一个计算机可以有多个进程,这称之为多任务。他们共享的是CPU,硬盘,打印机,显示器,但他们的内存是独立的。现代的操作系统几乎都是多进程操作系统,能够同时管理多个进程的运行。 多进程带来的好处是明显的。但是多进程对于系统的资源要求甚高,资源浪费也比较严重。应用多进程场景最多的是windows系统,例如同时打开运行软件,每个软件打开相当于运行一个进程。
多进程是实现并行的一个有效手段。它可以充分发挥多个cpu的作用,将多个任务分配到不同的cpu上,从而实现同一时刻,处理多个任务。多进程很适合计算密集的任务,因为它充分利用了多个cpu。如果计算机只有一个cpu,那么多进程也是无法实现并行的。

8.多线程

在一段完整的代码中,往往会有需要独立的代码模块,而这些独立运行的程序片段叫作“线程”(Thread),一个进程可以有多个线程,这称之为多线程,他们除了共享进程间的共享内容之外,还共享内存,主要是为了满足运算时共享数据,无需额外的通信。利用多个线程编程的概念就叫作多线程处理(多线程编程)。当然,每个进程,可以是单线程的,也可以是多线程。
至于多线程实现的是并发还是并行?
多线程程序在一个核的cpu上运行,就是并发。
多线程程序在多个核的cpu上运行,就是并行。
在CPU比较繁忙,资源不足的时候(开启了很多进程),操作系统只为一个含有多线程的进程分配仅有的CPU资源,这些线程就会为自己尽量多抢时间片,这就是通过多线程实现并发,线程之间会竞争CPU资源争取执行机会。
在CPU资源比较充足的时候,一个进程内的多线程,可以被分配到不同的CPU资源,这就是通过多线程实现并行。
上面所说,所写多线程可能被分配到一个CPU内核中执行,也可能被分配到不同CPU执行,分配过程是操作系统所为,不可人为控制。所有,多线程是并发还是并行都有可能。
不管并发还是并行,都提高了程序对CPU资源的利用率,最大限度地利用CPU资源。

多线程是实现并发的一个手段。一个进程可以拥有多个线程。当有多个cpu时,多个线程是可以同时执行的,这时就是并行。如果只有一个cpu,那么多个线程可以交叉重叠执行,这时就是并发了。
多进程和多线程比较起来,多线程一般适用于IO密集型的任务。多进程适用于计算密集型的任务
可能,你会有疑问,多线程既然可以并行执行,岂不是也适用于计算密集型的任务?理论上是这样的,只是这里说多进程更适合,是说当数据量比较大时,计算任务之间没有逻辑上的依赖时,多进程更合适一些。因为每个进程都会有自己的进程内存空间,各个进程之间天然隔离。而多线程共享同一个内存空间,线程之间的同步是必须考虑的问题。而这些问题都不是计算密集型任务必须的。所以我们说计算密集型任务更适合多进程。

9.多线程作用

1.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。
2.可以提高程序的效率。
3.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。

10.多线程的缺点

1.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。
2.影响系统性能,因为操作系统需要在线程之间来回切换。
3.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。
4.线程使用不当会发生很多问题。

11.多线程应用

例如并发读取两个文件,文件读取完毕后cpu才开始处理,完成文件读取前cpu一直空闲。如果调整操作顺序,cpu的利用率会提高,程序执行时间也会缩短,在读取B文件时候cpu可以处理文件A,通常情况,cpu在等待IO时,可以执行命令。IO可以是文件IO、网络IO、输入输出IO等。这种情况经常会发生,因为IO速度比cpu的处理速度慢很多。(前提保证,执行顺序不会影响最后结果,结果大于性能,例如一次付款,执行顺序会影响结果就不适合多线程并行执行),多线程是为了更充分的利用cpu资源,再例如服务器在一个端口监听用户请求,服务器处理完用户的请求后继续监听其他的用请求,这样带来的问题是,服务器在处理用户的请求过程中,其他的请求是无法监听和接收的。为解决这个问题,可以采用多线程的方式,每个用户请求的处理都交给一个线程去做。这样,服务器在处理用户请求时可以继续监听端口上其他用户请求。

12.并行

并行指的是两个(或以上)的线程同时执行,前提需要多核CPU。
在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
可以理解为CPU不同的核(核简单理解为CPU可以同时执行的数量,CPU只有一核那么说一瞬间CPU只能做一件事)干不同的事情,就比如你要计算一加到一百,一个核的话就只能一个一个 的累加,但是如果是两个核或者多个核的话,以两核为例,就可以一个去执行一加到五十,另一个核同时执行五十一加到一百,最后再合并。在同样的频率下速度直接快了一倍,就是并行。

13.并发

指的是两个(或以上)的线程同时请求执行,但是同一瞬间CPU只能执行一个,于是CPU就安排他们交替执行,我们看起来好像是同时执行的,其实不是。
指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

注意:实际上并发既可能是”同一个进程里的线程在并发“,也可能是”不同的进程在并发“,但是在我们面试时候统一说不同的进程在并发即可

在这里插入图片描述

14.并行与并发区别

1.并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;
2.并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。(可以把实体理解为CPU)
3.并行是在多台处理器上同时处理自己的任务。

15.高并发

高并发指的是是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问或者socket端口集中性收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化。

16.多线程与高并发关系

多线程只是解决高并发问题的其中的一个方法手段,是在同一时刻利用计算机闲置资源的一种方式。
多线程在高并发问题中的作用就是充分利用计算机资源,使计算机的资源在每一时刻都能达到最大的利用率,不至于浪费计算机资源使其闲置。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值