程序
1、进程执行顺序可用前驱图表示,前驱图不可循环。
2、程序顺序执行的特征:顺序性;封闭性;可再现性。
进程描述
1、在操作系统中,进程是程序在并发环境中的执行过程。PCB、程序段和数据段共同构成进程。进程具有动态性(创建->调度->撤销)、并发性(不存在前驱关系)、独立性(资源独立)、异步性和结构性五大特征。
进程和程序的区别是,进程是一动态概念,而程序是一静态概念。程序是指令的有序集合,永远存在,而进程强调的是执行,是程序在数据集上的一次执行,有创建、有撤销,存在是暂时的;进程具有并发性,而程序没有;进程是竞争计算机资源的基本单位,程序不是。进程是程序在数据集上的一次执行,一个程序可对应多个进程,一个进程可包含多个程序。
2、每个进程中都有进程控制块(PCB),进行进程控制和管理,里面包含进程的状态和调度等信息,包括:进程内外标识符;处理机状态(进程用到的寄存器、指令计数器(当前指令信息和下一条指令号等)、程序状态字(状态信息)、用户栈指针(栈顶指针,方便再次执行时作为起点))、进程调度信息(进程状态、进程优先级、事件)和进程控制信息(程序和数据地址、通信机制、资源清单和链接指针)。
创建和注销进程都是创建和注销进程的PCB。PCB作用:1)作为独立运行标志,创建进程时申请PCB,注销进程时,清零PCB;2)在PCB中存储CPU现场信息,实现间断性运行;3)保存进程所需资源信息,包括内存外存起始指针、IO设备信息等;4)协助进程调度,保存进程状态和优先级等信息;5)协助进程间通信,保存通信信号、管道等相关信息。
3、操作系统将资源或进程抽象为数据结构,称为资源信息表,其中包括资源或进程的标识、描述、状态等信息和一批指针。通过指针可以将同类资源或进程链接成相应的队列。比如:内存表、设备表、文件表和进程管理表。进程管理表组织方式有3种,包括:线性表、链表、索引表(建立不同状态的索引表,将索引表首地址记录在OS的专用单元中,将相同状态的PCB标识信息存在索引表中)。
进程状态切换
1、进程的五种基本状态:创建(内核中申请PCB,分配资源)、就绪(有资源无cpu时间,插入就绪队列)、阻塞(无资源)、执行和终止(PCB清零、资源释放)。挂起操作会直接将进程转化为禁止状态。
进程控制就是根据具体的情况进行进程状态切换。
2、进程管理都是在内核态实现的。为防止OS本身关键数据遭受应用程序破坏,操作系统分为两种处理机状态:内核态,运行操作系统程序,权限高。用户态,运行用户程序。内核态包含以下功能:支撑功能(中断处理、时钟管理和原语操作(不可分割))和资源管理功能(进程管理、存储器管理和设备管理)。
3、可以在一个进程中创建他的子进程,并通过获取的子进程句柄实现子进程控制。
4、进程创建流程:1)申请PCB; 2)为进程分配物理和逻辑资源;3)初始化PCB,包括:标识信息、状态信息和控制信息;4)将进程插入就绪队列。进程创建场景:1)用户登录;2)作业调度。3)提供服务。4)响应请求。
5、进程终止过程:
1)调用中止原语,在内核中找到对应进程的PCB,如果PCB状态为正在执行,则将PCB状态置为中止,将调度状态置为true,等待后续继续调度。
2)如果该进程有子孙进程,则将子孙进程也停止。
2)释放资源,将资源归还为父进程或者操作系统。
3)将进程的PCB从队列中移除。
进程结束原因:1)正常结束,执行到进程结束指令。2)异常终止,包括:异常越界;异常校验;异常权限访问;异常IO访问;非法指令;指令运行超时;等待超时;3)其他干预,包括:父进程干预、父进程终止、用户干预。
6、进程阻塞流程:1)调用阻塞原语,中止进程;2)将进程插入阻塞队列;3)将cpu资源释放给其他进程,但是进程不会被调出内存;4)修改cpu相应的参数信息;
进程阻塞原因:1)等资源;2)等某个操作;3)等数据;4)等某个任务完成。
7、进程唤醒,当进程等待的条件满足时,进程从阻塞队列移到就绪队列。
8、进程挂起,将进程从其他状态转变为挂起状态,并将进程调出外存;进程激活,是将进程从挂起状态转变为其他状态,并将进程调入内存,比较进程和当前正在执行的优先级,如果激活进程优先级较高,则将进程从终止状态转变为执行状态,否则进入就绪队列。
9、进程切换时需要保存的处理机状态信息。包括:程序计数器、堆栈指针、寄存器值、处理器状态寄存器、内存管理信息和相关硬件状态
进程同步
1、进程同步通过协调进程执行顺序,使得并发进程互相合作,按照一定的时序和规则共享系统资源,使得程序的执行有可再现性。
2、软件同步限制机制:1)进程之间的制约关系:间接制约,两个进程访问同一个资源;直接制约,两个进程之间存在依赖关系。2)通过进入区和退出区代码,对临界区资源进行互斥访问控制。3)同步机制:空闲让进;忙则等待;限时等待;让权等待。
3、硬件同步限制机制:1)关中断;2)TS原语;3)swap指令;
4、信号量:1)整型信号量,用于表示资源数目的整型参数,循环不让权等待。2)记录型信号量,通过资源数目和等待进程指针链表,不循环等待,将所有等待进程都加入链表,方便管理。3)AND型信号量,将进程所需资源一次性全部分给进程,只要有一个资源没有分给进程,则它所需的所有资源全都不分给进程,避免死锁。4)信号量集,一次分配n个资源。要先wait资源信号量,再wait互斥信号量,否则容易引起死锁。
5、mutex semaphore为互斥信号量,初始值为1。mutex semaphore为1时,两个进程都没进入临界区,mutex semaphore为0时,有一个进程进入临界区,mutex semaphore为-1时,一个进程进入临界区,一个进程阻塞在信号队列中,通过wait和signal/notify_one控制。还可以控制前驱关系。
6、系统中各种硬件资源和软件资源均可用数据结构描述其资源特性,而忽略他们的内部实现细节。对系统中的共享资源的获取指定一系列特定操作流程,称为管程。确保每次仅有一个进程可以进入管程,使用共享资源。管程包括:1)管程名称;2)管程中的共享数据;3)共享数据操作过程。(面向对象思想)。
7、管程和进程的区别:1)进程定义私有数据结构PCB,管程定义公共数据结构,如消息队列等;2)进程中的数据结构操作流程是程序过程执行,管程中的数据结构操作是初始化和同步操作;3)进程的目的是实现并发性,管程的目的是解决共享资源冲突;4)进程是主动工作,管程是被动工作,进程调用管程。
8、管程中设置多个条件变量,每个变量保存一条链表,用于记录该条件变量而阻塞的所有进程。
进程通信
1、进程通信类型:
1)共享存储器系统:共享内存(在内存中划出一块区域,附加到用于通信的多个进程地址空间中)、fifo(适合少量数据传输)。
2)管道:用于连接读写进程的一个通信文件,发送进程以字符流的形式将数据输入管道,接收线程再从管道中读取。特征:1)连接确认,发送和接收线程必须确认彼此存在,才会开始工作。2)互斥,发送和接收进程不能同时读写;3)同步,发送进程发送数据后进入休眠,并通知接受线程;接收线程接收数据后进入休眠,并通知发送线程。
3)消息传递系统(消息队列和信号):进程将通信的数据封装在消息中,并利用操作系统提供的一组通信命令进行进程间的消息传递和数据交换。
4)客户服务器系统:socket(发送线程创建套接字和端口绑定->接收线程监听请求消息->发送和接收线程连接->数据传输->关闭连接),包括目的地址、端口号、网络协议、网络地址、API函数等。远程过程调用和远程方法调用:本地进程通过网络远程调用远程服务器上的进程,本地进程传递参数并授权给本地存根,本地存根建立包含参数和目的过程名的消息,本地通信进程将消息传递给服务器通信进程,进程将消息存储在消息队列中,出队列时,将消息传递给对应的服务器存根,服务器存根解析消息后调用对应的服务器进程中的过程,然后将结果原路返回给客户端进程。
2、消息传递通信的实现方式:
1)直接消息传递系统,包括直接通信原语和非对称寻址方式。消息格式:本地机器内进程通信消息格式简单,长度固定;跨机器通信消息格式复杂,长度不定。进程同步情况:发送和接收进程都阻塞,经常是由于发送和接收进程之间无缓存导致的;发送进程不阻塞,接收进程阻塞,大部分情况都是接收进程阻塞等待发送进程数据处理结束后,数据发送;发送和接收进程都不阻塞,发送和接收进程都在进行自己的工作。通信链路,发送进程通过请求主动建立的单向或双向链路。
2)间接通信,进程之间的通信需要某种中间实体来完成。发送进程可以把数据发送给实体,接收进程可以从实体接收数据。我们称实体为信箱,每个信箱都包含信箱头和信箱体。通过信箱原语实现信箱通信,包括:创建和撤销、消息发送和接收。信箱的类型包括:私用信箱、公用信箱和共享信箱。
线程
1、引入线程是为了减少程序在并发时所付出的时空开销,使得OS具有更好的并发性。由于进程是拥有资源的独立单位,所以在创建、撤销和切换进程的时候都会造成大量的时空开销。
2、线程和进程的区别:
1)进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位,线程的切换只需要保存和设置少量寄存器内容。
2)在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
3)所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
4)内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
5)包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
3、在多线程编程中,通过线程调用函数和直接调用函数之间有几个关键的区别:
-
并发执行:
- 线程调用函数:通过线程调用函数时,函数会在新的线程中执行,与主线程(或其他线程)的执行是并发的。这意味着函数可能会与其他线程中的代码交替执行,具体执行顺序取决于操作系统的调度和线程的优先级设置。
- 直接调用函数:直接调用函数时,函数会在当前线程中顺序执行,直到函数返回或者遇到阻塞操作为止。
-
上下文和资源隔离:
- 线程调用函数:在新线程中执行函数时,它拥有独立的执行上下文和资源,例如栈空间。这意味着函数执行期间可以并行运行,互不影响地访问数据和资源。
- 直接调用函数:直接调用函数时,函数与调用者共享同一线程上下文和资源。这可能导致数据竞争和其他线程安全问题,除非在函数内部进行了显式的同步和互斥操作。
-
通信与同步:
- 线程调用函数:通常需要通过消息传递、共享内存或同步机制(如互斥锁、条件变量等)进行线程间通信和同步。例如,一个线程调用完函数后可能需要等待另一个线程处理完特定任务。
- 直接调用函数:函数的调用者和被调用者可以直接共享内存和变量,因此可以更直接地进行数据传递和共享。
-
线程管理:
- 线程调用函数:需要考虑线程的创建、启动、管理和销毁过程,这可能涉及到线程的生命周期管理、资源释放等复杂问题。
- 直接调用函数:不涉及额外的线程管理开销和复杂性,函数调用完成后,控制权立即返回给调用者。
综上所述,使用线程调用函数和直接调用函数之间的选择取决于具体的需求和情境。多线程适用于需要并发执行、资源隔离、异步处理和复杂同步逻辑的情况,而直接调用函数则适用于简单的顺序执行和共享资源的场景。
4、线程状态:执行、就绪和阻塞。
5、每个线程都有一个TCB,包括:1)线程标识符;2)状态、通用和计数寄存器;3)线程运行状态;4)线程存储器信息;5)优先级;6)堆栈指针,保存局部变量、过程调用返回地址和核心栈。
6、线程分为内核级线程和用户级线程:
1)内核级线程的创建、撤销、同步调度和通信都是在内核中实现的,内核为每个内核线程设置了一个TCB。
优点:内核线程具有很小的数据结构和堆栈,线程切换比较快,开销比较小;
缺点:内核线程需要分配独立的内核栈,会占用一定的内存资源。
2)用户级线程,用户级线程所属的进程也是在内核中,但是用户级线程的创建、撤销、同步调度和通信是由线程库管理的,不需要内核支持。
优点:线程切换不需要切换到内核态。
缺点:在多对一模型中,一个线程被阻塞,其他线程只能等待。因为一个线程库中的所有线程都是映射到一个内核级线程上的。
3)内核和用户组合线程:多对多模式下,不会产生一个线程阻塞所有线程,也可以减少线程的时空开销。
7、内核级线程创建时,先在进程中建立一个任务数据区,在进程中每建立一个线程都在任务数据区中为其分配一个TCB,直到任务数据区线程数量达到上限。线程撤销时,回收线程对应的任务数据区空间。可通过时间片轮转和优先权算法等进行线程调度。
8、用户级线程是在用户空间实现的,通过运行时系统或内核控制。1)运行时系统是管理和控制线程函数的集合,直接进行线程调度,无需内核参与。内核控制用户级线程是在进程中创建一个线程池,线程池中包含多个类内核线程数据结果LWP,每个LWP连接到一个内核线程上,每个用户级线程都可以连接到线程池中的任何一个LWP上,当用户级线程需要和内核交互时就需要连接LWP,不交互时不需要连接。通过线程创建函数和撤销函数实现线程的创建和撤销。
9、如果不进行线程和cpu核绑定,操作系统会进行cpu核负载均衡。也可以通过pthread_setaffinity_np给某个线程设置固定的cpu核。