首页 > 系统相关 >进程和线程的区别

进程和线程的区别

时间:2023-01-30 18:45:07浏览次数:83  
标签:区别 队列 通信 信号量 互斥 线程 进程

/*
* 1. 进程
通信方式:管道,消息队列,信号量,套接字,信号
* 同步方式:信号量,互斥量,事件
* 2. 线程
* 通信方式:教材上没有线程的通信机制这样的说法,但可以肯定这几种方法是进程的通信方式,且其中的信号量既可用于进程的同步,又可用于进程的通信,在网* 络上还有说可以用于线程同步的。
* 同步方式:信号量,互斥量,事件,临界区
*/

一、进程/线程间同步机制。

临界区、互斥区、事件、信号量四种方式
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2、互斥量:采用互斥对象机制。

只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .

信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。
   P操作申请资源:
  (1)S减1;
  (2)若S减1后仍大于等于零,则进程继续执行;
  (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。
  
  V操作 释放资源:
  (1)S加1;
  (2)若相加结果大于零,则进程继续执行;
  (3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .

总结:
  1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
  2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
  3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。

二、进程间通信方式

由于比较容易混淆,我们把进程间通信方法也列在这里做比较。

进程通信也就是所谓的IPC问题,主要是指进程间交换数据的方式。进程通信包括高级通信与低级通信,其中进程同步与互斥属于低级通信,主要用于插U农地控制信号;高级通信包括三种:共享存储系统(有的地方称作共享内存区)、消息传递系统(有的地方称作消息队列)、管道。

信号量是进程同步与互斥的常用方法,也可以作为低级的进程通信方法,用于传递控制信号。

简而言之,进程间通信方式主要包括管道、FIFO、消息队列、信号量、共享内存。 

1.管道,还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式    

2.消息队列,是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!!    

3.信号量,它与WINDOWS下的信号量是一样的,所以就不用多说了    

4.共享内存,类似于WINDOWS下的DLL中的共享变量,但LINUX下的共享内存区不需要像DLL这样的东西,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写      

以上几种方式的比较:    

1.管道:速度慢,容量有限,只有父子进程能通讯    

2.FIFO:任何进程间都能通讯,但速度慢    

3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题    

4.信号量:不能传递复杂消息,只能用来同步    

5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

   本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:

   (1)测试控制该资源的信号量;    (2)若此信号量的值为正,则允许进行使用该资源,进程将进号量减1;    (3)若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1);    (4)当进程不再使用一个信号量控制的资源时,信号量值加1,如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
    套接字通信并不为Linux所专有,在所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket,而所有这样操作系统,对套接字的编程方法几乎是完全一样的

三、进程/线程同步机制与进程间通信机制比较

很明显2者有类似,但是差别很大

同步主要是临界区、互斥、信号量、事件

进程间通信是管道、内存共享、消息队列、信号量、socket

共通之处是,信号量和消息(事件)

小结:

    1. 进程互斥、同步与通信的关系:进程竞争资源时要实施互斥,互斥是一种特殊的同步,实质上需要解决好进程同步问题,进程同步是一种进程通信,由此看来,进程互斥、同步都可以看做进程的通信;
    2. 信号量是进程同步与互斥的常用方法,也可以作为低级的进程通信方法,用于传递控制信号;

    3. 管道与管程是不同的,管程是进程同步的方式,而管道则是进程通信的方式;

标签:区别,队列,通信,信号量,互斥,线程,进程
From: https://www.cnblogs.com/lihongbing1997-1004/p/17076959.html

相关文章

  • DAPP 和 APP 有哪些区别?多链跨链 NFT 铸造dapp 系统开发技术原理分析
    DAPP智能合约开发流程是怎样?基本流程Asch有三种网络类型,分别是localnet,testnet,mainnet,后两种是发布到线上的,可以通过公网访问。第一种localnet是运行在本地的,只有一个......
  • Linux的多线程下使用c/c++调用Python方法示例
    首先,所有python的函数都是用extern"C"定义的,因此对于C和C++,其使用是一样的。c语言调用python必须要有的API(不管有没有多线程):  PyRun_SimpleString//执行一段......
  • python判断一个进程是否存在的3种方法
    在python中,如何判断一个进程是否存在呢?可以使用Popen执行shell命令判断进程是否存在,或者检查/proc目录下是否存在进程相对应的目录,最佳的方法是向进程发送信号0,下面分别介......
  • 解决多线程的安全问题方式二
    /***解决多线程中线程安全的方式二:同步方法,操作共享数据的是一个方法*1.同步方法仍然涉及到同步监视器,只是不需要显示的声明*2.非静态的同步方法,同步监视器是th......
  • c++多线程调用python
    脚本语言是快速编写富有弹性的代码的重要方法之一,在 Unix 系统自动化管理中已经应用了多种脚本语言。现在,在许多应用开发中,也提供了脚本层,这大大方便用户实现通用任务自......
  • Java线程
    从jdk1.0引入的Thread类和Runable接口,以及到后来的jdk1.5版本引入的Callable接口一:多线程原理进程就是操作系统对一个应用程序分配资源(比如:CPU,内存,磁盘、GPU,上下文环......
  • QT(c++) 线程 调用python问题
    1、背景简单说一下需求,Qt开发的上位机界面程序,需要调用Python编写的算法跑一个结果返回到界面上显示。2、度娘出一篇博客,按照步骤进行环境搭建和简单的代码测试......
  • 将docker容器作为进程来使用
    1.容器只是一个进程使用docker部署一个mysql服务,或者一个nginx服务,这些服务是持久存在的,加上环境的隔离特性,我一直都将docker容器的使用限定在容器这个范围内。在容器内,启......
  • python web框架多进程部署下数据库连接问题
    python常用的web框架,诸如flask,django,在生产部署时,都会选择多进程的部署方式,选用的中间件多为uwsgi或者gunicorn。如果项目里使用了数据库,那么就要考虑数据库连接在多进程下......
  • C++子线程中调用python代码
    项目需要C++调用python的算法,由于python算法比较耗时,因此采用在C++里启动workingthread来调用python脚本,python代码里含有cv2.imread()等opencv的调用,在子线程里调用会卡......