当一个程序运行起来时,操作系统要为之分配些许资源,这样运行起来的一个程序就可以称之为一个进程,为了有效解决并发编程, 由于多进程对于系统的开销比较大,从而提出了多线程,进程包括线程,同时一个进程可以包含多个线程,多个线程共享一块资源,此时就可以减少系统的大量开销.
应用程序 -> 系统调用 -> 操作系统内核 -> 驱动程序 -> 硬件设备
ps:系统调用会为应用程序提供api,操作系统的核心功能是对上和对下进行管理.
由于cpu的资源有限,需要对多个进程进行合理的分配,让有限的资源可以执行多个进程.
微观上同一时刻,两个核心上的进程就是同时进行的.
微观上同一时刻,一个核心只能运行一个进程,但他对于进程之间的切换是足够快的.
一个运行起来的程序就称之为一个进程, 没有运行起来就不算,每个进程同时都会对应一些资源,进程是重要的"系统资源",由操作系统负责管理,以组织和描述的方式进行管理.
使用c语言中的结构体对进程的属性进行描述,每个这样的结构体称为“进程控制块”,简称:PCB。
由于进程对系统资源的开销比较大,所以提出了多线程,共用一个进程的资源.
一个进程可以包含多个线程,多个线程对同一个进程的资源进行共享(内存,文件描述符表等),这样就节省了资源,但是也会出现新的问题:"线程安全问题"
线程安全:多个线程争取同一块资源,一个进程中的一个线程抛异常可能会导致整个进程发生崩溃.
1) 每个线程都对应不同的pcb,当pcb被cpu调度时,这个线程就启动了.
2) 操作系统调度时,是以线程为单位的.
3) 一个进程里的线程,pid,内存指针,文件描述符表都是相同的.
4) 线程之间是同时执行的,我们看起来可能没有什么规则,但是在操作系统内核中,是有一定规律的,(取决于操作系统调度器策略的实现).
5) 进程负责资源分配,线程负责接管和调度一切任务.
进程的身份标识符,不同的进程的pid不同(唯一的数字)
指向了这个进程使用的内存空间.
硬盘上的文件,等其他资源.
1) 进程的状态:
就绪状态,运行状态,阻塞状态(进程正在其他地方运行).
2)优先级:
对进程划分优先级,先执行那个在执行那个.
3)上下文:
操作系统在对进程切换的时候,会记录进程的中间状态,下一次进程执行的时候会恢复到原来的状态,中间状态的数据是存储在寄存器上的.(好比函数的返回值)
4)记账信息:
操作系统统计每个进程在cpu上占用的时间和执行指令的条数,用来决定下个阶段该如何调度.
通过一个双向链表对进程实现管理,把每个进程的pcb通过双向链表连接起来(这里不是一个单纯的双向链表).
如果有一个进程对内存的使用越界了,就会影响到另一个进程的内从空间,两个进程就可能同时进入崩溃,所以提出了虚拟内存的方法.
针对进程使用的内存空间进行隔离,代码里也不再使用物理内存,而是用虚拟内存,由操作系统专门的硬件设备实现虚拟内存到物理内存的转换.
ps:操作系统中硬件设备一旦发现某个进程内存越界,就会反馈错误,使其进程崩溃,从而不影响其他线程的执行.
这样将进程间隔离起来,但是进程间也需要数据交互,实现的核心思想:对进程见提供一个可以公共访问的空间,基于这个公共空间实现许局交互.
这里列举一些主流操作系统提供的进程间的通信机制: 管理, 共享内存, 文件, 网络, 信号量, 信号.
这里的内容需要理解,方便加深我们的记忆.