进程

1. 假设物理机内存大小为8GB,我现在系统剩余可用内存4GB。申请一个连续4GB的空间为什么一定能够申请成功?有没有可能物理内存中根本没有连续可用的4GB空间?
有可能。虚拟内存,将物理内存中的内存碎片映射到一个连续完整的地址空间。

2. 两个进程里有指向同样地址的指针,对他们求值会不会得到同样的值?什么情况下可以得到同样的值,什么情况下不可以?
指针指向的是虚拟地址。不同进程的虚拟地址没有相关性。
页表由系统生成,决定映射关系。
公用内存的情况:用户主动申请共享内存,用于进程通信;两个进程使用相同的动态链接库

3. 两个进程同时运行在一台物理机上,一个进程能否访问另一个进程的变量?通常情况是能还是不能,为什么?如果能,通过什么方法?
不能,进程之前是相互隔离的。
如果要访问另一个进程的变量,可以通过进程间的通信实现。
常用的进程间通信有socket,共享内存,消息队列等。

4. 很多程序都共享大量的动态链接库,比如基础的数学库,glibc等,启动多个进程的时候,这些库占用系统内存吗?是启动一个进程这些库也要多使用一份内存吗?为什么?
在编译的时候,将动态链接库编译进去之后,在elf文件中为留下该动态链接库的依赖关系。在程序的启动的时候,linux也只是为其分配一段线性空间,但不分配具体内存,当具体使用的时候,才分配物理内存。
如果不同进程使用相同的ddl,操作系统会把dll映射到相同的内存。

5. 当使用交换文件的时候,进程可用的内存也许比物理内存更大,因为有些数据可以被交换到磁盘上。那么此时,用户的程序需要自行读取物理磁盘吗?这个技术是怎么实现的?
在交换文件的时候,cpu会在页表上做标记已移到磁盘,在cpu访问页表时发现标记,会请求CPU把数据移到内存。
分页:等间隔,连续的

6. 我们知道,在单核处理器上,多个程序可以并发(多个进程交替运行),那么一个程序如何交出对CPU的控制权?
时间片用尽时,进程交出CPU的控制权。
进程自己调用一个系统调用。
CPU中断。

一个进程在运行纯数学计算的时候,操作系统在做什么?
什么都不做

有些操作系统能够保证一个进程一次至多连续占用50msCPU,操作系统是如何做到的?为什么能防止进程持续运行下去而其他进程无法运行?
时间片轮转算法。
所有就绪进程被放在队列里,每个进程被分配一个时间片。如果在时间片用尽时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果在时间片未用尽但进程已经结束,则CPU立刻分给下一个进程。
每个进程用完时间片或者结束后,被移至队尾。
时间片太短会导致过多进程切换,降低CPU效率,太长会影响短的交互请求的响应速度。一般为50-100ms。

7. 一个线程能不能在两个核心上运行?能不能用计算充分利用(占满)处理器的两个核心?为什么?
可以交替的用两个核心。
不可以。因为线程是CPU调度的基本单位。多个线程可以分别运行在不同的核心上。

8. 为什么要使用多线程?使用多进程和多线程的区别在于什么?各有什么优点?多线程解决了多进程的什么问题?
好处:减少IO延迟和利用多核提高效率
多进程涉及到内存、CPU及其他资源的切换,开销比线程切换大。
进程间的通信比线程通信复杂。
但进程的隔离性好,各进程间相互独立,一个进程出问题不会影响另一个进程,但线程共享资源,一个线程出问题很可能影响其他线程。并且多线程的设计更复杂,错误更难复现。
共用数据内存。

9. 为什么线程切换有开销,这个开销是什么?
上下文切换。比如A线程切换到B线程,需要进行的操作有:保存线程A的执行现场(寄存器),然后再载入B线程的执行现场。这个开销并不小。
上下文切换开销可以分为:
a. 直接开销:CPU完成切换所用的时间(保存,恢复寄存器,切换地址空间)
b. 间接开销:高速缓存,缓冲区缓存,TLB(translation lookup buffer)失效

你可能感兴趣的:(进程)