0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux环境编程必须搞懂的几个概念

dyquk4xk2p3d 来源:良许Linux 2023-02-12 16:57 次阅读

Linux环境编程对于初学者来说,必须深刻理解重点概念才能更好地编写代码,实现业务功能,下面就几个重要的及常用的知识点进行说明。搞懂这几个概念后以免在将来的编码出现混淆。

系统调用

所有的操作系统在其内核里都有一些内建的函数,这些函数可以用来完成一些系统级别的功能。在Linux系统使用的这样的函数叫做“系统调用”,英文是systemcall。这些函数代表了从用户空间到内核空间的一种转换。

系统调用是Linux操作系统提供的服务,是编写应用程序与内核之间通信接口,也就是我们所说的函数。相对于普通的函数调用来说,系统调用的性能消耗相对来说是大的。所以在程序追求性能的同时,尽量避免系统调用。

用户态的程序默认是通过栈来传递参数的。而对于系统调用来说,内核态和用户态使用的是不同的栈,这使得系统调用的参数只能通过寄存器的方式进行传递。

IO操作

什么是IO,通俗来讲就是输入输出

IO分为标准IO和文件IO,我们常用的scanf、printf、getchar、putchar、gets、puts这些都是标准输入输出。Linux系统下一切皆文件的概念,所以在linux下的编程中对文件的IO操作有标准IO和文件IO两种操作类型。标准IO是带缓冲的IO属于库函数,文件IO是不带缓冲的属于系统调用。

标准IO:

1.标准IO是由ANSIC标准定义

2.跨平台,可以在windows下运行,也可以在Linux下运行

3.通过缓冲机制来减少系统调用,实现更高的效率

4.文件流 标准IO用结构体类型来存放文件的相关信息,标准IO所有操作围绕着FILE来操作。

文件IO:

1.文件IO是POSIX提供的一组函数

2.只能运行在可移植操作系统中,不能跨平台

3.没有缓冲机制

4.文件描述符是一个非负整数,每打开一个文件,系统会自动分配一个文件描述符(即从系统最小的且没有被用的描述符来分配)

原子操作

原子在化学课程中是不可再分的颗粒。而对于Linux系统来说所谓原子操作是为了确保对一个整型数据的更改具有排他性。原子操作就是要么不执行,一旦执行就会执行完成,是不可被打断的一个,或一系列的动作,即在完成任务前不会被其他事件所打断,就像原子不可被分割成颗粒一样。单处理中,可以用单条指令完成的指令可以被看成是一个原子操作。软件中的原子操作依赖于硬件原子操作的支持。当然原子操作,也可以当引用计数使用。

原子操作其实本质上和锁实现同样的功能,都是为了保护共享对象,它具有原子性,和顺序性。原子性确保指令执行期间不被打断,要么全部执行,要么根本不执行。而顺序性确保即使两条或多条指令出现在独立的执行线程中,甚至独立的处理器上,它们本该执行的顺序依然要保持。

线程安全

所谓线程安全,就是指代码可以在多线程环境下安全地执行,输出我们想要的结果。即符合正确的逻辑,是程序员期望的正常执行结果。为了实现线程安全,Linux系统提供一些列的方法,或者只能使用局部变量或资源,或者就是利用锁等同步机制,来实现全局变量或资源的访问。

线程安全在Linux环境编程中极其重要,我们不仅要了解概念,更重要的是要在实际的编程中学会实现线程安全方式。下面来看一个简单的例子:

#include
#include
#include

staticintnCnt=0;

