你要知道的「进程」那些事

进程和线程

进程,指运行中的程序。
在没有线程前,进程如果阻塞,就会被挂起,即使其中有些操作并不依赖于等待的资源,仍旧不会执行。

为了解决这个问题,操作系统引入了线程,作为进程中的一条执行流程。一个进程包含多个线程,线程作为任务的真正执行者,有自己的寄存器和栈。同时,会和进程内其他线程共享虚拟内存等资源。

相比进程,线程开销更小。因为它需要的资源比进程少,所以创建、切换都会比进程快。并且,线程间数据传递无需经过内核,效率更高。

在实现上,线程可以分为用户线程和内核线程。

  • 用户线程,无需用户态和内核态的切换,速度快。
    但由于操作系统不参与线程调度,所以一旦某个用户线程阻塞,那其他的也不能执行。
  • 而内核线程相反,某个内核线程阻塞,并不会影响其他的。
    但需要用户态和内核态的切换,速度慢。

进程状态

有六种,分别为创建、就绪、运行、结束、阻塞和挂起。

  • 进程被创建后,进入创建状态。初始化后,进入就绪状态,等待被调度。
  • 成功被调度后,进入运行状态,占用 CPU。运行完毕后,进入结束状态。
  • 运行中的进程,若要等待资源,则进入阻塞状态。得到资源后,重新进入就绪状态。
  • 另外,还有一个挂起状态,表示进程不在内存,而是在硬盘上。

进程调度

有六种,

  • 先来先服务:选择最先进入的进程来运行,有利于长作业。
  • 最短作业优先:选择运行时间最短的进程来运行,有利于短作业。
  • 高响应比优先:选择高响应比的进程来运行,以平衡长短作业。
  • 时间片轮转:允许进程在分配的时间片内运行。若时间片用完,则释放进程。
  • 最高优先级:选择最高优先级的进程来运行。但低优先级的进程永远不会运行。
  • 多级反馈队列:
    • 设置了多个队列,优先级从高到低,同时优先级越高时间片越短。
    • 对于短作业,可以很快在第一级队列处理完。对于长作业,若在第一级队列处理不完,则移入下级队列,虽然等待时间变长,但时间片也会变长。从而很好兼顾了长短作业,同时有不错的性能

进程通信

有六种,分别为管道、消息队列、共享内存、信号量、信号、Socket,

  • 管道:保存内核里的一串缓存,使用先进先出的单向传输,实现简单,但不适合进程间频繁通信。分为匿名和命名管道,匿名管道:只能在父子进程间通信。而命名管道:可以在不相关的进程间通信。
  • 消息队列:保存在内核中的消息链表,通信方式像发邮件,你来一封,我回一封,可以频繁通信。但不及时,有大小限制,不适合大数据的通信。
  • 共享内存:进程共享同一块内存空间。这样,这个进程写入的数据,另一个进程马上就能看到,大大提高了通信的速度。但需要依靠一些同步操作,如锁和信号量。
  • 信号量:一个整型的计数器,表示资源的数量,有两个原子操作:
    • P 操作:减 1,若信号量小于 0,则进入阻塞等待。
    • V 操作:加 1,若信号量不大于 0,则唤醒一个等待的进程。
    • 若信号量初值为 0,则为同步量。为 1,则为互斥量(可用来实现生产者-消费者问题)。
  • 信号:进程通信中唯一的异步通信机制,用于在异常情况下通知进程。
  • Socket:用于不同主机间的进程通信。 建立的方式有:TCP 和 UDP。
posted @ 2021-11-15 10:49  ayuecoding  阅读(70)  评论(0)    收藏  举报