运行中的程序在进行切换时, 可以分为以下两类:
- 线程: 只涉及指令的切换, 硬件资源没有切换;
- 进程: 包含指令的切换,以及硬件资源的切换, 其中映射表便是一种内存资源。
1. 进程间的切换示意图
这一讲中, 只会涉及指令的切换,暂不考虑资源的切换。
本质就是 映射表不改变, pc 指针改变
1.用户级线程
1.1 线程 thread
由前面的进程之间的切换可知,
不同的进程之间在进行切换时, 需要切换各自进程所对应的PCB, 以及 各个进程对应的 映射表;
由于不同的进程对应不同的映射表, 切换时,代价较大;
为了避免这种代价, 在切换时, 使得不同的程序之间共享同一张 映射表;
2. 运行的程序之间 共享资源 , 如内存资源, 数据资源 这些的共享
线程: 保留了程序并发的有点;
减少了进程切换的代价。
1.2 线程的实例
浏览器的使用:
线程之间的资源共享:
- 将从服务器中接受的数据, 如文本,图片数据 放在缓冲区中, 而其他的进程需要从映射表中读数据;
而如果使用进程完成上述任务,
进程之间,地址是分离的。
由于不同的进程,会有不同的映射表, 那么这些映射表将会存放在内存的不同区域, 这样同一份数据占用了更多的内存,这没有必要。
一个线程在下载数据时, 这个过程中,切换到其他线程, 用来显示文本数据;
当文本数据显示完成之后, 在重新切换到下载进程。
1.3 代码实现
pthread_create()
创建多个线程,
在各个线程执行的过程中,增加一些内容,
Yield ()
函数 实现线程之间的切换,