进程那一章,我们留下了一个问题
第一个cpu调用进程,进程调用i/o设备,主动进入ready 队列
第二个cpu将程序执行时间平均分时,进程执行时间到
第三个fork函数,我们上一章的lab有实践,可以看出是父进程主动条用fork函数产生子进程
第四个interrupt,上一章我们有演示wait等待,所以这个也是主动的。
上一章我们做的实验可以看出,这里的执行流内存不一样,pid不一样,但子进程的内存数据是clone父进程的。
这里有个坏处
如果能在一个进程当中出现两个一样的执行流,这两个执行流共享内存空间
我们管这样的方式叫做并发的线程
多进程通信和多线程通信的区别:
多进程通信如父进程正在进行copy文件,而子进程有一个取消按钮
点击之后取消按钮产生一个子进程,父进程等待子进程执行,发现子进程是中断父进程
多线程通信 父线程1在copy文件,产生n个子线程(因为可能要copy多个文件夹),然后当点击取消时,产生要给wait abouting线程,去通知父线程取消copy文件。
两者的区别在于,点击取消事件时,进程会产生一此clone,子进程要clone父进程,产生一个内存空间
这里需要实验进行演示,不然不好理解。
进程切换开销
我们推出线程这个概念的动机
线程的定义
下面我们可以看到单线程的单进程只有一个PCB+code+date区域;而单进程多线程是共享code+data+files区域的。其实就是共享了存储数据、代码、全局变量,但每个线程都有自己的堆栈空间和寄存
单cpu多线程
线程并发,需要来回切换
多cpu多线程
多线程在多cpu环境下也可以设置为并行模式
现在操作系统的线程概念
多核编程
我们需要设计程序时将多核的性能应用起来,不然全是顺序执行的单进程单线程的应用,完全是浪费资源的行为。
多核线程模型
多线程模型
多对一模型,用户线程在用户模式下一个进程有多个线程,这个进程对应一个内核线程,这个进程有多个线程,也就达成了多个用户线程对应一个内核线程
如果只有一个内核
虽然我们也有多个进程(执行流),在用户感觉上是多个进程并行,但是其实因为我们只有一个内核,所以一次只能运行一个线程,所以这里还是并发,但这里不止是进程的并发,也是线程的并发,上面那个一对多每个进程最少有一个线程可以和其他进程进行并发,这就是单核和多核的区别。
一对一
这里可以看出不管是进程还是线程都做到一对一,实现逻辑上基本可以说这些进程是并行的,但是这也取决于核心数量
多对多
多路复用,取决于cpu的调度,每个进程的开销不一样,需要cpu进行调度去分配内核线程
线程库
linux关注于posix pthread 这个p代表用户线程和内核线程都可以被创建