信号量

Linux信号量动作和说明列表

匿名 (未验证) 提交于 2019-12-02 21:56:30
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010214802/article/details/90572691 ctrl退出指令 Ctrl-C 发送 INT signal (SIGINT),通常导致进程结束 Ctrl-Z 发送 TSTP signal (SIGTSTP),通常导致进程挂起(suspend) Ctrl-\ 发送 QUIT signal (SIGQUIT),通常导致进程结束 和 dump core 举例:kill -9指令 kill -9 pid 会发送 SIGKILL信号给进程 信号列表 在POSIX.1-1990(可移植操作系统接口Portable Operating System Interface)标准中定义的信号列表 信号 值 动作 说明 SIGHUP 1 Term 终端控制进程结束(终端连接断开) SIGINT 2 Term 用户发送INTR字符(Ctrl+C)触发 SIGQUIT 3 Core 用户发送QUIT字符(Ctrl+/)触发 SIGILL 4 Core 非法指令(程序错误、试图执行数据段、栈溢出等) SIGABRT 6 Core 调用abort函数触发 SIGFPE 8 Core 算术运行错误(浮点运算错误、除数为零等) SIGKILL 9 Term 无条件结束程序(不能被捕获、阻塞或忽略

Linux的信号量semaphore源码解析

匿名 (未验证) 提交于 2019-12-02 21:53:52
版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/83047910 1 .信号量概述------------------------------------------------ Linux中提供了两种信号量,一种用于内核程序中,一种用于应用程序中。 由于这里讲解的是内核编程的知识,所以只对内核中的信号量进行详细讲述。 自旋锁和信号量的区别: 自旋锁:会一直检测是否可以上锁,因此当有锁可用时,自旋锁的反应快速 信号量:没有锁后会进行休眠,直到有锁后被唤醒,反应慢 注意: 从信号量的原理上来说,没有获得信号量的函数可能睡眠。这就要求只有能够睡眠的 ,进程才能够使用信号量,不能睡眠的进程不能使用信号量。例如在中断处理程序中,由于中断需要立刻完成,所以不能睡眠, 也就是说在中断处理程序中是不能使用信号量的。 cout变量: count是信号量中一个非常重要的成员变量,这个变量可能取下面的3种值。 如果这个值等于0,表示信号量被其他进程使用,现在不可以用这个信号量,但是wait list队列中没有进程在等待信号量。 如果这个值小于0,那么表示至少有一个进程在wait list队列中等待信号量被释放 如果这个值大于0,表示这个信号量可以用,程序可以使用这个信号量。 注意这里cout的值大于0的情况

H2O 生成

僤鯓⒐⒋嵵緔 提交于 2019-12-02 19:44:32
现在有两种线程,氢 oxygen 和氧 hydrogen,你的目标是组织这两种线程来产生水分子。 存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。 氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。 这些线程应该三三成组突破屏障并能立即组合产生一个水分子。 你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。 换句话说: 如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢线程到达。 如果一个氢线程到达屏障时没有其它线程到达,它必须等候直到一个氧线程和另一个氢线程到达。 书写满足这些限制条件的氢、氧线程同步代码。 示例 1: 输入: "HOH" 输出: "HHO" 解释: "HOH" 和 "OHH" 依然都是有效解。 示例 2: 输入: "OOHHHH" 输出: "HHOHHO" 解释: "HOHHHO", "OHHHHO", "HHOHOH", "HOHHOH", "OHHHOH", "HHOOHH", "HOHOHH" 和 "OHHOHH" 依然都是有效解。 限制条件: 输入字符串的总长将会是 3n, 1 ≤ n ≤ 50; 输入字符串中的 “H” 总数将会是 2n; 输入字符串中的 “O” 总数将会是 n。 在真实的面试中遇到过这道题? 链接:https

win32API多线程编程

蹲街弑〆低调 提交于 2019-12-02 19:12:38
win32线程API 在Windows平台下可以通过Windows的线程库来实现多线程编程。 对于多线程程序可以使用Visual Studio调试工具进行调试,也可以使用多核芯片厂家的线程分析调试工具进行调试。 Win32 API(了解Windows,代码小,效率高) Windows操作系统为内核以及应用程序之间提供的接口 将内核提供的功能进行函数封装 应用程序通过调用相关的函数获得相应的系统功能 _beginthread _beginthread(函数名,栈大小,参数指针) Win32 函数库中提供了操作多线程的函数, 包括创建线程、管理线程、终止线程、线程同步等接口。 线程函数(线程开始执行的函数) DWORD WINAPI ThreadFunc (LPVOID lpvThreadParm ); 线程创建 HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); 第一个参数lpThreadAtt,是一个指向SECURITY- ATTRIBUTES结构的指针

Scrapy信号量

