Skip to content

进程、线程与协程

代码

进程、线程和协程是计算机程序执行的三种不同方式,它们在资源管理和执行模型上各有特点。

进程

  • 进程是操作系统分配资源的基本单位。每个进程都有自己独立的内存空间、数据段、代码段等。

特点:

  • 进程之间相互独立,安全性高。
  • 进程切换开销大,因为需要切换内存空间。
  • 适合多任务并行处理。

线程

  • 线程是进程中的一个执行单元,是 CPU 调度的基本单位。一个进程可以包含多个线程,它们共享进程的内存空间。

特点:

  • 线程之间共享内存,通信方便。
  • 线程切换开销小于进程。
  • 适合需要频繁切换的任务。

协程

  • 协程是一种用户态的轻量级线程。它们由程序员在用户空间调度,而不是由操作系统内核调度。

特点:

  • 协程切换开销极小,因为不涉及内核态的切换。
  • 协程可以保存执行状态,方便暂停和恢复。
  • 适合 I/O 密集型任务和高并发场景。

对比

  • 资源消耗:进程 > 线程 > 协程
  • 切换开销:进程 > 线程 > 协程
  • 并发能力:协程 > 线程 > 进程(在 I/O 密集型任务中)

适用场景

  • 进程:适用于需要高隔离性和稳定性的任务,如独立的服务或应用。
  • 线程:适用于需要并发处理的计算密集型任务。
  • 协程:适用于高并发和 I/O 密集型任务,如网络服务器、爬虫等。 理解这三者的区别和适用场景,可以帮助你在开发中选择合适的并发模型,提高程序的性能和效率。

同源策略与跨域

代码

限制对象

  • cookie、localStrong、sessionStrong、indexDB 无法进行读取。
  • DOM 无法获取
  • AJAX 不能发送请求

不限制对象

  • 图片、脚本、样式表、视频、音频等资源不受同源策略限制。
  • 插件、Flash 等不受同源策略限制。
  • img
  • link
  • background-image
  • iframe
  • script

linux下进程间通信

代码
  • 管道(Pipe)及有名管道(named pipe)
    • 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
  • 信号(Signal)
    • 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
  • 报文(Message)队列(消息队列)
    • 克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 信号量(semaphore)
    • 主要作为进程间以及同一进程不同线程之间的同步手段。
  • 套接口(Socket)
    • 更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
  • 共享内存(Shared Memory)
    • 使得多个进程可以访问同一块内存空间,是最快的可用 IPC 形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。