文化局网站建设方案,平面设计课程简介,重庆城市建设档案馆网站,主流媒体网站建设进程
介绍
进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间#xff0c;不同进程通过进程间通信来通信。由于进程占据独立的内存#xff0c;所以上下文进程间的切换开销#xff08;栈、寄存器、虚拟内存、文件句柄等#xff09;比较大#…进程
介绍
进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间不同进程通过进程间通信来通信。由于进程占据独立的内存所以上下文进程间的切换开销栈、寄存器、虚拟内存、文件句柄等比较大但相对比较稳定安全。
进程间通信
● 无名管道
无名管道是通过调用 pipe 函数创建的pipe(int fd[2]) : fd[0] 用于读fd[1] 用于写只支持半双工通信单向交替传输无名管道只能用于父子进程或兄弟进程之间必须用于具有亲缘关系的进程间的通信。
● FIFO 命名管道
有名管道是FIFO文件存在于文件系统中可以通过文件路径名来指出。有名管道可以在不具有亲缘关系的进程间进行通信。FIFO 常用于客户-服务器应用程序中FIFO 用作汇聚点在客户进程和服务器进程之间传递数据。
● 消息队列
消息队列是消息的链接表存放在内核中。一个消息队列由一个标识符即队列ID来标识。消息队列可以独立于读写进程存在从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难读进程可以根据消息类型有选择地接收消息而不像 FIFO 那样只能默认地接收。消息队列的主要特点是异步处理主要目的是减少请求响应时间和解耦。
● 信号量
信号量semaphore与已经介绍过的 IPC 结构不同它是一个计数器。信号量用于实现进程间的互斥与同步而不是用于存储进程间通信数据。“二进制信号量”信号量的值在0和1之间跳转实现同步互斥
● 共享内存
进程可以将同一段共享内存连接到它们自己的地址空间所有进程都可以访问共享内存中的地址如果某个进程向共享内存内写入数据所做的改动将立即影响到可以访问该共享内存的其他所有进程。
● 套接字(Sockets) 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元可以看做是不同主机之间的进程进行双向通信的端点简单的说就是通信的两方的一种约定用套接字中的相关函数来完成通信过程。
进程同步
● 临界区
对临界资源进行访问的那段代码称为临界区为了互斥访问临界资源每个进程在进入临界区之前都需要先进行检查
● 同步与互斥 (mutex)
同步多个进程按一定顺序执行互斥多个进程在同一时刻只有一个进程能进入临界区
● 信号量
信号量是一个整型变量可以对其执行down和up操作也就是常见的P和V操作二进制0/1的信号量可以实现互斥量mutex
● 管程
管程在功能上和信号量及PV操作类似属于一种进程同步互斥工具但是具有与信号量及PV操作不同的属性。引入原因信号量机制的缺点进程自备同步操作P(S)和V(S)操作大量分散在各个进程中不易管理易发生死锁。管程机制的目的 1、把分散在各进程中的临界区集中起来进行管理 2、防止进程有意或无意的违法同步操作 3、便于用高级语言来书写程序也便于程序正确性验证。
死锁
在两个或多个并发进程中如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源在未改变这种状态之前都不能向前推进称这一组进程产生了死锁。通俗地讲就是两个或多个进程被无限期地阻塞、相互等待的一种状态。 产生条件
互斥条件 – 一个资源一次只能被一个进程使用请求保持条件 – 一个进程因请求资源而阻塞时对已经获得资源保持不放不可抢占条件 – 进程已获得的资源在未使用完之前不能强行剥夺循环等待条件 – 若干进程之间形成一种头尾相接的循环等待资源的关系
死锁处理
预防死锁破坏产生死锁的4个必要条件中的一个或者多个实现起来比较简单但是如果限制过于严格会降低系统资源利用率以及吞吐量避免死锁在资源的动态分配中防止系统进入不安全状态(可能产生死锁的状态)-如银行家算法检测死锁允许系统运行过程中产生死锁在死锁发生之后采用一定的算法进行检测并确定与死锁相关的资源和进程采取相关方法清除检测到的死锁。实现难度大解除死锁与死锁检测配合将系统从死锁中解脱出来撤销进程或者剥夺资源。对检测到的和死锁相关的进程以及资源通过撤销或者挂起的方式释放一些资源并将其分配给处于阻塞状态的进程使其转变为就绪态。实现难度大
进程空间分配和堆栈大小 进程的堆栈大小
32位Windows一个进程栈的默认大小是1M在vs的编译属性可以修改程序运行时进程的栈大小。Linux下进程栈的默认大小是10M可以通过 ulimit -s查看并修改默认栈大小。默认一个线程要预留1M左右的栈大小所以进程中有N个线程时Windows下大概有N*M的栈大小。堆的大小理论上大概等于进程虚拟空间大小-内核虚拟内存大小。windows下进程的高位2G留给内核低位2G留给用户所以进程堆的大小小于2G。Linux下进程的高位1G留给内核低位3G留给用户所以进程堆大小小于3G。
进程的最大线程数
32位windows下一个进程空间4G内核占2G留给用户只有2G一个线程默认栈是1M所以一个进程最大开2048个线程。当然内存不会完全拿来做线程的栈所以最大线程数实际值要小于2048大概2000个。32位Linux下一个进程空间4G内核占1G用户留3G一个线程默认8M所以最多380个左右线程。psulimit -a 查看电脑的最大进程数大概7000多个
PCB
用来记录进程信息的数据结构管理进程的核心包含了PID等进程的所有关键信息. 在PCB中一般包括如下信息
进程的状态状态科包括新建态、就绪态、运行态、终止态、阻塞态。程序计数器用于记录进程要执行的下一条指令的地址。CPU寄存器这些信息CPU寄存器包括累加器索引寄存器堆栈指针通用寄存器和其他一些条件码信息寄存器。这些信息描述了程序执行的状态与程序计数器一起保存以便进程以后的正确执行。CPU调度信息这类信息包括进程的优先级调度队列的指针和其他调度参数为操作系统管理进程并进行调度提供支持。内存管理信息根据操作系统对内存的使用情况记录下基址界限寄存器页表、段表等信息。记账信息包括CPU时间实际使用时间时间界限使用数据记账数据作业和进程数量等。I/O状态信息包括分配给进程的I/O设备表打开的文件列表等。
线程
介绍
线程是进程的一个实体是CPU调度和分派的基本单位它是比进程更小的能独立运行的单位。线程拥有自己的程序计数器、本地方法栈、虚拟机栈同一个进程中的多个线程可以共享进程所拥有的资源堆与方法区。线程间通信主要通过共享内存上下文切换很快资源开销较少但相比进程不够稳定容易丢失数据。
当一个进程中的线程挂掉之后非正常退出就会导致该线程占有的资源永远无法释放从而影响其他线程的正常工作。
进程和线程比较
线程是指进程内的一个执行单元也是进程内的可调度实体。线程与进程的区别:
地址空间线程是进程内的一个执行单元进程内至少有一个线程它们共享进程的地址空间而进程有自己独立的地址空间资源拥有进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源线程是处理器调度的基本单位但进程不是二者均可并发执行每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口但是线程不能够独立执行必须依存在应用程序中由应用程序提供多个线程执行控制
线程和携程比较
协程多与线程进行比较
一个线程可以多个协程一个进程也可以单独拥有多个协程。线程进程都是同步机制而协程则是异步协程能保留上一次调用时的状态每次过程重入时就相当于进入上一次调用的状态
线程状态及切换 ● 新建状态(New)新创建了一个线程对象。 ● 就绪状态(Runnable)线程对象创建后其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中变得可运行等待获取CPU的使用权。即在就绪状态的进程除CPU之外其它的运行所需资源都已全部获得。 ● 运行状态(Running)就绪状态的线程获取了CPU执行程序代码。 ● 阻塞状态(Blocked)阻塞状态是线程因为某种原因放弃CPU使用权暂时停止运行。直到线程进入就绪状态才有机会转到运行状态。阻塞的情况分三种
等待阻塞运行的线程执行wait()方法该线程会释放占用的所有资源JVM会把该线程放入“等待池”中。进入这个状态后是不能自动唤醒的必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。同步阻塞运行的线程在获取对象的同步锁时若该同步锁被别的线程占用则JVM会把该线程放入“锁池”中。其他阻塞运行的线程执行sleep()或join()方法或者发出了I/O请求时JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时线程重新转入就绪状态。
● 死亡状态(Dead)线程执行完了或者因异常退出了run()方法该线程结束生命周期。
协程
介绍
协程是一种用户态的轻量级线程协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时将寄存器上下文和栈保存到其他地方在切回来的时候恢复先前保存的寄存器上下文和栈直接操作栈则基本没有内核切换的开销可以不加锁的访问全局变量所以上下文的切换非常快。
● 进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程从属于进程是程序的实际执行者。对操作系统来说线程是最小的执行单元进程是最小的资源管理单元。 ● 线程是比进程更轻量的存在但同样线程状态切换、线程上下文切换、同步锁这些都是耗费性能的操作 ● 协程英文Coroutines是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样一个线程也可以拥有多个协程。协程不是被操作系统内核所管理而完全是由程序所控制也就是在用户态执行。 ● 协程的总结
协程属于线程即一个线程下面可以开辟多个协程。协程是用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时将寄存器上下文和栈保存到其他地方在切回来的时候恢复先前保存的寄存器上下文和栈。当多个协程切换时由于其同属于一个线程所以可以看作是同步执行的不存在同时共享资源的情况可以不加锁的访问全局变量切换上下文非常快。
用户态和内核态
用户态
当一个进程在执行用户自己的代码时处于用户运行态用户态此时特权级最低为3级是普通的用户进程运行的特权级大部分用户直接面对的程序都是运行在用户态。
当一个进程因为系统调用陷入内核代码中执行时处于内核运行态内核态此时特权级最高为0级。执行的内核代码会使用当前进程的内核栈每个进程都有自己的内核栈。
内核态
用户运行一个程序该程序创建的进程开始时运行自己的代码处于用户态。如果要执行文件操作、网络数据发送等操作必须通过write、send等系统调用这些系统调用会调用内核的代码。 进程会切换到Ring0然后进入3G-4G中的内核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换到Ring3回到用户态。
这样用户态的程序就不能随意操作内核地址空间具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制保证进程间的地址空间不会互相冲突一个进程的操作不会修改另一个进程地址空间中的数据。
区别
用户态执行中的进程所能访问的内存空间和对象受到限制其所处于占有的处理机是可被抢占的 内核态执行中的进程则能访问的内存空间和对象不受限制且所占有的处理机是不允许被抢占的。
进程调度算法
先到先服务(FCFS)调度算法 : 从就绪队列中选择一个最先进入该队列的进程为之分配资源使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。短作业优先(SJF)的调度算法 : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。时间片轮转调度算法 : 时间片轮转调度是一种最古老最简单最公平且使用最广的算法又称 RR(Round robin)调度。每个进程被分配一个时间段称作它的时间片即该进程允许运行的时间。多级反馈队列调度算法 短进程优先的调度算法仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业进程迅速完成。因而它是目前被公认的一种较好的进程调度算法。优先级调度 为每个流程分配优先级首先执行具有最高优先级的进程依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求时间要求或任何其他资源要求来确定优先级。
内存管理
操作系统的内存管理主要负责内存的分配与回收malloc 函数申请内存free 函数释放内存另外地址转换也就是将逻辑地址转换成物理地址也是操作系统内存管理做的事情。
逻辑虚拟地址和物理地址
虚拟地址
逻辑地址编程一般是和逻辑地址打交道比如C语言中的指针里面存储的数值就可以理解成内存的一个地址这个地址就是逻辑地址逻辑地址由操作系统决定。
我们使用电脑Windows系统时很多时候我们点开了很多占内存的软件这些软件占用的内存可能已经远远超出了电脑本身具有的物理内存。为什么可以这样呢正是因为虚拟内存 的存在通过虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间。
另外虚拟内存为每个进程提供了一个一致的、私有的地址空间它让每个进程产生了一种自己在独享主存的错觉每个进程拥有一片连续完整的内存空间。这样会更加有效地管理内存并减少出错。
虚拟内存是计算机系统内存管理的一种技术虚拟内存的重要意义是它定义了一个连续的虚拟地址空间并且把内存扩展到硬盘空间。
物理地址
物理地址真实物理内存中地址具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。
为什么要有虚拟地址空间
如果直接把物理地址暴露出来的话会带来严重问题比如可能对操作系统造成伤害以及给同时运行多个程序造成困难。 通过虚拟地址访问内存有以下优势 1程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。 2程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时内存管理器会将物理内存页通常大小为 4 KB保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。 3不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
内存管理方式
内存管理方式简单点分为连续分配管理方式和非连续分配管理方式。
连续分配管理方式是为一个用户程序分配一个连续的内存空间常见的有块式管理。非连续分配管理方式是允许为一个程序使用的内存分布在离散或不相邻的内存中常见的有页式管理和段式管理。
块式管理
远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块每个块中只包含一个进程。如果程序运行需要内存的话操作系统就分配给它一块如果程序运行只需要很小的空间的话分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间我们称之为碎片。
页式管理
把主存分为大小相等且固定的一页一页的形式页较小相比于块式管理的划分力度更大提高了内存利用率减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
优点没有外碎片每个内碎片不超过页的大小。缺点程序全部装入内存要求有相应的硬件支持如地址变换机构缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。增加了机器成本和系统开销。
段式管理
页式管理虽然提高了内存利用率但是页式管理其中的页实际并无任何实际意义。 段式管理把主存分为一段段的每一段的空间又要比一页的空间小很多 。但是最重要的是段是有实际意义的每个段定义了一组逻辑信息例如有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
优点可以分别编写和编译可以针对不同类型的段采取不同的保护可以按段为单位来进行共享包括通过动态链接进行代码共享。缺点会产生碎片。
段页式管理
段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段每个段又分成若干页也就是说段页式管理机制中段与段之间以及段的内部的都是离散的。
分页管理与分段管理的共同点和区别
共同点
分页机制和分段机制都是为了提高内存利用率较少内存碎片。页和段都是离散存储的所以两者都是离散分配内存的方式。但是每个页和段中的内存是连续的。
区别
页的大小是固定的由操作系统决定而段的大小不固定取决于我们当前运行的程序。分页仅仅是为了满足操作系统内存管理的需求而段是逻辑信息的单位在程序中可以体现为代码段数据段能够更好满足用户的需要。
CPU
CPU调度算法
先了解两个概念
周转时间 从开始申请执行任务到执行任务完成响应时间 从开始申请执行任务到开始执行任务
先来先服务调度算法FCFS按作业或者进程到达的先后顺序依次调度平均周转时间可能会很长
短作业优先调度算法SJF算法从就绪队列中选择估计时间最短的作业进行处理直到得出结果或者无法继续执行周转时间短但是响应时间长
高响应比算法HRN响应比(等待时间要求服务时间)/要求服务时间
时间片轮转调度RR按到达的先后对进程放入队列中然后给队首进程分配CPU时间片时间片用完之后计时器发出中断暂停当前进程并将其放到队列尾部循环 ;响应时间可以得到保证
多级反馈队列调度算法目前公认较好的调度算法设置多个就绪队列并为每个队列设置不同的优先级第一个队列优先级最高其余依次递减。优先级越高的队列分配的时间片越短进程到达之后按FCFS放入第一个队列如果调度执行后没有完成那么放到第二个队列尾部等待调度如果第二次调度仍然没有完成放入第三队列尾部…。只有当前一个队列为空的时候才会去调度下一个队列的进程。