【操作系统】进程、线程和协程相关问题

综合比较进程、线程、协程

(1)进程是被加载进内存的程序,是操作系统分配资源的基本单位,一个进程拥有独立的资源和地址空间。

(2)线程是调度和执行任务的基本单位,同一进程下的各个线程会共享其所属进程的空间和资源。线程是进程中的控制单元,负责当前进程中程序的执行。线程拥有专属于自己的线程ID,一组寄存器和栈。

(3)协程相较于进程和线程有本质区别,协程本质上就是一个函数,一个线程可以拥有多个协程。而且协程并不由操作系统管理,而是完全运行在用户态。

相关问题:

1,进程切换:当CPU中属于某一个进程的时间片到了的时候,就需要进行进程切换,保存当前进程的运行进度、将下一个进程换上来、将新换上来的进程的上下文信息,数据等加载进内存,并接着该进程原先的进度继续向下运算。

具体的过程是,当一个进程时间片到了需要被切换下去时,由于进程的切换要由内核负责,所以首先要通过这个进程找到这个进程的虚拟地址空间,并找到该虚拟地址空间中的内核空间,再通过页表的映射找到其对应的操作系统的代码,并在当前进程的上下文空间中执行这些代码,此时进程是处于内核态的。此时,内核会将金恒的数据,上下文信息剥离并保存,再换上另一个进程。为了换上另一个进程,需要切换页表以使用新的地址空间,加入新进程的PCB,刷新进程的虚拟内存和栈,从而恢复新进程的上下文数据和临时变量。

对于进程的切换而言,当某一个进程在时间片内正常运行的时候,是处于用户态的,但是涉及到进程的切换时,由于需要上下文信息的保存,页表的切换等操作,此时被切换下去和切换上来的进程都是处于内核态的。

2,线程切换:线程的切换分为两种情况,当不同进程下的线程切换时,具体的过程和进程切换几乎一致,但同一进程下的不同线程切换时,由于同一进程下的不同线程是共享该进程的空间和资源的,所以此时,线程所需的开销就会小很多,需要进行处理的只有每一个线程所专有的寄存器和栈。对于某一线程的上下文数据,需要将其保存至寄存器中,而该线程运算的临时数据需要保存至线程的栈中。当然,新切换过来的线程需要将上下文数据从寄存器中拿出来,将临时数据从栈中拿出来即可。

3,为什么要有协程?当一个线程需要处理多个IO操作时,由于程序本身一定是串行的,所以当其中的一个IO操作阻塞或等待时,其它的IO操作也无法执行,这时就会影响效率。但是,如果一个线程下有多个协程,当其中的一个进行IO操作的协程阻塞时,可以切换其它协程继续执行,这样就可以减少等待的时间,增加效率。例如,可以把IO操作写成一个协程,当该协程触发IO操作的时候就将CPU让给其它协程,这样,硬盘、内存的效率就不会成为制约CPU效率的瓶颈。

4,多线程的同步(条件变量)和互斥(互斥锁):线程的同步和互斥是两个相对的概念。之所以要引入线程互斥的概念是因为在多线程的情况下,为了避免多个线程同时访问临界资源,相互干扰,所以引入了互斥机制,也就是在同一时刻通过对临界资源加锁的方式,实现允许一个线程访问临界资源的目的。但是,互斥也会带来问题,如果需要访问同一块资源的若干线程优先级不同,导致一个优先级较高的线程得以一直访问资源,其它优先级较低的进程却没有资源可用,所以需要引入线程的同步。

而实现同步的具体方法是引入条件变量的概念,条件变量具体需要参与的两件事是:1,一个线程因为等待条件变量而被挂起。2,一个条件成立而导致某个正在等待的线程被唤醒。条件变量的本质是全局变量,是对某种临界资源是否就绪的数据化表述。也就是相关线程需要保持等待,直到某个条件为真。

在实际应用中,条件变量必须与互斥锁配合使用。二者的使用场景在生产消费者模型中有体现:由于生产者和生产者,消费者和消费者,以及生产者和消费者之间都存在互斥关系,所以对于临界资源,都需要加锁。但是为了维护生产-消费者模型正常运转,需要做到保证生产者不会在交易场所已满的情况下继续向其中加入数据,消费者也不会在交易场所已空的时候读取数据。所以,需要使用条件变量,在交易场所被装满时通知生产者休眠,在交易场所为空时通知消费者休眠,等条件合适时在唤醒生产者或消费者。

锁的原理:锁就像钥匙一样,谁先来就先拿走,拿走了其它人就拿不到了。

5,多线程的缺点

(1)容易造成性能损失:当线程的数量大于计算机中可用处理器的数量时,在运行状态下就一定会涉及线程的切换。而线程的切换是要付出一定的代价的(将原先进程的上下文数据保存到寄存器中,将运行的临时数据保存到栈中,将原先进程切换下来,把新线程切换上来,加载上下文数据和临时变量),在可用资源不变的情况下,增加了很多切换线程的开销,那势必会造成性能的损失。当然,上述的影响只体现在计算密集型的场景,对于IO密集型的应用场景而言,多线程仍然可以发挥灵活处理任务的优势。

(2)线程之间缺乏访问控制:由于同一进程下的不同线程是可以访问进程中的所有资源的,那这些线程之间往往是没有访问控制的。所以在涉及多线程的情况下,往往需要专门对特定资源加锁。

(3)鲁棒性较低:对于同一进程下的不同线程而言,只要其中一个进程出现错误,那默认整个进程就出现错误了,此时整个进程直接就被挂掉了,也就是一个线程出错,整个进程就出错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值