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