#1
进程和程序的区别? 用一个词来区分!
动静
是否被送进内存执行
#2
进程是什么的基本单位?线程又是什么基本单位?
进程是 资源管理 的基本单位。
线程是 程序执行的基本单位。
#3
什么是上下文切换?大致描述下?
操作系统内核在cpu上对进程或者线程进行切换,切换的当前信息保存在PCB中。
#4
切换的耗时来说,线程和进程有什么区别?
进程的上下文切换,context switch更加耗时,为什么?
#5
线程和进程的系统开销是?
系统开销就是 创建或者撤销进程时候,系统都要分配或回收系统资源,如内存空间,I/O设备等。
#6
协程是什么?听过么?
Coroutines
协程是比 线程 更轻量级的存在。
不是线程或者线程,只是一种特殊函数,函数中有需要挂起阻塞的地方,而且可以在重新在挂起阻塞后继续执行的 一种函数。
#6
协程和进程和进程,哪些是同步机制?哪些是异步机制?
线程和进程都是同步机制,协程是异步的。
#7
如上,哪些是抢占式?
协程是非抢占式。需要用户释放使用权切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
#8
线程与进程 和 协程的 n对m关系?
一个线程可以有多个协程,一个进程也可以有多个协程
#9
协程被操作系统内核管理么?
协程不被操作系统内核管理,而完全是由程序控制。
线程是被分割的CPU资源,协程是组织好的代码流程,线程是协程的资源。
但协程不会直接使用线程,协程直接利用的是执行器关联任意线程或线程池。
#10
什么是并发?并行?
并发就是在一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。单核处理器可以做到并发。比如有两个进程A和B,A运行一个时间片之后,切换到B,B运行一个时间片之后又切换到A。因为切换速度足够快,所以宏观上表现为在一段时间内能同时运行多个程序。
并行就是在同一时刻,有多个任务在执行。
这个需要多核处理器才能完成,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。
#11
进程切换分两步?
1?
2?
线程又分几步?
进程切换分两步:
1、切换页表以使用新的地址空间,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。
2、切换内核栈和硬件上下文。
对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2步是进程和线程切换都要做的。
因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。
#12
什么是页表?
页表 是一种特殊的 数据结构!
放在系统空间的页表区,存放逻辑页与物理页的映射关系,页面与页框的映射关系。
每个进程都拥有自己的页表,PCB中有指针指向页表。
哈希表一样的东西?
#13
什么是硬件上下文?
1.首先,每个进程有自己的虚拟地址空间!
2.但是,共用cpu的寄存器!
3.因此,在寄存器中的数据就是 硬件上下文。
#14
什么是虚拟地址空间?
程序使用的内存地址就是虚拟内存地址
实际存在硬件里面的空间地址就是物理内存地址。
为了不同进程之间 地址空间隔离,不互相干扰。
#15
每个进程都会有一个自己的虚拟地址空间么?
是的
#16
为什么虚拟地址空间切换会比较耗时?
进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个Cache就是TLB(translation Lookaside Buffer,TLB本质上就是一个Cache,是用来加速页表查找的)。—-看封面!
由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,Cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。
#17
进程间的通信方式有哪些?
管道:管道这种通讯方式有两种限制,一是半双工的通信,数据只能单向流动,二是只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
-管道可以分为两类:匿名管道和命名管道。匿名管道是单向的,只能在有亲缘关系的进程间通 信;命名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
信号 : 信号是一种比较复杂的通信方式,信号可以在任何时候发给某一进程,而无需知道该进程的状态。
例如:(1)SIGHUP:用户从终端注销,所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。
(6)SIGKILL:用户终止进程执行信号。shell下执行kill -9发送该信号。
(7)SIGTERM:结束进程信号。shell下执行kill 进程pid发送该信号。
(8)SIGALRM:定时器信号。
(9)SIGCLD:子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号,则子进程退出后将形成僵尸进程。
信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列:消息队列是消息的链接表,包括Posix消息队列和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
Socket:与其他通信机制不同的是,它可用于不同机器间的进程通信。
#18
什么是管道?
#19
什么是信号?
#20
什么是socket?
套接字,是一个抽象层,应用程序可以通过它发送、接受程序,可对其进行像对文件一样的打开、关闭和读写等操作。
描述为:ip + port
网络中【不同主机】中的【应用进程】之间的双向通信
#21
什么是共享内存区?
#22
什么是信号量?
#23
什么是消息队列?
#24
以上的优缺点?
管道:速度慢,容量有限;
Socket:任何进程间都能通讯,但速度慢;
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;
信号量:不能传递复杂消息,只能用来同步;
共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。
#25
进程间同步的方式?
1.临界区
每个进程中访问【临界资源】的那段【程序】称为临界区,一次仅允许一个进程使用的资源称为临界资源。
2.信息量
3.事件
事件: 用来通知线程有一些事件已发生,从而启动后继任务的开始。
优点:事件对象通过通知操作的方式来保持线程的同步,并且可以实现不同进程中的线程同步操作
#26
什么是临界区?临界资源?
你说呢?不要往上看!!!!
不记得了?
别说自己老了,老年痴呆之类的。🐶🐶
你只是单纯没过脑子!
#27
什么是缓冲区溢出?
缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害有以下两点:
程序崩溃,导致拒绝服务
跳转并且执行一段恶意代码
造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入。