函数调用

Linux多线程编程初探

南笙酒味 提交于 2020-02-24 14:37:20
Linux线程介绍 进程与线程   典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。     进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。   线程 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno常量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。在Unix和类Unix操作系统中线程也被称为轻量级进程(lightweight processes),但轻量级进程更多指的是内核线程(kernel thread),而把用户线程(user thread)称为线程。 "进程——资源分配的最小单位,线程——程序执行的最小单位"  

Python之面向对象编程

拜拜、爱过 提交于 2020-02-24 08:30:25
一、类的对象、实例化、变量 1.概念:类就是class,将一类事物放到一起,类里面包含这类事物的各种函数方法,相当于一个模型,例如造汽车,造汽车就是一个类,类里面包含造轮胎,造车门等函数方法。类的实例化就是通过这个类,这个模型造出来的实际的东西,例如通过造汽车这个模型造出来了一个汽车,这个汽车就是这个类的一个实例。在类里面有类变量,写在类里面,函数外面,通常就是类变量,在函数里面类似于self.name 这种就是实例变量。类的对象在代码层指的就是self,在函数里都会默认有个参数为self,类里面的函数都是面向这个self对象,函数里面的self.name 这种变量也是的,所以在一个类的函数里面,各个函数可以直接调用类里的其他函数的self.name 这种变量,或是self.函数名这个函数。其实在实例化的时候就是将那个实例传递给这个类里面的self,所以这个实例会拥有这个类里面的所有属性,或是方法。 2.例子: class Person: #类,类名都以大写字母开头,驼峰式取名 country = 'China' #类变量 def say(self): self.name = '张三' #实例变量 def cry(self): print('%s 哇哇哇'%self.name) #调用上一个函数里self.name self.say() #调用函数say()a=Person()

Windows进程的内核对象句柄表

