程序员的自我修养--链接、装载与库笔记:第一章温故而知新

对称多处理器(SMP,Symmetrical Multi-Processing):一个计算机拥有多个CPU,其中最常见的一种形式。
多核处理器(Multi-core Processor):将多个处理器“合并在一起打包出售”,这些“被打包”的处理器之间共享比较昂贵的缓存部件,只保留多个核心并且以一个处理器的外包装进行出售。
计算机软件体系结构图
接口上面为使用者,下面为提供者。

内存不够怎么办?

假设我们的计算机有128MB内存,程序A运行需要10MB,程序B需要100MB,程序C需要20MB。如果我们需要同时运行程序A和B,那么比较直接的做法是将内存的前10MB分配给程序A,10MB~110MB分配给B。这样就能够实现A和B两个程序同时运行,但是这种简单的内存分配策略问题很多.

  1. 地址空间不隔离:程序所使用的内存空间不是相互隔离的,恶意的程序、臭虫的程序改写了其他程序的数据(内存数据),使其他程序崩溃 无法保证 安全稳定的计算机环境。
  2. 内存使用效率低:无有效的内存管理机制,大量的数据再换入换出,导致效率十分低下。
  3. 程序运行的地址不确定:程序每次需要装入运行时,要给它从内存中分配一块足够大的空闲区域,此区域位置会不确定因此在编写时为固定所以设计程序的重定位问题。

解决方案
增加中间层,即使用一种间接地址访问方法
把程序给出的地址看作是一种虚拟地址然后通过某些映射的方法:将虚拟地址———>实际的物理地址。
若能妥善控制这个映射过程,就可以保证任一程序,访问的物理内存区域和另外一个程序相互不重叠达到地址隔离

隔离:每个进程都有自己独立的虚拟空间,而且每个进程智能访问自己的地址空间。

分段分段映射机制
分页

线程

线程状态切换
饿死现象
在优先级调度下,一个线程被饿死,是说它的优先级较低,在它执行之前,总是有较高优先级的线程试图执行,因此这个低优先级线程始终无法执行。当一个CPU密集型的线程获得较高的优先级时,许多低优先级的进程就很可能饿死。而一个高优先级的IO密集型线程由于大部分时间都处于等待状态,因此相对不容易造成其他线程饿死。
避免饿死现象:调度系统常常会逐步提升那些等待了过长时间的得不到执行的线程的优先级。在这样的手段下,一个线程只要等待足够长的时间,其优先级一定会提高到足够让它执行的程度。

在优先级调度的环境下,线程的优先级改变一般有三种方式。

  1. 用户指定优先级。
  2. 根据进入等待状态的频繁程度提升或降低优先级。
  3. 长时间得不到执行而被提升优先级。

线程主动放弃执行无非两种情况

  1. 当线程试图等待某事件时(I/O等)。
  2. 线程主动放弃时间片。

Linux的多线程

fork 复制当前进程
fork函数产生一个和当前进程完全一样的新进程,并和当前进程一样从fork函数里返回,例如如下代码:

pid_t pid;
if(pid =fork())
{
 ...
 }

注:调用该命令后,新任务将启动并和本任务一起从fork函数返回。不同的时本任务的fork返回新任务的pid,新任务的fork将返回0.

fork复制的特殊性
fork产生新任务速度非常快,并不复制原任务的内存空间,而是和原任务一起共享一个写时复制的内存空间。
配合exec一起使用,调用exec来执行新的可执行文件
fork和exec通常用于产生新任务。
写时复制
**

线程安全与多线程

1.6.2 线程安全**
多线程程序处于一个多变的环境中,可访问的全局变量和堆数据随时都可能被其他的线程改变,因此多线程程序在并发时数据的一致性变得很重要。
竞争和原子操作
例如:自增(++)操作在多线程环境下会出现错误是因为这个操作被编译成汇编代码时不止一条指令,因此在执行的时候容易被打断。
原子的(Atomic):单指令操作。 单挑指令的执行是不会被打断的。
在Windows下的一套API专门进行一些原子操作如图所示
Interlocked API
同步与锁

可重入和线程安全
一个函数要被重入,只有两种情况

  1. 多个线程同时执行这个函数。
  2. 函数自身(可能是经过多层调用之后)调用自身。

可重入函数的特点

  1. 不使用任何(局部)静态或全局的非const变量。
  2. 不返回任何(局部)静态或全局的非const变量的指针。
  3. 仅依赖于调用方提供的参数。
  4. 不依赖任何单个资源的锁(mutex等)。不调用任何不可重入的函数。
  5. 可重入是并发安全的强力保障,一个可重入的函数可以在多线程环境下放心使用。

读后感受
从攻克方面来说对于计算机新人来说也许较难理解,专业名词过于多。有些抽象的概念也很难以理解,要有相关知识的积累才能一点一点的真正理解该内容,对于此部分要做到能够大致说清,没必要死记硬背官方的答案。总结知识点也要有着重的部分,这仅仅是本书的第一章开篇了解了一些知识才能“温故而知新”。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值