8.、什么是状态机
8.1、有限状态机
(1)常说的状态机是有限状态机FSM。FSM指的是有有限个状态(一般是一个状态变量的值),这个机器同时能够从外部接收信号和信息输入,机器在接收到外部输入的信号后会综合考虑当前自己的状态和用户输入的信息,然后机器做出动作:跳转到另一个状态。
(2)考虑状态机的关键点:当前状态、外部输入、下一个状态
8.2、两种状态机:Moore型和Mealy型
(1)Moore型状态机特点是:输出只与当前状态有关(与输入信号无关)。相对简单,考虑状态机的下一个状态时只需要考虑它的当前状态就行了。
(2)Mealy型状态机的特点是:输出不只和当前状态有关,还与输入信号有关。状态机接收到一个输入信号需要跳转到下一个状态时,状态机综合考虑2个条件(当前状态、输入值)后才决定跳转到哪个状态。
8.3、状态机的主要用途:电路设计、FPGA程序设计、软件设计
(1)电路设计中广泛使用了状态机思想
(2)FPGA程序设计
(3)软件设计(框架类型的设计,譬如操作系统的GUI系统、消息机制)
8.4、状态机解决了什么问题
(1)我们平时写程序都是顺序执行的,这种程序有个特点:程序的大体执行流程是既定的,程序的执行是遵照一定的大的方向有迹可寻的。
(2)但是偶尔会碰到这样的程序:外部不一定会按照既定流程来给程序输入信息,而程序还需要完全能够接收并响应外部的这些输入信号,还要能做出符合逻辑的输出。
8.5、C语言实现简单的状态机
题目:开锁状态机。功能描述:用户连续输入正确的密码则会开锁,如果密码输入过程错误则锁会退回到初始状态重新计入密码,即:用户只需要连续输入出正确的密码即可开锁(输入错误不用撤销、也不用删除)
#include <stdio.h>
// 给状态机定义状态集
typedef enum
{
STATE1,
STATE2,
STATE3,
STATE4,
STATE5,
STATE6,
STATE7,
}STATE;
int main(void)
{
int num = 0;
// current_state记录状态机的当前状态,初始为STATE1,用户每输入一个正确的
// 密码STATE就走一步,一直到STATE为STATE7后锁就开了;其中只要有一次用户
// 输入对不上就回到STATE1.
STATE current_state = STATE1; // 状态机初始状态为STATE1
// 第一步:实现一个用户循环输入密码的循环
printf("请输入密码,密码正确开锁.\n");
while (1)
{
scanf("%d", &num);
printf("num = %d.\n", num);
// 在这里处理用户的本次输入
switch (current_state)
{
case STATE1:
if (num == 1)
{
current_state = STATE2; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE2:
if (num == 2)
{
current_state = STATE3; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE3:
if (num == 3)
{
current_state = STATE4; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE4:
if (num == 4)
{
current_state = STATE5; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE5:
if (num == 5)
{
current_state = STATE6; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
case STATE6:
if (num == 6)
{
current_state = STATE7; // 用户输入对了一步,STATE走一步
}
else
{
current_state = STATE1;
}
break;
default:
current_state = STATE1;
}
if (current_state == STATE7)
{
printf("锁开了.\n");
break;
}
}
return 0;
}
9、多线程简介
9.1、操作系统下的并行执行机制
(1)并行就是说多个任务同时被执行。并行分微观上的并行和宏观上的并行。
(2)宏观上的并行就是从长时间段(相对于人来说)来看,多个任务是同时进行的;微观上的并行就是真的在并行执行。
(3)操作系统要求实现宏观上的并行。宏观上的并行有2种情况:第一种是微观上的串行,第二种是微观上的并行。
(4)理论来说,单核CPU本身只有一个核心,同时只能执行一条指令,这种CPU只能实现宏观上的并行,微观上一定是串行的。微观上的并行要求多核心CPU。多核CPU中的多个核心可以同时微观上执行多个指令,因此可以达到微观上的并行,从而提升宏观上的并行度。
9.2、进程和线程的区别和联系
(1)进程和线程是操作系统的两种不同软件技术,目的是实现宏观上的并行(通俗一点就是让多个程序同时在一个机器上运行,达到宏观上看起来并行执行的效果)。
(2)进程和线程在实现并行效果的原理上不同。而且这个差异和操作系统有关。譬如windows中进程和线程差异比较大,在linux中进程和线程差异不大(linux中线程就是轻量级的进程)。
(3)不管是多进程还是多线程,最终目标都是实现并行执行。
9.3、多线程的优势
(1)前些年多进程多一些,近些年多线程开始用得多。
(2)现代操作系统设计时考虑到了多核心CPU的优化问题,保证了:多线程程序在运行的时候,操作系统会优先将多个线程放在多个核心中分别单独运行。所以说多核心CPU给多线程程序提供了完美的运行环境。所以在多核心CPU上使用多线程程序有极大的好处。
9.4、线程同步和锁
(1)多线程程序运行时要注意线程之间的同步。
注:更详细的内容在Linux网络编程和应用编程中学习