操作系统笔记

进程和线程的区别

  • 进程是操作系统资源分配的最小单元,线程是操作系统调度的最小单元
  • 不同进程之间空间是独立的,一个进程的奔溃不会对其他的进程产生影响,而一个线程的奔溃会导致整个进程的奔溃
  • 线程自己不拥有任何系统资源,但是可以访问它隶属进程的全部资源,多个线程是共享内存的
  • 线程执行的开销小,但是不利于资源的保护和管理,进程相反

进程间的通信方式(IPC, Inter-Process Communication)

管道pipe

管道是在内核中申请一块固定大小的缓冲区,用于具有亲缘关系的父子进程间的通信,半双工的通信方式,数据只能单向流动

命名管道FIFO

具有管道的功能,还允许无情缘关系的进程间的通信

信号

用于通知接收进程某个事件已经发生

消息队列

消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流和缓冲区大小受限的缺点。

共享内存

使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新

信号量

进程之间及同一个进程间的不同线程同步和互斥手段

套接字

用于网络中不同机器之间的进程间的通信

用户态和内核态的区别

  • 用户态和内核态是操作系统的两种运行级别
  • 程序运行在3级特权级上时,称为运行在用户态,是最低特权级;程序运行在0级特权级上时,称之为运行在内核态
  • 用户态执行时,进程所能访问的内存空间受到限制,其所占有的CPU是可被抢占的;处于内核态执行时,能访问所有的内存空间,占有的CPU不可被抢占
  • 用户态转内核态有三种情况,系统调用,异常,外围设备的中断,系统调用是用户进程主动发起的,异常和外围设备的中断是被动的。

虚拟内存

  • 逻辑地址:CPU所生成的地址,逻辑地址是操作系统给进程分配的地址,这些地址看起来是连续的,实际上是虚拟的,并不真实存在
  • 物理地址:加载到内存地址寄存器中的地址,也就是内存单元的真正地址。
  • 虚拟内存给每一个进程提供了一致的地址空间,简化了内存管理,保护了每个进程的地址空间不被其他进程破坏。
  • 虚拟内存使得我们可以加载比真实的物理内存要大得多程序,通过页表数据结构将虚拟页映射到物理页(内存的物理页和磁盘的物理页)
  • 当加载的逻辑地址通过页表发现其是映射在硬盘中的地址时,会产生一个缺页中断,就会将硬盘上的页加载到内存中,如果内存中有空闲块,则分配一个块,如果没有空闲块,则会进行淘汰页(页面置换)
  • 页面置换算法有:最佳置换算法,先进先出,最近最久未使用LRU

IO

先来说明一下同步/异步,阻塞/非阻塞
同步:当一个请求发送出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行
异步:当一个请求发送出去后,调用者不能立即得到调用结果的返回,要想获取结果,可以通过主动轮询方式或者等待被调用方通过回调callback的方式来通知调用方

阻塞和非阻塞的区别在于进/线程等待消息时候的行为,也就是说在等待消息的时候,当前进/线程是挂起状态还是非挂起状态
阻塞:在发送请求后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活
非阻塞:在发送请求后,不会阻塞当前进/线程,而会立即返回。

同步与异步,重点在于消息通知的方式,是否得到最终的结果
阻塞和非阻塞,重点在于等消息时候的行为,是否等待
java中几种IO
BIO:同步并阻塞,一个连接一个线程,
NIO:同步非阻塞,一个请求一个线程
AIO:异步非阻塞,一个有效请求一个线程,需要由操作系统来完成IO请求再通知服务器启动线程处理。

select poll:
当连接有I/O流事件产生的时候,就回去唤醒进/线程处理,但是不知道是哪个连接产生的I/O,只能遍历所有连接来判断
epoll:
当连接有I/O流事件产生的时候,epoll会通知进/线程是哪个连接产生的,不需要遍历

select poll和epoll的区别是epoll是基于事件驱动,通过回调函数的形式通知,避免了select poll的轮询的方式。

你可能感兴趣的:(操作系统笔记)