对进程和线程的整理

进程和线程的理解

每个进程都有自己的资源,而一个进程中又有多个线程。在不同的线程访问共享资源的时候,比如堆、全局变量、静态变量等等,有的资源需要独占,就可以加互斥锁(mutex),只允许此处的资源独占。有的资源有一定的容量,就会加信号量(semaphore)。所以我们可以看出进程与线程之间属于从属关系。线程的资源一定程度上受限于进程,但是线程的通信会比进程间通信更加快捷。线程是不同的任务,共同完成进程的功能。一般来说,一个进程在运行使用CPU时是独占一个核的,但是由于分时系统存在,所以可以有多进程并发。在多核中,每个核都可以跑一个进程,那么就可以实现并行

多进程和多线程之间如何通信

进程间通信(IPC)会使用管道(pipe,父子进程间),流管道(s_pipe,可双向的父子进程)和有名管道(FIFO),信号(signal,控制资源使用), 消息队列(message queue),共享内存(由一个进程创建,别的进程都可以访问的地址),信号量,套接字(socket,ROS就是采用该方法进行进程间通信) 进行通信。
共享内存是最快的方式,共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的,因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中,所以只能由处于同一个计算机系统中的诸进程共享。不方便网络通信。 共享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆写内存空间等竞争状态的出现。 不幸的是,Linux无法严格保证提供对共享内存块的独占访问,甚至是在您通过使用IPC_PRIVATE创建新的共享内存块的时候也不能保证访问的独占性。 同时,多个使用共享内存块的进程之间必须协调使用同一个键值。
线程一般采用锁,信号,信号量进行同一个进程内线程间通信。但是线程间有共享数据,所以也是可以直接进行内存的写,但是不同线程的数据同步就需要做一些优化。比如在OpenMP中就会有local variable去除false sharing。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多线程与多进程的特点

进程更加安全,进程间独立,一个进程挂了不会影响到别的进程。进程创建时间比较长,远远长于线程。进程相对于线程最大的区别是有内核保证的隔离:数据和错误隔离。对于使用如C/C++这些语言编写的本地代码,错误隔离是非常有用的:采用多进程架构的程序一般可以做到一定程度的自恢复。进程上下文切换时间高于线程上下文切换。线程有较轻的上下文切换开销,不用切换地址空间,不用更改CR3寄存器,不用清空TLB。进程间通信效率不如线程通信,线程可以进行方便高效的内存共享,多进程下内存共享比较不便,且会抵消掉多进程编程的好处。

线程在新建和回收的效率上很高,但它还是一个耗时的操作,所以需要线程池等来加快这一类操作。线程之间的通信可以直接访问内存。

什么时候使用线程和进程

多进程可以使得系统鲁棒性更高,出错的时候容易找到错误的地方,而且不影响别的进程。所以在绝大多数的自动驾驶操作系统中,会使用多进程的发案,比如ROS,比如Apollo。如果是分布式,就用多进程。
多线程可以进行快速创建和数据共享,进程创建的开销很大,上下文切换开销也稍微大一些,频繁创建进程去响应服务器的请求会造成极大的开销,而且会增加响应时间,所以在进行服务器响应的时候会采用多线程。如果是多核处理用多线程。

其实说了这么多,在Linux里面,进程和线程的实现是一样的,只是两者可以使用的资源不一样。没想到吧~ 所以选择多线程和多进程也没有绝对的,要看业务场景以及所拥有的资源。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值