进程与线程
(1) 核心定义
进程是操作系统进行资源分配和调度的基本单位,是程序的一次执行过程,拥有独立的地址空间,程序段、数据段以及PCB,进程均是系统进行资源分配的最小单位,未引入线程的OS中,进程也是调度的最小单位。
程序段和数据段存储在磁盘上,静态的,一组指令、数据和对齐组织描述的总和。PCB是动态的,将这些程序与数据从磁盘调入内存时OS为每个进程配备的完整的记录型数据结构,用来描述进程当前的状态。
PCB是进程独立运行基本单位的标志,能够实现进程的间断运行(保存处理器现场信息),提供进程管理的信息,提供进程调度信息,实现与其他进程的同步和通信。PCB中包含PID的进程标识符,处理器状态信息(PC,PSW, 通用寄存器,用户栈指针,PTBR),处理器调度信息(调度状态,调度优先级,调度相关信息,事件),进程控制信息(进程同步机制,代码段和数据段地址。资源清单和链接指针)
线程是进程中的一个实体,是CPU调度和执行的最小单位,是进程的子集,同一进程中的线程共享进程的资源,线程自身基本不拥有系统资源,只拥有一点在运行中必不可少的资源,如程序计数器、一组寄存器和栈。
寄存器信息(通用寄存器,PC,PSW)、局部变量、栈地址空间、栈帧,各线程等待信号屏蔽字均为线程独占,而不是共享的。
线程可分为用户级线程和内核级线程,用户级线程是在用户空间中完成创建执行,比如线程池,OS感知不到,因此可以在不支持线程的OS平台上运行,没有内核参与效率更高。缺点是一旦某线程阻塞其余跟着遭殃,不能利用多处理实现并发,因为OS只会为该进程分配一个处理器,同时只能有一个线程处于执行态。
内核级线程优点是内核可调度一个进程内多个线程上处理机运行,完美适配多处理器技术,当一个线程被阻塞时还能切换到另一个线程上处理器运行,OS自身也可以用多线程,缺点是引入额外开销。
还有两种组合方式,多对一模型指的是多个用户对一个内核,本质上还是跟单独的用户线程差不多,一个阻塞其余也阻塞,优点效率高,多对多需要保证用户级线程个数大于内核级线程个数,可以在多核系统是并发运行。
(2) 关键特征或步骤
- 进程的关键特征
- 独立性:进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位,各进程之间互不干扰。
- 动态性:进程具有生命周期,从创建到终止,其状态在不断变化,是动态的实体。
- 并发性:多个进程可以在系统中同时运行,共享系统资源,相互协作或竞争。
- 结构特征:由程序、数据和进程控制块三部分组成,程序和数据说明进程运行的实体,进程控制块是进程存在的标志,记录了进程运行过程中的各种信息。
- 线程的关键特征
- 轻量级:线程上下文切换开销小,创建和撤销的代价也小,系统在进行线程切换时,只需要保存和恢复线程的寄存器和栈指针等少量信息。
- 并发性:线程是CPU调度和执行的最小单位,可以实现更细粒度的并发操作,提高系统的并发性能和资源利用率。
- 共享性:同一进程中的线程共享进程的资源,如地址空间、文件描述符等,线程间通信更方便。
进程间通信分为高级通信和低级通信,其中信号量属于低级,效率低,对用户不透明,高级通信可以高效实现大规模数据传输,由OS以系统调用形式提供。
共享存储通信方式分为进程间共享同一数据结构(低级),共享存储区的通信方式(高级),共享存储区是OS在内核中开辟一块共享存储区
信息传递分为直接和间接,两者均为高级共享方式,间接是多个进程借助信箱通信,方向是双向的,通过不阻塞发生,阻塞接收来实现进程同步。而直接信息传递是两个进程间单向发生到对方的消息队列中
管道通信是基于共享文件来事件进程间通信,可以有多个读写进程,但应使用同步机制保证同一时刻一个方向上只有一个进程进行操作。当有一个进程对管道进行读或写操作,其他进程必须等待,管道是一个固定大小缓冲区,在内核中实现,其大小不受磁盘大小限制。
管道实质是一个共享文件,读进程将管道视为输出文件,写进程将管道视为输入文件,可以利用文件系统机制实现。
读数据操作是一次性的,管道中的数据一旦被读取就会被抛弃,管道是半双工通信,数据只能单向传输。
信号是一种单向事件通知能力的软中断,通过发送指定信号来通知进程某个事件发送,以迫使进程执行信号处理程序。
信号可以由用户、OS内核和进程产生,用户通过输入特定字符请求内核产生信号,OS会给前台进程组中所有进程发送中断信号SIGINT。当进程运行遇到错误是,OS内核会检测错误事件并发送信号给出错进程。
进程之间可以通过系统调用产生信号进行通信。
OS内核可以采用3种方式处理信号,一是直接忽略(KILL和STOP不能忽略),二是自执行内核默认函数(对于未注册信号处理函数的信号,进程执行默认操作),三是执行信号处理函数(通过系统调用未特定信号注册处理函数,内核收到信号后会将信号编号作为参数调用该函数)
进程间信号通信机制是通过用户注册的信号处理函数实现的。
(3) 典型应用场景
- 进程的典型应用场景
- 多任务操作系统:不同的应用程序作为不同的进程在系统中运行,用户可以同时打开多个应用程序进行操作,如同时运行文本编辑器、浏览器和音乐播放器等,操作系统通过进程调度算法合理分配CPU时间,使各个应用程序能够并发执行。
- 服务器端程序:一个服务器程序通常以一个进程的形式运行,负责处理来自客户端的请求,如Web服务器、数据库服务器等,服务器进程会根据请求的类型和内容,调用相应的子进程或函数来完成任务,当请求处理完成后,子进程结束或者返回结果给主进程。
- 线程的典型应用场景
- 多线程服务器:服务器程序使用多线程来处理客户端请求,当服务器接收到一个客户端请求时,就会创建一个线程来处理该请求,这样可以同时处理多个客户端请求,提高服务器的并发处理能力和响应速度,如Tomcat等Web服务器。
- 图形用户界面程序:在图形用户界面程序中,通常会有一个主线程负责界面的绘制和事件的响应,当用户触发某个事件(如点击按钮、输入文本等)时,主线程会创建一个线程来处理该事件,避免主线程被长时间占用而导致界面卡顿,如Windows应用程序、Android应用程序等,主线程和事件处理线程之间通过消息队列等方式进行通信。
浙公网安备 33010602011771号