Open tomoya06 opened 4 years ago
进程是资源分配的最小单位,线程是CPU调度的最小单位
系统为每个进程定义的一个数据结构,来描述进程的基本信息和运行状态。进程的整个生命周期变化实质上就是系统对PCB的操作。
进程控制块存储的信息:
进程是计算机管理运行程序的一种方式,一个进程下可包含一个或者多个线程。线程可以理解为子进程。
创建 -> 就绪 <-> 运行 ~ 阻塞 - 结束
进程通信方式:
pipe()
mkfifo()
进程同步方式:
系统安全状态vs不安全状态:
所谓安全状态,是指系统能按某种进程顺序P1-P2-...-PN aka安全序列,来为每个进程 Pi 分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
eg. from 计算机操作系统第三版
可以用来描述系统死锁。
乐观锁:在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。
悲观锁:在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。
乐观锁和悲观锁是两种思想,它们的使用是非常广泛的,不局限于某种编程语言或数据库。
乐观锁:Compare And Swap aka. CAS;版本号机制
负责内存的分配和回收
其中主存储器简称内存或主存;寄存器访问速度最快,但容量很小;告诉缓存比寄存器大,访问速度比主存储器/内存快
分类: 连续分配管理方式+非连续分配管理方式
分页vs分段:
逻辑地址vs物理地址
逻辑地址:程序可以读取的地址,表现为存储在内存中的一个数值 物理地址:内存单元在物理内存中的真实地址
缺页中断:要访问的页不在主存,需要操作系统将其调入主存后再进行访问。 在这个时候,被内存映射的文件实际上成了一个分页交换文件。
页面置换:当发生缺页中断时,如果当前内存中并没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来选择淘汰哪一页的规则叫做页面置换算法。
最佳(OPT, Optimal replacement algorithm):所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。
最近最久未使用(LRU, Least Recently Used)
最近未使用(NRU, Not Recently Used):与LRU类似
先进先出(FIFO, First In First Out)
时钟算法(Clock)
虚拟内存 使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
最简单的寻址方式物理寻址,也就是直接使用物理地址;
现代CPU使用的方式是虚拟寻址,CPU需要将虚拟地址翻译成物理地址,
如何虚拟寻址:CPU中有一个内存管理单元(Memory Management Unit, MMU)的硬件,负责管理虚拟地址和物理地址的转换,页表就保存在MMU上。
虚拟内存、CPU高速缓存、以及其他缓存技术,都依赖于局部性原理。
程序的局部性原理是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域。
局部性原理又表现为:时间局部性和空间局部性。
从程序编写的角度,想要编写出性能高效的程序,首先要保证程序的时间局部性与空间局部性。
TODO:内存管理:栈+堆
本段手动fork自CS-Notes Socket一节
一个输入操作通常包括两个阶段:
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待数据到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。
Unix 有五种 I/O 模型:
应用进程被阻塞,直到数据从内核缓冲区复制到应用进程缓冲区中才返回。
应该注意到,在阻塞的过程中,其它应用进程还可以执行,因此阻塞不意味着整个操作系统都被阻塞。因为其它应用进程还可以执行,所以不消耗 CPU 时间,这种模型的 CPU 利用率会比较高。
应用进程执行系统调用之后,内核返回一个错误码。应用进程可以继续执行,但是需要不断的执行系统调用来获知 I/O 是否完成,这种方式称为轮询(polling)。
由于 CPU 要处理更多的系统调用,因此这种模型的 CPU 利用率比较低。
使用 select 或者 poll 等待数据,并且可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回,之后再把数据从内核复制到进程中。
它可以让单个进程具有处理多个 I/O 事件的能力。又被称为 Event Driven I/O,即事件驱动 I/O。
如果一个 Web 服务器没有 I/O 复用,那么每一个 Socket 连接都需要创建一个线程去处理。如果同时有几万个连接,那么就需要创建相同数量的线程。相比于多进程和多线程技术,I/O 复用不需要进程线程创建和切换的开销,系统开销更小。
应用进程使用 sigaction 系统调用,内核立即返回,应用进程可以继续执行,也就是说等待数据阶段应用进程是非阻塞的。内核在数据到达时向应用进程发送 SIGIO 信号,应用进程收到之后在信号处理程序中调用 recvfrom 将数据从内核复制到应用进程中。
相比于非阻塞式 I/O 的轮询方式,信号驱动 I/O 的 CPU 利用率更高。
应用进程执行 aio_read 系统调用会立即返回,应用进程可以继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。
异步 I/O 与信号驱动 I/O 的区别在于,异步 I/O 的信号是通知应用进程 I/O 完成,而信号驱动 I/O 的信号是通知应用进程可以开始 I/O。
同步 I/O 包括阻塞式 I/O、非阻塞式 I/O、I/O 复用和信号驱动 I/O ,它们的主要区别在第一个阶段。
非阻塞式 I/O 、信号驱动 I/O 和异步 I/O 在第一阶段不会阻塞。
本节完整解析参考这篇博客
select/poll/epoll都是IO复用的方法,实现的方式不同
epoll工作状态:参考这里
懒人比较:select/poll处理时间复杂度均为O(N),且select的连接数受限1024;poll/epoll连接数不受限,epoll处理时间复杂度O(1)
什么是操作系统
操作系统基本特征:
什么是系统调用
前言
进程运行级别分为:
系统调用
指的是指运行在用户空间(用户态)的程序、向操作系统内核、请求需要更高权限运行的服务。
系统调用分类:
设备管理;文件管理;进程控制;进程通信;内存管理;安全管理