最近在复习操作系统,现在想想小小的总结一下,哎,感觉要学习东西好多呀,加油吧,骚年。
操作系统基础
什么是操作系统(为什么需要操作系统)
- 操作系统是管理计算机硬件与软件资源的程序。
- 操作系统是运行在计算机上面的软件。
- 操作系统给用户提供与操作系统交互的界面。
- 操作系统分为了内核和外壳(内核就是操作硬件的程序,外壳就是围绕内核的应用程序)
内核负责管理操作系统的进程,内存,设备驱动,文件,网络等,内核决定系统的性能和稳定性。
系统调用
首先我们需要了解用户态和系统态
用户态:用户态运行的进程或者可以直接读取用户程序的数据。
系统态:系统态运行的进程或者程序可以访问计算机中的任何资源不受限制。
进程的用户程序段在执行时,该进程处于用户态。
而一个进程的系统程序段在执行时,该进程处于系统态。
小插曲:为什么需要区分用户态和系统态?
将用户程序和系统程序区分开,限制它们的访问能力,比如说在操作系统中,有些危险的命令,如果我们随意操作的话,那么系统就很容易崩崩。但是区分为用户态和系统态,这也会增加系统复杂度和系统开销为代价的。
什么是系统调用?
一般我们写的程序都是用户态,凡事设计到系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
这些系统调用按功能大致可分为如下几类:
- 设备管理。完成设备的请求或释放,以及设备启动等功能。
- 文件管理。完成文件的读、写、创建及删除等功能。
- 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
- 进程通信。完成进程之间的消息传递或信号传递等功能。
- 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
进程与线程
相关定义
进程:进程是资源分配的最小单位,每个进程都有自己独立的内存空间的系统资源。
线程:线程是独立调度的最小单位。
进程是线程的容器。
换句话说:
比如,我们打开网易云英语,其实打开的这一瞬间,是创建了一个进程,然后呢,我们要进行的一系列操作都是由线程来执行(比如,播放,搜索)。
通俗的讲:“进程是爹妈,管着众多的线程儿子
总结: 线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
小插曲:为什么要使用线程?
一个程序并发执行,线程的切换开销小,如果我们用进程来切换,进程是拥有内存空间的,所以进程间切换非常消耗CPU的时间和空间开销。相对线程来说,这中切换开销小。
进程的几种状态
进程的五种状态和线程的状态有点像。
- 创建状态(new) :进程正在被创建,尚未到就绪状态。
- 就绪状态(ready) :进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。
- 运行状态(running) :进程正在处理器上上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。
- 阻塞状态(waiting) :又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。
- 结束状态(terminated) :进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行
进程间通信的方式
参考文章 :https://www.jianshu.com/p/c1015f5ffa74
1,匿名管道(pipe):
管道是半双工的,数据只能从一个方向流向另一个方向,如果双方间想要通信,那么需要建立两个通道,存在于内存中的文件系统,只能在父子进程或者兄弟进程(有血缘关系的进程)之间通信。
2,有名管道(FIFO):
解决了匿名管道没有名字的问题,可以实现在本机任意进程间通信,存在于磁盘介子或者文件系统。
3,信号(Signal):
- 信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。
- 如果该进程当前并未处于执行状态,则该信号就有内核保存起来,知道该进程回复执行并传递给它为止。
- 如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消是才被传递给进程。
4,消息(Message)队列:
- 消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。
- 与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。
- 另外与管道不同的是,消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。
5,共享内存(share memory):
- 使得多个进程可以可以直接读写同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。
- 为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。
- 由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥。
6,信号量(semaphore):
信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。
7,套接字(socket):
套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。
套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
未完。。。
转载:https://blog.csdn.net/qq_40935723/article/details/105727098