计算机基础
-
进程,线程和协程有什么关系和区别?
- 关系: 进程是资源的分配单元,而线程是CPU调度的基本单元; 同一个进程中可以包括多个线程; 进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束; 线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源; 协程的本质就是使用当前进程在不同的函数代码中切换执行,可以理解为并行;
- 效率: 进程<线<协程
- 特点: 每个进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,由操作系统调用 线程在进程内部拥有自己独立的栈和共享的堆,由操作系统调用(标准线程是这样的) 协程和线程一样共享堆,不共享栈,在代码层面调度
- 线程和协程相比优势: 1、减少了线程切换的成本,协程在用户态切换,减少一次内核态的调用; 2、协程的第二大优势就是,不需要多线程的锁机制,因为只有一个线程; 3、协程更轻量级。创建一个线程栈大概需要 1M 左右,而协程栈大概只需要几 K 或者几十K; 4、Golang里因为GPM调度器
进程和线程切换区别:
1. 进程切换涉及到虚拟地址空间的切换而线程切换则不会,
这也是为什么进程切换要比线程切换慢的原因:
地址转化为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用
的地址映射,这样可以加速页表查找,这个Cache就是TLB,Translation Lookaside Buffer,TLB本质上就是一个cache,是用来加速页表查找的。
而且每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache
失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换不会导致TLB失效,因为线程无需切换地
址空间,因此我们通常说线程切换比进程切换快,原因就在这里。 -
什么是并发,什么是并行?
并发单核上进程切换执行。
并行每个核心执行一个进程,同时执行。 -
进程间的同步方式有哪些,通信方式有哪些?
进程间的同步方式有:
1. 信号量:一种整数计数器,可以用来控制对共享资源的访问。
2. 条件变量:用于在进程间或线程间同步,可以挂起和唤醒指定的进程/线程。
3. 读写锁:用于在多读单写的场景中对共享资源的保护。
4. 互斥量:一种互相排斥的锁,用于控制同一时刻只有一个进程/线程能够访问共享资源。进程间的通信方式有:
1. 管道:父子进程间的单向通信。
2. 套接字:网络上不同主机间的通信。
3. 共享内存:多进程共享同一块内存,实现快速的进程间通信。
4. 信号:用于进程间的异步通信。 -
线程间的同步方式有哪些?
线程间通信: 互斥量、信号量、事件
- 互斥量(Mutex):采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。互斥量用一个整型表示,0是解锁, 其他值表示加锁,多个线程阻塞在互斥量则随机选取一个进入临界区
- 信号量(Semphares) :它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量
- Read-Write Lock读写锁:支持多个读线程同时访问,但只允许一个写线程访问。
- Atomic操作:通过原子操作实现线程间的同步。
- 事件(Event) :Wait/Notify:通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的⽐较操
-
进程有哪些状态,进程是如何调度的?
NULL→新建态:执行一个程序,创建一个子进程。
新建态→就绪态:当操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许。
运行态→终止态:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结。
运行态→就绪态:运行时间片到;出现有更高优先权进程。
运行态→等待态:等待使用资源;如等待外设传输;等待人工干预。
就绪态→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。
等待态→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。
终止态→NULL:完成善后操作。进程是如何调度的:
先来先服务(FCFS)算法、短作业优先(SJF)调度算法、优先级调度算法、时间片轮转调度算法、
多级反馈队列算法:将所有进程分为多个优先级级别,每个级别内采用先来先服务或者短作业优先的算法进行调度。 -
什么是死锁,什么情况下会产生死锁?怎么解决?
死锁是指两个或多个线程因竞争资源互相等待导致的状态。当两个或多个线程都持有一个资源并试图获取对方占用的资源时,就可能会发生死锁。
解决方式:
死锁避免:通过预先分析死锁的可能性来避免死锁的发生。
死锁检测:通过定期检测系统中是否存在死锁,并在发现死锁时采取适当的行动。
死锁预防:通过限制系统中的某些行为来预防死锁的发生。
死锁解除:通过强制终止一个或多个线程来释放占用的资源以解除死锁。 -
中断和轮询有什么区别?
轮询:轮询则是不断地询问某个条件是否满足,当满足时执行某个操作。它没有中断那样的灵活性,但是简单易懂。
中断:中断是当一个线程完成某个任务或者被某些事件打断时,在其他线程继续执行。