进程
说到进程就不得不提下操作系统的调度
大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式。也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态,等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(多个任务同时执行)。
操作系统内存管理
进程隔离 :进程相互独立
自动分配和管管理:程序动态分配,分配对程序员是透明的。支持模块化程序设计程序员可以定义程序模块。
保护和访问控制
长期储存:程序关机后保存信息
作业是向计算机提交任务的任务实体。
进程是一个执行实体,是操作系统资源分配的基本单位。
线程是进程中的一个实体,是被系统独立调度和执行的基本单位。
进程由三部分组成
程序:一段可执行的程序
数据:程序所需要的相关数据
进程控制块:操作系统用来管理和控制进程的所需内部数据,这种内部信息和进程是分开的,因为操作系统不允许被进程直接访问。
进程是一个实体
每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
进程是一个“执行中的程序”。
'程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。'
进程创建
1给新进程陪以个唯一的进程标示号
2给进程分配空间
3初始化进程控制块
4设置正确的链接
5创建或扩充其他的数据结构
进程概念特点
资源所有权
一个进程包括一个存放进程映像的虚拟地址空间;
进程是程序、数据、栈、进程控制块定义的属性的集合。
一个进程时常拥有对资源的控制或所有权,这些资源包括、储存I/O通道、I/O设备和文件等;操作系统指向保护功能,以防止进程间翻身不必要的的与资源相关的冲突
调度/执行
一个进程严重通过一个或多个程序一条执行路径(轨迹)执行,执行过程可能和其他进程的执行过程交替执行。因此,一个具有执行状态(运行态、就绪态等)和分派了优先级的进程是一个被操作系统调度并分派的实体。
进程中的所有线程共享该进程的状态和资源,它们驻留在同一块地址空间中,并且可以访问到相同的数据。当一个线程改变了储存器中的数据项时,其他线程在访问这一数据项能够看到变化后的结果,如果一个线程为读操作打开文件,那么同一个线程中的其他线程能够从这个文件中读取数据
状态
进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态。
1)就绪状态(Ready):
进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
2)运行状态(Running):
进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
3)阻塞状态(Blocked):
由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。
进程描述符
在linux中,每一个进程都有一个进程描述符,这个”进程描述符”是一个结构体名字叫做task_struct,在task_struct里面保存了许多关于进程控制的信息。
task_struct是Linux内核的一种数据结构,它会被装载到RAM里并包含进程的信息。每个进程都把它的信息放在task_struct这个数据结构里面。
linux 系统最多可以产生多少个进程?一个进程最多可以打开多少个文件描述符?什么命令可以查看某个进程打开了那些文件?
查看用户打开的最大进程数
ulimit -a
max user processes (-u) #系统限制某用户下最多可以运行多少进程或线程
ulimit -u 可以修改
一个进程最多可以打开多少个文件描述符
ulimit -n
什么命令可以查看某个进程打开了那些文件?
Isof
说完进程我们再来说说线程
线程
进程和线程关系
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
当下推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。
注意:在linux下是没有线程实现的,线程是在unix里中实现的,在linux线程只是概念,具体实现其根本还是进程,所以线程也叫轻量级进程
线程的优点
已有线程创建一个新线程比创建一个全新进程所需的时间要少许多。
终止一个线程比终止一个进程的花费少。
同一个进程内线程切换比进程间切换花费时间更少。
线程提高了不同执行程序间通信的效率。在大多数的操作系统中,独立进程间的通信需要内核的介入,以提供保护和通信所需要的机制。但是由于在同一个进程中线程共享内存和文件,同名无需调用内核就可以互相通信。
线程变化相关的四种基本操作
派生:在产生一个进程时,同时产生一个线程。随后进程中的线程可以在同一个进程中产生另一个线程,并为新线程提供指令指针和参数,线程拥有自己的寄存器上下文和占空间,被放置在就绪队列中。
阻塞:当线程需要等待一个时间时,它将被阻塞(保存他的用户寄存器。程序计数器和栈指针),此时处理器抓呢而执行另一个处于同一进程中或不同进程中的就绪线程
接触阻塞:当阻塞一个线程的时间发生时,该线程被转移到就绪队列中
结束:当以个线程完成时,其寄存器上下文和栈都会被释放
线程同步
一个进程中的所有线程共享一个地址空间和注入打开的文件之类的其他资源。
一个线程对资源的任何修改都会影响同一个进程中其他新城的环境。因此同步各种线程以便它们互不干涉且不破坏数据结构;如两个线程都是土在一个双联表正价一个元素,则可能会丢失一个元素或者使链表变成畸形。
进程与线程的区别
线程是轻型进程
一个进程可拥有多个线程
具体比较:
1.调度
进程拥有资源
线程作为调度和分派的基本单位
同一进程中线程的切换不会引起进程的切换。
进程间的线程切换则会引起进程切换从而导致资源切换等
2.并发性
进程:进程和进程之间可并发执行
线程:除了进程间的并发执行还可以线程之间并发执行
所以线程的并发性更高
3.拥有资源
前面说了,线程并不能拥有资源,只有进程才拥有资源
4.系统开销
进程创建、切换和撤销都会导致系统为之创建或者回收进程控制卡以及资源,但是线程的创建以及线程间的切换并不会引起系统做这些事儿,所以线程的系统开销明显更小。