进程那些事

目录

什么是进程

在ARTS的微信群里,看到布置的命题作业,为了弄清楚一个概念,那所谓的进程到底是什么?

作为程序员都知道,进程是一段程序代码,好像也对,也不对。我们有很多程序,基本都是由C或者C++写的程序代码,但不可能他们都叫进程吧。有时候,我们把程序代码加载在内存中,在CPU里执行的一段程序代码叫进程。也不对。CPU的频率那么高,可能在1s内运行无数个程序,那到底怎么才能称之为进程?

所谓的进程,我们可以把这个词语拆分来看,也就是:

不断进行输入运算输出的程序代码。

在面向进程设计的操作系统里,进程是程序的基本执行实体,在面向线程设计的操作系统中,进程不是基本运行单位,而是线程的容器。

一个操作系统的进程,可以读写下列数据:

  1. 可执行机器代码的镜像
  2. 分配到的存储器,包含可执行代码、特定进程的输入输出、调用堆栈、运行时堆栈。
  3. 分配给该进程的资源的操作系统描述符,如文件描述符、数据源和数据终端。
  4. 安全权限,例如进程拥有者和允许的操作权限。
  5. 处理器状态,例如寄存器内容、物理存储器定址。

进程在运行时,状态会变化。进程的状态有以下这些:

  1. 新生,进程刚创建。
  2. 运行,正在运行中
  3. 等待,等待事件的发生,比如用户输入完成,可称之为阻塞 blocked
  4. 就绪,排队中,等待CPU
  5. 结束,完成运行。

什么是线程

所谓的线程是操作系统可以进行运算调度的最小单位。以进程为容器,是进程的实际运行单位。通常情况下,把用户线程称为线程。

进程线程备注
虚拟地址空间共享当前进程
文件描述符共享当前进程
信号处理共享当前进程
调用栈
寄存器环境
线程本地存储

一个进程可以有很多线程,每条线程并行执行不同的任务。

线程的四种基本状态分别为:

  1. 产生
  2. 中断
  3. 非中断
  4. 结束

如何选择多进程/多线程

关于如何正确的选择,有些大牛的文章写得很清楚,用下面的表格进行了两者的对比:

对比维度多进程多线程总结
数据共享、同步数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂各有优势
内存、CPU占用内存多,切换复杂,CPU利用率低占用内存少,切换简单,CPU利用率高线程占优
创建销毁、切换创建销毁、切换复杂,速度慢创建销毁、切换简单,速度很快线程占优
编程、调试编程简单,调试简单编程复杂,调试复杂进程占优
可靠性进程间不会互相影响一个线程挂掉将导致整个进程挂掉进程占优
分布式适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单适应于多核分布式进程占优

参考链接

  1. wikipedia 进程
  2. wikipedia 线程
  3. 多线程还是多进程的选择及区别
  4. 进程与线程的一个简单解释
  5. Linux 下多线程和多进程程序的优缺点,各自适合什么样的业务场景

img