Shell
- Shell是操作系统与用户交互的界面。表现为通过控制台执行用户命令。本身不执行命令,仅仅是组织和管理命令。
- 脚本:类似程序的方式执行一系列的逻辑顺序的命令序列完成复杂的功能和人机交互。保存在文件中,是shell命令的集合。
系统调用
- 定义:操作系统内核为应用程序提供的服务/函数
- 特点:
- 一般涉及核心操作和硬件资源
- 运行于核态
- 函数具有唯一ID
- 产生中断,且为自愿中断
进程管理
- 定义:是程序在某个数据集合上的一次运行活动。程序的一次运行即为一个进程。
- 特性:
- 动态性
- 并发性
- 异步性
- 独立性
- 分类:
按使用资源权限- 系统进程:系统内核相关进程
- 用户进程:运行于用户态的进程
按对CPU依赖性 - 偏CPU进程:计算型
- 偏I/O进程:
- 进程状态
- 就绪态:获得了除CPU之外所有资源,通常有多个进程处于就绪态,有一个就绪队列。
- 运行态:获得CPU,正在运行
- 等待态:
进程控制块
进程由程序、数据、进程控制块组成。
进程控制块是描述和管理进程的一种数据结构,包括以下内容:
- 进程描述信息
- 控制和调度信息
- 资源信息
- 现场信息
进程互斥和同步
- 同步:进程通过协作共同完成同一任务而造成的直接制约关系,如生产者-消费者模式
- 互斥:进程间竞争系统资源而造成的间接制约关系,同一时间内只有一个进程可以访问系统资源。
- 临界资源和临界区
- 临界资源:同一时间只能有一个进程访问的资源
- 临界区:进程访问临界资源的程序片段
- 实现同步互斥的方法:原子操作、锁、信号量。
- 信号量同步机制
- 信号量是一种特殊的变量,只能被两种操作修改,即P、V操作。
- P操作:s=s-1;if(s < 0) block();一个进程获得资源访问权,s-1,当s小于0时说明资源不能再被更多进程访问了,会将进程变为等待状态,加入等待队列。P操作用于申请资源。
- V操作:s=s+1;if(s<=0) wakeup();一个进程释放了该资源的访问,此时会唤醒一个正在等待的进程。如果s大于0则表示没有进程等待该资源。V操作用于释放资源。
- P、V操作实现互斥
- 将信号量s值设为1,表示同一时间只有一个进程能使用资源。
- P、V操作实现同步
- 使用两个信号量表示缓冲区的读写,实现生产者-消费者模式。
- 死锁
- 通俗来讲死锁就是进程1先占用了A资源,申请B资源,而进程2先占有了B资源,申请A资源,这样就会造成两个进程都在等待对方已占用的资源而一直循环下去的情况。
- 死锁产生条件:
(1)资源互斥,同一时间只有一个进程能访问 (2)资源不可剥夺,除非进程主动放弃 (3)资源的保持和请求,进程在占有某一资源后还能申请其他资源 (4)对资源的循环等待。
- 死锁解决:破坏上述四个条件之一即可。
(1)预防:即对资源进行适当的限制 (2)检测:在运行过程中随时检测死锁条件,并设法避开 (3)恢复:发生死锁后以最小代价退出死锁状态。
通常预防会使得程序运行效率降低,无法充分利用资源。检测则会耗费大量的系统开销,效率低。一般系统都采用恢复措施。Linux系统也可能会发生死锁现象,但是概率极低,因此系统采用“鸵鸟策略”,并不去检测和解除死锁,而是忽略。
进程通信
进程有自己独立的地址空间,因此进程间需要交换数据时需要通过某种手段,这就是进程通信。
- 通信方式:信号量、信号、管道、共享内存、消息
- 高级通信:消息、管道、共享内存。可以传递大量数据
- 低级通信:信号量、信号。只能传递少量数据。
- 同步通信:管道、共享内存。通信双方需要共同参与到整个通信过程中,步调协调地完成数据交换。如同打电话一样,双方必须同时在线,即时交谈。
- 异步通信:信号量、信号、消息。双方进程不用考虑对方进程,发完或者接受完数据就好。如同发邮件,不必关心对方是何时接收。
- 信号量:
- 信号: 进程间可以发送控制信息,一般只有几个字节数据,通知进程某个事件发生。
- 管道:两个进程之间数据传输通道,一个发,一个接,同步的传递字节流。管道是通过文件系统实现的。Linux将管道看做是一种特殊的文件系统,而实际上它是一个虚拟文件的形式实现内存高速缓存区。管道文件建立后由两个进程共享,一个写,一个读。
- 消息队列:消息是结构化的数据。
- 共享内存:在内存中开辟一个进程共享的存储段,将这个区间映射到不同进程的地址空间中。一旦涉及到共享就要考虑同步问题,保证共享数据的安全性,因此实现较为复杂。
线程
- 为什么需要线程?
进程可以并发执行,但是进程内最是串行执行的,没能充分利用CPU资源。此外,进程的创建和切换对于资源的开销都比较大,影响了系统的整体效率。为了提高系统运行的效率,提出了线程这个概念。 - 进程和线程比较
- 资源分配方面:进程是资源分配的最小单位,每一个进程都有自己独立的地址空间,以及相关的资源。而线程则共享进程内的地址空间和资源。因此进程的建立开销较大。
- CPU调度方面:线程是CPU调度的最小单位。进程在切换时,需要保存现场,即整个进程的运行环境,需要的开销较大。而线程的切换则只需要保存少量寄存器,开销小,因而切换速度快。
- 通信方面:由于进程有自己独立的地址空间,其他进程无法访问,因此通信需要系统提供的进程通信机制完成。而线程共享进程内的资源,通信较为简单。
- Linux线程
- Linux线程实现较为独特,它没有专门的线程概念,实际上是把线程当做进程来处理的,只不过该进程要和其他进程共享地址空间等资源。因此Linux线程也称为“轻量级进程”(LWP)。
- 创建线程有clone()函数完成,于fork函数不同的是,它需要指定共享的资源。
来源:https://www.cnblogs.com/heyyw1119/p/10952943.html