腊月的季节

进程与线程的联系和区别

线程的基本概念

线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行(引起线程安全的原因)。这句话总的来说就是,进程里面放的是一个系统的所有资源,然后开了一个线程,这个线程对资源具有相应的操作,并且每个进程必定有一个线程,否则进程资源无效。
我认为创建线程的主要目的就是把拥有的资源和操作资源的过程分开,分开之后有什么好处呢。我可以开多个线程啊,开多个线程就能操作资源,多方便啊。也许你们还有疑问,难道我不能多开一个进程吗?那你想一下,如果这样那么就不需要线程,你开一个进程也就是说每个资源你都要复制一遍,存储起来,然后再用进程进行操作。这样多麻烦呀。所以人们就把线程给想出来了,我把资源给放到进程里面,然后再开线程去操作这些资源,而且我开线程也不用复制资源,直接使用,是不是很方便,伟大的人们真会想。哈哈。不说了,能理解就行。

线程的优点

  • 易于调度(这跟他不拥有资源是有一定关系的)
  • 提高并发性。通过线程可方便有效地实现并发性。进程可以创建多个线程来执行同一程序的不同部分。(刚才已经说了,线程不需要拥有资源,直接拿资源来用,所以这也是他的有效性)
  • 开销少。创建线程要比创建进程要快(还是那个原因)
  • 利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。(不知道你们这看懂了没,有人会问,我擦,你每个线程在不同的处理器上运行,不就乱了套了吗?那我只想说,你对计算机内部不了解,计算机有内存,硬盘,CPU(处理器,寄存器等),其实你的资源都在内存里,处理器只是做运算的或者是I/O的)

    进程的基本状态及状态之间的关系

    状态:运行、阻塞、挂起阻塞、就绪、挂起就绪
    状态之间的转换:准备就绪的进程,被CPU调度执行,变成运行态;
    运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态
    运行中的进程,进程执行完毕(或者时间片已到),变成就绪态
    将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成,挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态。
    将就绪(或运行)中的进程挂起,变成挂起就绪态,当进程恢复之后,挂起就绪态变成就绪态。

    线程与进程的关系

  • 一个线程只属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  • 处理机分给线程,即真正在处理机上运行的线程。
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元也是进程内的可调度的实体。
    意思就是说,你有进程没得线程都是白搭,线程是进程运行的最小单位。

    线程与进程的区别

  • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
  • 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
  • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源
  • 系统开销:在创建或者撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销。

    进程间的通信方式

  • 管道:管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
  • 信号:信号是在软件层次上对中断机制的一种模拟,他是比较复杂的通信方式,用于通知进程有某件事发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说一致的。
  • 消息队列:消息队列是消息的链表,它克服了以上两种通信方式中信号量有限的缺陷,具有写权限的进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息。
  • 共享内存:可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
  • 信号量:主要作为进城之间及同一种进程的不同线程之间得同步和互斥手段。
  • 套接字:这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

    进程或线程I/O阻塞

    关于I/O操作为什么要被阻塞,想必很多人有这样的问题,那么我今天就总结一下。
    IO所需要的CPU资源非常少,大部分工作是分派给了DMA完成的。
    对于磁盘I/O,CPU是不会直接和硬盘对话的,他们之间有个中间人,叫DMA芯片
    CPU计算文件地址==>委派DMA读取文件==>DMA接管总线==>CPU的A进程阻塞,挂起==>CPU切换到B进程==>DMA读完文件后通知CPU(一个中断异常)==>CPU切换回A进程操作文件

计算机硬件上使用DMA来访问磁盘等IO,也就是请求发出后,CPU就不再管了,直到DMA处理器完成任务,再通过中断告诉CPU完成了。所以,单独的一个IO时间,对CPU的占用是很少的,阻塞了就更不会占用CPU了,因为程序都不继续运行了,CPU时间交给其它线程和进程了。虽然IO不会占用大量的CPU时间,但是非常频繁的IO还是会非常浪费CPU时间的,所以面对大量IO的任务,有时候是需要算法来合并IO,或者通过cache来缓解IO压力的。

热评文章