C语言链表,状态机和多线程

Posted 阿C_C

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言链表,状态机和多线程相关的知识,希望对你有一定的参考价值。

链表

数组有两个缺点,数组中所有元素的类型必须一致,并且数组的大小必须事先指定并不能更改,结构体解决了数组的第一个缺点,使用链表这种数据结构就可以解决数组的第二个缺点,链表的长度可以实时的增大或者减小。

链表是将一个一个节点相互链接起来,每个节点中的内存可以用来存储数据,每个节点是结构是完全类似的,由有效数据和指针构成,在C语言中使用指针将每个节点链接起来,有效数据用于存储信息,指针区域用于指向链表的下一个节点,从而将链表链接起来。

单链表

链表是由节点组成的,包含有效数据和指针部分,我们需要定义一个struct结构体,为链表节点定义一个模版,使用堆内存来创建一个链表节点的步骤

  • 申请一个节点大小的堆内存,并进行清理
  • 把申请到的堆内存转化为节点的结构体指针类型
  • 填充该节点中的有效数据和指针区域

链表的头指针并不是一个节点,而是一个4字节的普通指针,头指针的类型是节点的结构体指针类型,指向链表的下一个节点。

双链表

单链表每个节点之间只有一个指针单向链接,所以单链表只能经由指针单向移动,不能反向移动,所以单链表的操作有局限性,不能够双向移动指针。

双链表的节点,由两个指针和有效数据构成,一个指向前一个节点,另一个指向后一个节点。

Linux内核链表

Linux内核中使用到的链表,节点中存储的数据其实是一个结构体,结构体中成员构成了节点数据区域,所以在实际上项目中需要将数据区域封装成结构体。内核链表实现了一个纯链表的封装和各种操作函数,纯链表没有数据区域,只有前后指针,数据区域为0,作为核心给具体链表进行调用,都实现在include/linux/list.h文件中。

状态机

通常我们讲状态机指的是有限状态机(FSM),可以从外部接收信号输入,综合考虑当前状态和信息来切换状态,状态机分两种,Moore型和Mealy型。

Moore型状态机输出只和当前状态相关,和其他信息无关,Mealy状态机的输出不止和当前信号有关,还和输入信息有关。

状态机常用于电路设计,FPGA程序,软件设计等领域。

多线程

进程和线程是操作系统实现宏观上的并行的两种技术,在Linux中,线程可以理解为轻量级的进程,现代操作系统大多数运行在多核心CPU之上,保证了多线程程序在运行的时候优先将多线程分配在多个核心上运行,所以在多核CPU上运行多线程程序是有很大好处的。

编程和编程语言

CPU只需要的是1和0组成的二进制数据,编程得到的二进制程序是给CPU运行的,CPU并不关心这些二进制数据是如何得到的,编程就是产生这些二进制数据的过程,程序员通过使用编程语言,通过编译器将源代码转换为二进制数据,至于CPU接收到二进制数据之后如何工作,则不是程序员所要关心的。

早期CPU很简单的时候,使用纸孔打卡的方式进行编程,从而控制CPU运行,可以说是最早使用二进制进行编程的人,但是随着CPU越来越复杂,使用二进制编程也变得越来越困难,便发明了使用符号代替二进制进行编程的方法,最早期的汇编,B语言等都是这种,随着编程语言的发展,更诞生了像C语言,C++,Java等高级语言。

编译器

CPU需要二进制才能运行,但是人类的大脑更偏向于认识符号,所以人类想要和机器沟通,就需要使用编程语言,再由编译器转换为二进制。

编译器是编程语言的核心,每一种编程语言都有对应的编译器,有了编译器之后,程序员学习编程的方式就是关注编译器的特性和习性,也就是所谓的语法,编译器设计越简单,CPU执行效率越高。

编程语法就是编译器的特性,

以上是关于C语言链表,状态机和多线程的主要内容,如果未能解决你的问题,请参考以下文章

单线程和多线程语言的异步 I/O 如何工作?

如何多线程(多进程)加速while循环(语言-python)?

2017/12/28-1集合和多线程

并发和多线程--线程的生命周期/状态

睡眠方法和多线程的产量方法有什么区别?

多线程高并发和多线程的关系