1.概念:
进程包括文本段(代码段)、当前活动、程序计数器的值、处理器寄存器的内容、堆栈段(including 临时数据,如函数参数,返回地址和局部变量)、数据段(including 全局变量)和堆(进程运行期间动态分配的内存)。
注意:程序(可执行文件)本身不是进程,程序只是被动实体,进程是活动实体。
2.状态
新的 运行 等待 就绪 终止
3.进程控制块(PCB)
进程状态 程序计数器 CPU寄存器 CPU调度信息 内存管理信息 记账信息 I/0状态信息
4.进程调度
(1)进程调度选择一个可用的进程(可能从多个可用进程集合中选择)到CPU执行。
(2)调度队列: 作业队列:包括系统中所有进程。
就绪队列:驻留在内存中就绪的,等待运行的进程。
设备队列:等待特定I/O设备的进程列表。
(3)进程选择由相应的调度程序来执行。
通常对于批处理系统,进程更多地是被提交,而非马上执行。这些进程被放到大容量存储设备(通常为磁盘)的缓冲池中,保存在那里以便以后执行。长期调度程序/作业调度程序从该池中选择进程,并装入内存中以便执行。(以I/O为主)
短期调度程序/CPU调度程序从准备执行的进程中选择进程,并为之分配CPU。(以CPU为主)
5.将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,该任务为上下文切换。
6.进程创建:
(1)大多数操作系统根据一个唯一的进程标识符(process identifier,pid)来识别进程,pid通常为一个整数值。
(2)创建子进程时,子进程可能直接从操作系统直接获得资源,也可能只从父进程获得资源;初始化数据(或输入)由父进程传递给子进程。
(3)当进程创建新进程时,有两种执行可能:
父进程与子进程并发执行; 父进程等待,直到某个或全部子进程执行完;
新进程的地址空间有两种可能:
子进程是父进程的复制品(具有与父进程相同的程序和数据); 子进程装入另一新程序。
(4)fork()用于创建新进程:对于新(子)进程,系统调用fork()返回值为0;对于父进程,返回值为子进程的pid。
(5)父进程用wait()等待子进程完成。
(6)exit()表示结束。(system call:用户在调用system call时,向内核传递一个系统调用号,然后系统调用处理程序通过此号从系统调用列表中找到相应的内核函数执行系统调用服务例程,然后返回)
7.进程通信
(1)共享内存 (2)消息传递 进程间通信机制(interprocess communication ,IPC)
对进程通信的补充:
(1)共享内存:参见博客:https://blog.csdn.net/skyroben/article/details/72625028(API+实例)
(2)消息传递
(2.1) 直接通信:
send(P,message):发送消息到进程P
receive(id,message):接受来自任何进程的消息,id设置成与其通信的进程名字
特点:在需要通信的每对进程之间自动建立线路,进程仅需要知道相互通信的标识符;
一个线路只与两个进程相关,每对进程之间只有一个线路。
间接通信:采用邮箱(邮箱可以抽象为一个对象,进程可以向其中存放消息,删除消息,每个邮箱有唯一的标识符)
send(A,message):发送一个消息到邮箱A
receive(A,message):接收来自邮箱A的消息
特点:只有在两个进程共享一个邮箱时,才可建立通信线路;
一个线路可以与两个或更多个进程相关联;
两个进程间可以有多个不同的线路,每个线路对应于一个邮箱。
(2.2)同步/异步 -----阻塞/非阻塞
阻塞:直到消息被接受才返回
非阻塞:直接返回
(2.3)缓冲 --建立消息队列
零容量 有限容量 无限容量