void*Thread(void*arg)
{
for(inti=0;i< 10000; ++i) 
    {
        ++nCnt;
    }

    return NULL;
}
int main()
{
    pthread_t t1;
    pthread_t t2;

    /* 创建两个线程 */
    pthread_create(&t1, NULL, thread, NULL);
    pthread_create(&t2, NULL, thread, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    printf("nCnt is %d by threads
", nCnt);

    return 0;
}

大家看出上面例子的问题了吗?

对,没错,在此例子中我们创建了两个线程,线程函数是同一个函数,在线程函数中是对全局变量nCnt的自增操作。这个例子中输出结果和我们想要的是不一样,就是因为nCnt执行指令并不是原子的,两个个线程对nCnt的并发访问出现了问题。我们利用锁就可以解决此问题。

阻塞与非阻塞

Linux环境编程中的阻塞与非阻塞,都是指I/O操作。而所有的I/O系统调用默认都是阻塞的。那什么是阻塞?阻塞的系统调用是指当进行系统调用时除非出错或被信号打断,那么系统调用将会一直陷入内核态直到调用完成。非阻塞的系统调用是指无论I/O操作成功与否,调用都会立刻返回。阻塞和非阻塞IO是访问设备的两种模式,驱动程序可以灵活的支持这两种用户空间对设备的访问方式。

阻塞操作是指在执行操作时,若不能获得资源,则阻塞进程直到满足条件再进行操作。被阻塞的进程进入睡眠状态,被调度器的运行队列移走,直到等待的条件满足

非阻塞是指在进行操作时,若不能获得资源,他要么放弃,要么返回后重新查询,直到可以进行操作为止。

当数据准备好时二者的模式相同,即IO操作都是将进程阻塞,直到IO操作完成

阻塞、非阻塞是设备文件、网络文件的属性

同步与异步

同步与异步,也是指I/O操作。POSIX定义如下:A synchronous I/O operation causes the requesting process to beblocked until that I/O operation completes An asynchronous I/O operation does not cause the requesting processto be blocked

两者的区别就在于同步IO做IO操作时会将进程阻塞,而异步IO做IO操作时不会阻塞进程

当把阻塞、非阻塞、同步和异步放在一起时,难免会出现混淆。同步是否就是阻塞,异步是否就是非阻塞?实际上在I/O操作中,它们是不同的概念。同步既可以是阻塞的,也可以是非阻塞的,而常用的Linux的I/O调用实际上都是同步的。这里的同步和异步,是指I/O数据的复制工作是否同步执行。

以系统调用read为例。阻塞的read会一直陷入内核态直到read返回;而非阻塞的read在数据未准备就绪时,会直接返回,而当有数据时,非阻塞的read同样会一直陷入内核态,直到read完成。这个read就是同步的操作, 即I/O的完成是在当前执行流程下同步完成的。如果是异步,则I/O操作不是随系统调用同步完成的。调用返回后,I/O操作并没有完成,而是由操作系统或者某个线程负责真正的I/O操作,等完成后通知原来的线程

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7629

    浏览量

    148443
  • Linux
    +关注

    关注

    87

    文章

    10986

    浏览量

    206720
  • 操作系统
    +关注

    关注

    37

    文章

    6278

    浏览量

    121865
  • 编程
    +关注

    关注

    88

    文章

    3439

    浏览量

    92371
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61306

原文标题:Linux环境编程必须搞懂的几个概念

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    分析EMC问题必须掌握的几个基本概念

    产品的电源线或信号线上。其实质也是共模干扰。与EMC相关的几个基本概念先举几个个例子:1、一个产品带LED显示,在考虑EMC设计(主要是ESD)时,我们常常会在LED上并连一个102贴片陶瓷电容。为什么?2
    发表于 12-01 20:41

    C语言编程入门(linux环境)

    消息管理 …………………………………………………………………………39第七章 线程操作 …………………………………………………………………………49第八章 网络编程 …………………………………………………………………………54第九章 Linux 下 C 开发工具介绍 …
    发表于 12-19 13:57

    Linux平台搭建与环境熟悉

    环境、系统编程以及网络编程,熟悉C++、QT编程并且深刻体会整个嵌入式Linux项目开发流程,强化学员对
    发表于 05-19 08:30

    从哪几个方面入手去学习linux嵌入式编程开发呢

    的疑问,学习时有很多的困难,在这里小编就来让你们迅速学会linux嵌入式编程开发。linux嵌入式编程开发学习时,你要从这几个方面来下手,首
    发表于 12-22 08:11

    LINUX环境编程指南资料合集

    资料简介:第 1 章着重介绍整个 Linux编程环境,包括如何安装 Linux 系统,以及如何使用 Shell 来操作你的系统,在这一章中还给大家详细介绍了
    发表于 07-11 15:30

    Linux编程白皮书(pdf下载)

    Linux编程白皮书》是由一群Linux高手所写的,它由五个部分组成——是Linux文档工程的一个印刷版本。该书描述了关键的设计概念,以及
    发表于 09-10 11:32 653次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>编程</b>白皮书(pdf下载)

    linux下c语言编程pdf

    linux下c语言编程内容为::基础知识,进程介绍,文件操作,时间概念,信号处理,消息管理,线程操作,网络编程,Linux 下C 开发工具介
    发表于 12-08 10:00 0次下载

    几个RT-Linux 源码

    几个RT-Linux 源码
    发表于 01-08 14:27 11次下载

    开关电源EMC必须掌握的几个概念

    开关电源EMC必须掌握的几个概念
    发表于 01-14 12:13 33次下载

    串口编程参考资料 linux环境下的

    串口编程参考资料 linux环境下的
    发表于 10-24 14:39 8次下载
    串口<b class='flag-5'>编程</b>参考资料 <b class='flag-5'>linux</b><b class='flag-5'>环境</b>下的

    精通嵌入式Linux编程—构造自己的GUI环境

    精通嵌入式Linux编程—构造自己的GUI环境
    发表于 10-30 09:04 16次下载
    精通嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>编程</b>—构造自己的GUI<b class='flag-5'>环境</b>

    LINUX系统教程之如何在Linux系统下进行编程

    本文档的主要内容详细介绍的是LINUX系统教程之如何在Linux系统下进行编程主要内容包括了:程序开发过程 ,Linux编程
    发表于 12-18 19:09 9次下载

    LINUX环境编程图文指南的PDF电子书免费下载

    本书从零开始,循序渐进地攻破Linux环境编程所遇到的各级关卡,以图文并茂的形式帮助读者理解各个概念。本书内容翔实,囊括了Linux系统操作
    发表于 06-08 08:00 0次下载
    <b class='flag-5'>LINUX</b><b class='flag-5'>环境</b><b class='flag-5'>编程</b>图文指南的PDF电子书免费下载

    关于电磁兼容必须搞懂的几件事,你了解吗

    你了解电磁兼容必须搞懂的几件事吗?其实,往往在学习电磁兼容的过程中,不能忘记我们的初衷。所以,在学习之前,有些基本要点必须搞懂。下面给大家分享一下实用常识,能对各位工程师有所帮助! 1
    的头像 发表于 10-30 18:16 325次阅读

    Linux环境编程:从应用到内核

    Linux环境编程:从应用到内核资料下载。
    发表于 06-01 14:51 15次下载