深入了解进程和线程

面试必备知识

一.什么是进程

我们先通过概念来理解一下进程
进程 是程序的一次执行过程,是资源分配和任务管理的基本单位,每一个进程都有自己的地址空间。

有时候我们会把程序和进程的概念混淆,这里做一个区分

  • 进程(动态)
    是程序的一次动态执行过程,是一个独立的可调度的任务,是程序执行和资源管理的最小单位

  • 程序(静态)
    是保存在内存中的代码指令的集合没有执行的概念

一.进程的线程的基本区别

  1. 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
  2. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段,堆栈段和数据段,这种操作非常的耗资源
    而线程是共享进程中的数据的,使用相同的地址空间,因此cpu切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也要比进程小很多
  3. 线程之间的通讯更方便,同一进程下的线程共享全局变量,静态变量等数据
    而进程之间的通信需要以通信的方式(IPC)进行
  4. 但是多进程程序更健壮,多线程程序只要有一个线程死掉,那么整个进程也死掉了,而一个 进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间

二.进程与线程的资源

1.堆与栈

  • 堆:是大家共有的空间,分全局堆和局部堆,全局堆就是所有没有分配的空间,局部堆就是用户 分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以
    向系统要额外的堆,但是记得用完之后要释放空间还给操作系统,要不然就会造成内存泄漏

  • 栈: 是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每一个线程的栈独立,因此栈是比较安全的。

2.其他

线程共享的环境
进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

线程的独有的资源
进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括

  1. 线程ID
    每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标
    识线程。
  2. 寄存器组的值
    由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线
    程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便
    将来该线程在被重新切换到时能得以恢复。
  3. 线程的堆栈
    堆栈是保证线程独立运行所必须的。
    线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程
    必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影
    响。
  4. 错误返回码
    由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用
    后设置了errno值,而在该线程还没有处理这个错误,另外一个线程就在此时
    被调度器投入运行,这样错误值就有可能被修改。
    所以,不同的线程应该拥有自己的错误返回码变量。
  5. 线程的信号屏蔽码
    由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自
    己管理。但所有的线程都共享同样的信号处理器。
  6. 线程的优先级
    由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参
    数,这个参数就是线程的优先级。

三. 进程间的通讯方式和线程同步

进程:无名管道、有名管道、信号、共享内存、消息队列、信号量
线程:互斥量、读写锁、自旋锁、线程信号、条件变量

详细大家可以参考这篇文章

进程间的通讯方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值