进程与线程
1.进程与线程的区别?
- 进程是操作系统资源分配的基本单位,线程是内存程序执行的基本单位。
- 线程上写文切换比进程上下文切换快得多。
- 进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问进程资源。
- 系统开销: 创建或撤销进程时,系统都要为之分配或回收系统资源。
2.协程与线程的区别?
- 协程与进程都是同步机制,而协程是异步机制。
- 线程是抢占式,而协程是非抢占式。
- 一个线程可以有多个协程,一个进程也可以有多个协程。
- 协程不被操作系统内核管理,而完全是由程序控制。
- 协程能保留上一次调用时的状态。
3.并发与并行有什么区别?
- 并发就是在一段时间内,多个任务都会被处理,但在某一个时刻,只有一个任务在执行。
- 并行就是在同一个时刻,有多个任务在执行。
4.进程与线程的切换流程?
- 进程切换分两步:
- 切换页表以使用新的地址空间。
- 切换内核栈和硬件上下文。
- 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2步是 进程和线程切换都要做的。 因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中 的线程进行线程切换时不涉及虚拟地址空间的转换。
5.进程间通信方式有哪些?
- 管道:管道这种通讯方式有两种限制,一是半双工的通信,数据只能单向流动,二是只能在具有亲 缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 管道可以分为两类:匿名管道和命名管道。匿名管道是单向的,只能在有亲缘关系的进程间通信; 命名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
- 信号 : 信号是一种比较复杂的通信方式,信号可以在任何时候发给某一进程,而无需知道该进程 的状态。
- 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机 制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进 程内不同线程之间的同步手段。
- 消息队列:消息队列是消息的链接表,包括Posix消息队列和System V消息队列。有足够权限的进 程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承 载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但 多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专 门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
- Socket:与其他通信机制不同的是,它可用于不同机器间的进程通信。
优缺点:
- 管道:速度慢,容量有限;
- Socket:任何进程间都能通讯,但速度慢;
- 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;
- 信号量:不能传递复杂消息,只能用来同步;
- 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进 程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不 过没这个必要,线程间本来就已经共享了同一进程内的一块内存。
6.线程的分类?
从线程的运行空间来说,分为用户级线程(user-level thread, ULT)和内核级线程(kernel-level, KLT)
- 内核级线程:这类线程依赖于内核,又称为内核支持的线程或轻量级进程。无论是在用户程序中的线程 还是系统进程中的线程,它们的创建、撤销和切换都由内核实现。比如英特尔i5-8250U是4核8线程,这 里的线程就是内核级线程
- 用户级线程:它仅存在于用户级中,这种线程是不依赖于操作系统核心的。应用进程利用线程库来完 成其创建和管理,速度比较快,操作系统内核无法感知用户级线程的存在。
7.什么是死锁?死锁产生的条件?
- 什么是死锁:(通俗的讲就是两个或多个进 程无限期的阻塞、相互等待的一种状态。)
- 如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的 资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。
- 死锁产生的四个必要条件:(有一个不成立,则不会产生死锁)
- 互斥:一个资源一次只能被一个进程使用
- 请求与保持:一个进程在请求资源而阻塞时。对已获得的资源保持不放
- 不剥夺:进程获得的资源,在未使用完之前,不能强行剥夺
- 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系
- 如何处理死锁问题:
- 就是确保死锁发生的四个必要条件中至少有一个不成立!
8.讲一讲IO多路复用?
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取。它就通知该进程。IO多路复用使用一下场景:
- 当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。
- 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
- 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
- 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
- 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。
- 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线 程,也不必维护这些进程/线程,从而大大减小了系统的开销。
实现IO多路复用的三种方案:
- 第一种方案:多路复用器(selector):最大为1024!
- 第二种方案:多路复用器(poll):无上限!! 是使用轮询机制!
- 第三种方案:通知(触发)机制 epoll实现的关键流程:通过mmap