Linux 環境プログラミングで理解する必要があるいくつかの概念

WBOY
リリース: 2024-02-15 08:03:22
転載
580 人が閲覧しました

初心者の場合、Linux 環境でプログラムを作成したい場合は、コードをより適切に記述してビジネス機能を実装するために、いくつかの重要な概念を深く理解する必要があります。以下に、重要かつ一般的に使用されるいくつかの知識ポイントを紹介します。これらの概念をマスターすると、将来のコーディングでの混乱を避けることができます。

Linux 環境プログラミングで理解する必要があるいくつかの概念

システムコール

#「

すべてのオペレーティング システムのカーネルには、いくつかのシステム レベルの機能を実行するために使用できる組み込み関数がいくつかあります。 Linux システムでは、これらの関数は「システム コール」と呼ばれます。これらは、ユーザー空間からカーネル空間への移行を表します。

#メッセージを受信しました。初心者が Linux 環境でプログラミングを行う場合、コードをより適切に記述してビジネス機能を実装するには、いくつかの重要な概念を深く理解する必要があります。以下に、重要かつ一般的に使用されるいくつかの知識ポイントを紹介します。これらの概念をマスターすると、将来のコーディングでの混乱を避けることができます。 ## システム コール > ❝ > > すべてのオペレーティング システムのカーネルには、いくつかのシステム レベルの機能を実行するために使用できるいくつかの組み込み関数があります。Linux システムでは、これらの関数は「システム コール」と呼ばれます (システム コール) ) .これらは、ユーザー空間からカーネル空間への変換を表します。 > > ❞

4合計 5

もっと好きか嫌いか

システム コールは、Linux オペレーティング システムによって提供されるサービスであり、アプリケーションとカーネル間の通信を記述するためのインターフェイスであり、これを関数と呼びます。通常の関数呼び出しと比較して、システムコールのパフォーマンス消費は比較的大きくなります。したがって、プログラムはパフォーマンスを追求しますが、システム コールは避けるようにしてください。
  • ユーザーモード プログラムは、デフォルトでスタックを介してパラメーターを渡します。システムコールの場合、カーネルモードとユーザーモードは異なるスタックを使用するため、システムコールパラメータはレジスタのみを通過します。
IO 操作

#「

IOとは何ですか、平たく言えば入力と出力を意味します

# IO は標準 IO とファイル IO に分かれており、よく使用される scanf、printf、getchar、putchar、gets、puts はすべて標準入出力です。 Linux システムではすべてがファイルであるため、Linux でのプログラミングでは、ファイル IO 操作には標準 IO とファイル IO の 2 種類があります。標準 IO はバッファリングされた IO でライブラリ関数に属しますが、ファイル IO はバッファリングされずシステム コールに属します。

  • 標準 IO: リーリー
  • ファイルIO:
1.文件IO是POSIX提供的一组函数

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

3.没有缓冲机制

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

原子操作

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

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

线程安全

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

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

static int nCnt = 0;

void * Thread(void * arg)
{
    for (int i = 0; i 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\n", 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

    # 2 つの違いは、同期 IO は
  • IO 操作 を実行するときにプロセスをブロックしますが、非同期 IO は IO 操作 を実行するときにプロセスをブロックしないことです。
  • ブロッキング、ノンブロッキング、同期、非同期をまとめると、必然的に混乱が生じます。同期とはブロッキングを意味し、非同期とは非ブロッキングを意味しますか?実際、I/O 操作では、これらは異なる概念です。同期はブロッキングまたはノンブロッキングのいずれかであり、一般的に使用される Linux I/O 呼び出しは実際には同期です。ここでいう同期・非同期とは、I/Oデータのコピーが同期的に実行されるかどうかを指します。
  • システムコール read を例に挙げます。ブロッキング読み取りは読み取りが戻るまでカーネル状態に残ります。ノンブロッキング読み取りはデータの準備ができていない場合に直接戻り、データがある場合は読み取りが完了するまでノンブロッキング読み取りもカーネル状態に残ります。完成しました。この読み取りは同期操作です。つまり、I/O の完了は現在の実行プロセスで同期して完了します。非同期の場合、I/O 操作はシステム コールと同期して完了しません。呼び出しが戻った後、I/O 操作は完了しません。代わりに、オペレーティング システムまたは特定のスレッドが実際の I/O 操作を担当し、完了後に元のスレッドに通知されます

以上がLinux 環境プログラミングで理解する必要があるいくつかの概念の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:lxlinux.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!