程序员的自我修养读书笔记:第一章

来源:互联网 发布:清洁面膜有必要吗 知乎 编辑:程序博客网 时间:2024/06/05 15:48
计算机最关键的三个部件:-中央处理器CPU-内存-I/O控制器南桥北桥:由于计算机技术的发展,慢速的I/O总线无法满足需求,设计了高速的北桥芯片,方便高速交换数据。北桥运行速度非常高,所有相对低速的设备如磁盘,USB,键盘等如果连接在北桥芯片上,北桥既要处理高速的设备,又要处理低速的设备,设计会十分复杂,所有又设计了处理低速设备的南桥芯片。北桥芯片处理高速设备,南桥芯片处理低速设备。对称多处理器(SMP,symmetrical Multi-Processing):每个CPU在系统中所处的地位和所发挥的功能都是一样的,理论上讲增加CPU的数量会提高运行的速度,但在实际应用中并不是这样的,因为我们的每个程序不见得都能分成若干个不相干的子程序。就比如一个女人花10个月生一个孩子和10个女人花一个月生一个孩子一样。 计算机系统软件体系采用一种中间层的结构“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,计算机的每个层次之间都需要通信,通信就要有通信协议,我们一般将其称为“接口”,接口下面的那层是接口提供者,由它定义接口。接口上面的那层是接口调用者,它使用该接口来实现所需要的功能。 运行库使用操作系统提供的系统调用接口,系统调用接口在实现中往往以软件中断的方式提供,比如Linux以0x80号中断作为系统调用接口。 操作系统内核层对于硬件层来说是硬件接口使用者,而硬件是接口的定义者,硬件的接口决定了操作系统的内核,具体来讲就是驱动程序如何操作硬件,如何与硬件进行通信,这种接口往往被称为硬件规格。 **操作系统的功能:操作系统的两个主要功能一个是提供抽象的接口,另一个主要功能是管理硬件资源。** CPU处理任务的改进:多道程序,分时系统,多任务,抢占式。驱动程序可以看作是操作系统的一部分,它主要的作用就是提供给用户统一的调用硬件的接口,它往往跟操作系统一起运行在特权级,但它又与操作系统内核之间有一定的独立性,使得驱动程序有比较好的灵活性。计算机的地址空间分为两种:虚拟空间和物理空间,物理空间是实实在在存在的,我在这里理解为内存条就可以看作是物理空间。虚拟空间是人们想象出来的地址空间,它实际是并不存在的,每个进程都有自己独立的虚拟空间,而且每个进程只能访问自己的空间地址,这样就做到了进程隔离。分段:把一段与程序所需的内存空间大小的虚拟空间映射到某个地址空间。假如程序中访问空间超过了映射的这段空间,会出现我们程序中经常报错的段错误。分页:分页与分段差不多,分页是把地址空间人为的等分为固定大小页,每一页的大小由硬件决定,或硬件支持多种页大小的页,由操作系统决定页的大小。线程:线程有时被称为轻量级进程,是程序执行流的最小单元,一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。通常意义上一个进程由一个或者多个线程组成,线程之间共内存空间(代码段,数据段,堆栈等)。使用多线程的原因:-1. 某个操作可能会陷入长时间的等待,等待的线程会进入睡眠状态,无法继续执行。多线程可以有效的利用等待的时间,典型的例子就是等待网络响应。-2. 某个操作(通常是计算)会消耗大量的时间,如果只有一个线程,程序和用户之间的交互会中断,多线程可以让一个线程负责交互,另一个线程负责计算。-3. 程序逻辑本身要求并发操作,比如多端下载程序。-4. 多CPU或多核计算机,本身具备同时执行多个线程的能力,单线程无法全面发挥计算机的性能。-5. 相对于多进程应用,多线程在数据共享方面效率要高很多。在线程调度中,线程一般分为三个状态,运行:此线程正在运行中,就绪:此时线程可以立即运行,但CPU被占用,等待:此时线程正在等待某一事件发生,无法执行。处于运行的线程拥有一段可以执行的时间,这段时间被称为时间片,当时间片用尽的时候,线程进入就绪状态。在具有优先级调度的系统中,线程都拥有各自的优先级,在Linux和window中用户可以指定线程的优先级,频繁等待的线程称为IO密集型线程,很少等待的线程成为CPU密集型线程,在优先级调度中,会存在一种饿死线程,是指这种线程优先级比较低,一直处于等待中,无法执行。改变线程优先级的方法:1.用户指定优先级。2.系统根据进入等待状态的频繁程度提升或者降低优先级。3.系统为长时间得不到执行的线程提高优先级。linux讲所有执行的实体(无论是进程还是线程)都称为任务,每一个任务概念上都类似一个单线程的进程,具有内存空间,执行实体,文件资源等。单指令的操作称为原子操作,单指令的执行是不会被打断的。二元信号量:二元信号量是最简单的一种锁,它只有两种状态,占用和非占用,它适合只能被唯一一个线程独占访问的资源,当二元信号量处于非占用状态时,第一个试图获取该二元信号量的线程会获得该锁,并将二元信号量置为占用状态,此后其他试图获取该信号量的线程将会等待,直到该锁被释放。多元信号量:对允许多个线程并发访问的资源,多元信号量简称信号量,一个初始值为N的信号量只允许N个线程并发访问,线程访问资源的时候首先获取信号量,进行如下操作1.将此信号量减12.如果此信号量的值为0,则等待访问完资源后,线程释放信号量1.将信号量的值加12.如果信号量的值小于1,唤醒等待中一个线程互斥量:互斥量和二元信号量非常相似,资源仅同时允许一个线程访问,但和信号量不同的是,信号量在整个系统中可以被任意一个线程获取并且释放,也就是说同一信号量可以被系统中的任意一个线程获取之后由另一个线程释放,而互斥量则要求哪个线程获取了互斥量,哪个线程释放。其他线程去释放是无效的临界区:临界区是比互斥量更加严格的同步手段,把临界区的锁的获取称为进入临界区,而把锁的释放称为离开临界区。临界区和互斥量与信号量的区别在于,互斥量和信号量在系统的任何进程里都是可见的,也就是说,一个进程创建了一个信号量或者互斥量,另一个进程试图去获取该锁是合法的。然而,临界区的作用范围仅限于本进程,其他进程无法获取该锁,除此之外,临界区和互斥量具有相同性质。(进程和线程)?????????????????读写锁:读写锁有两种获取方式,共享的和独占的,当处于自由状态时,试图以任何一种方式获取该锁都能成功,并将锁之余对应的状态,如果锁处于共享状态,其他线程以共享的方式获取该锁仍会成功,此时这个锁分配给了多个线程,然而,如果其他线程试图已独占的方式去获取处于共享状态的锁,那么它必须等待锁被所有线程释放,相应的,处于独占状态的锁将阻止其他任何线程获取该锁。(如果锁以共享的方式永远不释放,那独占的是不是永远不能获取到该锁)????。可重入:一个函数被重入,表示这个函数没有执行完成,由于外部因素或者内部调用,又一次进入该函数,一个函数要被重入,只有两种状态:1.多个线程同时执行这个函数2.函数自身(可能经过多层调用之后)调用自身。一个函数可被重入,表明这个函数被重入后不会产生任何不良后果。一个函数要被可重入,必须满足以下几点要求:1.不使用任何(局部)静态或全局的非const的变量2.不返回任何(局部)静态或全局的非const的变量3.依赖于调用方提供的函数4,不依赖于任何单个资源的锁5.不调用任何不可重入的函数可重入是并发安全的强力保证,一个可重入函数可以在多线程下放心使用。
原创粉丝点击