进程、线程——面经(一)

1、什么是进程(Process),线程(Thread),有什么区别?

进程(Process):

  1. 定义: 进程是一个独立的执行环境,它拥有独立的内存空间(包括代码段、数据段、堆、栈等)、打开的文件描述符集合、以及独立的运行状态。
  2. 每个进程都代表了一个正在执行的程序实例。
  3. 资源分配:进程是资源分配的基本单位,系统会给每个进程分配独立的资源,如内存地址空间、CPU时间片等。
  4.  上下文切换: 进程之间的切换开销比较大,因为涉及到虚拟内存空间的切换和上下文环境的保存与恢复。
  5. 应用场景: 适用于需要独立资源、保护或隔离的场景,如多任务处理、服务端应用。

线程(Thread)

  • 1. 定义:线程是进程内的执行流,是进程内的一个执行序列,共享进程的内存和资源。多个线程可以在同一进程中并发执行,共享相同的地址空间,访问相同的全局变量和资源。
  • 2. 轻量级:** 相较进程而言,线程是轻量级的,创建、销毁、切换开销较小。
  • 3. 通信:** 线程间通信比进程间通信简单,因为它们共享内存空间,可以直接访问相同的变量(但需注意同步问题)。
  • 4. 并发与并行:** 线程使得程序能够实现更细粒度的并发与并行执行,提高CPU的利用率和程序的响应速度。
  • 5. 应用场景:** 适合于需要并发处理任务、提高响应速度、并行计算效率的场景,如Web服务器、游戏、图像渲染等。

区别总结:

•资源和独立性:

        进程是资源分配的基本单位,拥有独立的内存空间和系统资源;

        线程共享所属进程的资源,轻量级。

•并发与并行:

        线程提供了更细粒度的并行执行,使得程序能更高效利用多核CPU。

•通信与同步:

        线程间通信更直接但需处理数据同步问题,进程间通信相对复杂。

•创建与切换开销:

        线程创建、切换、销毁和上下文切换比进程快,更适合需要频繁切换的场景。

2、多进程(Multi-Process)、多线程(Multi-Thread)的优缺点?

多进程和多线程是用于实现并发的两种常见方式,它们各自有一些优点和缺点。
 

多进程(Multi-Process)的优缺点:
优点:

  • 1.独立性高: 每个进程拥有独立的内存空间,进程之间互不干扰,因此不容易出现数据共享的问题。
  • 2.稳定性强: 如果一个进程崩溃了,通常不会影响其他进程,因为它们有各自独立的地址空间。
  • 3.利于多核处理器的利用: 多进程可以在多核处理器上并行执行,充分利用了硬件资源。

缺点:

  • 4.资源消耗大: 每个进程都需要独立的内存空间和系统资源,创建和销毁进程的开销比较大。
  • 5.切换代价高: 进程切换需要保存和恢复进程的上下文,切换代价较高。
  • 6.通信复杂: 进程之间的通信需要借助操作系统提供的IPC(Inter-Process Communication)机制,通常较为复杂。

多线程(Multi-Thread)的优缺点:
优点:

  • 7.资源消耗小: 线程共享同一进程的地址空间和系统资源,创建和销毁线程的开销相对较小。
  • 8.切换代价低: 线程切换只需要保存和恢复线程的上下文,切换代价比进程低。
  • 9.通信简单: 线程之间可以直接访问同一进程的共享变量,通信相对简单。

缺点:

  • 10.同步与互斥问题: 多个线程共享内存空间,容易出现竞态条件和数据同步问题,需要使用锁等同步机制进行保护。
  • 11.安全性难以保证: 由于线程共享进程的地址空间,一个线程的错误可能导致整个进程的崩溃。
  • 12.编程复杂度高: 多线程编程需要考虑线程同步、死锁等问题,相比单线程程序,编程难度较大。

综上所述,多进程适合CPU密集型任务和需要稳定性的应用,而多线程适合IO密集型任务和需要高并发的应用。在实际开发中,通常会根据具体的需求和场景选择合适的并发模型。

3、多进程、多线程同步通讯的方法?

