关于线程和进程的面试问题

一、进程和线程的区别:

1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
4.调度和切换:线程上下文切换比进程上下文切换要快得多;
5.进程和线程都是由操作系统内核所管理。

二、协程:

协程运行在线程之上,当一个协程执行完成后,可以选择主动让出,让另一个协程运行在当前线程之上。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。
比如:我们只需要启动100个线程,每个线程上运行100个协程,这样不仅减少了线程切换开销,而且还能够同时处理10000个读取数据库的任务,很好的解决了上述任务。

协程既不是进程也不是线程,协程仅仅是一个特殊的函数,协程同进程和进程不是一个维度的。
一个进程可以包含多个线程,一个线程可以包含多个协程。
一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用CPU多核能力。
协程与进程一样,是存在上下文切换问题的。
协程是完全由程序控制的,不是由操作系统内核所管理的。

三、进程通信和线程通信

1.进程通信(ipc):

  • 管道(pipe)
    管道是一种半双工的通信方式,意思同一时间,有固定的读端和写端。传输效率慢。
    只能用于有关系的进程通信,比如父子进程,兄弟进程
    -命名管道(FIFO)
    有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信;

  • 信号(signal):
    信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生;

  • 信号量(semaphore,mutex)
    这个主要用于pv操作,不能传递复杂的信息,一般和共享内存配合使用;

  • 共享内存(shared memory)
    这个是最快的进程通信,通常配合信号量一起使用,信号量控制进程互斥同步,所有的进程通过使用一块内存来传递消息;

  • 消息队列(message queue):消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。消息队列容量为1时,有些地方称为消息邮箱。

  • 套接字(Socket)
    这也是众所周知的Socket,可以用于不同主机进程之间的通信方式。

2.线程通信:线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制。

  • 锁机制

    1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。

    1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥。

    1.3 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

  • 信号量机制:包括无名线程信号量与有名线程信号量

  • 信号机制:类似于进程间的信号处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值