为什么有了进程,还要有线程呢?

进程可以使多个程序并发执行,以提高资源的利用率和系统的吞吐量,但是其带来了一些缺点:

  1. 进程在同一时间只能干一件事情;

  2. 进程在执行的过程中如果阻塞,整个进程就会被挂起,即使进程中有些工作不依赖与等待的资源,仍然不会执行。

基于以上的缺点,操作系统引入了比进程粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时间和空间开销,提高并发性能。

发表评论

后才能评论

评论(8)

  • 文峯 普通 2022-05-06 10:30 下午

    多进程依然会存在问题:

    进程之间如何通信,共享数据?
    维护进程的系统开销较大,如创建进程时,分配资源、建立 PCB;终止进程时,回收资源、撤销 PCB;进程切换时,保存当前进程的状态信息;

  • mpweixin用户 普通 2022-03-20 10:29 下午

    其实是因为进程间通信很麻烦,共享资源非常麻烦,所以才开线程来共享堆这些资源更加方便

  • 一叶知秋 普通 2022-03-05 9:39 上午

    进程在同一时间只能干一件事情,那线程在同一时间不是也只能干一件事情吗?有点不懂

    • 帅地 永久会员 @ 一叶知秋 2022-03-05 10:56 下午

      一个程序启动,等价于一个进程启动,也就是说,一个程序只有是一个进程,而可以有多个线程,因为一个进程里面可以包含多个现场

    • mpweixin用户 普通 @ 一叶知秋 2023-01-18 5:34 下午

      比如,你在使用word,实际上是打开了多个线程。
      这些线程一个负责显示,一个接收输入,一个定时进行存盘。这些线程一起运转,让我们感觉到输入和显示
      同时发生,而不用键入一些字符,等待一会儿才显示到屏幕上。

  • 傅小司 2021-08-18 2:48 下午

    第3里说进程是并发执行的单位,这里说线程是并发执行的基本单位,感觉好像有点容易混淆?

    • shuaidi 永久会员 @ 傅小司 2021-08-18 2:59 下午

      怎么说呢,在有一些语言中,例如 PHP,其实没有线程的概念,这个时候只有进程,那么并发必须是多进程了。

      在 Java 中,有线程的概念,那么一个进程里可以有多个线程去并发。这个时候相当于,线程是进程的一个实体,就像 类 和实例一样。

      在 Go 语言里,有协程的概念(比线程力度更小),相当于多个协程可以由一个线程来执行。

      不知道你能不能明白我说的意思,我觉得你理解进程,线程,协程的本质是最重要的,那些基本单位,最小单位,执行单位,感觉没必要抠的那么细。