linux进程和线程专题
文章平均质量分 88
本专栏主要与大家一起讨论分享下linux进程和线程的概念与用法,学习进程线程有利于提高我们处理多并发事件以及多任务事件的能力,学习多进程和多线程的编码才能更好的体会到程序的乐趣。
九月丫
爱好编程,爱好生活
展开
-
linux 文件锁
当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。进程使用 flock 尝试锁文件时,如果文件已经被其他进程锁住,进程会被阻塞直到锁被释放掉,或者在调用 flock 的时候,采用 LOCK_NB 参数,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误。flock 锁的释放非常具有特色,即可调用 LOCK_UN 参数来释放文件锁,也可以通过关闭 fd 的方式来释放文件锁(flock 的第一个参数是 fd),意味着 flock 会随着进程的关闭而被自动释放掉。记录锁是更细粒度的文件锁。原创 2023-09-19 16:43:31 · 821 阅读 · 0 评论 -
利用prctl 函数给线程命名
(其中 4623 是进程号,4624 是线程号) 然后可以查看这个目录中的 stat 文件,可以看到如下结果。这两个文件都记录了线程的一些信息,我们看到线程名发现就是我们通过 prctl 设置的。可以看到进程号为 4623,然后可以通过 ps -L -p 4623 查看该进程号中的线程名字。对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的。使用 prctl 函数,第一个参数置为 PR_SET_NAME 就可以实现给调用者线程命名,也可以查看 status 文件,可以看到如下结果。原创 2023-09-19 16:21:31 · 483 阅读 · 0 评论 -
linux-线程条件变量(cond)
如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。想象一种情况,我创建一个线程去执行下雨收衣服的工作,但是大多数时候天气都是晴天,只有下雨天这个线程才会去工作,那么我就需要这个线程睡眠,不要浪费CPU 资源,等下雨时我再叫醒它起来工作就行了,线程条件变量就是扮演这样一个角色。在 linux 的 pthread 中使用条件变量的类型为:pthread_cond_t 表示一个条件变量。原创 2023-09-15 17:59:35 · 511 阅读 · 0 评论 -
linux-读写锁(rwlock)
动态初始化是在堆中申请空间,需要释放,而静态初始化是在静态存储区中创建,不。在 linux 中,通过 pthread_rwlock_t 结构来表示一个读写锁。1.如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作;3 如果某线程申请了读锁,其它线程可以再申请读锁,但不能申请写锁;4.如果某线程申请了写锁,其它线程不能申请读锁,也不能申请写锁。读写锁与互斥量类似,不过读写锁允许更改的并行性,释放读写锁(pthread_rwlock_destroy)读写锁的属性,为 NULL 表示默认属性。原创 2023-09-11 11:13:00 · 575 阅读 · 0 评论 -
linux-自旋锁(spinlock)
自旋锁尽可能的减少线程的阻塞,这对于锁的竞争不激烈,且占用锁时间非常短的代码块来说性能能大幅度的提升,因为自旋的消耗会小于线程阻塞挂起再唤醒的操作的消耗,这些操作会导致线程发生两次上下文切换!要设置的自旋锁属性,为 PTHREAD_PROCESS_PRIVATE 表示互斥锁只能在本进程中使用,为 PTHREAD_PROCESS_SHARED 表示互斥锁可以在不同进程间使用。解决资源冲突的,即,一个线程获取了一个自旋锁后,另外一个线程期望获取该自旋锁,获取不到,只能够原地“获取自旋锁 lock。原创 2023-09-08 16:43:16 · 278 阅读 · 0 评论 -
线程互斥锁(mutex)
线程之间的需要访问一些共享资源,为了保证对共享资源的有序访问,防止竞争,需要对共享资源进行某种方式的保护,使得共享资源有序访问,线程互斥锁就是用来实现线程间互斥的一种手段。要设置的线程属性,为 PTHREAD_PROCESS_PRIVATE 表示互斥锁只能在本进程中使用,为 PTHREAD_PROCESS_SHARED 表示互斥锁可以在不同进程间使用。就像线程具有属性一样,用于线程互斥的互斥量的也有相应的属性,互斥量属性的数据类型是用 pthread_mutexattr_t。原创 2023-09-06 10:18:49 · 192 阅读 · 0 评论 -
linux线程概述
此外,这些线程的调用进程没有有效的用户 ID 0。一个线程退出.它的资源是否全部被释放,取决于它的分离属性,设置分离的线程在线程结束后会自动释放线程的资源,而处于非分离状态的线程该线程结束,它有部分的资源不会自动释放,必须要其他的线程调用 pthread_join 这个函数才能释放所有资源。保存线程的竞争范围,为 PTHREAD_SCOPE_SYSTEM 或 0 时,线程将与系统中所有的线程竞争,为 PTHREAD_SCOPE_PROCESS 或 1 时,线程将与进程中的线程竞争。原创 2023-08-31 17:37:36 · 66 阅读 · 0 评论 -
信号量,消息队列,共享内存总结
在加锁的时候会有一个 SEM_UNDO 的设置,也就是在调用 semop 的时候指定操作结构体当中可以放置一个 SEM_UNDO 参数, 这样的 UNDO 选项会让内核记录一个与调用进程相关的 UNDO 记录,如果该进程崩溃,则根据这个进程的 UNDO 记录自动恢复相应信号量的计数值。然而,如果是一个进程 lock,而另一个进程 unlock,我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。原创 2023-08-28 17:38:46 · 169 阅读 · 0 评论 -
进程间通信-消息队列
每个消息包含一个正长整型类型字段,一个非负长度以及实际数据字节(对应于长度),所有这些都在将消息添加到队列 时,传送给 msgsnd。指定的消息队列的 id,表示你要把消息发送到哪一个消息队列,一般由msgget 函数生成。指定的消息队列的 id,表示你要把消息发送到哪一个消息队列,一般由msgget 函数生成。阻塞标志位,为 0 表示阻塞模式,为 IPC_NOWAIT 表示非阻塞模式。的权限,拥有者、两个重要的指针分别指向消息队列的第一个消息和最后一个消息。用于创建一个新队列或打开一个现存的队列。原创 2023-08-28 17:26:56 · 253 阅读 · 0 评论 -
进程间通信-共享内存
概述概述共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种 IPC。原创 2023-08-28 15:35:19 · 149 阅读 · 0 评论 -
进程间资源竞争解决-信号量(3)
销毁并不代表空间释放了,只是说明信号量的值变成未定义的,所以如果开始是申请的无名信号量的空间需要 free 释放。该无名信号量的共享方式,为 0 的话是进程内部的线程共享,为 1 的话是不同进程间共享(不同进程都要能够访问到信号量)。要创建或者打开 POSIX 信号量在文件系统中的路径名(以'/'开头的路径,路径名中只有一个'/')用来获取 sem 指定的信号量的值,把信号量的值存储到 sval 指向的内存空间。你要初始化的信号量的初始值,信号量保护的共享资源可以同时有多少个个进程/线程访问。原创 2023-08-21 17:10:02 · 92 阅读 · 0 评论 -
进程间资源竞争解决-信号量(2)
指针,指向一个信号量 P/V 操作的描述数组,一个信号量的 P/V 操作是由struct sembuf 中的 sem_op 决定的,一个信号量的 P/V 操作需要一个 struct sembuf 描述,如果有多个 P/V 操作,需要多个 struct sembuf(数组),因为你可能会同时对多个信号量进行 P/V 操作 P(S1 & S2)基于内存的无名信号灯的持续性却是不定的,如果基于内存的信号灯是由单个进程内的各个线程共享的,那么该信号灯就是随进程持续的,当该进程终止时它也会消失。原创 2023-08-21 11:44:46 · 249 阅读 · 0 评论 -
进程间资源竞争解决-信号量(1)
当 P2 进程发送 request(1,0,1)资源请求后,银行家算法会对此做检查满足条件 request(1,0,1) < need(1,0,2),因为进程此刻请求的资源数不能大于此刻还需要完成任务的进程数,保证进程所需最大资源数不变,同时满足 request(1,0,1) < available(1,1,2),保证系统中还剩下的资源数能够满足要求,全部满足后,假定为 P2 分配了资源,则资源表就变为如下。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。原创 2023-08-10 20:38:52 · 270 阅读 · 0 评论 -
进程间通信-信号
每个信号都有一个默认的当前设置,该设置决定了当收到信号时进程的行为。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被 取消时才被传递给进程。为信号的处理方式,和 signal 的第二个参数一样,同样可以设置三种处理方式(1).函数名:你自己写一个信号处理函数 你要指定或者关联的函数的类型必须是sighandler_t 类型 →。用来指定在信号处理函数执行期间需要被屏蔽的信号,特别是当某个信号被处理时,它自身会被自动放入进程的信号掩码,因此在信号处理函数执行期间这个信号不会再度发生。原创 2023-08-10 15:14:41 · 81 阅读 · 0 评论 -
进程间通信-管道
(1)两个进程运行时,写端彻底关闭,则读端 read 返回 0,也会关闭。(2)如果管道的读端关闭,继续写入数据会发生异常,写端收到未捕获的信号 SIGPIPE 会关闭写端。当然也可以修改默认的信号响应方式,比如增加信号处理函数。(3)写端写入数据以后,读端不从里面读取内容:数据保持在管道中存在一段时间。管道文件的大小是 0。(4)管道通讯发送的数据若没有指定进程接收,任何一个进程只要打开的是同一个管道文件,都有可能读到数据。(5)read 读取管道中的数据,只要读过的数据就会被清空。原创 2023-07-29 15:36:14 · 68 阅读 · 0 评论 -
linux 下进程相关 API
函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。待等待进程的进程号,为-1 表示等待任何子进程,为 0 表示等待进程组 ID 的任何子进程。将当前进程映像替换为一个新的进程映像,新替换的可执行文件名为 file,将当前进程映像替换为一个新的进程映像,新替换的可执行文件名为 file,将当前进程映像替换为一个新的进程映像,新替换的可执行文件名为 path,将当前进程映像替换为一个新的进程映像,新替换的可执行文件名为 file,原创 2023-07-29 15:21:05 · 130 阅读 · 0 评论 -
程序进程概念
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;(Round Robin,时间片轮转算法),HPF(Highest Priority First,最高优先级算法),多级队列,最短进程优先,保证调度,彩票调度,公平分享调度。是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是。1.程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。原创 2023-07-29 14:59:19 · 70 阅读 · 0 评论