了解进程,线程之间的关系

简介: 如果一个进程B是由进程A开启,则A是B的父进程,B是A的子进程,子进程会继承父进程的一些信息,但仍然保持相对独立

进程


一个应用程序,总是通过操作系统启动的,当操作系统启动一个应用程序时,会给其分配一个进程


一个进程拥有独立的、可伸缩的内存空间,原则上不受其他进程干扰


进程之间是可以通信的,只要两个进程双方遵守一定的协议,比如ipc


CPU在不同的进程之间切换执行


虽然一个应用程序在启动时只有一个进程,但它在运行的过程中,可以开启新的进程,进程之间仍然保持相对独立


如果一个进程是直接由操作系统开启,则它叫做主进程


如果一个进程B是由进程A开启,则A是B的父进程,B是A的子进程,子进程会继承父进程的一些信息,但仍然保持相对独立


nodejs 开启进程
// nodejs 中开启子进程
const childProcess = require("child_process"); // 导入内置模块
childProcess.exec(在子进程运行的命令, (err, out, stdErr) => {
  // 回调函数中可以获取子进程的标准输出,这种数据交互是通过IPC完成的,nodejs已经帮你完成了处理
  // err:开启进程过程中发生的错误
  // out: 子进程输出的正常内容
  // stdErr: 子进程输出的错误内容
  // 子进程发生任何的错误,绝不会影响到父进程,它们的内存空间是完全隔离的
});
// 过去,nodejs没有提供给用户创建线程的接口,只能使用进程的方式
// 过去,nodejs还提供了cluster模块,通过另一种模式来创建进程
// 现在,nodejs已经提供了线程模块,对进程的操作已经很少使用了


线程


操作系统启动一个进程(无论是主进程,还是子进程),都会自动为它分配一个线程,称之为主线程


程序一定在线程上运行!!


主线程在运行的过程中,可以创建多个线程,这些线程称之为子线程


当操作系统命令CPU去执行一个进程时,实际上,是在该进程的多个线程中切换执行


线程和进程很相似,它们都是独立运行,最大的区别在于:线程的内存空间没有隔离,共享进程的内存空间,线程之间的数据不用遵守任何协议,可以随意使用


什么时候要使用线程?


使用线程的主要目的,是为了充分使用多核cpu。线程执行过程中,尽量的不要阻塞。


最理想的线程效果:


1.线程数等于cpu的核数

2.线程永不阻塞

  1.没有io

  2.只存在大量运算

3.线程相对独立,几乎不使用共享数据


线程一般处理cpu密集型操作(运算操作),而io密集型操作不适合使用线程,而适合使用异步


为了避免线程执行过程中共享数据产生的麻烦,nodejs使用独特的线程机制来尽力规避:


// 创建子线程的父线程,主进程
const { Worker } = require("worker_threads");
const worker = new Worker(线程执行的入口文件, {
  workerData: 开启线程时向其传递的数据,
}); // worker是子线程实例
// 通过EventEmitter监听子线程的事件
worker.on("exit", () => {
  // 当子线程退出时运行的事件
});
worker.on("message", (msg) => {
  // 收到子线程发送的消息时运行的事件
});
worker.postMessage(任意消息); // 父线程向子线程发送任意消息
worker.terminate(); // 退出子线程
子进程里面
const {
  isMainThread, // 是否是主线程
  parentPort, // 用于与父线程通信的端口
  workerData, // 获取线程启动时传递的数据
  threadId, // 获取线程的唯一编号
} = require("worker_threads");
parentPort.on("message", (msg) => {
  // 当收到父线程发送的消息时,触发的事件
});
parentPort.postMessage(workerData); // 向父线程发送消息


相关文章
|
17天前
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
45 1
|
20天前
|
分布式计算 JavaScript 前端开发
多线程、多进程、协程的概念、区别与联系
多线程、多进程、协程的概念、区别与联系
29 1
|
19小时前
|
数据处理 调度 Python
Python并发编程实战指南:深入理解线程(threading)与进程(multiprocessing)的奥秘,打造高效并发应用!
【7月更文挑战第8天】Python并发编程探索:使用`threading`模块创建线程处理任务,虽受限于GIL,适合I/O密集型工作。而`multiprocessing`模块通过进程实现多核利用,适用于CPU密集型任务。通过实例展示了线程和进程的创建与同步,强调了根据任务类型选择合适并发模型的重要性。
|
18小时前
|
大数据 API 数据处理
Python高手都在用的并发秘籍:解锁线程与进程的终极奥义,性能飙升不是梦!
【7月更文挑战第8天】Python并发编程提升性能,线程(threading)适合I/O密集型任务,如网络请求,通过`start()`和`join()`实现并发。进程(multiprocessing)利用多核CPU,适用于CPU密集型任务,如大数据处理。结合两者可优化混合任务,实现最佳并发效果。
5 1
|
3天前
|
消息中间件 安全 Java
线程和进程的区别及应用场景
线程和进程的区别及应用场景
|
7天前
|
消息中间件 安全 Java
线程和进程的区别及应用场景
线程和进程的区别及应用场景
|
12天前
|
数据采集 Java Unix
10-多线程、多进程和线程池编程(2)
10-多线程、多进程和线程池编程
|
12天前
|
安全 Java 调度
10-多线程、多进程和线程池编程(1)
10-多线程、多进程和线程池编程
|
18天前
|
安全 Java Python
GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。
【6月更文挑战第20天】GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。线程池通过预创建线程池来管理资源,减少线程创建销毁开销,提高效率。示例展示了如何使用Python实现一个简单的线程池,用于执行多个耗时任务。
22 6
|
14天前
|
算法 API 调度