目录
1.进程
1.什么是进程
一个程序运行起来,完成一系列任务的模样。
注意区分进程和程序(可执行程序),可执行程序是静态的,存放在硬盘,当你双击后,操作系统会把可执行程序的关键信息加载金内存,然后运行里面代码,得到的就是进程。
2.进程是如何管理的
先描述: 使用一个类/结构体把这东西的特征表现出来
再组织: 再使用数据结构,把这些对象/结构体存储起来
我们操作系统对于进程线程的调度都是依靠PCB进行的
3.进程的互不干扰(隔离性)
每个进程都拥有自己的内存,不能互相干扰。
但是如果在程序中出现指针改变指向并且你还对他进行解引用等操作(进程的执行依靠于操作系统,而操作系统的底层大多由C语言完成),就可能导致其他进程的崩溃,这就违背了进程之间互不干扰的原则-------》因此引入了虚拟内存的概念,每个进程安排一段自己的内存空间。
每个虚拟地址都会经过MMU映射到内存上,如果内存非法,就代表进程运行过程中越界了,会由MMU报告给操作系统,然后操作系统中断进程。
上述做法带来了新的问题,万一虚拟地址开的太多,比物理地址还大怎么办?
这个问题在实际开发的过程比较少见,因为进程虽然多,但是同一时间运行的进程是比较少的,但是在极端情况下还是还会失衡(进程过多导致虚拟地址比物理地址还大,进程的运行就会出现问题)
4.进程间的合作办公(进程间通信)
操作系统引入了“进程间通信”,在保障隔离性的情况下,开个口子--->方法很多,但是本质都是提供一个公共资源给多个继承,借助公共资源通信。
2.线程
1.什么是线程
进程的开辟是非常麻烦也非常耗时间的,分三步
1.创建PCB
2.分配内存(非常麻烦)
3.把PCb加入内核链表
因此便有了轻量级进程(线程)的概念,既然分配内存麻烦,那干脆不分配了,每次公用一片内存空间,就不用分配了。
即 一个进程包括多个线程,第一个开辟的线程需要分配内存,此后所有这个在这个进程下的线程都用这片空间,简而言之一个进程下创造多个线程。
深入理解就是:进程就是一个工厂,线程就是里面的部分流水线(一小片代码),他们可以一起工作(同时工作)-》并发执行,流水线多了自然更快完成任务,但是在工厂不变大的情况下一直增大流水线那只会把CPU占满,这时增加流水线就没用了。
注意:其中操纵系统的调度不分线程进程,只认PCB。
经典问题: 进程和线程区别
1.进程包含线程,线程在进程内部
2.每个进程有独立的虚拟地址,也有自己的文件描述表; 同一个进程的多个线程之间,共用一份虚拟地址空间和文件描述符表 ------>即进程之间的资源是独立的 线程之间系统资源共享
3.进程是操作系统中资源分配的基本单位 线程是操作系统中调度执行的基本单位
4.多个进程同时执行,一个进程挂了不会影响别的进程;
但是同一个进程里的多个线程之间,一个挂了可能其他线程也没了.