1、操作系统对内存的管理
操作系统为每个进程都提供了一个虚拟内存,相当于在进程和物理地址之间加上了一层,这一层可以保证不同进程之间不能直接访问对方的数据。但也由此派生出逻辑地址,线性地址,分段,分页等概念。
早期的Intel芯片cpu是16位的,而地址总线是20位的,这就意味着CPU只能访问64KB存储空间,而地址总线能访问1MB存储空间,为了解决这个问题,Intel的工程师采用了分段的策略,一个逻辑地址表示成 段地址:段偏移量 的形式,段地址由16位CPU段寄存器左移4位构成,二维逻辑地址拼接起来就构成了一个线性地址。
进程直接访问物理地址的方式称为实模式,现在操作系统开机时也是先进入实模式。实模式的问题就在于不安全,不同进程的内容都暴露给其他进程了,cpu给每个进程分配相应的段区域可以解决这个问题。
现代操作系统为了提高每个进程可用的存储空间,采用了虚拟地址的概念,每个进程都有一段可用的虚拟内存,每个进程自己管理一个LDT,即局部描述符表,指定当前进程每一页对应到物理地址中的哪一个页目录中的哪一页。对应了也不一定被加载,即使是该进程的运行阶段也不一定被加载,只有发生缺页的时候才会加载。这样可以保证有限的物理地址空间尽可能多的运行进程数量。
逻辑地址对应到线性地址的时候,也不再使用直接拼接,而是用逻辑地址指向GDT,即全局描述符表,里面记载了需要查询的线性地址的段起始位置。
2、进程间通信的几种方式
1)信号
比较古老的通信方式,主要用于系统调用,用一些数字实现,数量有限,从用户态到内核态。
2)管道
包括匿名管道和命名管道两种,匿名管道用于关联进程之间的通信,是系统自动创建的;命名管道用于不关联进程之间的通信,需要用户手动创建。(面试问题:如何在linux下创建一个管道?)
3)信号量
一般用于进程同步
4)消息队列
5)共享内存
最快的进程间通信方式
6)socket
可以用于网络主机之间的进程通信,不限于单机。
3、进程调度
调度的几种策略:短进程优先,FIFO,优先级,时间片轮转,以及这几种策略的结合。
进程调度发生在以下几种情况:1)中断;2)时间片结束。进程调度时,操作系统维护三个队列,第一个是就绪队列,第二个是运行队列,第三个是阻塞队列。
4、系统调用
系统调用是指程序调用操作系统的api,调用方法是中断,调用相应的中断号进入操作系统的中断响应程序,然后操作系统去查找中断向量表,调用相应的程序。系统调用需要从用户态进入内核态,所以比较耗时。
5、进程和线程的区别
线程共享进程的资源,如I/O,文件,所以线程间通信简便;创建线程耗时少;线程间切换开销小;