多进程同步通信方法:

  1. 管道(Pipe): 管道是一种最简单的进程间通信方式,可以实现单向或双向通信。在Unix/Linux系统中,可以使用pipe()系统调用创建匿名管道,进程可以通过读写管道来进行通信。

  2. 命名管道(Named Pipe): 与管道类似,但是可以通过文件系统进行跨进程通信。可以使用mkfifo()函数创建命名管道。

  3. 消息队列(Message Queue): 进程可以通过消息队列发送和接收消息,实现进程间的通信。消息队列提供了一种可靠的、异步的通信方式,可以在不同进程之间传递数据。

  4. 共享内存(Shared Memory): 多个进程可以映射同一块共享内存,实现进程间的数据共享。通过共享内存,多个进程可以直接读写共享数据,效率较高。

  5. 信号量(Semaphore): 信号量是一种用于进程间同步的计数器,可以用来解决进程间的互斥和同步问题。通过P、V操作对信号量进行加锁和解锁。

  6. 套接字(Socket): 进程可以通过网络套接字进行通信,实现跨网络的进程间通信。套接字通信可以在本地或远程机器上进行。

多线程同步通信方法:

  1. 锁(Lock): 锁是最常用的多线程同步机制,包括互斥锁(Mutex)、读写锁(Read-Write Lock)等。通过获取和释放锁,线程可以实现对共享资源的互斥访问。

  2. 条件变量(Condition Variable): 条件变量用于线程之间的信号通知,线程可以在条件变量上等待某个条件的发生,也可以通过条件变量发送信号通知其他线程。

  3. 信号量(Semaphore): 信号量也可以用于线程间的同步,实现线程之间的互斥和同步操作。

  4. 屏障(Barrier): 屏障用于在多个线程之间设置同步点,当所有线程都到达同步点时才能继续执行。

  5. 线程间的通信原语: 包括生产者-消费者问题中的阻塞队列、线程安全的队列等。

4.父进程、子进程的关系以及区别?

  1. 子进程是由父进程调用创建新进程的系统调用(如fork())而生成的。
  2. 每个进程都有唯一的进程ID(PID),父进程和子进程的PID不同。
  3. 父进程和子进程拥有各自独立的内存空间,它们之间不共享内存。
  4. 子进程会继承父进程的一些资源和属性,例如文件描述符、信号处理方式等。不过,子进程通常会执行exec系列函数,替换自己的内存空间,因此在执行时会丢失一些父进程的属性。
  5. 子进程可以通过调用exit()函数来退出,父进程可以通过调用wait()函数等待子进程退出,并获取子进程的退出状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux应用入门(二)

1. 输入系统应用编程 1.1 输入系统介绍 常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等。用户经过这些输入设备与Linux系统进行数据交换。这些设备种类繁多,如何去统一它们的接口,Linux为了统一管理这些输入设备实现了一套能兼容所有输入设备的…

怎么压缩pdf pdf在线压缩 pdf文件压缩大小

pdf文件无论在何种设备上打开,PDF文件都能保持其原始的布局和格式,这对于文档共享和打印非常重要。PDF不仅支持文本,还能嵌入图像、视频、音频以及动态链接等元素。PDF文件支持加密和密码保护,可以限制访问、编辑、复制或打印文档…

C语言----深入理解指针(3)

1.字符指针变量 //int main() //{ // char ch w; // char*pc&ch; // printf("%c", *pc); // return 0; //}/*int main() {//char* p "abcdef";//char arr[] "abcdef";//常量字符串 a b c d e f \0//char* pc arr;//将数组首…

高防IP是什么意思?

在网络安全中,企业和用户经常会受到网络攻击和流量攻击,比如DDOS攻击和CC攻击等,那么对于这些网络攻击,企业和用户有什么解决方案呢? 对于网络攻击,高防IP是一种针对网络攻击和分布式拒绝服务攻击设计的IP解…

【002】FlexBison原理分析

0. 前言 Flex和Bison是用于构建处理结构化输入的程序的工具。它们最初是用于构建编译器的工具,但它们已被证明在许多其他领域都很有用。  在第一章中,我们将首先看一点(但不是太多)它们背后的理论,然后我们将深入研究一些使用它…

