浅谈操作系统的内存管理

    xiaoxiao2021-12-14  21

    为了支持多进程(同一时间允许多个进程),解决直接操作内存带来的各种问题,引入了地址空间——允许每个进程都拥有自己的地址,硬件上需要两个寄存器——基址寄存器(保存进程开始地址)和界址寄存器(保存上界,防止内存溢出)。当我们执行一条指令,实际的物理内存地址是根据基址和偏移量来计算得到。而每个进程拥有的地址空间是不同的,因此也就使得多进程成为可能。

    考虑到内存大小很难容纳下所有并发执行的进程——交换技术将闲置的进程交换出内存,暂存在硬盘上,待执行时再交换回内存。

    虚拟内存的基本思路是:每个进程都有独立的逻辑地址空间,内存被分为大小相等的称为页的数据块,每个页都是一段连续的地址,通常虚拟内存比物理内存大,当访问虚拟内存时,首先通过MMU计算得到对应的物理地址,如果虚拟内存页不存在物理内存中,会产生缺页中断,磁盘,内存满的话会使用置换算法。虚拟内存和物理内存的匹配是通过页表来实现,页表在MMU中。 页置换算法:最近不常使用算法,FIFO算法,最久未使用算法LRU。

    进程的调度、同步等操作通常是由内核来完成,而线程...

    单进程多线程/多进程单线程:

    首先根据共享内存大小来判断:如果共享内存较大,就用多线程,避免cpu cache频繁的换入换出(比如memcached);其次根据自身的业务场景是否有数据共享/单任务拆分并行化需求。通常尽量选用多进程,享受单线程编程带来的便利。 两种模型的区别在于:进程更安全,一个进程完全不会影响其他进程,但进程间通信比线程间通信的性能差很多(比如Nginx一个master多个worker,进程间只进行有限的通信,传递命令而非数据)。

    接上——》》》 就进程和线程的开销分为时间和空间:对于时间开销,Linux下创建进程和线程差不多,事实上创建线程的时间开销略微大一些,对于空间开销,Linux下显然进程大(Linux中没有线程概念,线程被当做进程实现,Linux进程本身就已经足够轻量,线程是进程共享资源的手段)。但windows下不一样。如果需要创建极大数量的进程,此时可以考虑使用线程。
    转载请注明原文地址: https://ju.6miu.com/read-970762.html

    最新回复(0)