…衆ロ難τιáo~ 提交于 2019-12-02 17:06:15
1、类 from scrapy import signals class MySingle(object): def __init__(self): pass @classmethod def from_crawler(cls, crawler): self = cls() crawler.signals.connect(self.spider_open, signal=signals.spider_opened) crawler.signals.connect(self.spider_close, signal=signals.spider_closed) return self def spider_open(self, spider): print('打开') def spider_close(self, spider): print('关闭') 2、配置文件 EXTENSIONS = { # 'scrapy.extensions.telnet.TelnetConsole': None, 'toscrapy.mysingles.MySingle': 555, } 来源: https://www.cnblogs.com/wt7018/p/11756296.html

程序的并发性分享

人盡茶涼 提交于 2019-12-02 16:02:12
最近在学习程序并发性的知识,在这里整理一下: 定义: 并发与并行的概念一直非常相似,不同的人也有不同的理解。而关于并发,最被人们认可的定义是:在单个处理器上采用单核执行多个任务。这样的话,任务调度程序很快便可以从一个调到另一个,因此所有任务看起来都是一个时间段内运行的。而对于并行来说:同一时间在不同的计算机、处理器或者处理器核心上同时运行多个任务。所以,伴随着多核处理器的发展,两者会越来越相似。 并发中,最重要的便是同步,有控制同步与数据访问同步,控制同步就是当两个任务有依赖关系时,运行的次序不可颠倒,而数据访问的同步就是对共享变量的访问限制为1;目前最流行的同步机制有信号量机制(semaphore)和监视器机制。信号量机制是一种用于控制对一个或多个单位资源进行访问的机制。它有一个用于存放可用资源数量的变量,并且可以用两种原子操作来管理该变量的值。互斥(mutex)是一种特殊的信号量,它只能取两个值(即资源空闲和资源忙),而且只有将其设置为忙的进程才可以释放它。互斥可以通过保护临界区来帮助你避免出现竞争条件。监视器机制是一种在共享资源之上的机制。它有一个互斥、一个条件变量、(等待条件和通报条件)。一旦你通报了该条件,在等待它的任务中只有一个会继续执行。还有一个概念便是线程安全,如果共享数据的所有用户都受到同步机制的保护,那么该方法或者对象便是线程安全的

day30总结

青春壹個敷衍的年華 提交于 2019-12-02 16:02:08
目录 多线程实现TCP服务端并发 服务端---封装接口思想 GIL全局解释器锁 什么是GIL?---global interpreter lock 为什么要有GIL? 死锁问题及解决 死锁问题 解决:递归锁 信号量 多线程实现TCP服务端并发 服务端---封装接口思想 import threading import socket def server_interface(): server = socket.socket() server.bind(('127.0.0.1', 8888)) server.listen() def multi_handle(): new_server_link, address = server.accept() print(address) while True: try: res = new_server_link.recv(1024).decode('utf-8') print(res) new_server_link.send(res.upper().encode('utf-8')) if res == 'q': return except Exception as e: print(e) return for i in range(10): t = threading.Thread(target=multi_handle) t.start(

STM32F1+uCOSii移植

时间秒杀一切 提交于 2019-12-02 12:53:52
0.uCOSII简介 0.0 uCOSii背景 μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。 0.1 特点及组成 μC/OS-II可以提供如下服务: 信号量 互斥信号量 事件标识 消息邮箱 消息队列 任务管理 固定大小内存块管理 时间管理 另外,在μC/OS-II内核之上,有如下独立模块可供用户选择: μC/FS文件系统模块 μC/GUI图形软件模块 μC/TCP-IP协议栈模块 μC/USB协议栈模块 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。 (1) 核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。 (2) 任务处理部分(OSTask.c) 任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的

Linux进程间通信 --- IPC机制(转)

余生颓废 提交于 2019-12-02 12:27:58
在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。在linux下有多种进程间通信的方法:半双工管道、命名管道、消息队列、信号、信号量、共享内存、内存映射文件,套接字等等。使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架。 1. 管道 (PIPE) 管道实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。 管道的特点: 1、管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2、只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。比如fork或exec创建的新进程,在使用exec创建新进程时,需要将管道的文件描述符作为参数传递给exec创建的新进程。当父进程与使用fork创建的子进程直接通信时,发送数据的进程关闭读端,接受数据的进程关闭写端。 3、单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 4、数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾

网络编程面试题整理(一)

旧巷老猫 提交于 2019-12-02 10:44:10
1:tcp和udp的区别 首先,了解网络经典的五层协议体系结构: 物理层、数据链路层、网络层、传输层、应用层 。信号的传输总要符合一定的协议(protocol),而计算机之间的通信也要遵循不同层次的协议,来实现计算机的通信。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。在传输层中有TCP协议与UDP协议。在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。 而本问的tcp和udp就是工作在传输层的两个重要协议。其中TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,简单概况就是: 1. 主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话; 2. 主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话; 3. 主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。 三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。 而UDP(User Data Protocol,用户数据报协议