烤面筋第五场

网友投稿 550 2022-05-29

文章目录

Question One: 有了进程,为什么还要有线程?

进程的不足:

线程的优势:

Question Two:请你来说一说协程

相对于线程,协程的优势

Question Three: 请你说一下多进程和多线程的使用场景

Question Four:请问单核机器上写多线程程序,是否需要考虑加锁,为什么?

Question Five:请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别

Question Six:请你说一说死锁发生的条件以及如何解决死锁

产生死锁的四个必要条件

破坏死锁的方法

Question Seven:游戏服务器应该为每个用户开辟一个线程还是一个进程,为什么?

Question Eight:怎样确定当前线程是繁忙还是阻塞?

Question One: 有了进程,为什么还要有线程?

那肯定是进程不够用了嘛,所以线程才出来补缺补漏了。

进程的不足:

1、进程在执行的过程中如果阻塞,整个进程就会挂起。

2、启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,总的来说就是耗资甚大。

3、据统计,一个进程的开销大约是一个线程开销的30倍左右。

4、对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。

线程的优势:

1、线程是一种非常"节俭"的多任务操作方式。

2、由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。

3、操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

4、一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序才会利于理解和修改。

Question Two:请你来说一说协程

说真的,对于协程,还停留在初步了解的状态,因为还没深入了解C++该如何去操作协程。

协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。

子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。

所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。

子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。比如子程序A、B:

def A(): print '1' print '2' print '3' def B(): print 'x' print 'y' print 'z'

1

2

3

4

5

6

7

8

9

假设由协程执行,在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A,结果可能是:

1 x 2 y 3 z

1

但是在A中是没有调用B的,所以协程的调用比函数调用理解起来要难一些。

烤面筋的第五场

相对于线程,协程的优势

最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

Question Three: 请你说一下多进程和多线程的使用场景

多进程模型的优势是CPU,因此适用于CPU密集型的工作场景。

多线程模型主要优势为线程间切换代价较小,因此适用于I/O密集型的工作场景。

Question Four:请问单核机器上写多线程程序,是否需要考虑加锁,为什么?

仍然需要线程锁。在单核机器上的多线程程序,仍然存在线程同步的问题。在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程。如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突。

Question Five:请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别

我就不搬运了,链接跳转吧锁种

Question Six:请你说一说死锁发生的条件以及如何解决死锁

这个还是要搬运一下的,因为上次模拟面试的时候我给卡壳儿了。

说白了,就是竞态。

多个进程所共享的资源不足,引起它们对资源的竞争而产生死锁

-竞争可剥夺和非剥夺性资源

-竞争非剥夺性资源

进程运行过程中,请求和释放资源的顺序不当,而导致进程死锁

-进程推进顺序合法

-进程推进顺序非法

产生死锁的四个必要条件

互斥条件 进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有 请求和保持条件 当进程因请求资源而阻塞时,对已获得的资源保持不放 不剥夺条件 进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放 环路等待条件 在发生死锁时必然存在一个进程—资源的环形链

1

2

3

4

5

6

7

8

9

10

11

破坏死锁的方法

预防死锁、避免死、检测死锁、解除死锁

当然,防范于未然是首要的。

如果死锁真发生了,那就只能:

-剥夺资源

-撤销进程

Question Seven:游戏服务器应该为每个用户开辟一个线程还是一个进程,为什么?

游戏服务器应该为每个用户开辟一个进程。因为同一进程间的线程会相互影响,一个线程死掉会影响其他线程,从而导致进程崩溃。因此为了保证不同用户之间不会相互影响,应该为每个用户开辟一个进程

Question Eight:怎样确定当前线程是繁忙还是阻塞?

用ps命令。

任务调度 多线程

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数字化转型正当时,云视频会议成为高效沟通协作利器
下一篇:文件空间映射mmap()函数(是什么,为什么,怎么用)
相关文章