1. 进程和线程的区别
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。。。。
进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文(敲黑板💯)
程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。
这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。(敲黑板💯)
2. 死锁的必要条件,怎么处理死锁
死锁的必要条件:
(1) 互斥条件。即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有。这种独占资源如CD-ROM驱动器,打印机等等,必须在占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。如独木桥就是一种独占资源,两方的人不能同时过桥。
(2) 不可抢占条件。进程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放。如过独木桥的人不能强迫对方后退,也不能非法地将对方推下桥,必须是桥上的人自己过桥后空出桥面(即主动释放占有资源),对方的人才能过桥。
(3) 占有且申请条件。进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。还以过独木桥为例,甲乙两人在桥上相遇。甲走过一段桥面(即占有了一些资源),还需要走其余的桥面(申请新的资源),但那部分桥面被乙占有(乙走过一段桥面)。甲过不去,前进不能,又不后退;乙也处于同样的状况。
(4) 循环等待条件。存在一个进程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。就像前面的过独木桥问题,甲等待乙占有的桥面,而乙又等待甲占有的桥面,从而彼此循环等待。
一般地,解决死锁的方法分为死锁的预防,避免,检测与恢复三种(注意:死锁的检测与恢复是一个方法)。
(1) 死锁的预防是保证系统不进入死锁状态的一种策略。它的基本思想是要求进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。
(2) 在资源分配过程中若预测有发生死锁的可能性,则加以避免。
安全序列、银行家算法
(3) 在实际的操作系统中往往采用死锁的检测与恢复方法来排除死锁。
具体见http://blog.csdn.net/abigale1011/article/details/6450845/😄
3. Window内存管理方式:段存储,页存储,段页存储
请看上图,给出逻辑地址的页号和页内地址,开始进行地址变换:
(1) 在被调进程的PCB中取出页表始址和页表大小,装入页表寄存器
(2) 页号与页表寄存器的页表长度比较,若页号大于等于页表长度,发生地址越界中断,停止调用,否则继续
(3) 由页号结合页表始址求出块号
(4) 块号&页内地址,即得物理地址
请看上图,给出逻辑地址的段号和段内地址,开始进行地址变换:
(1) 在被调进程的PCB中取出段表始址和段表长度,装入控制寄存器
(2) 段号与控制寄存器的页表长度比较,若页号大于等于段表长度,发生地址越界中断停止调用,否则继续
(3) 由段号结合段表始址求出基址
(4) 基址+段内地址,即得物理地址
请看上图,给出逻辑地址的段号、页号、页内地址,开始进行地址变换:
(1) 在被调进程的PCB中取出段表始址和段表长度,装入段表寄存器
(2) 段号与控制寄存器的页表长度比较,若页号大于等于段表长度,发生地址越界中断,停止调用,否则继续
(3) 由段号结合段表始址求出页表始址和页表大小
(4) 页号与段表的页表大小比较,若页号大于等于页表大小,发生地址越界中断,停止调用,否则继续
(5) 由页表始址结合段内页号求出存储块号
(6) 存储块号&页内地址,即得物理地址
在页式、段式存储管理中,为获得一条指令或数据,须两次访问内存;
而段页式则须三次访问内存
还有三种方式都是离散分配(即将一个进程直接分散地装入到许多不相邻的内存分区中)
4. 进程的几种状态
(1) 创建状态:进程在创建时需要申请一个空白PCB(进程管理块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
(2) 就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行,如果进程运行时间片使用完也会进入就绪状态
(3) 执行状态:进程处于就绪状态被调度后,进程进入执行状态
(4) 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
(5) 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
5. IPC(进程间的通讯)几种通信方式
为什么要进行进程间的通讯
(1) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间
(2) 数据共享:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
(3) 事件通知:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
(4) 资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
(5) 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
linux常用的进程间的通讯方式
(1) 管道(pipe):管道可用于具有亲缘关系的进程间的通信,是一种半双工的方式,数据只能单向流动,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
(2) 命名管道(named pipe):命名管道克服了管道没有名字的限制,同时除了具有管道的功能外(也是半双工),它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
(3) 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事件发生了,除了进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
(4) 消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
(5) 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
(6) 内存映射:内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
(7) 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
(8) 套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
6. 什么是虚拟内存
虚拟内存是计算机系统内存管理的一种技术,它使得应用程序认为它拥有一个连续完整的地址空间,虚拟内存不只是“用磁盘空间来扩展物理内存”的意思。
具体见http://blog.csdn.net/guoweimelon/article/details/50849710
7. 虚拟地址、逻辑地址、线性地址、物理地址的区别
不明觉厉😶https://www.zhihu.com/question/29918252/answer/163114415