K8S认证|CKA题库+答案| 5. 创建 Ingress

5 . 创建 Ingress 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node k8s master …

基于Tensorflow卷积神经网络垃圾智能分类系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着城市化进程的加速,垃圾问题日益严重,垃圾分类成为解决这一问题的关…

浅谈金融行业数据安全分类分级

数据安全管理是一项从上而下的、多方配合开展的工作。在进行数据安全管理组织架构建设时,需要从上而下建设;从而全面推动数据安全管理工作的执行和落地;以保证数据安全的合法合规、并长效推动业务的发展和稳定运行。 金融行业机构应设立数据…

「项目」负载均衡在线OJ(ONLINE_JUDGE)系统

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

机器学习系列--强化学习

强化学习(Reinforcement Learning,RL)是一种机器学习方法,旨在通过智能体(Agent)在环境(Environment)中采取行动(Actions)并获取反馈(Reward&…

技术驱动未来,全面揭秘 Sui 的生态发展和布局

在不到一年的时间里,由 Mysten Labs 团队创立的 Layer1 区块链 Sui 迅速崛起,成功跃升至去中心化金融(DeFi)的前十名。根据 DeFi Llama 的数据,Sui的总锁定价值(TVL)在短短四个月内增长超过 100…

13-云原生监控体系-Mysqld_exporter 监控 MySQL[部署Dashborad告警规则实战]

文章目录 1. 部署1.1. 二进制方式部署1.1.1. 下载1.1.2. 部署1.1.3. MySQL 服务的配置1.2 docker-compose 方式1.3 配置 Prometheus1.4 测试1.5 mysqld_exporter 命令行运行参数1.5.1. 配置格式1.5.2. 运行参数详解1.5.3. 监控不同的集群2. Dashboard2.

【好玩的经典游戏】Docker环境下部署retroarch-web经典游戏模拟器

【好玩的经典游戏】Docker环境下部署retroarch-web经典游戏模拟器 前言一、RetroArch-web介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查Docker服务状态四、拉取镜像五、创建retroarch-web容器5.1 创建容器5.2 查看容器状态六…

深度学习之基于Tensorflow+Flask框架Web手写数字识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是深度学习领域中的一个经典问题,也是计算机视觉领域的重要应用之一。…

BFT Robotics - 您的智能自动化伙伴

“买机器人,上BFT” 自动化和机器人技术是推动现代工业发展的重要力量。BFT Robotics以其创新的产品系列和定制化解决方案,为企业提供了一条通往高效、智能生产环境的道路。通过采用BFT Robotics的产品和服务,企业不仅能够提高生产效率&#…

编程语言的集合判断逻辑

当判断一个Item是否在集合中,比如List,Map,Array等,只可以判断真,不可以判断假。 如果执着判断,也可以通过设置标志位去实现,这样代码就会显得臃肿,效率低下。 比如 list.forEach…

js JSON.stringify 对象转字符串

通过 JSON.stringify() 把 JavaScript 对象转换为字符串 注: 在 JSON 中,不允许日期对象。JSON.stringify() 函数将把任何日期转换为字符串。在 JSON 中,不允许函数作为对象值。 JSON.stringify() 函数将从 JavaScript 对象删除任何函数&am…

iView实现表格拖拽列宽度,列显示顺序及显示字段

需要实现表格列宽度调整,选择展示表格字段,以及显示顺序,先看效果,每次变动后保存到本地缓存中,也可以与后台配合保存到数据库,实现用户自定义表格. 1.安装vuedraggable实现拖拽 npm i vuedraggable2.新建组件 FilterColumns.vue 我这里默认把操作列放到最后一个并且不允许…

机器学习(五) -- 监督学习(3) -- 决策树

系列文章目录及链接 上篇:机器学习(五) -- 监督学习(2) -- 朴素贝叶斯 下篇:机器学习(五) -- 监督学习(4) -- 集成学习方法-随机森林 前言 tips&#xff1a…