进程、线程、并发、并行、进程间通信

程序、进程和线程

程序:

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。

程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。

程序与进程 <百度百科>

进程更能真实地描述并发,而程序不能;

进程是由进程控制块、程序段、数据段三部分组成;

进程具有创建其他进程的功能,而程序没有。

同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。

在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。

进程:

什么是进程?<百度百科>

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。进程是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元

进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,进程是系统进行资源分配和调度的基本单位

  • 进程从磁盘上来,是运行中的程序(C语言的程序–>预处理–>编译–>汇编–>链接–>可执行的二进制文件<符合当前OS的ABI接口>),触发可执行程序(命令行或者鼠标双击等方式)—>加载至内存==>进程。
进程的概念主要有两点:

第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

  • 进程可以理解为内存中的一个资源的管理单位,进程的线性空间:可以分成5个部分:
    ①代码段:程序运行的二进制程序
    ②数据段:进程运行过程中可能用到的一些变量,这些变量已经被初始化的
    ③BSS(以符合开始的块):存放没有初始化的变量
    ④堆:存放系统中需要使用的内存一部分空间,这部分空间可以动态变化
    ⑤栈:跟堆的区别,栈可以存放一些函数中使用的变量,栈的特点:先进后出

第二,进程是一个" 执行中的程序 "。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

线程:

线程(thread)是操作系统能够进行运算调度的最小单位线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

当下推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。

线程的特点:可并发执行,在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行。

进程与线程

==>程序是内存中的一个资源管理单位,管理其中包括线程 --> 线程则是程序中真正’ 干活的 '(线程则是那些函数<函数即是写的程序代码>) --> 程序代码通过编译之后为机器指令 --> 机器指令就被操作系统调度(实质是被CPU调度) --> 如果单核CPU,单核CPU就一个线程一个线程的执行。(注:一个核心在一个瞬间只能一个线程运行) --> 一个CPU核心的话,意味着没有并发

并行与并发

并发与并行:

运维的话:一般都是WEB框架,一切都是围绕WEB产生的,WEB架构一定会遇到的一个问题:并发!而许多服务也只是为了解决并发的问题。

什么是并发?

并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。换句话说:并发就是一段时间内需要做这么多事儿,但是任何一个时间点只能处理一件事 <单车道>。

什么是并行?

并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。换句话说:并行就是在某一个时刻同时有几件事在做 <多车道>。

==> 并行不过是并发的一种解决方案,换句话说,并行的方式解决并发即水平扩展

==> 解决高并发的其他方案:动静分离、缓存、缓冲(队列)等都是用来解决高并发问题。

==> 但是高并发不管怎么解决,垂直扩展<提升硬件性能>?但是硬件之上运行的还是进程和线程,因此进程和线程如何更好的协调工作,可能是从调优角度考虑。

进程间通信

进程间通信:

进程间的通信方式:

进程间通信主要包括管道、系统IPC(包括消息队列、信号、共享存储)、套接字(SOCKET)

  • 进程之间通信可以比喻为国与国之间的关系
  • 线程之间通信可以比喻为省与省之间的关系,但是线程与线程之间共享进程中的数据,但是线程之间也有自己独有的资源<不共享>即线程中的栈。
  • 进程与端口一一绑定,同一进程下的线程共用一个端口,进程间通信代价很高。

进程间通信简化版本就是端到端的通信,目前进程间通信均使用网络通信socket。即使本机之间进程通信(因为一台主机的资源总有不够使用的时候,需要跨主机进程间通信,那么都使用网络通信,代码通用)。socket(套接字)统一的网络接口,Unix、linux、Windows通用,也是到目前为止的网络通信的唯一解决方案。如果一端被动的接收另一端请求以提供计算和数据则被动接收的一段称为服务器端,另一端发起计算或数据请求的一段,称为客户端。这种编程模式称为client/server编程模式,简称C/S编程,开发的程序也称为C/S程序,CS编程往往使用传输层(TCP/UDP),较为底层。

进程间通信的最大消耗之一:序列化和反序列化
  • hostA <==> hostB (hostA 与 hostB主机需要基于网络通信)
  • 发送缓冲区:涉及队列的数据结构
栈、队列和数组:
数组:也可以是先进先出,也可以是后进先出。
	但是数组更想做到的是,包括中间数据的插入(即插队),或者中间的数据排着排着,走了,即数组可以进行队伍的调节。
队列:先进先出,不允许出来和插队。即不允许队伍的调节,形象于早上挤地铁,两边还有栏杆,不允许插队、出列和改变。
栈:与队列相似,唯一的区别,先进后出,后进先出。
  • 发送缓冲区:将一个需要发送的数据转化为一个字节挨着一个字节的序列,此过程称为序列化。
  • 将收到的数据从缓冲区拿出来,还原成一个对象的过程,称为反序列化。

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程<百度百科>

注:此处只提及相关概念,更详细的知识还需更深入的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值