进程那些事

什么是进程

在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 下多线程和多进程程序的优缺点,各自适合什么样的业务场景

发表评论

电子邮件地址不会被公开。 必填项已用*标注