讲一下计算机操作系统中的进程与线程

引言

    说到计算机操作系统,就没有办法不提及进程与线程了。那么二者的共通点以及差异点又在哪里呢?而且它们在操作系统中是充当个什么样的角色,发挥着怎么样的作用呢?

共通点

    无论是进程还是线程,它们都可以被独立调度,是系统独立管理的对象个体。同时,它们都是可以实现多任务并发的技术手段,所以在功能上来说,两者并无差异。在多任务程序中,子进程/子线程与它们的父进程/父线程,一般都是平等竞争。

差异点

    操作系统中有一句名言,流传数十年:进程是资源分配的基本单位,而线程是调度的基本单位。线程与进程都可以被系统所调度,但是相比进程,线程是一个更小的单位。

    而进程强调的更多是当系统分配资源时,对象必须是进程。若要运行一个任务,想要从操作系统中获得资源,那么必须要有进程,其他子任务则可以以线程的方式去执行。

    也就是说,线程之间是彼此相互依存的,而进程与进程个体之间是完全独立的。在多进程中,当一个进程终止时,其他进程一样会照常运行,不会影响其他进程。然而,在多线程环境中,一旦父线程终止,全部子线程会因为没有资源而被迫中止;但是一个子线程终止一般不会影响其他子线程。

通信方式

    当系统生成线程,进程这些实体时,就会需要通信。

    线程间的通信方式除了共享内存、消息队列、信号量、信号、管道(有名管道、无名管道)、套接字、文件之外,还有线程所独有的:互斥量、信号量、读写锁、线程信号等。这里的线程信号与上边的信号是不一样的。因为信号是以进程为基本单位,而线程与线程是同属于同一个进程之下,所以要采用线程信号。当线程采用它们独有的通信方式时,是在自身的进程空间中完成,所以不需要进行内核上下文的切换,通信速度也较快。

    相比线程,进程间的信号就较少了:共享内存、消息队列、信号量、信号、管道(有名管道、无名管道)、套接字、文件。当进程间需要进行通信时,是需要进程内核上下文切换,因此当对外设进行访问时,速度则会下降。

通信方式介绍

    套接字:,套接字是进程中经常遇见的一种通信机制,它是借助网络实现不同进程间通信。

    信号量:为实现进程之间的同步、互斥,以及在一个进程下,不同线程之间的同步与互斥所采取的手段。

    信号:在操作系统中,信号是一种比较复杂的通信方式,它是用于提醒另外一个进程已经发生了某个时间。

    管道(有名管道、无名管道):无名管道可以用于没有亲缘关系的父子进程间的通信,而有名管道除了允许有亲缘关系的父子进程进行通信,还可允许无亲缘关系的进程进行通信。

    消息队列:进程一般具备读权限、写权限。具有写权限的进程可以按照一定的规则向消息队列添加信息;而另一头,具备读权限的进程则可以从队列中依次读取信息。

    共享内存:共享内存可以说是进程之间通信最为高效的一种方式,它可以使多个进程可以访问同一块内存空间,不同进程之间可以及时看到对方中共享内存的更新。但是这种方式需要依赖同步、互斥。

    互斥量:操作系统一般会分配多个进程互斥锁,只有拥有这一个互斥锁的线程才可以访问某个公共资源。当一个线程访问该资源时,其他线程则不能访问,因此保证了某个公共资源不会被多个线程所访问。

    信号量:与互斥量有些许不同,信号量允许同一时刻多个线程访问同一资源,但是有数量限制。数量限制由分配信号量时所指定。

线程的共享环境

    与进程不同,因为多个线程是属于同一个进程下的,所以线程拥有自身所独有的共享环境。线程的共享环境包括::进程的代码段、进程的文件描述符、进程当前的目录、用户ID、用户组ID。除了这些,线程还拥有许多自身所特有的共享环境,也是因为拥有了这一些个性,才能实现并发性。这些包括:

    自身的线程ID:通过这些线程ID,进程可以标识不同的线程。

    寄存器的值:由于线程是并发运行的,当从A线程切换到B线程时,必须将原有的状态保存在寄存器中,以便切换回来时恢复线程的状态。

    线程的堆栈:线程函数可以调用函数,调用函数中又可能是层层嵌套,所以为了函数可以正常运行,线程必须拥有自己的函数堆栈才能不受其他线程影响。

    信号屏蔽码:由于每一个线程都对不同的信号感兴趣以及不感兴趣,所以信号屏蔽码是由线程本身所控制处理的。

    线程的优先级:因为线程需要被调度,那么就需要一个可供调度的参数,这一个参数就是线程的优先级。基本原理就如同UCOS中的任务优先级。

状态

    一直以来都分不清进程以及线程的状态有哪一些。在此,也总结一下。

   进程的状态分为就绪状态、运行状态、阻塞状态。

    1.就绪状态:进程以及获取除处理机之外所需的资源,等待系统分配处理机资源。

    2.运行状态:进程正在占用处理机资源运行,并且在运行状态下的进程数目小于CPU数。

    3.阻塞状态:进程等待某种条件,在条件满足前不会继续执行下去。

    线程的状态分为:创建、运行、阻塞、等待、消亡。

死锁的产生以及解决办法

    1.互斥条件,资源是独占的,某一时刻进程只能给一个进程使用,如果其他进程想申请该资源,则要等到该资源被释放才能占有。

    2.不可剥夺,进程在未使用完所占取的资源时,不能被其他资源强制剥夺。

    3.请求与保持,进程在申请它所需要的资源时,会继续占用它自身已经被分配的资源。

    4.循环等待:发生死锁时,必然有一个进程在等待队列,A进程等待B占有的资源,B进程等待C占有的资源...,累计下去,形成等待环路。

    解决办法:只要解决以上四种情况的其中一种情况就可以消除死锁。

结语

    多线程的优点:1.当系统需要进行耗时操作时,可以将任务先放到后台,如文件IO操;2.程序运行效率可能会提升。

    多线程的缺点:1.如果有大量的线程需要切换,则会影响性能;2.线程会占据内存空间,因此需要考虑空间的问题;3.需要考虑线程终止时对其他线程的影响;3.处理不当可能会导致死锁

    多进程的优点:1.在多核CPU的条件下,可以提供系统的效率和系统的资源利用率;在并行执行多任务的情况下,由于空间相对独立,因此数据也较为安全。

    多进程的缺点:1.需要更多的资源开销;2.如果需要频繁创建、删除多进程,则会消耗过多系统资源3.与多线程一样,如果处理不当则会造成死锁。

 

以上内容如有错误,欢迎指出。谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值