程序员的自我修养(第一章)

来源:互联网 发布:人工智能豆瓣评分 编辑:程序博客网 时间:2024/05/16 12:11

内存不够怎么办?

       首先实现的是分页机制,即只在物理内存中保存进程常用的数据,而其他的放在硬盘中。

 

关于隔离:

      进程作为普通的运行程序,需要的是简单的执行环境和单一的地址空间。这里就出现了虚拟地址空间,然后统一由MMU内存管理单元进行统一映射,而这个管理单元是同页表的方式进行映射的,这个页表放在物理内存中。

 

关于线程:

       线程间的调度方式主要有优先级调度和轮转法。

在具有优先级调度的时候,每个线程都具有优先级,系统会根据线程的表现自动调整优先级。然而在优先级调度下,存在一种饿死的情况,就是说某个线程的优先级一直很低,导致不被运行,操作系统处理的方式是只要线程等待了足够长的时间,其优先级会被自动提高。

 

Linux进程 fork():

       fork()会复制当前进程,其速度非常快,并且一般与exec()合用。速度快主要依靠的是写时复制:

                   所谓写时复制:就是说两个进程可以同时自由的读取内存,但是任意一个进程试图读对内存进行修改时,内存就会复制一份提供给修改方单独使用。注意:只有发生修改的时候,才会写。这样就减少了内存的压力。

 

同步与锁:

             线程同步的最好的办法就是锁,锁的种类:

1.二元信号量:只有两种状态:占用和非占用。一个初始值为N的信号量允许N个线程并发访问。操作如下:

          将信号量-1

         如果信号量为0,则等待,否则继续;

         访问之后,释放;

         将信号量+1;

        如果信号量的值<1,唤醒一个等待的线程。

 

2.互斥量:资源也只能被一个线程同时访问。不同的是:二元信号量可以被这个线程访问,然后被另一个释放。而互斥量要求哪个线程获取了互斥量,哪个线程就负责释放这个锁。

 

3.临界区:比互斥量更严格。之前的信号量在系统的任何进程是可见的,也就是说,一个进程创建了互斥量,另一个进程是可以获取该锁的。而临界区的方位仅仅限于本进程,其他的进程无法访问

 

4:读写锁:致力于特定场合同步。多线程读的时候,单线程偶尔写的时候。

                  有两种锁的方式:共享和独占。

 

5.条件变量:线程可以等待条件变量,一个条件变量可以被多个线程所等待;线程也可以被唤醒,此时所有等待的条件变量的线程都会被唤醒。

 

 

原创粉丝点击