您的位置:首页 > 其它

程序,进程,线程,协程。

2017-07-07 11:43 197 查看

程序的概念

程序:通俗来讲就是我们编写的代码。从操作系统层面讲,就是一系列按一定顺序排列的指令。

理解程序的概念有两个重点: 1.程序是按照一定顺序的指令集合,它是静态的。2.指令的概念。

指令:指令是指示计算机执行某种操作的命令。通常是二进制形式。就好比 我们的程序(高级语言编写的)会被编译成计算机可以识别的二进制机器语言代码。都是可以被计算机执行的命令。一条指令包括两方面的内容: 操作码和操作数。

操作码:表示该指令应进行什么性质的操作。比如 加,减。不同操作的操作码是不一样的。

操作数:运算符作用于的实体。前面的操作码规定了操作的性质,操作数规定了操作的数据。可以是操作数据本身或者操作数据的指针地址。

进程的概念

进程:通俗来讲,就是程序一次执行过程。动态产生并动态消亡。从操作系统层面讲,计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。

结合上面的定义,我们可以知道进程是三个部分组成的。1.程序 2.数据集合 3.进程控制块(PCB)。

PCB:系统在创建每个进程时,都为其开辟一个专用的存储区,用以记录它在系统中的动态特性。系统根据存储区的信息对进程实施控制管理。进程任务完成后,系统收回该存储区,进程随之消亡,这一存储区就是进程控制块。简单来说,就是系统根据PCB管理进程,每个进程都有自己的PCB,PCB是进程存在的唯一物理标识

问题: 程序与进程的区别?

我们列出他们主要的区别:

程序是指令集合,静态的。进程是程序执行过程,是动态的。我们可以这样看他们:程序是未执行的代码,而进程是执行的代码+数据+PCB。

不同进程可以运行同一个程序。进程的组成不只程序一个,只要数据集合不同,就是不同的进程,比如 不同用户/程序 运行系统的套接字处理程序,因为数据集合不同,产生了不同的进程。

进程是可以并发的。程序没有并发概念,由于进程可以调度资源,所以可能会发生竞争。

进程竞争

我们的CPU并不是等待处理完一个进程,再去处理下一个进程。真实的设计是:把进程分块。某一时刻执行A进程的某个部分,下一时刻执行B进程的某个部分。

既然进程有自己的数据集合,有各自调度的资源和cpu使用权,如果有两个进程需要调度同一个资源,就形成了竞争关系。比如有一个进程调用了打印机的打印,有另一个进程调用打印机的复印,会出现打印机一边打印一边复印,如果不对共享资源进行互斥操作有可能我们打印出混乱数据。

互斥:互斥是一种手段,它使共享数据的进程无法同时对其共享的数据进行处理。

进程通信

进程的数据集合是互相独立的,一般而言是不能互相访问的。我们很多时候需要在不同进程之间交换数据,比如一个进程利用另一个进程的输出来处理并返回等等。于是操作系统提供了一种进程间通信的接口,我们称之为 IPC。

通过继承这个接口,不同系统不同应用场景使用不同的通信方法。

管道

消息队列

信号量

信号

共享内存

套接字

管道:管道分为两种。无名管道命名管道。管道的特点就是阻塞,Go语言里面就设计了管道(channel)来处理并发。我们可以把管道看成里面的数据是由一方(A)写入,流向另一方(B)的。当管道里面没有数据的时候,B读取管道的数据会造成阻塞,直至A向管道里面写入数据。当管道被数据填满了,A向管道写数据会造成阻塞,直至B读取了数据。

无名管道(pipe):有上面管道的特点。但是有几个其他的特点。

数据在同一时刻只能在一个方向上流动。

数据只能从管道的一端写入,从另一端读出,遵循先入先出原则。

从管道读数据是一次性操作,数据一旦被读走,它就从管道中被抛弃,释放空间以便写更多的数据。

管道没有名字(无名),只能在具有公共祖先的进程(父进程与子进程,或者两个兄弟进程,具有亲缘关系)之间使用。

命名管道(FIFO):无名管道有很明显的缺点,就是只能在亲缘关系进程中实现通信。所以命名管道就提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信。

消息队列:管道的特点是阻塞。消息队列提供一种非阻塞的方式去通信。消息队列,本质上就是消息的链表

消息:指得是交换的数据块。消息队列上面有很多的数据块,每一块我们都称为消息,这些数据块可以是不同类型的数据,都被封装成了消息队列上面的数据块。

消息队列是一个独立的存在。不同进程都可以往消息队列写消息,取消息。

问题:比如A、B进程需要通信,A进程往消息队列写入了数据,此时消息队列上面有A进程写入的消息,但是内核中同时存在其他消息队列,消息队列是独立存在的。那么B进程怎么知道哪一个是它们通信的消息队列呢?

所以创建消息队列的时候,需要提供一个key值标识这个消息队列,A、B进程通过key值操作这个消息队列。Windows界面就是用消息队列进行进程通信的。

信号量:操作系统提供一种特殊的变量,对他的操作只能是原子性的。为了防止进程同步访问共享资源,我们使用信号量来标识哪一个进程可以使用该资源。我们称这个状态为 临界区域。信号量是用来调协进程对共享资源的访问的。我们一般对信号量有两个操作,PV。当一个进程A执行P操作,它得到一个信号量,然后进入临界区工作。这个时候当另一个进程B进行P操作的时候会被挂起。A离开临界区然后执行V操作,这时候被挂起的B进程就可以执行了。由于P,V操作都是原子性的,所以保证在同一时刻只有一个进程访问这个临界区。

信号:信号是一种异步机制。类似中断机制。一般信号用于错误发生的情况。比如windows任务管理器去结束进程。信号的触发有三种:1.用户操作 2.硬件异常 3.调用信号发生函数(kill等)。我们可以设置接收信号的进程对于信号的处理函数,这个函数是信号触发的,不需要进程自己去设置一个循环等待,就像JS中的onmessage一样。信号是进程通信中唯一异步的方法。

共享内存:允许两个不相关的进程访问同一个逻辑内存。我们计算机上面有很多公共访问内存区域。共享内存就是一些逻辑内存可以被不同进程访问,但是它本身不提供同步机制。所以我们一般结合信号量来处理不同进程的读写。

套接字:这个概念其实就是网络通信的那个套接字。计算机在网络中的唯一标识是IP,而端口就是标识这台计算机上面的某个进程。所以IP+端口标识了网络中某一进程,我们通过套接字去进行网络中进程通信,数据交换等等,套接字是唯一网络进程通信的手段。

线程的概念

线程:可以看成轻量级的进程。因为进程有在内存中属于自己的独立空间。一个进程中可以分割出很多线程,这些线程共享该进程的内存空间,所以线程实际上只拥有运行时必不可少的资源,因此它比进程轻量很多。

线程的特点:

程序执行的最小单位,线程是可以独立运行的。

并发性。线程可以创建另一个线程。

参考:

1. 管道

2. 进程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: