1、进程和线程的概念;为什么要有进程线程;进程和线程的区别;它们各自是怎么同步的
基本概念:
进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位,每个线程独自占有一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。进程中的每个线程完成不同的任务,但是共享同一地址空间(即同样的动态内存、映射文件、目标代码),打开的文件队列和内核资源。
为什么要有进程线程:
进程可以使多个程序并发执行,以提高资源的利用率和系统吞吐量。但仍有一些缺点:
进程在同一时间只能干一件事,如果进程在执行过程中阻塞,整个进程就会挂掉(即使进程中有些工作不依赖于等待的资源仍然不会运行)。
因此操作系统引入比进程颗粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时空开销,提高并发性。
线程的优势如下:
从系统开销来讲,在创建或撤销进程时,系统都为之分配或回收资源,如内存空间、I/O设备等。因此操作系统所付出的时空开销显著大于创建和撤销线程时的开销。
从切换效率来讲,在进行进程切换的时候,涉及到整个当前进程的CPU环境的保存和将要被调度运行的进程的CPU环境的设置。而线程只需要保存和设置少量寄存器信息,不涉及存储器管理的操作。可见进程切换的开销也远大于线程切换的开销。
从通信机制来讲,由于同一进程的多个线程共享同一地址空间,他们之间的同步和通信也变得比较容易。可以直接读写进程数据段(如全局变量)来进行通信
进程间通信IPC,需要进程同步和互斥手段的辅助,以保证数据的一致性。
除此之外,1)线程可以使多CPU系统更加有效:操作系统会保证当线程数不大于CPU数目时,不同线程运行在不同CPU;2)还可以改善程序结构:一个长而复杂的进程可以考虑分成多个线程,这样的程序有利于理解和修改。
区别:
1、一个线程只属于一个进程,一个进程可以拥有多个线程,至少一个线程。线程依赖于进程。
2、进程是系统资源调度和分配的基本单位,线程是CPU调度和分派的基本单位。
3、进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存空间。(共享的资源包括:代码段(代码和常量)、数据段(全局变量和静态变量)、拓展段(堆存储),但是每个线程拥有自己的栈段,用于存放局部变量和临时变量)。
4、进程间不会相互影响;线程挂掉会导致整个进程挂掉。
5、进程适用于多核多机分布的场景;线程适用于多核。
6、系统开销:在创建或撤销进程时,系统都为之分配或回收资源,如内存空间、I/O设备等。因此操作系统所付出的时空开销显著大于创建和撤销线程时的开销。
类似地,在进行进程切换的时候,涉及到整个当前进程的CPU环境的保存和将要被调度运行的进程的CPU环境的设置。而线程只需要保存和设置少量寄存器信息,不涉及存储器管理的操作。可见进程切换的开销也远大于线程切换的开销。
7、通信:由于同一进程的多个线程共享同一地址空间,他们之间的同步和通信也变得比较容易。可以直接读写进程数据段(如全局变量)来进行通信
进程间通信IPC,需要进程同步和互斥手段的辅助,以保证数据的一致性。
8、进程编程调试简单,可靠性高、但是创建开销大;线程相反,创建开销小,切换速度快,但是编程调试相对复杂。、
进程间通信方式:
管道、系统IPC(消息队列、信号量、信号、共享内存)、套接字socket.
1)管道
管道分为命名管道和无名管道,管道可用于具有亲缘关系的父子间通信,而命名管道除了具有管道的功能外,也可用于无亲缘关系的进程间通信。
1.1 普通管道PIPE:
它是半双工的,具有固定的读端和写端。只能用于具有亲缘关系的父子进程间通信;可看做一种特殊的文件,但不存在于任何文件系统。
1.2 命名管道FIFO:
FIFO可以用于无关进程之间交换数据;FIFO有路径名与之关联,以一种特殊设备文件形式存在于文件系统中。
2)系统IPC
2.1 消息队列
消息队列是消息的链接表,存放在内核中。一个消息队列由一个标识符(队列ID)来标记。(消息队列克服了信息传递量少,管道只能承载无格式字节流以及缓冲区大小受限等特点) 具有写权限的进程可以按照一定的规则向消息队列中添加新的消息;具有读权限的进程可以从消息队列读取消息。
特点:
消息队列是面向对象的,其中的消息具有特定的格式以及特定的优先级;消息队列独立于发送与接受进程,进程终止,消息队列也不会删除;可以实现随机查询。
2.2 信号量semaphor
信号量是一个计数器,可以用来控制多个进程对资源的访问。信号量用于实现进程间的互斥与同步,微不是用于存储进程间通讯数据。
特点:
信号量用于进程同步,若要在进程间传递数据需要配合共享内存;信号量基于系统的PV操作,程序对信号量的操作都是原子操作。而且每次对信号量的PV操作可以加减任意正整数。支持信号量组。
2.3信号singal
它是一种比较复杂的通信方式,用于通知接受进程某个事件已经发生。
2.4 共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的ipc通信方式(它是针对其他进程间通信方式运行效率低而专门设计的)。它往往和其他通信方式如信号量和互斥锁,配合使用来实现进程间的同步和通信
3) 套接字
套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备间的进程通信
线程间的通信方式
临界区:通过多线程的串行化来访问公共资源或一段代码段,速度快,适合控制数据访问。
锁机制:包括互斥锁、条件变量、读写锁
互斥锁:提供了以排他方式防止数据结构被并发修改的方法。
读写锁:允许多个线程同时共享数据,而对写操作是互斥的。
条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制(Semaphore):包括无名进程信号量和命名线程信号量
信号机制(Signal):类似进程间的信号处理
2、并发和并行
并发指的是从宏观上看两个程序在同时运行,比如单核CPU上的多任务,但是从微观上看两个程序的指令是交织着运行的,在单个周期内只运行了一个指令。这种并发不能提高计算机的性能,只能提高效率。
并行指的是严格物理意义上的同时运行,比如多核CPU,两个程序同时运行在两个核上。互不影响,单个周期内每个程序都运行了自己的指令。提高了计算机的效率。
3、页表寻址
页式内存管理中(传统的非连续分配内存管理),内存分成固定长度的一个个页片。操作系统为每一个进程维护了一个从虚拟地址到物理地址的映射关系的数据结构,叫页表。页表的内容是该进程的虚拟地址到物理地址的一个映射。页表中的每一项都记录了这个页的基地址。
通过页表,由逻辑地址的高位部分先找到逻辑地址对应的页基地址,再由基地址偏移一定的长度就得到最后的物理地址,偏移的长度由逻辑地址的低位部分决定。
一般情况下这个过程由硬件完成,所以效率很高,页式内存管理的优点是比较灵活,内存管理以较小的页为单位,方便内存换入换出和扩充地址空间。
4、虚拟内存(虚拟地址空间)&&缺页中断&&缺页置换算法
虚拟内存
- 内存空间的扩充方式有三种:交换技术,覆盖技术和虚拟内存。
交换技术:暂时用不到的进程和数据放到外存。(应用于大范围多个程序问题)
覆盖技术:按程序的逻辑结构,把程序划分成多个模块,让不能同时被访问的程序段共享同一覆盖区。
(应用于小范围一个程序内问题)
虚拟存储:以更小的页颗粒单位在有限内存条件下装入更多更大程序。
程序不需要全部装入即可运行,运行时根据需要动态调入数据,若内存不够,还需置换一部分空间。
请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。
- 虚拟内存的好处:
1.扩大地址空间。
2.内存保护:每个进程运行在各自的虚拟内存空间,互不干扰。
3.公平内存分配,采用了虚存之后,每个进程都相当于有同样大小的虚存空间。
4.虚拟内存很适合在多道程序设计系统中使用。
5.当进程通信时,可采用虚拟共享的方式实现。
缺页中断
在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否在内存中。不在内存中时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页并调入内存。
缺页本身也是一种中断,与一般中断一样,需要经过4个步骤:
1.保护CPU现场
2. 分析中断原因
3. 转入中断处理程序进行处理
4. 恢复CPU现场,继续执行
但又有所区别:
1.缺页中断是在指令执行期间产生和处理缺页中断信号的
2.一条指令在执行期间可以产生多次缺页中断
3.缺页中断的返回是,执行产生中断的指令;一般中断的返回是,执行下一条指令。
缺页置换算法