Linux系统编程
文章平均质量分 90
Linux系统编程
轩辰~
这个作者很懒,什么都没留下…
展开
-
Linux系统编程——线程池和内存池
服务器程序利用线程技术响应客户请求已经司空见惯,但是线程的使用是有待优化和处理的。单线程执行并不是一个高效的方式,这个时候可能就要考虑高并发,多线程等方式。线程池也是线程优化的一种方式。在面向对象的过程中,对象的创建和销毁是非常占资源的,每创建一个对象都要获取内存资源以及其他一些资源。这就产生了“池化技术”。【线程池如何提高服务器程序的性能?单线程的情况下,系统花大量的时间再T1、T3阶段。我们要采取最优的措施,减少T1和T3的系统开销。原创 2024-11-07 22:23:15 · 862 阅读 · 0 评论 -
Linux系统编程——多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)
现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。【同步】:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。【互斥】:是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。原创 2024-11-07 10:45:20 · 1002 阅读 · 0 评论 -
Linux系统编程——线程概述、线程控制和线程私有数据
在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。在一个进程中的多个执行路线叫做线程。为了让进程完成一定的工作,进程必须至少包含一个线程。线程又叫轻量级进程(LWP)。线程会共享进程的一些资源,也有一些资源是线程独立拥有的。但是不同进程的线程是不共享资源的。【共享】:代码区、数据区、堆区(注意没有栈区)、环境变量和命令行参数、文件描述符、信号处理函数、当前目录、用户 ID 和组 ID 等。原创 2024-11-05 22:49:10 · 1281 阅读 · 0 评论 -
Linux系统编程——信号发送与信号处理
进程可以通过kill函数向包括它本身在内的其他进程发送一个信号,如果程序没有发送这个信号的权限,对kill函数的调用就将失败,而失败的常见原因是目标进程由另一个用户所拥有。功能: 把信号sig发送给进程号为pid的进程。参数:pid:取值有 4 种情况:pid > 0:将信号传送给进程 ID 为pid的进程;pid = 0:将信号传送给当前进程所在进程组中的所有进程;pid = -1:将信号传送给系统内所有的进程;pid < -1:将信号传给指定进程组的所有进程。原创 2024-11-05 22:27:47 · 903 阅读 · 0 评论 -
Linux系统编程——信号的基本概念(信号产生于处理、可靠信号、可重入函数、SIGCHLD)
信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。信号是软中断,通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。一个完整的信号周期包括三个部分:信号的产生,信号在进程中的注册,信号在进程中的注销(由内部机制完成),执行信号处理函数。如下图所示:重点是信号的产生与处理。原创 2024-11-03 22:06:17 · 958 阅读 · 0 评论 -
Linux系统编程——进程关系
1. 当系统自举时,内核创建进程 ID 为 1 的进程,也就是 init 进程。init 进程使系统进入多用户模式。init 进程根据配置文件 /etc/inittab 确定需要打开哪些终端,对每一个允许登录的终端设备,init 调用一次 fork,它所生成的子进程则执行 getty(exec)程序。(不同操作系统配置文件可能不同);2. getty 为终端设备调用 open 函数,以读写方式将终端打开。然后 getty 输出“longin:”之类的信息,并等待用户键入用户名;原创 2024-11-03 22:00:13 · 660 阅读 · 0 评论 -
Linux系统编程——共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信。【优点】:采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。原创 2024-10-30 20:12:12 · 1032 阅读 · 0 评论 -
Linux系统编程——信号量
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。...int val;信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。原创 2024-10-30 20:03:55 · 788 阅读 · 0 评论 -
Linux系统编程——消息队列
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题(命名管道要读端和写端都存在,否则出现阻塞)。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。原创 2024-10-26 17:45:01 · 596 阅读 · 0 评论 -
Linux系统编程——管道(pipe)和命名管道(FIFO)
POSIX标准中的FIFO又名有名管道或命名管道。我们知道前面讲述的POSIX标准中管道是没有名称的,所以它的最大劣势是只能用于具有亲缘关系的进程间的通信。FIFO最大的特性就是每个FIFO都有一个路径名与之相关联,从而允许无亲缘关系的任意两个进程间通过FIFO进行通信。所以,FIFO的两个特性:和管道一样,FIFO仅提供半双工的数据通信,即只支持单向的数据流;和管道不同的是,FIFO可以支持任意两个进程间的通信。1. 管道是一个环形队列缓冲区,允许两个进程以生产者消费者模型进程通信。原创 2024-10-26 17:37:39 · 493 阅读 · 0 评论 -
Linux系统编程——守护进程
守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。原创 2024-10-23 17:24:39 · 307 阅读 · 0 评论 -
Linux系统编程——exec函数族与system函数
使用函数fork()创建新的子进程后,子进程往往需要调用函数exec()以执行另一个程序。当进程调用函数exec()时,该进程执行的程序完全替换为新程序,而新程序则从其函数main()开始执行。与 fork 或 vfork 函数不同,exec 函数不是创建调用进程的子进程,而是创建一个新的进程取代调用进程自身。新进程会用自己的全部地址空间,覆盖调用进程的地址空间,但进程的 PID 保持不变。exec 只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆段和栈段。原创 2024-10-23 17:19:42 · 1009 阅读 · 0 评论 -
Linux系统编程——进程资源回收
若父进程调用waitpid()(这里使用阻塞调用确保子进程先于父进程结束)来等待子进程结束,将会使父进程在调用waitpid()后进入睡眠状态,只有子进程结束父进程的waitpid()才会返回。由此,可以看出父进程与子进程有父子关系,除非保证父进程先于子进程结束或者保证父进程在子进程结束前执行waitpid(),子进程均有机会成为僵尸进程。这就要用两次fork了。(2)如果一个子进程在 wait 函数套用之前,已经终止并处于僵尸状态,wait 函数会立即返回,并取得该子进程的终止状态,同时子进程僵尸消失。原创 2024-10-16 17:59:35 · 766 阅读 · 0 评论 -
Linux系统编程——进程标识、进程创建
每个进程都有一个非负整数形式的唯一编号,即 PID。PID 在任何时刻都是唯一的,但是可以重用,当进程终止并被回收以后,其 PID 就可以为其它进程所用。进程的 PID 由系统内核根据延迟重用算法生成,以确保新进程的 PID 不同于最近终止进程的 PID。原创 2024-10-16 17:53:10 · 837 阅读 · 0 评论 -
Linux系统编程——进程
(1)进程的定义进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位。进程和程序是有本质区别的:程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整个过程。(2)进程控制块(PCB)Linux系统通过进程控制块来描述一个进程。进程控制块包含了进程的状态信息、控制信息以及资源信息等。原创 2024-10-13 19:40:02 · 638 阅读 · 0 评论 -
Linux系统编程——文件系统和目录结构
由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层。文件I/O与标准I/O文件IO又被称为不带缓冲的IO,“不带缓冲“是指每个读写操作都调用系统内核的一个系统调用。文件IO与标准IO的区别在于:标准IO默认采用缓冲机制,打开文件的同时,在内存中建立一个缓冲区;而文件IO一般不会建立缓冲区,需要手动创建;标准IO针对的是控制台、打印输出到屏幕等;文件IO主要是对文件操作、读写硬盘等;标准IO是跨平台的,二文件IO只适用于Unix/Linux平台。文件描述符。原创 2024-10-13 15:25:27 · 1101 阅读 · 0 评论 -
Linux系统编程—文件I/O
(1)IO请求的两个阶段:1. 等待资源阶段:IO请求一般需要请求特殊的资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源;2. 使用资源阶段:真正进行数据接收和发生。(2)在等待数据阶段,IO分为阻塞IO和非阻塞IO:1. 阻塞IO: 资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时);2. 非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用。原创 2024-10-11 20:30:00 · 1079 阅读 · 0 评论