有些话、适合烂在心里 提交于 2020-02-24 05:54:45
当一个进程被初始化时,系统要为它分配一个句柄表。该句柄表只用于内核对象 ,不用于用户对象或GDI对象。 创建内核对象 当进程初次被初始化时,它的句柄表是空的。然后,当进程中的线程调用创建内核对象的函数时,比如CreateFileMapping,内核就为该对象分配一个内存块,并对它初始化。这时,内核对进程的句柄表进行扫描,找出一个空项。由于表 3 - 1中的句柄表是空的,内核便找到索引1位置上的结构并对它进行初始化。该指针成员将被设置为内核对象的数据结构的内存地址,访问屏蔽设置为全部访问权,同时,各个标志也作了设置。 下面列出了用于创建内核对象的一些函数(不是个完整的列表): HANDLE CreateThread( PSECURITY_ATTRIBUTE psa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam, DWORD dwCreationFlags, PDWORD pdwThreadId); HANDLE CreateFile( PCTSTR pszFileNAme, DWORD dwDesiredAccess, DWORD dwShareMode, PSECURITY_ATTRIBUTES psa, DWORD dwCreationDistribution, DWORD

多线程编程总结

这一生的挚爱 提交于 2020-02-24 05:48:57
一、线程模型: 线程是程序中完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境和调度者的身份,线程可分为 内核线程和 用户线程。 内核线程:运行在内核空间,由内核来调度; 用户线程:运行在用户空间,由线程库来调用。 当进程的一个内核线程获得CPU的使用权时,它就加载并运行一个用户线程。可见,内核程序相当于用户线程运行的容器。一个进程可以拥有M个内核线程和N个用户线程,其中M≤N。并且在一个系统的所有进程中,M和N的比值都是固定的。按照M:N的取值,线程的实现方式可分为三种模式: 完全在用户空间实现、 完全由内核调度和 双层调度。 1、完全在用户空间实现的线程无须内核的支持,内核甚至根本不知道这些现成的存在。线程库负责管理所有执行线程,比如线程的优先级、时间片等。线程库利用longjmp来切换线程的执行,使它们看起来像是“并发”执行的。但实际上内核仍然是把整个进程作为最小单位来调度的。换句话说,一个进程的所有执行线程共享该进程的时间片,它们对外表现出相同的优先级。因此,对于这种实现方式而言,M=1,即N个用户空间线程对应1个内核线程,而该内核线程实际上就是进程本身。 完全在用户空间实现的线程的优点是:创建和调度线程都无需内核的干预,因此速度相当快。并且由于它不占用额外的内核资源,所以即使一个进程创建了很多线程,也不会对系统性能造成明显的影响。其缺点是:对于多处理器系统

Lua的协程和协程库详解

无人久伴 提交于 2020-02-24 03:14:06
转: https://www.cnblogs.com/zrtqsk/p/4374360.html 我们首先介绍一下什么是协程、然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法。 一、协程是什么?   (1)线程   首先复习一下多线程。我们都知道线程——Thread。每一个线程都代表一个执行序列。   当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行。   在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定。   (2)协程   那什么是协程呢?协程跟线程都代表一个执行序列。不同的是,协程把线程中不确定的地方尽可能的去掉,执行序列间的切换不再由CPU隐藏的进行,而是由程序显式的进行。   所以,使用协程实现并发,需要多个协程彼此协作。 二、resume和yeild的协作。   resume和yeild的协作是Lua协程的核心。这边用一幅图描述一下,有一个大体的印象。对照下面的coroutine库的详细解释和最后的代码,应该可以搞清楚协程的概念了。   注:这是在非首次resume协程的情况下,resume和yield的互相调用的情况。如果是首次resume协程

Socket 函数

梦想的初衷 提交于 2020-02-24 01:38:15
Socket 小结 函数 注意 accept connect send recv socket() # include <sys/types.h> # include <sys/socket.h> int socket ( int family , int type , int protocal ) ; int family //参数指定所要使用的通信协议 AF_UNIX // Unix 内部协议 AF_INET // Internet 协议 AF_Ns //Xerox NS 协议 AF_IMPLINK //IMP 连接层 int type //指定套接字的类型 SOCK_STREAM //流套字 SOCK_DGRAM //数据报套字 SOCK_RAW //未加工套接字 SOCK_SEQPACKET //顺序包套接字 int protocal //参数常设置为 0 //socket()系统调用返回一个整数值,叫做套接字描述字 sockfd //失败 返回-1 bind() # include <sys/types.h> # include <sys/socket.h> int bind ( int sockfd , struct sockaddr * myaddr , int addrlen ) ; //这个调用将一个名字命名给一个没有名字的套接字 //第二个参数 myaddr

Javascript与数据结构之栈结构

允我心安 提交于 2020-02-24 01:03:43
文章目录 栈结构 基础知识 栈结构的实现 栈的应用 栈结构 基础知识 相关特性 栈结构是一种特殊的数组,普通的数组可以在任意位置插入和删除元素,但是栈结构不可以,栈结构每次仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对的,把另一端称为栈底。进栈与出栈遵循LIFO(last in first out),后进入的元素最先出栈。类似于自动托盘,最后放上的托盘,往往先拿出去使用。 生活中类似于栈的: 处理邮件:最新到的最先处理的 家中取碗 栈在程序中的使用:函数调用栈 举例:函数A调用B,B中又调用C,C中又调用D 在执行过程中,会先将A压入栈,A没有执行完所以不会出栈,在A中调用B,便会将B压入栈顶,并执行B函数,当B调用C时,又将C压入栈顶,执行函数C,当C调用D时,又将D压入栈顶,执行函数D。直到D函数执行完毕后将函数D弹出,继续执行在栈顶的C函数。然后再执行B函数以及A函数。 专业术语 进栈:把新元素放到栈顶元素的上面,使之成为新的栈顶元素(又称入栈或压栈) 出栈:把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 栈结构的实现 function Stack ( ) { //相关属性 this . item = [ ] ; //相关方法 //1.将元素压入栈 Stack . prototype . push = function ( element ) { this .

CoppeliaSim 脚本(1)simulation scripts

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-23 17:32:32
本文为官方文档翻译,仅供个人参考,如有侵权,联系删除 Embedded scripts CoppeliaSim是一个高度可定制的仿真器,几乎每个仿真步骤都是用户自定义的。 通过集成的脚本解释器可以实现这种灵活性。 脚本语言是Lua。 Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。(来自百度百科) https://www.runoob.com/lua/lua-tutorial.html (菜鸟联盟 Lua教程) CoppeliaSim扩展了Lua的命令并添加了CoppeliaSim特定的命令,这些命令可以通过其sim前缀来识别(例如sim.handleCollision)。 CoppeliaSim支持两种类型的嵌入式脚本: 仿真脚本(Simulation scripts): 仿真脚本是仅在仿真期间执行的脚本,用于自定义仿真或仿真模型。主仿真循环通过主脚本(main script)处理,模型/机器人通过子脚本

python进程池剖析(一)

不羁岁月 提交于 2020-02-23 13:44:09
  python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序。如果需要实现调用外部程序的功能,python的 psutil模块 是更好的选择,它不仅支持subprocess提供的功能,而且还能对当前主机或者启动的外部程序进行监控,比如获取网络、cpu、内存等信息使用情况,在做一些自动化运维工作时支持的更加全面。multiprocessing是python的多进程模块,主要通过启动python进程,调用target回调函数来处理任务,与之对应的是python的多线程模块threading,它们拥有类似的接口,通过定义multiprocessing.Process、threading.Thread,指定target方法,调用start()运行进程或者线程。   在python中由于 全局解释锁(GIL) 的存在,使用多线程,并不能大大提高程序的运行效率 【1】 。因此,用python处理并发问题时,尽量使用多进程而非多线程。并发编程中,最简单的模式是,主进程等待任务,当有新任务到来时,启动一个新的进程来处理当前任务。这种每个任务一个进程的处理方式,每处理一个任务都会伴随着一个进程的创建、运行、销毁,如果进程的运行时间越短,创建和销毁的时间所占的比重就越大

深度剖析PHP序列化和反序列化

无人久伴 提交于 2020-02-23 11:54:31
序列化 序列化格式 在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。 序列化函数原型如下: string serialize ( mixed $value ) 先看下面的例子: class CC { public $data; private $pass; public function __construct($data, $pass) { $this->data = $data; $this->pass = $pass; } } $number = 34; $str = 'uusama'; $bool = true; $null = NULL; $arr = array('a' => 1, 'b' => 2); $cc = new CC('uu', true); var_dump(serialize($number)); var_dump(serialize($str)); var_dump(serialize($bool)); var_dump(serialize($null)); var_dump(serialize($arr)); var_dump(serialize($cc)); 输出结果为: string(5) "i:34;" string(13) "s:6:"uusama";" string(4) "b:1;" string(2)