操作系统相关问题:进程和线程的区别以及如何进行通信

进程与线程的关系

  • 进程是具有一定独立功能的程序(运行环境),它是系统进行资源分配和调度的一个基本单位;
  • 线程是进程的一个实体,是CPU调度和分配的基本单位;
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程);
  • 进程就像一个容器,不能用来运行代码,真正运行代码的是进程里的线程
  • 同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源相互独立
  • 线程在执行过程中,需要协作同步,不同进程的线程间要利用消息通信的方法实现同步
  • 真正在处理机上运行的是线程
  • 线程是指进程内的一个执行单元,也是进程内的可调度实体;
  • CPU内核的个数与可同时运行的进程数相同。相反,若进程数超过核数,进程将分时使用CPU资源。
  • 线程数量进程的空间资源线程本身栈大小确定。

进程和线程的选取

  • 需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
  • 线程的切换速度快,在需要大量计算切换频繁耗时操作时,使用线程可提高应用程序的响应
  • 线程对CPU系统的效率使用更占优势,所以多机分布的用进程多核分布线程
  • 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
  • 需要更稳定安全时,适合选择进程;需要速度时,选择线程更好;
  • 当涉及较多同步阻塞操作时,或者不得不需要较多实例时考虑多进程

进程的五种状态

  1. 创建状态

    ​ 先由进程申请一个空白的进程控制块(PCB),并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入到就绪队列中。

  2. 就绪状态

    ​ 进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU,便可立即执行。如果系统中有许多处于就绪状态的进程,通常将它们按照一定的策略排成一个队列,该队列称为就绪队列有执行资格,没有执行权的进程。

  3. 运行状态

    ​ 进程已经获取CPU,其进程处于正在执行的状态。对任何一个时刻而言,在单处理机的系统中,只有一个进程处于执行状态;而在多处理机系统中,有多个进程处于执行状态。既有执行资格,又有执行权的进程。

  4. 阻塞状态

    正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态,即进程执行受到阻塞。此时引起进程调度,操作系统把处理机分配给另外一个就绪的进程,而让受阻的进程处于暂停的状态。

  5. 终止状态

    ​ 先等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还给系统:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能再执行,但是操作系统中仍然保留了一个记录,其中保存状态码和一些计时统计数据,供其他进程进行收集。一旦其他进程完成了对其信息的提取之后,操作系统将删除其进程,即将其PCB清零,并将该空白的PCB返回给系统。

五种状态间的转移

  1. 活动就绪->静止就绪:处于活动就绪状态的进程因挂起而转入静止就绪状态;
  2. 活动就绪->执行:处于活动就绪状态的进程因调度而执行;
  3. 静止就绪->活动就绪:处于静止就绪状态的进程因激活而转入活动就绪状态;
  4. 活动阻塞->静止阻塞:处于活动阻塞状态的进程由于挂起操作而进入静止阻塞状态;
  5. 活动阻塞->活动就绪:处于活动阻塞状态的进程由于所请求的资源得以满足而进入活动就绪状态;
  6. 静止阻塞->活动阻塞:处于静止阻塞状态的进程由于激活而进入活动阻塞状态;
  7. 静止阻塞->静止就绪:处于静止阻塞状态的进程由于所请求的资源得以满足而进入静止就绪状态;
  8. 执行->活动阻塞:执行状态的进程由于所请求的资源无法满足而进入活动阻塞状态;
  9. 执行->静止就绪:执行状态的进程由于挂起操作而进入静止就绪状态;
  10. 执行->活动就绪:执行状态的进程由于时间片用完而进入活动就绪状态;
  11. 执行->终止:从执行到死亡;

进程控制块PCB中的信息

  1. 进程标记符
  2. 处理机状态
  3. 进程调度信息
  4. 进程控制信息

进程间通信方式

​ 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信

应用场景:

  • 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
  • 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
  • 资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
  • 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

通信方式:

  1. 匿名管道(pipe)通信

    ​ 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有父子进程关系的进程间使用。

实现步骤:

​ 1. 父进程创建管道,得到两个文件描述符指向管道的两端;

​ 2. 父进程fork子进程,子进程也有两个文件描述符指向同一个管道;

​ 3. 父进程关闭管道读端fd[0],子进程关闭管道写端fd[1],管道用环形队列实现。

  1. 高级管道(popen)通信

    ​ 将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程

  2. 有名管(named pipe)道通信

    半双工的通信方式,但允许非父子关系的进程间通信。

  3. 消息队列(message queue)通信

    ​ 存放在内核中并由消息队列标识符标识。克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  4. 信号量(semophore)通信

    ​ 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。常作为一种锁机制,防止某个进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间同步手段。

  5. 信号(signal)

    ​ 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

  6. 共享内存(shared memory)通信

    ​ 映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制配合使用,来实现进程间的同步和通信。

  7. 套接字(socket)通信

    ​ 套接字也是一种进程间的通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。

通信方法无法介于内核态与用户态的原因
管道(不包括命名管道)局限于父子进程间的通信。
消息队列在硬、软中断中无法无阻塞地接收数据。
信号量无法介于内核态和用户态使用。
内存共享需要信号量辅助,而信号量又无法使用。
套接字在硬、软中断中无法无阻塞地接收数据。

内核和用户通信

  • 用户任务发起:

    • 系统调用
    • ioctl()
    • proc文件系统
    • 虚拟文件系统
    • 内存映像(用户空间共享内核空间中的一块内存)
  • 内核任务发起:

    • 信号
    • Netlink
    • brk系统调用导出内核数据

为什么使用线程

  • 创建进程的开销很大,而创建线程的开销很小;

  • 线程可以共享相同的地址空间和资源;

  • 线程可以并发地执行,切换速度快,效率高。

串行、并行与并发的区别

  • 串行:一个任务执行完,再执行下一个任务。

  • 并行同一时刻执行多个任务,不等一个任务执行完就切换。

  • 并发一段时间内切换执行多个任务,且切换的间隔很短,使得看上去是在同时执行多任务。

  • 并行与否程序员无法控制,只能让操作系统决定。

产生死锁的必要条件

死锁是指多个进程在运行过程中因争夺资源而造成的一种阻塞的现象。

产生死锁的原因

  1. 竞争系统资源

    ​ 产生死锁中的竞争资源之一指的是竞争不可剥夺资源(例如:系统中只有一台打印机,可供进程P1使用,假定P1已占用了打印机,若P2继续要求打印机打印将阻塞)

  2. 进程的推进顺序不当

    ​ 产生死锁中的竞争资源另外一种资源指的是竞争临时资源(临时资源包括硬件中断、信号、消息、缓冲区内的消息等),通常消息通信顺序进行不当,则会产生死锁

产生死锁的必要条件

  1. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
  2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不可剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
  4. 环路等待条件:在发生死锁时,必然存在一个 进程<—>资源 的环形链。

解决死锁的基本方法

  • 预防死锁: 通过设置一些限制条件,去破坏产生死锁的必要条件

    • 资源一次性分配:一次性分配所有资源,这样就不会再有请求了。(破坏请求条件
    • 只要有一个资源得不到分配,也不给这个进程分配其他的资源。(破坏请求保持条件
    • 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源。(破坏不可剥夺条件
    • 资源有序分配:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反。(破坏环路等待条件
  • 避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁

  • 检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉

  • 首先为每个进程每个资源指定一个唯一的号码

  • 然后建立资源分配表进程等待表

  • 解除死锁:该方法与检测死锁配合使用

    • 剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
    • 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用、死锁状态消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力不熬夜的小喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值